summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/char/Makefile17
-rw-r--r--src/char/char.c3615
-rw-r--r--src/char/char.h35
-rw-r--r--src/char/int_guild.c1473
-rw-r--r--src/char/int_guild.h17
-rw-r--r--src/char/int_party.c625
-rw-r--r--src/char/int_party.h15
-rw-r--r--src/char/int_pet.c375
-rw-r--r--src/char/int_pet.h14
-rw-r--r--src/char/int_storage.c516
-rw-r--r--src/char/int_storage.h17
-rw-r--r--src/char/inter.c586
-rw-r--r--src/char/inter.h21
-rw-r--r--src/char_sql/Makefile20
-rw-r--r--src/char_sql/char.c3578
-rw-r--r--src/char_sql/char.h90
-rw-r--r--src/char_sql/int_guild.c1719
-rw-r--r--src/char_sql/int_guild.h11
-rw-r--r--src/char_sql/int_party.c777
-rw-r--r--src/char_sql/int_party.h9
-rw-r--r--src/char_sql/int_pet.c329
-rw-r--r--src/char_sql/int_pet.h13
-rw-r--r--src/char_sql/int_storage.c339
-rw-r--r--src/char_sql/int_storage.h14
-rw-r--r--src/char_sql/inter.c625
-rw-r--r--src/char_sql/inter.h47
-rw-r--r--src/char_sql/itemdb.c247
-rw-r--r--src/char_sql/itemdb.h34
-rw-r--r--src/char_sql/make.sh10
-rw-r--r--src/char_sql/readme.txt250
-rw-r--r--src/common/.svnignore2
-rw-r--r--src/common/Makefile23
-rw-r--r--src/common/buffer.h18
-rw-r--r--src/common/core.c327
-rw-r--r--src/common/core.h21
-rw-r--r--src/common/db.c662
-rw-r--r--src/common/db.h68
-rw-r--r--src/common/dll.h25
-rw-r--r--src/common/grfio.c1070
-rw-r--r--src/common/grfio.h19
-rw-r--r--src/common/lock.c55
-rw-r--r--src/common/lock.h8
-rw-r--r--src/common/malloc.c548
-rw-r--r--src/common/malloc.h77
-rw-r--r--src/common/mmo.h353
-rw-r--r--src/common/nullpo.c90
-rw-r--r--src/common/nullpo.h233
-rw-r--r--src/common/showmsg.c140
-rw-r--r--src/common/showmsg.h57
-rw-r--r--src/common/socket.c1069
-rw-r--r--src/common/socket.h116
-rw-r--r--src/common/strlib.c98
-rw-r--r--src/common/strlib.h13
-rw-r--r--src/common/timer.c315
-rw-r--r--src/common/timer.h55
-rw-r--r--src/common/utils.c189
-rw-r--r--src/common/utils.h57
-rw-r--r--src/common/version.h27
-rw-r--r--src/ladmin/Makefile14
-rw-r--r--src/ladmin/ladmin.c4383
-rw-r--r--src/ladmin/ladmin.h11
-rw-r--r--src/ladmin/md5calc.c237
-rw-r--r--src/ladmin/md5calc.h8
-rw-r--r--src/lib/zconf_win32.h279
-rw-r--r--src/lib/zlib_win32.h893
-rw-r--r--src/login/Makefile14
-rw-r--r--src/login/login.c4017
-rw-r--r--src/login/login.h42
-rw-r--r--src/login/md5calc.c237
-rw-r--r--src/login/md5calc.h8
-rw-r--r--src/login_sql/Makefile16
-rw-r--r--src/login_sql/login.c1896
-rw-r--r--src/login_sql/login.h43
-rw-r--r--src/login_sql/make.sh6
-rw-r--r--src/login_sql/md5calc.c236
-rw-r--r--src/login_sql/md5calc.h7
-rw-r--r--src/login_sql/readme.txt120
-rw-r--r--src/login_sql/timer.h43
-rw-r--r--src/map/.svnignore3
-rw-r--r--src/map/Makefile82
-rw-r--r--src/map/Makefile.win3296
-rw-r--r--src/map/atcommand.c9229
-rw-r--r--src/map/atcommand.h292
-rw-r--r--src/map/battle.c4629
-rw-r--r--src/map/battle.h328
-rw-r--r--src/map/charcommand.c1257
-rw-r--r--src/map/charcommand.h59
-rw-r--r--src/map/chat.c378
-rw-r--r--src/map/chat.h22
-rw-r--r--src/map/chrif.c1179
-rw-r--r--src/map/chrif.h39
-rw-r--r--src/map/clif.c11474
-rw-r--r--src/map/clif.h313
-rw-r--r--src/map/guild.c1717
-rw-r--r--src/map/guild.h89
-rw-r--r--src/map/intif.c1167
-rw-r--r--src/map/intif.h56
-rw-r--r--src/map/itemdb.c975
-rw-r--r--src/map/itemdb.h85
-rw-r--r--src/map/log.c687
-rw-r--r--src/map/log.h40
-rw-r--r--src/map/mail.c337
-rw-r--r--src/map/mail.h9
-rw-r--r--src/map/map.c3437
-rw-r--r--src/map/map.h864
-rw-r--r--src/map/mob.c4577
-rw-r--r--src/map/mob.h149
-rw-r--r--src/map/npc.c2574
-rw-r--r--src/map/npc.h62
-rw-r--r--src/map/npc_chat.c502
-rw-r--r--src/map/party.c657
-rw-r--r--src/map/party.h47
-rw-r--r--src/map/path.c470
-rw-r--r--src/map/pc.c7337
-rw-r--r--src/map/pc.h224
-rw-r--r--src/map/pet.c1694
-rw-r--r--src/map/pet.h69
-rw-r--r--src/map/script.c7862
-rw-r--r--src/map/script.h59
-rw-r--r--src/map/skill.c9690
-rw-r--r--src/map/skill.h731
-rw-r--r--src/map/status.c5159
-rw-r--r--src/map/status.h271
-rw-r--r--src/map/storage.c624
-rw-r--r--src/map/storage.h39
-rw-r--r--src/map/trade.c389
-rw-r--r--src/map/trade.h13
-rw-r--r--src/map/vending.c175
-rw-r--r--src/map/vending.h12
-rw-r--r--src/tool/Makefile6
-rw-r--r--src/tool/adduser.c96
-rw-r--r--src/tool/backup100
-rw-r--r--src/tool/cgi/addaccount.cgi204
-rw-r--r--src/tool/checkversion85
-rw-r--r--src/tool/convert.c296
-rw-r--r--src/tool/getlogincount122
-rw-r--r--src/tool/ladmin3793
-rw-r--r--src/tool/mapcheck.sh34
-rw-r--r--src/tool/mapchecker.sh56
-rw-r--r--src/txt-converter/char/Makefile13
-rw-r--r--src/txt-converter/char/char-converter.c845
-rw-r--r--src/txt-converter/char/char.h39
-rw-r--r--src/txt-converter/char/int_guild.h10
-rw-r--r--src/txt-converter/char/int_party.h11
-rw-r--r--src/txt-converter/char/int_pet.h12
-rw-r--r--src/txt-converter/char/int_storage.h11
-rw-r--r--src/txt-converter/common/inter.h28
-rw-r--r--src/txt-converter/common/mmo.h280
-rw-r--r--src/txt-converter/login/Makefile12
-rw-r--r--src/txt-converter/login/login-converter.c262
-rw-r--r--src/webserver/Makefile20
-rw-r--r--src/webserver/doc/API.txt50
-rw-r--r--src/webserver/doc/README11
-rw-r--r--src/webserver/generate.c38
-rw-r--r--src/webserver/htmlstyle.c51
-rw-r--r--src/webserver/logs.c8
-rw-r--r--src/webserver/main.c142
-rw-r--r--src/webserver/pages/about.c6
-rw-r--r--src/webserver/pages/notdone.c5
-rw-r--r--src/webserver/pages/sample.c24
-rw-r--r--src/webserver/parse.c135
-rw-r--r--src/zlib/FAQ337
-rw-r--r--src/zlib/README126
-rw-r--r--src/zlib/adler32.c74
-rw-r--r--src/zlib/compress.c79
-rw-r--r--src/zlib/crc32.c333
-rw-r--r--src/zlib/crc32.h441
-rw-r--r--src/zlib/deflate.c1502
-rw-r--r--src/zlib/deflate.h325
-rw-r--r--src/zlib/inffast.c305
-rw-r--r--src/zlib/inffast.h11
-rw-r--r--src/zlib/inffixed.h94
-rw-r--r--src/zlib/inflate.c1274
-rw-r--r--src/zlib/inflate.h117
-rw-r--r--src/zlib/inftrees.c328
-rw-r--r--src/zlib/inftrees.h55
-rw-r--r--src/zlib/trees.c1215
-rw-r--r--src/zlib/trees.h128
-rw-r--r--src/zlib/zconf.h326
-rw-r--r--src/zlib/zlib.h1200
-rw-r--r--src/zlib/zutil.c319
-rw-r--r--src/zlib/zutil.h263
182 files changed, 0 insertions, 131569 deletions
diff --git a/src/char/Makefile b/src/char/Makefile
deleted file mode 100644
index aee0e69e2..000000000
--- a/src/char/Makefile
+++ /dev/null
@@ -1,17 +0,0 @@
-all: char-server
-txt: char-server
-
-COMMON_OBJ = ../common/obj/core.o ../common/obj/socket.o ../common/obj/timer.o ../common/obj/db.o ../common/obj/lock.o ../common/obj/malloc.o ../common/obj/showmsg.o ../common/obj/strlib.o
-COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/db.h ../common/lock.h ../common/timer.h ../common/malloc.h ../common/showmsg.h ../common/strlib.h
-char-server: char.o inter.o int_party.o int_guild.o int_storage.o int_pet.o $(COMMON_OBJ)
- $(CC) -o ../../$@ $> $(LIB_S)
-
-char.o: char.c char.h inter.h int_pet.h $(COMMON_H) ../common/version.h
-inter.o: inter.c inter.h int_party.h int_guild.h int_storage.h int_pet.h char.h $(COMMON_H)
-int_party.o: int_party.c int_party.h inter.h char.h $(COMMON_H)
-int_guild.o: int_guild.c int_guild.h int_storage.h inter.h char.h $(COMMON_H)
-int_storage.o: int_storage.c int_storage.h int_guild.h inter.h char.h $(COMMON_H)
-int_pet.o: int_pet.c int_pet.h inter.h char.h $(COMMON_H)
-
-clean:
- rm -f *.o ../../char-server
diff --git a/src/char/char.c b/src/char/char.c
deleted file mode 100644
index 73efbc864..000000000
--- a/src/char/char.c
+++ /dev/null
@@ -1,3615 +0,0 @@
-// $Id: char.c,v 1.3 2004/09/13 16:52:16 Yor Exp $
-// original : char2.c 2003/03/14 11:58:35 Rev.1.5
-
-#include <sys/types.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#ifdef _WIN32
-#include <winsock.h>
-typedef long in_addr_t;
-#else
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <sys/ioctl.h>
-#include <sys/time.h>
-#include <unistd.h>
-#endif
-
-#include <time.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdarg.h>
-
-#include "../common/strlib.h"
-#include "core.h"
-#include "socket.h"
-#include "timer.h"
-#include "mmo.h"
-#include "db.h"
-#include "version.h"
-#include "lock.h"
-#include "char.h"
-#include "showmsg.h"
-#include "buffer.h"
-
-#include "inter.h"
-#include "int_pet.h"
-#include "int_guild.h"
-#include "int_party.h"
-#include "int_storage.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-struct mmo_map_server server[MAX_MAP_SERVERS];
-int server_fd[MAX_MAP_SERVERS];
-
-int login_fd, char_fd;
-char userid[24];
-char passwd[24];
-char server_name[20];
-char wisp_server_name[24] = "Server";
-int login_ip_set_ = 0;
-char login_ip_str[16];
-in_addr_t login_ip;
-int login_port = 6900;
-int char_ip_set_ = 0;
-char char_ip_str[16];
-int bind_ip_set_ = 0;
-char bind_ip_str[16];
-in_addr_t char_ip;
-int char_port = 6121;
-int char_maintenance;
-int char_new;
-int email_creation = 0; // disabled by default
-char char_txt[1024]="save/athena.txt";
-char backup_txt[1024]="save/backup.txt"; //By zanetheinsane
-char friends_txt[1024]="save/friends.txt"; // davidsiaw
-char backup_txt_flag = 0; // The backup_txt file was created because char deletion bug existed. Now it's finish and that take a lot of time to create a second file when there are a lot of characters. => option By [Yor]
-char unknown_char_name[1024] = "Unknown";
-char char_log_filename[1024] = "log/char.log";
-char db_path[1024]="db";
-//Added for lan support
-char lan_map_ip[128];
-int subneti[4];
-int subnetmaski[4];
-int name_ignoring_case = 0; // Allow or not identical name for characters but with a different case by [Yor]
-int char_name_option = 0; // Option to know which letters/symbols are authorised in the name of a character (0: all, 1: only those in char_name_letters, 2: all EXCEPT those in char_name_letters) by [Yor]
-char char_name_letters[1024] = ""; // list of letters/symbols authorised (or not) in a character name. by [Yor]
-
-int log_char = 1; // loggin char or not [devil]
-int log_inter = 1; // loggin inter or not [devil]
-
-struct char_session_data{
- int account_id, login_id1, login_id2, sex;
- int found_char[9];
- char email[40]; // e-mail (default: a@a.com) by [Yor]
- time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
-};
-
-//Added for Mugendai's I'm Alive mod
-int imalive_on=0;
-int imalive_time=60;
-//Added by Mugendai for GUI
-int flush_on=1;
-int flush_time=100;
-
-#define AUTH_FIFO_SIZE 256
-struct {
- int account_id, char_id, login_id1, login_id2, ip, char_pos, delflag, sex;
- time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
-} auth_fifo[AUTH_FIFO_SIZE];
-int auth_fifo_pos = 0;
-
-int check_ip_flag = 1; // It's to check IP of a player between char-server and other servers (part of anti-hacking system)
-
-int char_id_count = 150000;
-struct mmo_charstatus *char_dat;
-int char_num, char_max;
-int max_connect_user = 0;
-int gm_allow_level = 99;
-int autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
-int start_zeny = 500;
-int start_weapon = 1201;
-int start_armor = 2301;
-
-// Initial position (it's possible to set it in conf file)
-struct point start_point = {"new_1-1.gat", 53, 111};
-
-struct gm_account *gm_account = NULL;
-int GM_num = 0;
-
-// online players by [Yor]
-char online_txt_filename[1024] = "online.txt";
-char online_html_filename[1024] = "online.html";
-int online_sorting_option = 0; // sorting option to display online players in online files
-int online_display_option = 1; // display options: to know which columns must be displayed
-int online_players_max;
-int online_refresh_html = 20; // refresh time (in sec) of the html file in the explorer
-int online_gm_display_min_level = 20; // minimum GM level to display 'GM' when we want to display it
-
-struct online_chars {
- int char_id;
- int server;
-} *online_chars;
-
-time_t update_online; // to update online files when we receiving information from a server (not less than 8 seconds)
-
-int console = 0;
-
-//------------------------------
-// Writing function of logs file
-//------------------------------
-int char_log(char *fmt, ...) {
- if(log_char)
- {
- FILE *logfp;
- va_list ap;
- struct timeval tv;
- char tmpstr[2048];
-
- va_start(ap, fmt);
-
- logfp = fopen(char_log_filename, "a");
- if (logfp) {
- if (fmt[0] == '\0') // jump a line if no message
- fprintf(logfp, RETCODE);
- else {
- gettimeofday(&tv, NULL);
- strftime(tmpstr, 24, "%d-%m-%Y %H:%M:%S", localtime((const time_t*)&(tv.tv_sec)));
- sprintf(tmpstr + 19, ".%03d: %s", (int)tv.tv_usec / 1000, fmt);
- vfprintf(logfp, tmpstr, ap);
- }
- fclose(logfp);
- }
- va_end(ap);
- }
- return 0;
-}
-
-//----------------------------------------------------------------------
-// Determine if an account (id) is a GM account
-// and returns its level (or 0 if it isn't a GM account or if not found)
-//----------------------------------------------------------------------
-int isGM(int account_id) {
- int i;
-
- for(i = 0; i < GM_num; i++)
- if (gm_account[i].account_id == account_id)
- return gm_account[i].level;
- return 0;
-}
-
-//----------------------------------------------
-// Search an character id
-// (return character index or -1 (if not found))
-// If exact character name is not found,
-// the function checks without case sensitive
-// and returns index if only 1 character is found
-// and similar to the searched name.
-//----------------------------------------------
-int search_character_index(char* character_name) {
- int i, quantity, index;
-
- quantity = 0;
- index = -1;
- for(i = 0; i < char_num; i++) {
- // Without case sensitive check (increase the number of similar character names found)
- if (stricmp(char_dat[i].name, character_name) == 0) {
- // Strict comparison (if found, we finish the function immediatly with correct value)
- if (strcmp(char_dat[i].name, character_name) == 0)
- return i;
- quantity++;
- index = i;
- }
- }
- // Here, the exact character name is not found
- // We return the found index of a similar account ONLY if there is 1 similar character
- if (quantity == 1)
- return index;
-
- // Exact character name is not found and 0 or more than 1 similar characters have been found ==> we say not found
- return -1;
-}
-
-//-------------------------------------
-// Return character name with the index
-//-------------------------------------
-char * search_character_name(int index) {
-
- if (index >= 0 && index < char_num)
- return char_dat[index].name;
-
- return unknown_char_name;
-}
-
-//-------------------------------------------------
-// Set Character online/offline [Wizputer]
-//-------------------------------------------------
-
-void set_char_online(int char_id, int account_id) {
- if (login_fd <= 0 || session[login_fd]->eof)
- return;
- WFIFOW(login_fd,0) = 0x272b;
- WFIFOL(login_fd,2) = account_id;
- WFIFOSET(login_fd,6);
-}
-void set_char_offline(int char_id, int account_id) {
- if (login_fd <= 0 || session[login_fd]->eof)
- return;
- WFIFOW(login_fd,0) = 0x272c;
- WFIFOL(login_fd,2) = account_id;
- WFIFOSET(login_fd,6);
-}
-
-/*---------------------------------------------------
- Make a data line for friends list
- --------------------------------------------------*/
-
-int mmo_friends_list_data_str(char *str, struct mmo_charstatus *p) {
- int i;
- char *str_p = str;
- str_p += sprintf(str_p, "%d", p->char_id);
-
- for (i=0;i<20;i++)
- {
- str_p += sprintf(str_p, ",%d,%s", p->friend_id[i],p->friend_name[i]);
- }
- return 0;
-}
-
-//-------------------------------------------------
-// Function to create the character line (for save)
-//-------------------------------------------------
-int mmo_char_tostr(char *str, struct mmo_charstatus *p) {
- int i;
- char *str_p = str;
-
- // on multi-map server, sometimes it's posssible that last_point become void. (reason???) We check that to not lost character at restart.
- if (p->last_point.map[0] == '\0') {
- memcpy(p->last_point.map, "prontera.gat", 16);
- p->last_point.x = 273;
- p->last_point.y = 354;
- }
-
- str_p += sprintf(str_p, "%d\t%d,%d\t%s\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
- "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
- "\t%s,%d,%d\t%s,%d,%d,%d,%d,%d,%d\t",
- p->char_id, p->account_id, p->char_num, p->name, //
- p->class_, p->base_level, p->job_level,
- p->base_exp, p->job_exp, p->zeny,
- p->hp, p->max_hp, p->sp, p->max_sp,
- p->str, p->agi, p->vit, p->int_, p->dex, p->luk,
- p->status_point, p->skill_point,
- p->option, p->karma, p->manner, //
- p->party_id, p->guild_id, p->pet_id,
- p->hair, p->hair_color, p->clothes_color,
- p->weapon, p->shield, p->head_top, p->head_mid, p->head_bottom,
- p->last_point.map, p->last_point.x, p->last_point.y, //
- p->save_point.map, p->save_point.x, p->save_point.y,
- p->partner_id,p->father,p->mother,p->child);
- for(i = 0; i < 10; i++)
- if (p->memo_point[i].map[0]) {
- str_p += sprintf(str_p, "%s,%d,%d", p->memo_point[i].map, p->memo_point[i].x, p->memo_point[i].y);
- }
- *(str_p++) = '\t';
-
- for(i = 0; i < MAX_INVENTORY; i++)
- if (p->inventory[i].nameid) {
- str_p += sprintf(str_p, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ",
- p->inventory[i].id, p->inventory[i].nameid, p->inventory[i].amount, p->inventory[i].equip,
- p->inventory[i].identify, p->inventory[i].refine, p->inventory[i].attribute,
- p->inventory[i].card[0], p->inventory[i].card[1], p->inventory[i].card[2], p->inventory[i].card[3]);
- }
- *(str_p++) = '\t';
-
- for(i = 0; i < MAX_CART; i++)
- if (p->cart[i].nameid) {
- str_p += sprintf(str_p, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ",
- p->cart[i].id, p->cart[i].nameid, p->cart[i].amount, p->cart[i].equip,
- p->cart[i].identify, p->cart[i].refine, p->cart[i].attribute,
- p->cart[i].card[0], p->cart[i].card[1], p->cart[i].card[2], p->cart[i].card[3]);
- }
- *(str_p++) = '\t';
-
- for(i = 0; i < MAX_SKILL; i++)
- if (p->skill[i].id && p->skill[i].flag != 1) {
- str_p += sprintf(str_p, "%d,%d ", p->skill[i].id, (p->skill[i].flag == 0) ? p->skill[i].lv : p->skill[i].flag-2);
- }
- *(str_p++) = '\t';
-
- for(i = 0; i < p->global_reg_num; i++)
- if (p->global_reg[i].str[0])
- str_p += sprintf(str_p, "%s,%d ", p->global_reg[i].str, p->global_reg[i].value);
- *(str_p++) = '\t';
-
- *str_p = '\0';
- return 0;
-}
-
-//-------------------------------------------------------------------------
-// Function to set the character from the line (at read of characters file)
-//-------------------------------------------------------------------------
-int mmo_char_fromstr(char *str, struct mmo_charstatus *p) {
- int tmp_int[256];
- int set, next, len, i;
-
- // initilialise character
- memset(p, '\0', sizeof(struct mmo_charstatus));
-
- // If it's not char structure of version 1363 and after
- if ((set = sscanf(str, "%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
- "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
- "\t%[^,],%d,%d\t%[^,],%d,%d,%d,%d,%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], p->name, //
- &tmp_int[3], &tmp_int[4], &tmp_int[5],
- &tmp_int[6], &tmp_int[7], &tmp_int[8],
- &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12],
- &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18],
- &tmp_int[19], &tmp_int[20],
- &tmp_int[21], &tmp_int[22], &tmp_int[23], //
- &tmp_int[24], &tmp_int[25], &tmp_int[26],
- &tmp_int[27], &tmp_int[28], &tmp_int[29],
- &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
- p->last_point.map, &tmp_int[35], &tmp_int[36], //
- p->save_point.map, &tmp_int[37], &tmp_int[38], &tmp_int[39],
- &tmp_int[40], &tmp_int[41], &tmp_int[42], &next)) != 46) {
- tmp_int[40] = 0; // father
- tmp_int[41] = 0; // mother
- tmp_int[42] = 0; // child
- // If it's not char structure of version 1008 and before 1363
- if ((set = sscanf(str, "%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
- "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
- "\t%[^,],%d,%d\t%[^,],%d,%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], p->name, //
- &tmp_int[3], &tmp_int[4], &tmp_int[5],
- &tmp_int[6], &tmp_int[7], &tmp_int[8],
- &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12],
- &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18],
- &tmp_int[19], &tmp_int[20],
- &tmp_int[21], &tmp_int[22], &tmp_int[23], //
- &tmp_int[24], &tmp_int[25], &tmp_int[26],
- &tmp_int[27], &tmp_int[28], &tmp_int[29],
- &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
- p->last_point.map, &tmp_int[35], &tmp_int[36], //
- p->save_point.map, &tmp_int[37], &tmp_int[38], &tmp_int[39], &next)) != 43) {
- tmp_int[39] = 0; // partner id
- // If not char structure from version 384 to 1007
- if ((set = sscanf(str, "%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
- "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
- "\t%[^,],%d,%d\t%[^,],%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], p->name, //
- &tmp_int[3], &tmp_int[4], &tmp_int[5],
- &tmp_int[6], &tmp_int[7], &tmp_int[8],
- &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12],
- &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18],
- &tmp_int[19], &tmp_int[20],
- &tmp_int[21], &tmp_int[22], &tmp_int[23], //
- &tmp_int[24], &tmp_int[25], &tmp_int[26],
- &tmp_int[27], &tmp_int[28], &tmp_int[29],
- &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
- p->last_point.map, &tmp_int[35], &tmp_int[36], //
- p->save_point.map, &tmp_int[37], &tmp_int[38], &next)) != 42) {
- // It's char structure of a version before 384
- tmp_int[26] = 0; // pet id
- set = sscanf(str, "%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
- "\t%d,%d,%d\t%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
- "\t%[^,],%d,%d\t%[^,],%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], p->name, //
- &tmp_int[3], &tmp_int[4], &tmp_int[5],
- &tmp_int[6], &tmp_int[7], &tmp_int[8],
- &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12],
- &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18],
- &tmp_int[19], &tmp_int[20],
- &tmp_int[21], &tmp_int[22], &tmp_int[23], //
- &tmp_int[24], &tmp_int[25], //
- &tmp_int[27], &tmp_int[28], &tmp_int[29],
- &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
- p->last_point.map, &tmp_int[35], &tmp_int[36], //
- p->save_point.map, &tmp_int[37], &tmp_int[38], &next);
- set += 2;
- //printf("char: old char data ver.1\n");
- // Char structure of version 1007 or older
- } else {
- set++;
- //printf("char: old char data ver.2\n");
- }
- // Char structure of version 1008+
- } else {
- set+=3;
- //printf("char: new char data ver.3\n");
- }
- // Char structture of version 1363+
- } else {
- //printf("char: new char data ver.4\n");
- }
- if (set != 46)
- return 0;
-
- p->char_id = tmp_int[0];
- p->account_id = tmp_int[1];
- p->char_num = tmp_int[2];
- p->class_ = tmp_int[3];
- p->base_level = tmp_int[4];
- p->job_level = tmp_int[5];
- p->base_exp = tmp_int[6];
- p->job_exp = tmp_int[7];
- p->zeny = tmp_int[8];
- p->hp = tmp_int[9];
- p->max_hp = tmp_int[10];
- p->sp = tmp_int[11];
- p->max_sp = tmp_int[12];
- p->str = tmp_int[13];
- p->agi = tmp_int[14];
- p->vit = tmp_int[15];
- p->int_ = tmp_int[16];
- p->dex = tmp_int[17];
- p->luk = tmp_int[18];
- p->status_point = tmp_int[19];
- p->skill_point = tmp_int[20];
- p->option = tmp_int[21];
- p->karma = tmp_int[22];
- p->manner = tmp_int[23];
- p->party_id = tmp_int[24];
- p->guild_id = tmp_int[25];
- p->pet_id = tmp_int[26];
- p->hair = tmp_int[27];
- p->hair_color = tmp_int[28];
- p->clothes_color = tmp_int[29];
- p->weapon = tmp_int[30];
- p->shield = tmp_int[31];
- p->head_top = tmp_int[32];
- p->head_mid = tmp_int[33];
- p->head_bottom = tmp_int[34];
- p->last_point.x = tmp_int[35];
- p->last_point.y = tmp_int[36];
- p->save_point.x = tmp_int[37];
- p->save_point.y = tmp_int[38];
- p->partner_id = tmp_int[39];
- p->father = tmp_int[40];
- p->mother = tmp_int[41];
- p->child = tmp_int[42];
-
- // Some checks
- for(i = 0; i < char_num; i++) {
- if (char_dat[i].char_id == p->char_id) {
- printf("\033[1;31mmmo_auth_init: ******Error: a character has an identical id to another.\n");
- printf(" character id #%d -> new character not readed.\n", p->char_id);
- printf(" Character saved in log file.\033[0m\n");
- return -1;
- } else if (strcmp(char_dat[i].name, p->name) == 0) {
- printf("\033[1;31mmmo_auth_init: ******Error: character name already exists.\n");
- printf(" character name '%s' -> new character not readed.\n", p->name);
- printf(" Character saved in log file.\033[0m\n");
- return -2;
- }
- }
-
- if (strcmpi(wisp_server_name, p->name) == 0) {
- printf("mmo_auth_init: ******WARNING: character name has wisp server name.\n");
- printf(" Character name '%s' = wisp server name '%s'.\n", p->name, wisp_server_name);
- printf(" Character readed. Suggestion: change the wisp server name.\n");
- char_log("mmo_auth_init: ******WARNING: character name has wisp server name: Character name '%s' = wisp server name '%s'." RETCODE,
- p->name, wisp_server_name);
- }
-
- if (str[next] == '\n' || str[next] == '\r')
- return 1; // V‹Kƒf[ƒ^
-
- next++;
-
- for(i = 0; str[next] && str[next] != '\t'; i++) {
- if (sscanf(str+next, "%[^,],%d,%d%n", p->memo_point[i].map, &tmp_int[0], &tmp_int[1], &len) != 3)
- return -3;
- p->memo_point[i].x = tmp_int[0];
- p->memo_point[i].y = tmp_int[1];
- next += len;
- if (str[next] == ' ')
- next++;
- }
-
- next++;
-
- for(i = 0; str[next] && str[next] != '\t'; i++) {
- if (sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
- &tmp_int[4], &tmp_int[5], &tmp_int[6],
- &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[10], &len) == 12) {
- // do nothing, it's ok
- } else if (sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
- &tmp_int[4], &tmp_int[5], &tmp_int[6],
- &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &len) == 11) {
- } else // invalid structure
- return -4;
- p->inventory[i].id = tmp_int[0];
- p->inventory[i].nameid = tmp_int[1];
- p->inventory[i].amount = tmp_int[2];
- p->inventory[i].equip = tmp_int[3];
- p->inventory[i].identify = tmp_int[4];
- p->inventory[i].refine = tmp_int[5];
- p->inventory[i].attribute = tmp_int[6];
- p->inventory[i].card[0] = tmp_int[7];
- p->inventory[i].card[1] = tmp_int[8];
- p->inventory[i].card[2] = tmp_int[9];
- p->inventory[i].card[3] = tmp_int[10];
- next += len;
- if (str[next] == ' ')
- next++;
- }
-
- next++;
-
- for(i = 0; str[next] && str[next] != '\t'; i++) {
- if (sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
- &tmp_int[4], &tmp_int[5], &tmp_int[6],
- &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[10], &len) == 12) {
- // do nothing, it's ok
- } else if (sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
- &tmp_int[4], &tmp_int[5], &tmp_int[6],
- &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &len) == 11) {
- } else // invalid structure
- return -5;
- p->cart[i].id = tmp_int[0];
- p->cart[i].nameid = tmp_int[1];
- p->cart[i].amount = tmp_int[2];
- p->cart[i].equip = tmp_int[3];
- p->cart[i].identify = tmp_int[4];
- p->cart[i].refine = tmp_int[5];
- p->cart[i].attribute = tmp_int[6];
- p->cart[i].card[0] = tmp_int[7];
- p->cart[i].card[1] = tmp_int[8];
- p->cart[i].card[2] = tmp_int[9];
- p->cart[i].card[3] = tmp_int[10];
- next += len;
- if (str[next] == ' ')
- next++;
- }
-
- next++;
-
- for(i = 0; str[next] && str[next] != '\t'; i++) {
- if (sscanf(str + next, "%d,%d%n", &tmp_int[0], &tmp_int[1], &len) != 2)
- return -6;
- p->skill[tmp_int[0]].id = tmp_int[0];
- p->skill[tmp_int[0]].lv = tmp_int[1];
- next += len;
- if (str[next] == ' ')
- next++;
- }
-
- next++;
-
- for(i = 0; str[next] && str[next] != '\t' && str[next] != '\n' && str[next] != '\r'; i++) { // global_regŽÀ‘•ˆÈ‘O‚Ìathena.txtŒÝŠ·‚Ì‚½‚߈ꉞ'\n'ƒ`ƒFƒbƒN
- if (sscanf(str + next, "%[^,],%d%n", p->global_reg[i].str, &p->global_reg[i].value, &len) != 2) {
- // because some scripts are not correct, the str can be "". So, we must check that.
- // If it's, we must not refuse the character, but just this REG value.
- // Character line will have something like: nov_2nd_cos,9 ,9 nov_1_2_cos_c,1 (here, ,9 is not good)
- if (str[next] == ',' && sscanf(str + next, ",%d%n", &p->global_reg[i].value, &len) == 1)
- i--;
- else
- return -7;
- }
- next += len;
- if (str[next] == ' ')
- next++;
- }
- p->global_reg_num = i;
-
- return 1;
-}
-//---------------------------------
-// Function to read friend list
-//---------------------------------
-
-int parse_friend_txt(struct mmo_charstatus *p)
-{
- char line[1024];
- int i,cid=0,temp[20];
- FILE *fp;
-
- // Open the file and look for the ID
- fp = fopen(friends_txt, "r");
-
- if(fp == NULL)
- return 1;
-
-
- while(fgets(line, sizeof(line)-1, fp)) {
-
- if(line[0] == '/' && line[1] == '/')
- continue;
-
- sscanf(line, "%d,%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%s",&cid,
- &temp[0],p->friend_name[0],
- &temp[1],p->friend_name[1],
- &temp[2],p->friend_name[2],
- &temp[3],p->friend_name[3],
- &temp[4],p->friend_name[4],
- &temp[5],p->friend_name[5],
- &temp[6],p->friend_name[6],
- &temp[7],p->friend_name[7],
- &temp[8],p->friend_name[8],
- &temp[9],p->friend_name[9],
- &temp[10],p->friend_name[10],
- &temp[11],p->friend_name[11],
- &temp[12],p->friend_name[12],
- &temp[13],p->friend_name[13],
- &temp[14],p->friend_name[14],
- &temp[15],p->friend_name[15],
- &temp[16],p->friend_name[16],
- &temp[17],p->friend_name[17],
- &temp[18],p->friend_name[18],
- &temp[19],p->friend_name[19]);
- if (cid == p->char_id)
- break;
- }
-
- // No register of friends list
- if (cid == 0) {
- fclose(fp);
- return 0;
- }
-
- // Fill in the list
-
- for (i=0; i<20; i++)
- p->friend_id[i] = temp[i];
-
- fclose(fp);
- return 0;
-}
-
-//---------------------------------
-// Function to read characters file
-//---------------------------------
-int mmo_char_init(void) {
- char line[65536];
- int i;
- int ret, line_count;
- FILE *fp;
-
- char_max = 256;
- char_dat = (struct mmo_charstatus*)aCalloc(sizeof(struct mmo_charstatus) * 256, 1);
- if (!char_dat) {
- printf("out of memory: mmo_char_init (calloc of char_dat).\n");
- exit(1);
- }
- for(i = 0; i < char_max; i++)
- {
- online_chars[i].char_id = -1;
- online_chars[i].server = -1;
- }
-
- char_num = 0;
-
- fp = fopen(char_txt, "r");
-
- if (fp == NULL) {
- printf("Characters file not found: %s.\n", char_txt);
- char_log("Characters file not found: %s." RETCODE, char_txt);
- char_log("Id for the next created character: %d." RETCODE, char_id_count);
- return 0;
- }
-
- line_count = 0;
- while(fgets(line, sizeof(line)-1, fp)) {
- int i, j;
- line_count++;
-
- if (line[0] == '/' && line[1] == '/')
- continue;
- line[sizeof(line)-1] = '\0';
-
- j = 0;
- if (sscanf(line, "%d\t%%newid%%%n", &i, &j) == 1 && j > 0) {
- if (char_id_count < i)
- char_id_count = i;
- continue;
- }
-
- if (char_num >= char_max) {
- char_max += 256;
- char_dat = (struct mmo_charstatus*)aRealloc(char_dat, sizeof(struct mmo_charstatus) * char_max);
- if (!char_dat) {
- printf("Out of memory: mmo_char_init (realloc of char_dat).\n");
- char_log("Out of memory: mmo_char_init (realloc of char_dat)." RETCODE);
- exit(1);
- }
- online_chars = (struct online_chars*)aRealloc(online_chars, sizeof(struct online_chars) * char_max);
- if (!online_chars) {
- printf("Out of memory: mmo_char_init (realloc of online_chars).\n");
- char_log("Out of memory: mmo_char_init (realloc of online_chars)." RETCODE);
- exit(1);
- }
- for(i = char_max - 256; i < char_max; i++)
- {
- online_chars[i].char_id = -1;
- online_chars[i].server = -1;
- }
- }
-
- ret = mmo_char_fromstr(line, &char_dat[char_num]);
-
- // Initialize friends list
- parse_friend_txt(&char_dat[char_num]); // Grab friends for the character
-
- if (ret > 0) { // negative value or zero for errors
- if (char_dat[char_num].char_id >= char_id_count)
- char_id_count = char_dat[char_num].char_id + 1;
- char_num++;
- } else {
- printf("mmo_char_init: in characters file, unable to read the line #%d.\n", line_count);
- printf(" -> Character saved in log file.\n");
- switch (ret) {
- case -1:
- char_log("Duplicate character id in the next character line (character not readed):" RETCODE);
- break;
- case -2:
- char_log("Duplicate character name in the next character line (character not readed):" RETCODE);
- break;
- case -3:
- char_log("Invalid memo point structure in the next character line (character not readed):" RETCODE);
- break;
- case -4:
- char_log("Invalid inventory item structure in the next character line (character not readed):" RETCODE);
- break;
- case -5:
- char_log("Invalid cart item structure in the next character line (character not readed):" RETCODE);
- break;
- case -6:
- char_log("Invalid skill structure in the next character line (character not readed):" RETCODE);
- break;
- case -7:
- char_log("Invalid register structure in the next character line (character not readed):" RETCODE);
- break;
- default: // 0
- char_log("Unabled to get a character in the next line - Basic structure of line (before inventory) is incorrect (character not readed):" RETCODE);
- break;
- }
- char_log("%s", line);
- }
- }
- fclose(fp);
-
- if (char_num == 0) {
- printf("mmo_char_init: No character found in %s.\n", char_txt);
- char_log("mmo_char_init: No character found in %s." RETCODE, char_txt);
- } else if (char_num == 1) {
- printf("mmo_char_init: 1 character read in %s.\n", char_txt);
- char_log("mmo_char_init: 1 character read in %s." RETCODE, char_txt);
- } else {
- printf("mmo_char_init: %d characters read in %s.\n", char_num, char_txt);
- char_log("mmo_char_init: %d characters read in %s." RETCODE, char_num, char_txt);
- }
-
- char_log("Id for the next created character: %d." RETCODE, char_id_count);
-
- return 0;
-}
-
-//---------------------------------------------------------
-// Function to save characters in files (speed up by [Yor])
-//---------------------------------------------------------
-void mmo_char_sync(void) {
- char line[65536],f_line[1024];
- int i, j, k;
- int lock;
- FILE *fp,*f_fp;
- //int *id = (int *) aMalloc(sizeof(int) * char_num);
- CREATE_BUFFER(id, int, char_num);
-
- // Sorting before save (by [Yor])
- for(i = 0; i < char_num; i++) {
- id[i] = i;
- for(j = 0; j < i; j++) {
- if ((char_dat[i].account_id < char_dat[id[j]].account_id) ||
- // if same account id, we sort by slot.
- (char_dat[i].account_id == char_dat[id[j]].account_id &&
- char_dat[i].char_num < char_dat[id[j]].char_num)) {
- for(k = i; k > j; k--)
- id[k] = id[k-1];
- id[j] = i; // id[i]
- break;
- }
- }
- }
-
- // Data save
- fp = lock_fopen(char_txt, &lock);
- if (fp == NULL) {
- printf("WARNING: Server can't not save characters.\n");
- char_log("WARNING: Server can't not save characters." RETCODE);
- } else {
- for(i = 0; i < char_num; i++) {
- // create only once the line, and save it in the 2 files (it's speeder than repeat twice the loop and create twice the line)
- mmo_char_tostr(line, &char_dat[id[i]]); // use of sorted index
- fprintf(fp, "%s" RETCODE, line);
- }
- fprintf(fp, "%d\t%%newid%%" RETCODE, char_id_count);
- lock_fclose(fp, char_txt, &lock);
- }
-
- // Data save (backup)
- if (backup_txt_flag) { // The backup_txt file was created because char deletion bug existed. Now it's finish and that take a lot of time to create a second file when there are a lot of characters. => option By [Yor]
- fp = lock_fopen(backup_txt, &lock);
- if (fp == NULL) {
- printf("WARNING: Server can't not create backup of characters file.\n");
- char_log("WARNING: Server can't not create backup of characters file." RETCODE);
- //aFree(id); // free up the memory before leaving -.- [Ajarn]
- DELETE_BUFFER(id);
- return;
- }
- for(i = 0; i < char_num; i++) {
- // create only once the line, and save it in the 2 files (it's speeder than repeat twice the loop and create twice the line)
- mmo_char_tostr(line, &char_dat[id[i]]); // use of sorted index
- fprintf(fp, "%s" RETCODE, line);
- }
- fprintf(fp, "%d\t%%newid%%" RETCODE, char_id_count);
- lock_fclose(fp, backup_txt, &lock);
- }
-
- // Friends List data save (davidsiaw)
- f_fp = lock_fopen(friends_txt, &lock);
- for(i = 0; i < char_num; i++) {
- mmo_friends_list_data_str(f_line, &char_dat[id[i]]);
- fprintf(f_fp, "%s" RETCODE, f_line);
- }
-
- lock_fclose(f_fp, friends_txt, &lock);
-
- //aFree(id);
- DELETE_BUFFER(id);
-
- return;
-}
-
-//----------------------------------------------------
-// Function to save (in a periodic way) datas in files
-//----------------------------------------------------
-int mmo_char_sync_timer(int tid, unsigned int tick, int id, int data) {
- mmo_char_sync();
- inter_save();
- return 0;
-}
-
-//-----------------------------------
-// Function to create a new character
-//-----------------------------------
-int make_new_char(int fd, unsigned char *dat) {
- int i, j;
- struct char_session_data *sd;
-
- sd = (struct char_session_data*)session[fd]->session_data;
-
- // remove control characters from the name
- dat[23] = '\0';
- if (remove_control_chars((unsigned char *)(char*)dat)) {
- char_log("Make new char error (control char received in the name): (connection #%d, account: %d)." RETCODE,
- fd, sd->account_id);
- return -1;
- }
-
- // check lenght of character name
- if (strlen((const char*)dat) < 4) {
- char_log("Make new char error (character name too small): (connection #%d, account: %d, name: '%s')." RETCODE,
- fd, sd->account_id, dat);
- return -1;
- }
-
- // Check Authorised letters/symbols in the name of the character
- if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
- for (i = 0; dat[i]; i++)
- if (strchr(char_name_letters, dat[i]) == NULL) {
- char_log("Make new char error (invalid letter in the name): (connection #%d, account: %d), name: %s, invalid letter: %c." RETCODE,
- fd, sd->account_id, dat, dat[i]);
- return -1;
- }
- } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
- for (i = 0; dat[i]; i++)
- if (strchr(char_name_letters, dat[i]) != NULL) {
- char_log("Make new char error (invalid letter in the name): (connection #%d, account: %d), name: %s, invalid letter: %c." RETCODE,
- fd, sd->account_id, dat, dat[i]);
- return -1;
- }
- } // else, all letters/symbols are authorised (except control char removed before)
-
- if (dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29] != 5*6 || // stats
- dat[30] >= 9 || // slots (dat[30] can not be negativ)
- dat[33] <= 0 || dat[33] >= 20 || // hair style
- dat[31] >= 9) { // hair color (dat[31] can not be negativ)
- char_log("Make new char error (invalid values): (connection #%d, account: %d) slot %d, name: %s, stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d" RETCODE,
- fd, sd->account_id, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]);
- return -1;
- }
-
- // check individual stat value
- for(i = 24; i <= 29; i++) {
- if (dat[i] < 1 || dat[i] > 9) {
- char_log("Make new char error (invalid stat value: not between 1 to 9): (connection #%d, account: %d) slot %d, name: %s, stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d" RETCODE,
- fd, sd->account_id, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]);
- return -1;
- }
- }
-
- for(i = 0; i < char_num; i++) {
- if ((name_ignoring_case != 0 && strcmp(char_dat[i].name, (const char*)dat) == 0) ||
- (name_ignoring_case == 0 && strcmpi(char_dat[i].name, (const char*)dat) == 0)) {
- char_log("Make new char error (name already exists): (connection #%d, account: %d) slot %d, name: %s (actual name of other char: %d), stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d." RETCODE,
- fd, sd->account_id, dat[30], dat, char_dat[i].name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]);
- return -1;
- }
- if (char_dat[i].account_id == sd->account_id && char_dat[i].char_num == dat[30]) {
- char_log("Make new char error (slot already used): (connection #%d, account: %d) slot %d, name: %s (actual name of other char: %d), stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d." RETCODE,
- fd, sd->account_id, dat[30], dat, char_dat[i].name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]);
- return -1;
- }
- }
-
- if (strcmp(wisp_server_name, (const char*)dat) == 0) {
- char_log("Make new char error (name used is wisp name for server): (connection #%d, account: %d) slot %d, name: %s (actual name of other char: %d), stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d." RETCODE,
- fd, sd->account_id, dat[30], dat, char_dat[i].name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]);
- return -1;
- }
-
- if (char_num >= char_max) {
- char_max += 256;
- char_dat = (struct mmo_charstatus*)aRealloc(char_dat, sizeof(struct mmo_charstatus) * char_max);
- if (!char_dat) {
- printf("Out of memory: make_new_char (realloc of char_dat).\n");
- char_log("Out of memory: make_new_char (realloc of char_dat)." RETCODE);
- exit(1);
- }
- online_chars = (struct online_chars*)aRealloc(online_chars, sizeof(struct online_chars) * char_max);
- if (!online_chars) {
- printf("Out of memory: make_new_char (realloc of online_chars).\n");
- char_log("Out of memory: make_new_char (realloc of online_chars)." RETCODE);
- exit(1);
- }
- for(j = char_max - 256; j < char_max; j++) {
- online_chars[j].char_id = -1;
- online_chars[j].server = -1;
- }
- }
-
- char_log("Creation of New Character: (connection #%d, account: %d) slot %d, character Name: %s, stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d." RETCODE,
- fd, sd->account_id, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]);
-
- memset(&char_dat[i], 0, sizeof(struct mmo_charstatus));
-
- char_dat[i].char_id = char_id_count++;
- char_dat[i].account_id = sd->account_id;
- char_dat[i].char_num = dat[30];
- strcpy(char_dat[i].name, (const char*)dat);
- char_dat[i].class_ = 0;
- char_dat[i].base_level = 1;
- char_dat[i].job_level = 1;
- char_dat[i].base_exp = 0;
- char_dat[i].job_exp = 0;
- char_dat[i].zeny = start_zeny;
- char_dat[i].str = dat[24];
- char_dat[i].agi = dat[25];
- char_dat[i].vit = dat[26];
- char_dat[i].int_ = dat[27];
- char_dat[i].dex = dat[28];
- char_dat[i].luk = dat[29];
- char_dat[i].max_hp = 40 * (100 + char_dat[i].vit) / 100;
- char_dat[i].max_sp = 11 * (100 + char_dat[i].int_) / 100;
- char_dat[i].hp = char_dat[i].max_hp;
- char_dat[i].sp = char_dat[i].max_sp;
- char_dat[i].status_point = 0;
- char_dat[i].skill_point = 0;
- char_dat[i].option = 0;
- char_dat[i].karma = 0;
- char_dat[i].manner = 0;
- char_dat[i].party_id = 0;
- char_dat[i].guild_id = 0;
- char_dat[i].hair = dat[33];
- char_dat[i].hair_color = dat[31];
- char_dat[i].clothes_color = 0;
- char_dat[i].inventory[0].nameid = start_weapon; // Knife
- char_dat[i].inventory[0].amount = 1;
- char_dat[i].inventory[0].equip = 0x02;
- char_dat[i].inventory[0].identify = 1;
- char_dat[i].inventory[1].nameid = start_armor; // Cotton Shirt
- char_dat[i].inventory[1].amount = 1;
- char_dat[i].inventory[1].equip = 0x10;
- char_dat[i].inventory[1].identify = 1;
- char_dat[i].weapon = 1;
- char_dat[i].shield = 0;
- char_dat[i].head_top = 0;
- char_dat[i].head_mid = 0;
- char_dat[i].head_bottom = 0;
- memcpy(&char_dat[i].last_point, &start_point, sizeof(start_point));
- memcpy(&char_dat[i].save_point, &start_point, sizeof(start_point));
- char_num++;
-
- mmo_char_sync();
- return i;
-}
-
-//----------------------------------------------------
-// This function return the name of the job (by [Yor])
-//----------------------------------------------------
-char * job_name(int class_) {
- switch (class_) {
- case 0: return "Novice";
- case 1: return "Swordsman";
- case 2: return "Mage";
- case 3: return "Archer";
- case 4: return "Acolyte";
- case 5: return "Merchant";
- case 6: return "Thief";
- case 7: return "Knight";
- case 8: return "Priest";
- case 9: return "Wizard";
- case 10: return "Blacksmith";
- case 11: return "Hunter";
- case 12: return "Assassin";
- case 13: return "Knight 2";
- case 14: return "Crusader";
- case 15: return "Monk";
- case 16: return "Sage";
- case 17: return "Rogue";
- case 18: return "Alchemist";
- case 19: return "Bard";
- case 20: return "Dancer";
- case 21: return "Crusader 2";
- case 22: return "Wedding";
- case 23: return "Super Novice";
- case 4001: return "Novice High";
- case 4002: return "Swordsman High";
- case 4003: return "Mage High";
- case 4004: return "Archer High";
- case 4005: return "Acolyte High";
- case 4006: return "Merchant High";
- case 4007: return "Thief High";
- case 4008: return "Lord Knight";
- case 4009: return "High Priest";
- case 4010: return "High Wizard";
- case 4011: return "Whitesmith";
- case 4012: return "Sniper";
- case 4013: return "Assassin Cross";
- case 4014: return "Peko Knight";
- case 4015: return "Paladin";
- case 4016: return "Champion";
- case 4017: return "Professor";
- case 4018: return "Stalker";
- case 4019: return "Creator";
- case 4020: return "Clown";
- case 4021: return "Gypsy";
- case 4022: return "Peko Paladin";
- case 4023: return "Baby Novice";
- case 4024: return "Baby Swordsman";
- case 4025: return "Baby Mage";
- case 4026: return "Baby Archer";
- case 4027: return "Baby Acolyte";
- case 4028: return "Baby Merchant";
- case 4029: return "Baby Thief";
- case 4030: return "Baby Knight";
- case 4031: return "Baby Priest";
- case 4032: return "Baby Wizard";
- case 4033: return "Baby Blacksmith";
- case 4034: return "Baby Hunter";
- case 4035: return "Baby Assassin";
- case 4036: return "Baby Peco Knight";
- case 4037: return "Baby Crusader";
- case 4038: return "Baby Monk";
- case 4039: return "Baby Sage";
- case 4040: return "Baby Rogue";
- case 4041: return "Baby Alchemist";
- case 4042: return "Baby Bard";
- case 4043: return "Baby Dancer";
- case 4044: return "Baby Peco Crusader";
- case 4045: return "Super Baby";
- }
- return "Unknown Job";
-}
-
-//-------------------------------------------------------------
-// Function to create the online files (txt and html). by [Yor]
-//-------------------------------------------------------------
-void create_online_files(void) {
- int i, j, k, l; // for loops
- int players; // count the number of players
- FILE *fp; // for the txt file
- FILE *fp2; // for the html file
- char temp[256]; // to prepare what we must display
- time_t time_server; // for number of seconds
- struct tm *datetime; // variable for time in structure ->tm_mday, ->tm_sec, ...
- int id[4096];
-
- // don't return here if we display nothing, because server[j].users is updated in the first loop.
-
- // Get number of online players, id of each online players, and verify if a server is offline
- players = 0;
- for (i = 0; i < online_players_max; i++) {
- if (online_chars[i].char_id != -1) {
- // check if map-server is online
- j = online_chars[i].server;
- if (j == -1) {
- online_chars[i].char_id = -1;
- continue;
- } else if (server_fd[j] < 0) {
- server[j].users = 0;
- online_chars[i].char_id = -1;
- online_chars[i].server = -1;
- continue;
- }
- // check if the character is twice or more in the list
- // (multiple map-servers and player have successfully connected twice!)
- for(j = i + 1; j < online_players_max; j++)
- if (online_chars[i].char_id == online_chars[j].char_id) {
- k = online_chars[j].server;
- if (k != -1 && server_fd[k] >= 0 && server[k].users > 0)
- server[k].users--;
- online_chars[j].char_id = -1;
- online_chars[j].server = -1;
- }
- // search position of character in char_dat and sort online characters.
- for(j = 0; j < char_num; j++) {
- if (char_dat[j].char_id == online_chars[i].char_id) {
- id[players] = j;
- // use sorting option
- switch (online_sorting_option) {
- case 1: // by name (without case sensitive)
- for(k = 0; k < players; k++)
- if (stricmp(char_dat[j].name, char_dat[id[k]].name) < 0 ||
- // if same name, we sort with case sensitive.
- (stricmp(char_dat[j].name, char_dat[id[k]].name) == 0 &&
- strcmp(char_dat[j].name, char_dat[id[k]].name) < 0)) {
- for(l = players; l > k; l--)
- id[l] = id[l-1];
- id[k] = j; // id[players]
- break;
- }
- break;
- case 2: // by zeny
- for(k = 0; k < players; k++)
- if (char_dat[j].zeny < char_dat[id[k]].zeny ||
- // if same number of zenys, we sort by name.
- (char_dat[j].zeny == char_dat[id[k]].zeny &&
- stricmp(char_dat[j].name, char_dat[id[k]].name) < 0)) {
- for(l = players; l > k; l--)
- id[l] = id[l-1];
- id[k] = j; // id[players]
- break;
- }
- break;
- case 3: // by base level
- for(k = 0; k < players; k++)
- if (char_dat[j].base_level < char_dat[id[k]].base_level ||
- // if same base level, we sort by base exp.
- (char_dat[j].base_level == char_dat[id[k]].base_level &&
- char_dat[j].base_exp < char_dat[id[k]].base_exp)) {
- for(l = players; l > k; l--)
- id[l] = id[l-1];
- id[k] = j; // id[players]
- break;
- }
- break;
- case 4: // by job (and job level)
- for(k = 0; k < players; k++)
- if (char_dat[j].class_ < char_dat[id[k]].class_ ||
- // if same job, we sort by job level.
- (char_dat[j].class_ == char_dat[id[k]].class_ &&
- char_dat[j].job_level < char_dat[id[k]].job_level) ||
- // if same job and job level, we sort by job exp.
- (char_dat[j].class_ == char_dat[id[k]].class_ &&
- char_dat[j].job_level == char_dat[id[k]].job_level &&
- char_dat[j].job_exp < char_dat[id[k]].job_exp)) {
- for(l = players; l > k; l--)
- id[l] = id[l-1];
- id[k] = j; // id[players]
- break;
- }
- break;
- case 5: // by location map name
- for(k = 0; k < players; k++)
- if (stricmp(char_dat[j].last_point.map, char_dat[id[k]].last_point.map) < 0 ||
- // if same map name, we sort by name.
- (stricmp(char_dat[j].last_point.map, char_dat[id[k]].last_point.map) == 0 &&
- stricmp(char_dat[j].name, char_dat[id[k]].name) < 0)) {
- for(l = players; l > k; l--)
- id[l] = id[l-1];
- id[k] = j; // id[players]
- break;
- }
- break;
- default: // 0 or invalid value: no sorting
- break;
- }
- players++;
- break;
- }
- }
- }
- }
-
- if (online_display_option == 0) // we display nothing, so return
- return;
-
- // write files
- fp = fopen(online_txt_filename, "w");
- if (fp != NULL) {
- fp2 = fopen(online_html_filename, "w");
- if (fp2 != NULL) {
- // get time
- time(&time_server); // get time in seconds since 1/1/1970
- datetime = localtime(&time_server); // convert seconds in structure
- strftime(temp, sizeof(temp), "%d %b %Y %X", datetime); // like sprintf, but only for date/time (05 dec 2003 15:12:52)
- // write heading
- fprintf(fp2, "<HTML>\n");
- fprintf(fp2, " <META http-equiv=\"Refresh\" content=\"%d\">\n", online_refresh_html); // update on client explorer every x seconds
- fprintf(fp2, " <HEAD>\n");
- fprintf(fp2, " <TITLE>Online Players on %s</TITLE>\n", server_name);
- fprintf(fp2, " </HEAD>\n");
- fprintf(fp2, " <BODY>\n");
- fprintf(fp2, " <H3>Online Players on %s (%s):</H3>\n", server_name, temp);
- fprintf(fp, "Online Players on %s (%s):\n", server_name, temp);
- fprintf(fp, "\n");
-
- for (i = 0; i < players; i++) {
- // if it's the first player
- if (i == 0) {
- j = 0; // count the number of characters for the txt version and to set the separate line
- fprintf(fp2, " <table border=\"1\" cellspacing=\"1\">\n");
- fprintf(fp2, " <tr>\n");
- if ((online_display_option & 1) || (online_display_option & 64)) {
- fprintf(fp2, " <td><b>Name</b></td>\n");
- if (online_display_option & 64) {
- fprintf(fp, "Name "); // 30
- j += 30;
- } else {
- fprintf(fp, "Name "); // 25
- j += 25;
- }
- }
- if ((online_display_option & 6) == 6) {
- fprintf(fp2, " <td><b>Job (levels)</b></td>\n");
- fprintf(fp, "Job Levels "); // 27
- j += 27;
- } else if (online_display_option & 2) {
- fprintf(fp2, " <td><b>Job</b></td>\n");
- fprintf(fp, "Job "); // 19
- j += 19;
- } else if (online_display_option & 4) {
- fprintf(fp2, " <td><b>Levels</b></td>\n");
- fprintf(fp, " Levels "); // 8
- j += 8;
- }
- if (online_display_option & 24) { // 8 or 16
- fprintf(fp2, " <td><b>Location</b></td>\n");
- if (online_display_option & 16) {
- fprintf(fp, "Location ( x , y ) "); // 23
- j += 23;
- } else {
- fprintf(fp, "Location "); // 13
- j += 13;
- }
- }
- if (online_display_option & 32) {
- fprintf(fp2, " <td ALIGN=CENTER><b>zenys</b></td>\n");
- fprintf(fp, " Zenys "); // 16
- j += 16;
- }
- fprintf(fp2, " </tr>\n");
- fprintf(fp, "\n");
- for (k = 0; k < j; k++)
- fprintf(fp, "-");
- fprintf(fp, "\n");
- }
- fprintf(fp2, " <tr>\n");
- // get id of the character (more speed)
- j = id[i];
- // displaying the character name
- if ((online_display_option & 1) || (online_display_option & 64)) { // without/with 'GM' display
- strcpy(temp, char_dat[j].name);
- l = isGM(char_dat[j].account_id);
- if (online_display_option & 64) {
- if (l >= online_gm_display_min_level)
- fprintf(fp, "%-24s (GM) ", temp);
- else
- fprintf(fp, "%-24s ", temp);
- } else
- fprintf(fp, "%-24s ", temp);
- // name of the character in the html (no < >, because that create problem in html code)
- fprintf(fp2, " <td>");
- if ((online_display_option & 64) && l >= online_gm_display_min_level)
- fprintf(fp2, "<b>");
- for (k = 0; k < strlen(temp); k++) {
- switch(temp[k]) {
- case '<': // <
- fprintf(fp2, "&lt;");
- break;
- case '>': // >
- fprintf(fp2, "&gt;");
- break;
- default:
- fprintf(fp2, "%c", temp[k]);
- break;
- };
- }
- if ((online_display_option & 64) && l >= online_gm_display_min_level)
- fprintf(fp2, "</b> (GM)");
- fprintf(fp2, "</td>\n");
- }
- // displaying of the job
- if (online_display_option & 6) {
- char * jobname = job_name(char_dat[j].class_);
- if ((online_display_option & 6) == 6) {
- fprintf(fp2, " <td>%s %d/%d</td>\n", jobname, char_dat[j].base_level, char_dat[j].job_level);
- fprintf(fp, "%-18s %3d/%3d ", jobname, char_dat[j].base_level, char_dat[j].job_level);
- } else if (online_display_option & 2) {
- fprintf(fp2, " <td>%s</td>\n", jobname);
- fprintf(fp, "%-18s ", jobname);
- } else if (online_display_option & 4) {
- fprintf(fp2, " <td>%d/%d</td>\n", char_dat[j].base_level, char_dat[j].job_level);
- fprintf(fp, "%3d/%3d ", char_dat[j].base_level, char_dat[j].job_level);
- }
- }
- // displaying of the map
- if (online_display_option & 24) { // 8 or 16
- // prepare map name
- memset(temp, 0, 17);
- strncpy(temp, char_dat[j].last_point.map, 16);
- if (strstr(temp, ".gat") != NULL) {
- temp[strstr(temp, ".gat") - temp] = 0; // suppress the '.gat'
- }
- // write map name
- if (online_display_option & 16) { // map-name AND coordonates
- fprintf(fp2, " <td>%s (%d, %d)</td>\n", temp, char_dat[j].last_point.x, char_dat[j].last_point.y);
- fprintf(fp, "%-12s (%3d,%3d) ", temp, char_dat[j].last_point.x, char_dat[j].last_point.y);
- } else {
- fprintf(fp2, " <td>%s</td>\n", temp);
- fprintf(fp, "%-12s ", temp);
- }
- }
- // displaying nimber of zenys
- if (online_display_option & 32) {
- // write number of zenys
- if (char_dat[j].zeny == 0) { // if no zeny
- fprintf(fp2, " <td ALIGN=RIGHT>no zeny</td>\n");
- fprintf(fp, " no zeny ");
- } else {
- fprintf(fp2, " <td ALIGN=RIGHT>%d z</td>\n", char_dat[j].zeny);
- fprintf(fp, "%13d z ", char_dat[j].zeny);
- }
- }
- fprintf(fp, "\n");
- fprintf(fp2, " </tr>\n");
- }
- // If we display at least 1 player
- if (players > 0) {
- fprintf(fp2, " </table>\n");
- fprintf(fp, "\n");
- }
-
- // Displaying number of online players
- if (players == 0) {
- fprintf(fp2, " <p>No user is online.</p>\n");
- fprintf(fp, "No user is online.\n");
- } else if (players == 1) {
- fprintf(fp2, " <p>%d user is online.</p>\n", players);
- fprintf(fp, "%d user is online.\n", players);
- } else {
- fprintf(fp2, " <p>%d users are online.</p>\n", players);
- fprintf(fp, "%d users are online.\n", players);
- }
- fprintf(fp2, " </BODY>\n");
- fprintf(fp2, "</HTML>\n");
- fclose(fp2);
- }
- fclose(fp);
- }
-
- return;
-}
-
-//---------------------------------------------------------------------
-// This function return the number of online players in all map-servers
-//---------------------------------------------------------------------
-int count_users(void) {
- int i, users;
-
- users = 0;
- for(i = 0; i < MAX_MAP_SERVERS; i++)
- if (server_fd[i] >= 0)
- users += server[i].users;
-
- return users;
-}
-
-//----------------------------------------
-// Function to send characters to a player
-//----------------------------------------
-int mmo_char_send006b(int fd, struct char_session_data *sd) {
- int i, j, found_num;
- struct mmo_charstatus *p;
-#ifdef NEW_006b
- const int offset = 24;
-#else
- const int offset = 4;
-#endif
-
- found_num = 0;
- for(i = 0; i < char_num; i++) {
- if (char_dat[i].account_id == sd->account_id) {
- sd->found_char[found_num] = i;
- found_num++;
- if (found_num == 9)
- break;
- }
- }
- for(i = found_num; i < 9; i++)
- sd->found_char[i] = -1;
-
- memset(WFIFOP(fd,0), 0, offset + found_num * 106);
- WFIFOW(fd,0) = 0x6b;
- WFIFOW(fd,2) = offset + found_num * 106;
-
- for(i = 0; i < found_num; i++) {
- p = &char_dat[sd->found_char[i]];
- j = offset + (i * 106); // increase speed of code
-
- WFIFOL(fd,j) = p->char_id;
- WFIFOL(fd,j+4) = p->base_exp;
- WFIFOL(fd,j+8) = p->zeny;
- WFIFOL(fd,j+12) = p->job_exp;
- WFIFOL(fd,j+16) = p->job_level;
-
- WFIFOL(fd,j+20) = 0;
- WFIFOL(fd,j+24) = 0;
- WFIFOL(fd,j+28) = p->option;
-
- WFIFOL(fd,j+32) = p->karma;
- WFIFOL(fd,j+36) = p->manner;
-
- WFIFOW(fd,j+40) = p->status_point;
- WFIFOW(fd,j+42) = (p->hp > 0x7fff) ? 0x7fff : p->hp;
- WFIFOW(fd,j+44) = (p->max_hp > 0x7fff) ? 0x7fff : p->max_hp;
- WFIFOW(fd,j+46) = (p->sp > 0x7fff) ? 0x7fff : p->sp;
- WFIFOW(fd,j+48) = (p->max_sp > 0x7fff) ? 0x7fff : p->max_sp;
- WFIFOW(fd,j+50) = DEFAULT_WALK_SPEED; // p->speed;
- WFIFOW(fd,j+52) = p->class_;
- WFIFOW(fd,j+54) = p->hair;
-
- // pecopeco knights/crusaders crash fix
- if (p->class_ == 13 || p->class_ == 21 ||
- p->class_ == 4014 || p->class_ == 4022)
- WFIFOW(fd,j+56) = 0;
- else WFIFOW(fd,j+56) = p->weapon;
-
- WFIFOW(fd,j+58) = p->base_level;
- WFIFOW(fd,j+60) = p->skill_point;
- WFIFOW(fd,j+62) = p->head_bottom;
- WFIFOW(fd,j+64) = p->shield;
- WFIFOW(fd,j+66) = p->head_top;
- WFIFOW(fd,j+68) = p->head_mid;
- WFIFOW(fd,j+70) = p->hair_color;
- WFIFOW(fd,j+72) = p->clothes_color;
-
- memcpy(WFIFOP(fd,j+74), p->name, 24);
-
- WFIFOB(fd,j+98) = (p->str > 255) ? 255 : p->str;
- WFIFOB(fd,j+99) = (p->agi > 255) ? 255 : p->agi;
- WFIFOB(fd,j+100) = (p->vit > 255) ? 255 : p->vit;
- WFIFOB(fd,j+101) = (p->int_ > 255) ? 255 : p->int_;
- WFIFOB(fd,j+102) = (p->dex > 255) ? 255 : p->dex;
- WFIFOB(fd,j+103) = (p->luk > 255) ? 255 : p->luk;
- WFIFOB(fd,j+104) = p->char_num;
- }
-
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-int set_account_reg2(int acc, int num, struct global_reg *reg) {
- int i, c;
-
- c = 0;
- for(i = 0; i < char_num; i++) {
- if (char_dat[i].account_id == acc) {
- memcpy(char_dat[i].account_reg2, reg, sizeof(char_dat[i].account_reg2));
- char_dat[i].account_reg2_num = num;
- c++;
- }
- }
- return c;
-}
-
-// —£¥(char휎ž‚ÉŽg—p)
-int char_divorce(struct mmo_charstatus *cs) {
- if (cs == NULL)
- return 0;
-
- if (cs->partner_id > 0){
- int i, j;
- for(i = 0; i < char_num; i++) {
- if (char_dat[i].char_id == cs->partner_id && char_dat[i].partner_id == cs->char_id) {
- cs->partner_id = 0;
- char_dat[i].partner_id = 0;
- for(j = 0; j < MAX_INVENTORY; j++)
- if (char_dat[i].inventory[j].nameid == WEDDING_RING_M || char_dat[i].inventory[j].nameid == WEDDING_RING_F)
- memset(&char_dat[i].inventory[j], 0, sizeof(char_dat[i].inventory[0]));
- if (cs->inventory[j].nameid == WEDDING_RING_M || cs->inventory[j].nameid == WEDDING_RING_F)
- memset(&cs->inventory[j], 0, sizeof(cs->inventory[0]));
- return 0;
- }
- }
- }
- return 0;
-}
-
-//------------------------------------------------------------
-// E-mail check: return 0 (not correct) or 1 (valid). by [Yor]
-//------------------------------------------------------------
-int e_mail_check(char *email) {
- char ch;
- char* last_arobas;
-
- // athena limits
- if (strlen(email) < 3 || strlen(email) > 39)
- return 0;
-
- // part of RFC limits (official reference of e-mail description)
- if (strchr(email, '@') == NULL || email[strlen(email)-1] == '@')
- return 0;
-
- if (email[strlen(email)-1] == '.')
- return 0;
-
- last_arobas = strrchr(email, '@');
-
- if (strstr(last_arobas, "@.") != NULL ||
- strstr(last_arobas, "..") != NULL)
- return 0;
-
- for(ch = 1; ch < 32; ch++) {
- if (strchr(last_arobas, ch) != NULL) {
- return 0;
- break;
- }
- }
-
- if (strchr(last_arobas, ' ') != NULL ||
- strchr(last_arobas, ';') != NULL)
- return 0;
-
- // all correct
- return 1;
-}
-
-//----------------------------------------------------------------------
-// Force disconnection of an online player (with account value) by [Yor]
-//----------------------------------------------------------------------
-int disconnect_player(int accound_id) {
- int i;
- struct char_session_data *sd;
-
- // disconnect player if online on char-server
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = (struct char_session_data*)session[i]->session_data)) {
- if (sd->account_id == accound_id) {
- session[i]->eof = 1;
- return 1;
- }
- }
- }
-
- return 0;
-}
-
-// ƒLƒƒƒ‰íœ‚É”º‚¤ƒf[ƒ^íœ
-static int char_delete(struct mmo_charstatus *cs) {
- int j;
-
- // ƒyƒbƒgíœ
- if (cs->pet_id)
- inter_pet_delete(cs->pet_id);
- for (j = 0; j < MAX_INVENTORY; j++)
- if (cs->inventory[j].card[0] == (short)0xff00)
- inter_pet_delete(*((long *)(&cs->inventory[j].card[2])));
- for (j = 0; j < MAX_CART; j++)
- if (cs->cart[j].card[0] == (short)0xff00)
- inter_pet_delete(*((long *)(&cs->cart[j].card[2])));
- // ƒMƒ‹ƒh’E‘Þ
- if (cs->guild_id)
- inter_guild_leave(cs->guild_id, cs->account_id, cs->char_id);
- // ƒp[ƒeƒB[’E‘Þ
- if (cs->party_id)
- inter_party_leave(cs->party_id, cs->account_id);
- // —£¥
- if (cs->partner_id){
- // —£¥î•ñ‚ðmap‚É’Ê’m
- unsigned char buf[10];
- WBUFW(buf,0) = 0x2b12;
- WBUFL(buf,2) = cs->char_id;
- WBUFL(buf,6) = cs->partner_id;
- mapif_sendall(buf,10);
- // —£¥
- char_divorce(cs);
- }
- return 0;
-}
-
-int parse_tologin(int fd) {
- int i;
- struct char_session_data *sd;
-
- // only login-server can have an access to here.
- // so, if it isn't the login-server, we disconnect the session (fd != login_fd).
- if (fd != login_fd)
- session[fd]->eof = 1;
- if(session[fd]->eof) {
- if (fd == login_fd) {
- printf("Char-server can't connect to login-server (connection #%d).\n", fd);
- login_fd = -1;
- }
- close(fd);
- delete_session(fd);
- return 0;
- }
-
- sd = (struct char_session_data*)session[fd]->session_data;
-
- while(RFIFOREST(fd) >= 2) {
-// printf("parse_tologin: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd));
-
- switch(RFIFOW(fd,0)) {
- case 0x2711:
- if (RFIFOREST(fd) < 3)
- return 0;
- if (RFIFOB(fd,2)) {
-// printf("connect login server error : %d\n", RFIFOB(fd,2));
- printf("Can not connect to login-server.\n");
- printf("The server communication passwords (default s1/p1) is probably invalid.\n");
- printf("Also, please make sure your accounts file (default: accounts.txt) has those values present.\n");
- printf("If you changed the communication passwords, change them back at map_athena.conf and char_athena.conf\n");
- exit(1);
- } else {
- printf("Connected to login-server (connection #%d).\n", fd);
- // if no map-server already connected, display a message...
- for(i = 0; i < MAX_MAP_SERVERS; i++)
- if (server_fd[i] >= 0 && server[i].map[0][0]) // if map-server online and at least 1 map
- break;
- if (i == MAX_MAP_SERVERS)
- printf("Awaiting maps from map-server.\n");
- }
- RFIFOSKIP(fd,3);
- break;
-
- case 0x2713:
- if (RFIFOREST(fd) < 51)
- return 0;
-// printf("parse_tologin 2713 : %d\n", RFIFOB(fd,6));
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = (struct char_session_data*)session[i]->session_data) && sd->account_id == RFIFOL(fd,2)) {
- if (RFIFOB(fd,6) != 0) {
- WFIFOW(i,0) = 0x6c;
- WFIFOB(i,2) = 0x42;
- WFIFOSET(i,3);
- } else if (max_connect_user == 0 || count_users() < max_connect_user) {
-// if (max_connect_user == 0)
-// printf("max_connect_user (unlimited) -> accepted.\n");
-// else
-// printf("count_users(): %d < max_connect_user (%d) -> accepted.\n", count_users(), max_connect_user);
- memcpy(sd->email, RFIFOP(fd, 7), 40);
- if (e_mail_check(sd->email) == 0)
- strncpy(sd->email, "a@a.com", 40); // default e-mail
- sd->connect_until_time = (time_t)RFIFOL(fd,47);
- // send characters to player
- mmo_char_send006b(i, sd);
- } else if(isGM(sd->account_id) >= gm_allow_level) {
- sd->connect_until_time = (time_t)RFIFOL(fd,47);
- // send characters to player
- mmo_char_send006b(i, sd);
- } else {
- // refuse connection: too much online players
-// printf("count_users(): %d < max_connect_use (%d) -> fail...\n", count_users(), max_connect_user);
- WFIFOW(i,0) = 0x6c;
- WFIFOW(i,2) = 0;
- WFIFOSET(i,3);
- }
- break;
- }
- }
- RFIFOSKIP(fd,51);
- break;
-
- // Receiving of an e-mail/time limit from the login-server (answer of a request because a player comes back from map-server to char-server) by [Yor]
- case 0x2717:
- if (RFIFOREST(fd) < 50)
- return 0;
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = (struct char_session_data*)session[i]->session_data)) {
- if (sd->account_id == RFIFOL(fd,2)) {
- memcpy(sd->email, RFIFOP(fd,6), 40);
- if (e_mail_check(sd->email) == 0)
- strncpy(sd->email, "a@a.com", 40); // default e-mail
- sd->connect_until_time = (time_t)RFIFOL(fd,46);
- break;
- }
- }
- }
- RFIFOSKIP(fd,50);
- break;
-
- // login-server alive packet
- case 0x2718:
- if (RFIFOREST(fd) < 2)
- return 0;
- RFIFOSKIP(fd,2);
- break;
-
- // Receiving authentification from Freya-type login server (to avoid char->login->char)
- case 0x2719:
- if (RFIFOREST(fd) < 18)
- return 0;
- // to conserv a maximum of authentification, search if account is already authentified and replace it
- // that will reduce multiple connection too
- for(i = 0; i < AUTH_FIFO_SIZE; i++)
- if (auth_fifo[i].account_id == RFIFOL(fd,2))
- break;
- // if not found, use next value
- if (i == AUTH_FIFO_SIZE) {
- if (auth_fifo_pos >= AUTH_FIFO_SIZE)
- auth_fifo_pos = 0;
- i = auth_fifo_pos;
- auth_fifo_pos++;
- }
- //printf("auth_fifo set (auth #%d) - account: %d, secure: %08x-%08x\n", i, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10));
- auth_fifo[i].account_id = RFIFOL(fd,2);
- auth_fifo[i].char_id = 0;
- auth_fifo[i].login_id1 = RFIFOL(fd,6);
- auth_fifo[i].login_id2 = RFIFOL(fd,10);
- auth_fifo[i].delflag = 2; // 0: auth_fifo canceled/void, 2: auth_fifo received from login/map server in memory, 1: connection authentified
- auth_fifo[i].char_pos = 0;
- auth_fifo[i].connect_until_time = 0; // unlimited/unknown time by default (not display in map-server)
- auth_fifo[i].ip = RFIFOL(fd,14);
- //auth_fifo[i].map_auth = 0;
- RFIFOSKIP(fd,18);
- break;
-
- case 0x2721: // gm reply
- if (RFIFOREST(fd) < 10)
- return 0;
- {
- unsigned char buf[10];
- WBUFW(buf,0) = 0x2b0b;
- WBUFL(buf,2) = RFIFOL(fd,2); // account
- WBUFL(buf,6) = RFIFOL(fd,6); // GM level
- mapif_sendall(buf,10);
-// printf("parse_tologin: To become GM answer: char -> map.\n");
- }
- RFIFOSKIP(fd,10);
- break;
-
- case 0x2723: // changesex reply (modified by [Yor])
- if (RFIFOREST(fd) < 7)
- return 0;
- {
- int acc, sex, i, j;
- unsigned char buf[7];
- acc = RFIFOL(fd,2);
- sex = RFIFOB(fd,6);
- RFIFOSKIP(fd, 7);
- if (acc > 0) {
- for (i = 0; i < char_num; i++) {
- if (char_dat[i].account_id == acc) {
- int jobclass = char_dat[i].class_;
- char_dat[i].sex = sex;
- auth_fifo[i].sex = sex;
- if (jobclass == 19 || jobclass == 20 ||
- jobclass == 4020 || jobclass == 4021 ||
- jobclass == 4042 || jobclass == 4043) {
- // job modification
- if (jobclass == 19 || jobclass == 20) {
- char_dat[i].class_ = (sex) ? 19 : 20;
- } else if (jobclass == 4020 || jobclass == 4021) {
- char_dat[i].class_ = (sex) ? 4020 : 4021;
- } else if (jobclass == 4042 || jobclass == 4043) {
- char_dat[i].class_ = (sex) ? 4042 : 4043;
- }
- // remove specifical skills of classes 19, 4020 and 4042
- for(j = 315; j <= 322; j++) {
- if (char_dat[i].skill[j].id > 0 && !char_dat[i].skill[j].flag) {
- char_dat[i].skill_point += char_dat[i].skill[j].lv;
- char_dat[i].skill[j].id = 0;
- char_dat[i].skill[j].lv = 0;
- }
- }
- // remove specifical skills of classes 20, 4021 and 4043
- for(j = 323; j <= 330; j++) {
- if (char_dat[i].skill[j].id > 0 && !char_dat[i].skill[j].flag) {
- char_dat[i].skill_point += char_dat[i].skill[j].lv;
- char_dat[i].skill[j].id = 0;
- char_dat[i].skill[j].lv = 0;
- }
- }
- }
- // to avoid any problem with equipment and invalid sex, equipment is unequiped.
- for (j = 0; j < MAX_INVENTORY; j++) {
- if (char_dat[i].inventory[j].nameid && char_dat[i].inventory[j].equip)
- char_dat[i].inventory[j].equip = 0;
- }
- char_dat[i].weapon = 0;
- char_dat[i].shield = 0;
- char_dat[i].head_top = 0;
- char_dat[i].head_mid = 0;
- char_dat[i].head_bottom = 0;
- }
- }
- // disconnect player if online on char-server
- disconnect_player(acc);
- }
- WBUFW(buf,0) = 0x2b0d;
- WBUFL(buf,2) = acc;
- WBUFB(buf,6) = sex;
- mapif_sendall(buf, 7);
- }
- break;
-
- case 0x2726: // Request to send a broadcast message (no answer)
- if (RFIFOREST(fd) < 8 || RFIFOREST(fd) < (8 + RFIFOL(fd,4)))
- return 0;
- if (RFIFOL(fd,4) < 1)
- char_log("Receiving a message for broadcast, but message is void." RETCODE);
- else {
- // at least 1 map-server
- for(i = 0; i < MAX_MAP_SERVERS; i++)
- if (server_fd[i] >= 0)
- break;
- if (i == MAX_MAP_SERVERS)
- char_log("'ladmin': Receiving a message for broadcast, but no map-server is online." RETCODE);
- else {
- unsigned char buf[128];
- char message[4096]; // +1 to add a null terminated if not exist in the packet
- int lp;
- char *p;
- memset(message, '\0', sizeof(message));
- memcpy(message, RFIFOP(fd,8), RFIFOL(fd,4));
- message[sizeof(message)-1] = '\0';
- remove_control_chars((unsigned char *)message);
- // remove all first spaces
- p = message;
- while(p[0] == ' ')
- p++;
- // if message is only composed of spaces
- if (p[0] == '\0')
- char_log("Receiving a message for broadcast, but message is only a lot of spaces." RETCODE);
- // else send message to all map-servers
- else {
- if (RFIFOW(fd,2) == 0) {
- char_log("'ladmin': Receiving a message for broadcast (message (in yellow): %s)" RETCODE,
- message);
- lp = 4;
- } else {
- char_log("'ladmin': Receiving a message for broadcast (message (in blue): %s)" RETCODE,
- message);
- lp = 8;
- }
- // split message to max 80 char
- while(p[0] != '\0') { // if not finish
- if (p[0] == ' ') // jump if first char is a space
- p++;
- else {
- char split[80];
- char* last_space;
- sscanf(p, "%79[^\t]", split); // max 79 char, any char (\t is control char and control char was removed before)
- split[sizeof(split)-1] = '\0'; // last char always \0
- if ((last_space = strrchr(split, ' ')) != NULL) { // searching space from end of the string
- last_space[0] = '\0'; // replace it by NULL to have correct length of split
- p++; // to jump the new NULL
- }
- p += strlen(split);
- // send broadcast to all map-servers
- WBUFW(buf,0) = 0x3800;
- WBUFW(buf,2) = lp + strlen(split) + 1;
- WBUFL(buf,4) = 0x65756c62; // only write if in blue (lp = 8)
- memcpy(WBUFP(buf,lp), split, strlen(split) + 1);
- mapif_sendall(buf, WBUFW(buf,2));
- }
- }
- }
- }
- }
- RFIFOSKIP(fd,8 + RFIFOL(fd,4));
- break;
-
- // account_reg2•ÏX’Ê’m
- case 0x2729:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- struct global_reg reg[ACCOUNT_REG2_NUM];
- unsigned char buf[4096];
- int j, p, acc;
- acc = RFIFOL(fd,4);
- for (p = 8, j = 0; p < RFIFOW(fd,2) && j < ACCOUNT_REG2_NUM; p += 36, j++) {
- memcpy(reg[j].str, RFIFOP(fd,p), 32);
- reg[j].value = RFIFOL(fd,p+32);
- }
- set_account_reg2(acc, j, reg);
- // “¯CƒƒOƒCƒ“‚ð‹ÖŽ~‚µ‚Ä‚¢‚ê‚Α—‚é•K—v‚Í–³‚¢
- memcpy(buf, RFIFOP(fd,0), RFIFOW(fd,2));
- WBUFW(buf,0) = 0x2b11;
- mapif_sendall(buf, WBUFW(buf,2));
- RFIFOSKIP(fd,RFIFOW(fd,2));
-// printf("char: save_account_reg_reply\n");
- }
- break;
-
- // Account deletion notification (from login-server)
- case 0x2730:
- if (RFIFOREST(fd) < 6)
- return 0;
- // Deletion of all characters of the account
- for(i = 0; i < char_num; i++) {
- if (char_dat[i].account_id == RFIFOL(fd,2)) {
- char_delete(&char_dat[i]);
- if (i < char_num - 1) {
- memcpy(&char_dat[i], &char_dat[char_num-1], sizeof(struct mmo_charstatus));
- // if moved character owns to deleted account, check again it's character
- if (char_dat[i].account_id == RFIFOL(fd,2)) {
- i--;
- // Correct moved character reference in the character's owner by [Yor]
- } else {
- int j, k;
- struct char_session_data *sd2;
- for (j = 0; j < fd_max; j++) {
- if (session[j] && (sd2 = (struct char_session_data*)session[j]->session_data) &&
- sd2->account_id == char_dat[char_num-1].account_id) {
- for (k = 0; k < 9; k++) {
- if (sd2->found_char[k] == char_num-1) {
- sd2->found_char[k] = i;
- break;
- }
- }
- break;
- }
- }
- }
- }
- char_num--;
- }
- }
- // Deletion of the storage
- inter_storage_delete(RFIFOL(fd,2));
- // send to all map-servers to disconnect the player
- {
- unsigned char buf[6];
- WBUFW(buf,0) = 0x2b13;
- WBUFL(buf,2) = RFIFOL(fd,2);
- mapif_sendall(buf, 6);
- }
- // disconnect player if online on char-server
- disconnect_player(RFIFOL(fd,2));
- RFIFOSKIP(fd,6);
- break;
-
- // State change of account/ban notification (from login-server) by [Yor]
- case 0x2731:
- if (RFIFOREST(fd) < 11)
- return 0;
- // send to all map-servers to disconnect the player
- {
- unsigned char buf[11];
- WBUFW(buf,0) = 0x2b14;
- WBUFL(buf,2) = RFIFOL(fd,2);
- WBUFB(buf,6) = RFIFOB(fd,6); // 0: change of statut, 1: ban
- WBUFL(buf,7) = RFIFOL(fd,7); // status or final date of a banishment
- mapif_sendall(buf, 11);
- }
- // disconnect player if online on char-server
- disconnect_player(RFIFOL(fd,2));
- RFIFOSKIP(fd,11);
- break;
-
- // Receiving GM acounts info from login-server (by [Yor])
- case 0x2732:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- unsigned char buf[32000];
- if (gm_account != NULL)
- aFree(gm_account);
- gm_account = (struct gm_account*)aCalloc(sizeof(struct gm_account) * ((RFIFOW(fd,2) - 4) / 5), 1);
- GM_num = 0;
- for (i = 4; i < RFIFOW(fd,2); i = i + 5) {
- gm_account[GM_num].account_id = RFIFOL(fd,i);
- gm_account[GM_num].level = (int)RFIFOB(fd,i+4);
- //printf("GM account: %d -> level %d\n", gm_account[GM_num].account_id, gm_account[GM_num].level);
- GM_num++;
- }
- printf("From login-server: receiving of %d GM accounts information.\n", GM_num);
- char_log("From login-server: receiving of %d GM accounts information." RETCODE, GM_num);
- create_online_files(); // update online players files (perhaps some online players change of GM level)
- // send new gm acccounts level to map-servers
- memcpy(buf, RFIFOP(fd,0), RFIFOW(fd,2));
- WBUFW(buf,0) = 0x2b15;
- mapif_sendall(buf, RFIFOW(fd,2));
- }
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
-
- // Receive GM accounts [Freya login server packet by Yor]
- case 0x2733:
- // add test here to remember that the login-server is Freya-type
- // sprintf (login_server_type, "Freya");
- if (RFIFOREST(fd) < 7)
- return 0;
- {
- unsigned char buf[32000];
- int new_level = 0;
- for(i = 0; i < GM_num; i++)
- if (gm_account[i].account_id == RFIFOL(fd,2)) {
- if (gm_account[i].level != (int)RFIFOB(fd,6)) {
- gm_account[i].level = (int)RFIFOB(fd,6);
- new_level = 1;
- }
- break;
- }
- // if not found, add it
- if (i == GM_num) {
- // limited to 4000, because we send information to char-servers (more than 4000 GM accounts???)
- // int (id) + int (level) = 8 bytes * 4000 = 32k (limit of packets in windows)
- if (((int)RFIFOB(fd,6)) > 0 && GM_num < 4000) {
- if (GM_num == 0) {
- gm_account = (struct gm_account*)aMalloc(sizeof(struct gm_account));
- } else {
- gm_account = (struct gm_account*)aRealloc(gm_account, sizeof(struct gm_account) * (GM_num + 1));
- }
- gm_account[GM_num].account_id = RFIFOL(fd,2);
- gm_account[GM_num].level = (int)RFIFOB(fd,6);
- new_level = 1;
- GM_num++;
- if (GM_num >= 4000) {
- printf("***WARNING: 4000 GM accounts found. Next GM accounts are not readed.\n");
- char_log("***WARNING: 4000 GM accounts found. Next GM accounts are not readed." RETCODE);
- }
- }
- }
- if (new_level == 1) {
- int len;
- printf("From login-server: receiving a GM account information (%d: level %d).\n", RFIFOL(fd,2), (int)RFIFOB(fd,6));
- char_log("From login-server: receiving a GM account information (%d: level %d)." RETCODE, RFIFOL(fd,2), (int)RFIFOB(fd,6));
- //create_online_files(); // not change online file for only 1 player (in next timer, that will be done
- // send gm acccounts level to map-servers
- len = 4;
- WBUFW(buf,0) = 0x2b15;
-
- for(i = 0; i < GM_num; i++) {
- WBUFL(buf, len) = gm_account[i].account_id;
- WBUFB(buf, len+4) = (unsigned char)gm_account[i].level;
- len += 5;
- }
- WBUFW(buf, 2) = len;
- mapif_sendall(buf, len);
- }
- }
- RFIFOSKIP(fd,7);
- break;
-
- default:
- printf("parse_tologin: unknown packet %x! \n", RFIFOW(fd,0));
- session[fd]->eof = 1;
- return 0;
- }
- }
- RFIFOFLUSH(fd);
-
- return 0;
-}
-
-int parse_frommap(int fd) {
- int i, j;
- int id;
-
- for(id = 0; id < MAX_MAP_SERVERS; id++)
- if (server_fd[id] == fd)
- break;
- if(id==MAX_MAP_SERVERS)
- session[fd]->eof=1;
- if(session[fd]->eof){
- for(i = 0; i < MAX_MAP_SERVERS; i++)
- if (server_fd[i] == fd) {
- printf("Map-server %d has disconnected.\n", i);
- server_fd[i] = -1;
- }
- close(fd);
- delete_session(fd);
- create_online_files();
- return 0;
- }
-
- while(RFIFOREST(fd) >= 2) {
-// printf("parse_frommap: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd));
-
- switch(RFIFOW(fd,0)) {
-
- // map-server alive packet
- case 0x2718:
- if (RFIFOREST(fd) < 2)
- return 0;
- RFIFOSKIP(fd,2);
- break;
-
- // request from map-server to reload GM accounts. Transmission to login-server (by Yor)
- case 0x2af7:
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd,0) = 0x2709;
- WFIFOSET(login_fd, 2);
-// printf("char : request from map-server to reload GM accounts -> login-server.\n");
- }
- RFIFOSKIP(fd,2);
- break;
-
- // Receiving map names list from the map-server
- case 0x2afa:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- memset(server[id].map, 0, sizeof(server[id].map));
- j = 0;
- for(i = 4; i < RFIFOW(fd,2); i += 16) {
- memcpy(server[id].map[j], RFIFOP(fd,i), 16);
-// printf("set map %d.%d : %s\n", id, j, server[id].map[j]);
- j++;
- }
- {
- unsigned char *p = (unsigned char *)&server[id].ip;
- printf("Map-Server %d connected: %d maps, from IP %d.%d.%d.%d port %d.\n",
- id, j, p[0], p[1], p[2], p[3], server[id].port);
- printf("Map-server %d loading complete.\n", id);
- char_log("Map-Server %d connected: %d maps, from IP %d.%d.%d.%d port %d. Map-server %d loading complete." RETCODE,
- id, j, p[0], p[1], p[2], p[3], server[id].port, id);
- }
- WFIFOW(fd,0) = 0x2afb;
- WFIFOB(fd,2) = 0;
- memcpy(WFIFOP(fd,3), wisp_server_name, 24); // name for wisp to player
- WFIFOSET(fd,27);
- {
- unsigned char buf[16384];
- int x;
- if (j == 0) {
- printf("WARNING: Map-Server %d have NO map.\n", id);
- char_log("WARNING: Map-Server %d have NO map." RETCODE, id);
- // Transmitting maps information to the other map-servers
- } else {
- WBUFW(buf,0) = 0x2b04;
- WBUFW(buf,2) = j * 16 + 10;
- WBUFL(buf,4) = server[id].ip;
- WBUFW(buf,8) = server[id].port;
- memcpy(WBUFP(buf,10), RFIFOP(fd,4), j * 16);
- mapif_sendallwos(fd, buf, WBUFW(buf,2));
- }
- // Transmitting the maps of the other map-servers to the new map-server
- for(x = 0; x < MAX_MAP_SERVERS; x++) {
- if (server_fd[x] >= 0 && x != id) {
- WFIFOW(fd,0) = 0x2b04;
- WFIFOL(fd,4) = server[x].ip;
- WFIFOW(fd,8) = server[x].port;
- j = 0;
- for(i = 0; i < MAX_MAP_PER_SERVER; i++)
- if (server[x].map[i][0])
- memcpy(WFIFOP(fd,10+(j++)*16), server[x].map[i], 16);
- if (j > 0) {
- WFIFOW(fd,2) = j * 16 + 10;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
- }
- }
- }
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
-
- // ”FØ—v‹
- // Send character data to map-server
- case 0x2afc:
- if (RFIFOREST(fd) < 22)
- return 0;
- //printf("auth_fifo search: account: %d, char: %d, secure: %08x-%08x\n", RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOL(fd,14));
- for(i = 0; i < AUTH_FIFO_SIZE; i++) {
- if (auth_fifo[i].account_id == RFIFOL(fd,2) &&
- auth_fifo[i].char_id == RFIFOL(fd,6) &&
- auth_fifo[i].login_id1 == RFIFOL(fd,10) &&
-#if CMP_AUTHFIFO_LOGIN2 != 0
- // here, it's the only area where it's possible that we doesn't know login_id2 (map-server asks just after 0x72 packet, that doesn't given the value)
- (auth_fifo[i].login_id2 == RFIFOL(fd,14) || RFIFOL(fd,14) == 0) && // relate to the versions higher than 18
-#endif
- (!check_ip_flag || auth_fifo[i].ip == RFIFOL(fd,18)) &&
- !auth_fifo[i].delflag) {
- auth_fifo[i].delflag = 1;
- WFIFOW(fd,0) = 0x2afd;
- WFIFOW(fd,2) = 16 + sizeof(struct mmo_charstatus);
- WFIFOL(fd,4) = RFIFOL(fd,2);
- WFIFOL(fd,8) = auth_fifo[i].login_id2;
- WFIFOL(fd,12) = (unsigned long)auth_fifo[i].connect_until_time;
- char_dat[auth_fifo[i].char_pos].sex = auth_fifo[i].sex;
- memcpy(WFIFOP(fd,16), &char_dat[auth_fifo[i].char_pos], sizeof(struct mmo_charstatus));
- WFIFOSET(fd, WFIFOW(fd,2));
- //printf("auth_fifo search success (auth #%d, account %d, character: %d).\n", i, RFIFOL(fd,2), RFIFOL(fd,6));
- break;
- }
- }
- if (i == AUTH_FIFO_SIZE) {
- WFIFOW(fd,0) = 0x2afe;
- WFIFOL(fd,2) = RFIFOL(fd,2);
- WFIFOSET(fd,6);
- printf("auth_fifo search error! account %d not authentified.\n", RFIFOL(fd,2));
- }
- RFIFOSKIP(fd,22);
- break;
-
- // MAPƒT[ƒo[ã‚̃†[ƒU[”ŽóM
- // Recieve alive message from map-server
- case 0x2aff:
- if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- server[id].users = RFIFOW(fd,4);
- // remove all previously online players of the server
- for(i = 0; i < online_players_max; i++)
- if (online_chars[i].server == id) {
- online_chars[i].char_id = -1;
- online_chars[i].server = -1;
- }
- // add online players in the list by [Yor]
- j = 0;
- for(i = 0; i < server[id].users; i++) {
- for(; j < online_players_max; j++)
- if (online_chars[j].char_id == -1) {
- online_chars[j].char_id = RFIFOL(fd,6+i*4);
- online_chars[j].server = id;
- //printf("%d\n", online_chars[j].char_id);
- break;
- }
- // no available slots...
- if (j == online_players_max) {
- // create 256 new slots
- online_players_max += 256;
- online_chars = (struct online_chars*)aRealloc(online_chars, sizeof(struct online_chars) * online_players_max);
- if (!online_chars) {
- printf("out of memory: parse_frommap - online_chars (realloc).\n");
- exit(1);
- }
- for( ; j < online_players_max; j++) {
- online_chars[j].char_id = -1;
- online_chars[j].server = -1;
- }
- // save data
- j = online_players_max - 256;
- online_chars[j].char_id = RFIFOL(fd,6+i*4);
- online_chars[j].server = id;
- }
- }
- if (update_online < time(NULL)) { // Time is done
- update_online = time(NULL) + 8;
- create_online_files(); // only every 8 sec. (normally, 1 server send users every 5 sec.) Don't update every time, because that takes time, but only every 2 connection.
- // it set to 8 sec because is more than 5 (sec) and if we have more than 1 map-server, informations can be received in shifted.
- }
- RFIFOSKIP(fd,6+i*4);
- break;
-
- // ƒLƒƒƒ‰ƒf[ƒ^•Û‘¶
- // Recieve character data from map-server
- case 0x2b01:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- for(i = 0; i < char_num; i++) {
- if (char_dat[i].account_id == RFIFOL(fd,4) &&
- char_dat[i].char_id == RFIFOL(fd,8))
- break;
- }
- if (i != char_num)
- memcpy(&char_dat[i], RFIFOP(fd,12), sizeof(struct mmo_charstatus));
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
-
- // ƒLƒƒƒ‰ƒZƒŒ—v‹
- case 0x2b02:
- if (RFIFOREST(fd) < 18)
- return 0;
- if (auth_fifo_pos >= AUTH_FIFO_SIZE)
- auth_fifo_pos = 0;
- //printf("auth_fifo set (auth #%d) - account: %d, secure: %08x-%08x\n", auth_fifo_pos, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10));
- auth_fifo[auth_fifo_pos].account_id = RFIFOL(fd,2);
- auth_fifo[auth_fifo_pos].char_id = 0;
- auth_fifo[auth_fifo_pos].login_id1 = RFIFOL(fd,6);
- auth_fifo[auth_fifo_pos].login_id2 = RFIFOL(fd,10);
- auth_fifo[auth_fifo_pos].delflag = 2;
- auth_fifo[auth_fifo_pos].char_pos = 0;
- auth_fifo[auth_fifo_pos].connect_until_time = 0; // unlimited/unknown time by default (not display in map-server)
- auth_fifo[auth_fifo_pos].ip = RFIFOL(fd,14);
- auth_fifo_pos++;
- WFIFOW(fd,0) = 0x2b03;
- WFIFOL(fd,2) = RFIFOL(fd,2);
- WFIFOB(fd,6) = 0;
- WFIFOSET(fd,7);
- RFIFOSKIP(fd,18);
- break;
-
- // ƒ}ƒbƒvƒT[ƒo[ŠÔˆÚ“®—v‹
- case 0x2b05:
- if (RFIFOREST(fd) < 49)
- return 0;
- if (auth_fifo_pos >= AUTH_FIFO_SIZE)
- auth_fifo_pos = 0;
- WFIFOW(fd,0) = 0x2b06;
- memcpy(WFIFOP(fd,2), RFIFOP(fd,2), 42);
- //printf("auth_fifo set (auth#%d) - account: %d, secure: 0x%08x-0x%08x\n", auth_fifo_pos, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10));
- auth_fifo[auth_fifo_pos].account_id = RFIFOL(fd,2);
- auth_fifo[auth_fifo_pos].char_id = RFIFOL(fd,14);
- auth_fifo[auth_fifo_pos].login_id1 = RFIFOL(fd,6);
- auth_fifo[auth_fifo_pos].login_id2 = RFIFOL(fd,10);
- auth_fifo[auth_fifo_pos].delflag = 0;
- auth_fifo[auth_fifo_pos].sex = RFIFOB(fd,44);
- auth_fifo[auth_fifo_pos].connect_until_time = 0; // unlimited/unknown time by default (not display in map-server)
- auth_fifo[auth_fifo_pos].ip = RFIFOL(fd,45);
- for(i = 0; i < char_num; i++)
- if (char_dat[i].account_id == RFIFOL(fd,2) &&
- char_dat[i].char_id == RFIFOL(fd,14)) {
- auth_fifo[auth_fifo_pos].char_pos = i;
- auth_fifo_pos++;
- WFIFOL(fd,6) = 0;
- break;
- }
- if (i == char_num)
- WFIFOW(fd,6) = 1;
- WFIFOSET(fd,44);
- RFIFOSKIP(fd,49);
- break;
-
- // ƒLƒƒƒ‰–¼ŒŸõ
- case 0x2b08:
- if (RFIFOREST(fd) < 6)
- return 0;
- for(i = 0; i < char_num; i++) {
- if (char_dat[i].char_id == RFIFOL(fd,2))
- break;
- }
- WFIFOW(fd,0) = 0x2b09;
- WFIFOL(fd,2) = RFIFOL(fd,2);
- if (i != char_num)
- memcpy(WFIFOP(fd,6), char_dat[i].name, 24);
- else
- memcpy(WFIFOP(fd,6), unknown_char_name, 24);
- WFIFOSET(fd,30);
- RFIFOSKIP(fd,6);
- break;
-
- // it is a request to become GM
- case 0x2b0a:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
-// printf("parse_frommap: change gm -> login, account: %d, pass: '%s'.\n", RFIFOL(fd,4), RFIFOP(fd,8));
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd,0) = 0x2720;
- memcpy(WFIFOP(login_fd,2), RFIFOP(fd,2), RFIFOW(fd,2)-2);
- WFIFOSET(login_fd, RFIFOW(fd,2));
- } else {
- WFIFOW(fd,0) = 0x2b0b;
- WFIFOL(fd,2) = RFIFOL(fd,4);
- WFIFOL(fd,6) = 0;
- WFIFOSET(fd, 10);
- }
- RFIFOSKIP(fd, RFIFOW(fd,2));
- break;
-
- // Map server send information to change an email of an account -> login-server
- case 0x2b0c:
- if (RFIFOREST(fd) < 86)
- return 0;
- if (login_fd > 0) { // don't send request if no login-server
- memcpy(WFIFOP(login_fd,0), RFIFOP(fd,0), 86); // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B
- WFIFOW(login_fd,0) = 0x2722;
- WFIFOSET(login_fd, 86);
- }
- RFIFOSKIP(fd, 86);
- break;
-
- // Map server ask char-server about a character name to do some operations (all operations are transmitted to login-server)
- case 0x2b0e:
- if (RFIFOREST(fd) < 44)
- return 0;
- {
- char character_name[24];
- int acc = RFIFOL(fd,2); // account_id of who ask (-1 if nobody)
- memcpy(character_name, RFIFOP(fd,6), 24);
- character_name[sizeof(character_name) -1] = '\0';
- // prepare answer
- WFIFOW(fd,0) = 0x2b0f; // answer
- WFIFOL(fd,2) = acc; // who want do operation
- WFIFOW(fd,30) = RFIFOW(fd, 30); // type of operation: 1-block, 2-ban, 3-unblock, 4-unban, 5-changesex
- // search character
- i = search_character_index(character_name);
- if (i >= 0) {
- memcpy(WFIFOP(fd,6), search_character_name(i), 24); // put correct name if found
- WFIFOW(fd,32) = 0; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- switch(RFIFOW(fd, 30)) {
- case 1: // block
- if (acc == -1 || isGM(acc) >= isGM(char_dat[i].account_id)) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd,0) = 0x2724;
- WFIFOL(login_fd,2) = char_dat[i].account_id; // account value
- WFIFOL(login_fd,6) = 5; // status of the account
- WFIFOSET(login_fd, 10);
-// printf("char : status -> login: account %d, status: %d \n", char_dat[i].account_id, 5);
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- } else
- WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- case 2: // ban
- if (acc == -1 || isGM(acc) >= isGM(char_dat[i].account_id)) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd, 0) = 0x2725;
- WFIFOL(login_fd, 2) = char_dat[i].account_id; // account value
- WFIFOW(login_fd, 6) = RFIFOW(fd,32); // year
- WFIFOW(login_fd, 8) = RFIFOW(fd,34); // month
- WFIFOW(login_fd,10) = RFIFOW(fd,36); // day
- WFIFOW(login_fd,12) = RFIFOW(fd,38); // hour
- WFIFOW(login_fd,14) = RFIFOW(fd,40); // minute
- WFIFOW(login_fd,16) = RFIFOW(fd,42); // second
- WFIFOSET(login_fd,18);
-// printf("char : status -> login: account %d, ban: %dy %dm %dd %dh %dmn %ds\n",
-// char_dat[i].account_id, (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), (short)RFIFOW(fd,38), (short)RFIFOW(fd,40), (short)RFIFOW(fd,42));
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- } else
- WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- case 3: // unblock
- if (acc == -1 || isGM(acc) >= isGM(char_dat[i].account_id)) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd,0) = 0x2724;
- WFIFOL(login_fd,2) = char_dat[i].account_id; // account value
- WFIFOL(login_fd,6) = 0; // status of the account
- WFIFOSET(login_fd, 10);
-// printf("char : status -> login: account %d, status: %d \n", char_dat[i].account_id, 0);
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- } else
- WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- case 4: // unban
- if (acc == -1 || isGM(acc) >= isGM(char_dat[i].account_id)) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd, 0) = 0x272a;
- WFIFOL(login_fd, 2) = char_dat[i].account_id; // account value
- WFIFOSET(login_fd, 6);
-// printf("char : status -> login: account %d, unban request\n", char_dat[i].account_id);
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- } else
- WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- case 5: // changesex
- if (acc == -1 || isGM(acc) >= isGM(char_dat[i].account_id)) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd, 0) = 0x2727;
- WFIFOL(login_fd, 2) = char_dat[i].account_id; // account value
- WFIFOSET(login_fd, 6);
-// printf("char : status -> login: account %d, change sex request\n", char_dat[i].account_id);
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- } else
- WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- }
- } else {
- // character name not found
- memcpy(WFIFOP(fd,6), character_name, 24);
- WFIFOW(fd,32) = 1; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- }
- // send answer if a player ask, not if the server ask
- if (acc != -1) {
- WFIFOSET(fd, 34);
- }
- RFIFOSKIP(fd, 44);
- break;
- }
-
-// case 0x2b0f: not more used (available for futur usage)
-
- // account_reg•Û‘¶—v‹
- case 0x2b10:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- struct global_reg reg[ACCOUNT_REG2_NUM];
- int p, acc;
- acc = RFIFOL(fd,4);
- for(p = 8, j = 0; p < RFIFOW(fd,2) && j < ACCOUNT_REG2_NUM; p += 36, j++) {
- memcpy(reg[j].str, RFIFOP(fd,p), 32);
- reg[j].value = RFIFOL(fd, p+32);
- }
- set_account_reg2(acc, j, reg);
- // loginƒT[ƒo[‚Ö‘—‚é
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd, 0) = 0x2728;
- memcpy(WFIFOP(login_fd,0), RFIFOP(fd,0), RFIFOW(fd,2));
- WFIFOSET(login_fd, WFIFOW(login_fd,2));
- }
- // ƒ[ƒ‹ƒh‚Ö‚Ì“¯CƒƒOƒCƒ“‚ª‚È‚¯‚ê‚ÎmapƒT[ƒo[‚É‘—‚é•K—v‚Í‚È‚¢
- //memcpy(buf, RFIFOP(fd,0), RFIFOW(fd,2));
- //WBUFW(buf,0) = 0x2b11;
- //mapif_sendall(buf, WBUFW(buf,2));
- RFIFOSKIP(fd, RFIFOW(fd,2));
-// printf("char: save_account_reg (from map)\n");
- break;
- }
- // Character disconnected set online 0 [Wizputer]
- case 0x2b17:
- if (RFIFOREST(fd) < 6)
- return 0;
- //printf("Setting %d char offline\n",RFIFOL(fd,2));
- set_char_offline(RFIFOL(fd,2),RFIFOL(fd,6));
- RFIFOSKIP(fd,10);
- break;
-
- // Character set online [Wizputer]
- case 0x2b19:
- if (RFIFOREST(fd) < 6)
- return 0;
- //printf("Setting %d char online\n",RFIFOL(fd,2));
- set_char_online(RFIFOL(fd,2),RFIFOL(fd,6));
- RFIFOSKIP(fd,10);
- break;
-
- default:
- // inter serverˆ—‚É“n‚·
- {
- int r = inter_parse_frommap(fd);
- if (r == 1) // ˆ—‚Å‚«‚½
- break;
- if (r == 2) // ƒpƒPƒbƒg’·‚ª‘«‚è‚È‚¢
- return 0;
- }
- // inter serverˆ—‚Å‚à‚È‚¢ê‡‚ÍØ’f
- printf("char: unknown packet 0x%04x (%d bytes to read in buffer)! (from map).\n", RFIFOW(fd,0), RFIFOREST(fd));
- session[fd]->eof = 1;
- return 0;
- }
- }
- return 0;
-}
-
-int search_mapserver(char *map) {
- int i, j;
- char temp_map[16];
- int temp_map_len;
-
-// printf("Searching the map-server for map '%s'... ", map);
- strncpy(temp_map, map, sizeof(temp_map));
- temp_map[sizeof(temp_map)-1] = '\0';
- if (strchr(temp_map, '.') != NULL)
- temp_map[strchr(temp_map, '.') - temp_map + 1] = '\0'; // suppress the '.gat', but conserve the '.' to be sure of the name of the map
-
- temp_map_len = strlen(temp_map);
- for(i = 0; i < MAX_MAP_SERVERS; i++)
- if (server_fd[i] >= 0)
- for (j = 0; server[i].map[j][0]; j++)
- //printf("%s : %s = %d\n", server[i].map[j], map, strncmp(server[i].map[j], temp_map, temp_map_len));
- if (strncmp(server[i].map[j], temp_map, temp_map_len) == 0) {
-// printf("found -> server #%d.\n", i);
- return i;
- }
-
-// printf("not found.\n");
- return -1;
-}
-
-// char_mapif‚̉Šú‰»ˆ—iŒ»Ý‚Íinter_mapif‰Šú‰»‚Ì‚Ýj
-static int char_mapif_init(int fd) {
- return inter_mapif_init(fd);
-}
-
-//-----------------------------------------------------
-// Test to know if an IP come from LAN or WAN. by [Yor]
-//-----------------------------------------------------
-int lan_ip_check(unsigned char *p){
- int i;
- int lancheck = 1;
-
-// printf("lan_ip_check: to compare: %d.%d.%d.%d, network: %d.%d.%d.%d/%d.%d.%d.%d\n",
-// p[0], p[1], p[2], p[3],
-// subneti[0], subneti[1], subneti[2], subneti[3],
-// subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]);
- for(i = 0; i < 4; i++) {
- if ((subneti[i] & subnetmaski[i]) != (p[i] & subnetmaski[i])) {
- lancheck = 0;
- break;
- }
- }
- printf("LAN test (result): %s source\033[0m.\n", (lancheck) ? "\033[1;36mLAN" : "\033[1;32mWAN");
- return lancheck;
-}
-
-int parse_char(int fd) {
- int i, ch;
- unsigned short cmd;
- char email[40];
- struct char_session_data *sd;
- unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
-
- if (login_fd < 0)
- session[fd]->eof = 1;
- if(session[fd]->eof) { // disconnect any player (already connected to char-server or coming back from map-server) if login-server is diconnected.
- if (fd == login_fd)
- login_fd = -1;
- close(fd);
- delete_session(fd);
- return 0;
- }
-
- sd = (struct char_session_data*)session[fd]->session_data;
-
- while (RFIFOREST(fd) >= 2) {
- cmd = RFIFOW(fd,0);
- // crc32‚̃XƒLƒbƒv—p
- if( sd==NULL && // –¢ƒƒOƒCƒ“orŠÇ—ƒpƒPƒbƒg
- RFIFOREST(fd)>=4 && // Å’áƒoƒCƒg”§ŒÀ • 0x7530,0x7532ŠÇ—ƒpƒPœ‹Ž
- RFIFOREST(fd)<=21 && // Å‘åƒoƒCƒg”§ŒÀ • ƒT[ƒo[ƒƒOƒCƒ“œ‹Ž
- cmd!=0x20b && // md5’Ê’mƒpƒPƒbƒgœ‹Ž
- (RFIFOREST(fd)<6 || RFIFOW(fd,4)==0x65) ){ // ŽŸ‚ɉ½‚©ƒpƒPƒbƒg‚ª—ˆ‚Ä‚é‚È‚çAÚ‘±‚Å‚È‚¢‚Æ‚¾‚ß
- RFIFOSKIP(fd,4);
- cmd = RFIFOW(fd,0);
- printf("parse_char : %d crc32 skipped\n",fd);
- if(RFIFOREST(fd)==0)
- return 0;
- }
-
-// if(cmd<30000 && cmd!=0x187)
-// printf("parse_char : %d %d %d\n",fd,RFIFOREST(fd),cmd);
-
- // •s³ƒpƒPƒbƒg‚̈—
-// if (sd == NULL && cmd != 0x65 && cmd != 0x20b && cmd != 0x187 &&
-// cmd != 0x2af8 && cmd != 0x7530 && cmd != 0x7532)
-// cmd = 0xffff; // ƒpƒPƒbƒgƒ_ƒ“ƒv‚ð•\Ž¦‚³‚¹‚é
-
- switch(cmd){
- case 0x20b: //20040622ˆÃ†‰»ragexe‘Ήž
- if (RFIFOREST(fd) < 19)
- return 0;
- RFIFOSKIP(fd,19);
- break;
-
- case 0x65: // Ú‘±—v‹
- if (RFIFOREST(fd) < 17)
- return 0;
- {
- int GM_value;
- if ((GM_value = isGM(RFIFOL(fd,2))))
- printf("Account Logged On; Account ID: %d (GM level %d).\n", RFIFOL(fd,2), GM_value);
- else
- printf("Account Logged On; Account ID: %d.\n", RFIFOL(fd,2));
- if (sd == NULL) {
- sd = (struct char_session_data*)aCalloc(sizeof(struct char_session_data), 1);
- session[fd]->session_data = sd;
-
- memset(sd, 0, sizeof(struct char_session_data));
- memcpy(sd->email, "no mail", 40); // put here a mail without '@' to refuse deletion if we don't receive the e-mail
- sd->connect_until_time = 0; // unknow or illimited (not displaying on map-server)
- }
- sd->account_id = RFIFOL(fd,2);
- sd->login_id1 = RFIFOL(fd,6);
- sd->login_id2 = RFIFOL(fd,10);
- sd->sex = RFIFOB(fd,16);
- // send back account_id
- WFIFOL(fd,0) = RFIFOL(fd,2);
- WFIFOSET(fd,4);
- // search authentification
- for(i = 0; i < AUTH_FIFO_SIZE; i++) {
- if (auth_fifo[i].account_id == sd->account_id &&
- auth_fifo[i].login_id1 == sd->login_id1 &&
-#if CMP_AUTHFIFO_LOGIN2 != 0
- auth_fifo[i].login_id2 == sd->login_id2 && // relate to the versions higher than 18
-#endif
- (!check_ip_flag || auth_fifo[i].ip == session[fd]->client_addr.sin_addr.s_addr) &&
- auth_fifo[i].delflag == 2) {
- auth_fifo[i].delflag = 1;
- if (max_connect_user == 0 || count_users() < max_connect_user) {
- if (login_fd > 0) { // don't send request if no login-server
- // request to login-server to obtain e-mail/time limit
- WFIFOW(login_fd,0) = 0x2716;
- WFIFOL(login_fd,2) = sd->account_id;
- WFIFOSET(login_fd,6);
- }
- // send characters to player
- mmo_char_send006b(fd, sd);
- } else {
- // refuse connection (over populated)
- WFIFOW(fd,0) = 0x6c;
- WFIFOW(fd,2) = 0;
- WFIFOSET(fd,3);
- }
- break;
- }
- }
- // authentification not found
- if (i == AUTH_FIFO_SIZE) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd,0) = 0x2712; // ask login-server to authentify an account
- WFIFOL(login_fd,2) = sd->account_id;
- WFIFOL(login_fd,6) = sd->login_id1;
- WFIFOL(login_fd,10) = sd->login_id2; // relate to the versions higher than 18
- WFIFOB(login_fd,14) = sd->sex;
- WFIFOL(login_fd,15) = session[fd]->client_addr.sin_addr.s_addr;
- WFIFOSET(login_fd,19);
- } else { // if no login-server, we must refuse connection
- WFIFOW(fd,0) = 0x6c;
- WFIFOW(fd,2) = 0;
- WFIFOSET(fd,3);
- }
- }
- }
- RFIFOSKIP(fd,17);
- break;
-
- case 0x66: // ƒLƒƒƒ‰‘I‘ð
- if (RFIFOREST(fd) < 3)
- return 0;
-
- // if we activated email creation and email is default email
- if (email_creation != 0 && strcmp(sd->email, "a@a.com") == 0 && login_fd > 0) { // to modify an e-mail, login-server must be online
- WFIFOW(fd, 0) = 0x70;
- WFIFOB(fd, 2) = 0; // 00 = Incorrect Email address
- WFIFOSET(fd, 3);
-
- // otherwise, load the character
- } else {
- for (ch = 0; ch < 9; ch++)
- if (sd->found_char[ch] >= 0 && char_dat[sd->found_char[ch]].char_num == RFIFOB(fd,2))
- break;
- if (ch != 9) {
- char_log("Character Selected, Account ID: %d, Character Slot: %d, Character Name: %s." RETCODE,
- sd->account_id, RFIFOB(fd,2), char_dat[sd->found_char[ch]].name);
- // searching map server
- i = search_mapserver(char_dat[sd->found_char[ch]].last_point.map);
- // if map is not found, we check major cities
- if (i < 0) {
- if ((i = search_mapserver("prontera.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[sd->found_char[ch]].last_point.map, "prontera.gat", 16);
- char_dat[sd->found_char[ch]].last_point.x = 273; // savepoint coordonates
- char_dat[sd->found_char[ch]].last_point.y = 354;
- } else if ((i = search_mapserver("geffen.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[sd->found_char[ch]].last_point.map, "geffen.gat", 16);
- char_dat[sd->found_char[ch]].last_point.x = 120; // savepoint coordonates
- char_dat[sd->found_char[ch]].last_point.y = 100;
- } else if ((i = search_mapserver("morocc.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[sd->found_char[ch]].last_point.map, "morocc.gat", 16);
- char_dat[sd->found_char[ch]].last_point.x = 160; // savepoint coordonates
- char_dat[sd->found_char[ch]].last_point.y = 94;
- } else if ((i = search_mapserver("alberta.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[sd->found_char[ch]].last_point.map, "alberta.gat", 16);
- char_dat[sd->found_char[ch]].last_point.x = 116; // savepoint coordonates
- char_dat[sd->found_char[ch]].last_point.y = 57;
- } else if ((i = search_mapserver("payon.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[sd->found_char[ch]].last_point.map, "payon.gat", 16);
- char_dat[sd->found_char[ch]].last_point.x = 87; // savepoint coordonates
- char_dat[sd->found_char[ch]].last_point.y = 117;
- } else if ((i = search_mapserver("izlude.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[sd->found_char[ch]].last_point.map, "izlude.gat", 16);
- char_dat[sd->found_char[ch]].last_point.x = 94; // savepoint coordonates
- char_dat[sd->found_char[ch]].last_point.y = 103;
- } else {
- int j;
- // get first online server (with a map)
- i = 0;
- for(j = 0; j < MAX_MAP_SERVERS; j++)
- if (server_fd[j] >= 0 && server[j].map[0][0]) { // change save point to one of map found on the server (the first)
- i = j;
- memcpy(char_dat[sd->found_char[ch]].last_point.map, server[j].map[0], 16);
- printf("Map-server #%d found with a map: '%s'.\n", j, server[j].map[0]);
- // coordonates are unknown
- break;
- }
- // if no map-server is connected, we send: server closed
- if (j == MAX_MAP_SERVERS) {
- WFIFOW(fd,0) = 0x81;
- WFIFOL(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- RFIFOSKIP(fd,3);
- break;
- }
- }
- }
- WFIFOW(fd,0) = 0x71;
- WFIFOL(fd,2) = char_dat[sd->found_char[ch]].char_id;
- memcpy(WFIFOP(fd,6), char_dat[sd->found_char[ch]].last_point.map, 16);
- printf("Character selection '%s' (account: %d, slot: %d).\n", char_dat[sd->found_char[ch]].name, sd->account_id, ch);
- printf("--Send IP of map-server. ");
- if (lan_ip_check(p))
- WFIFOL(fd, 22) = inet_addr(lan_map_ip);
- else
- WFIFOL(fd, 22) = server[i].ip;
- WFIFOW(fd,26) = server[i].port;
- WFIFOSET(fd,28);
- if (auth_fifo_pos >= AUTH_FIFO_SIZE)
- auth_fifo_pos = 0;
- //printf("auth_fifo set #%d - account %d, char: %d, secure: %08x-%08x\n", auth_fifo_pos, sd->account_id, char_dat[sd->found_char[ch]].char_id, sd->login_id1, sd->login_id2);
- auth_fifo[auth_fifo_pos].account_id = sd->account_id;
- auth_fifo[auth_fifo_pos].char_id = char_dat[sd->found_char[ch]].char_id;
- auth_fifo[auth_fifo_pos].login_id1 = sd->login_id1;
- auth_fifo[auth_fifo_pos].login_id2 = sd->login_id2;
- auth_fifo[auth_fifo_pos].delflag = 0;
- auth_fifo[auth_fifo_pos].char_pos = sd->found_char[ch];
- auth_fifo[auth_fifo_pos].sex = sd->sex;
- auth_fifo[auth_fifo_pos].connect_until_time = sd->connect_until_time;
- auth_fifo[auth_fifo_pos].ip = session[fd]->client_addr.sin_addr.s_addr;
- auth_fifo_pos++;
- }
- }
- RFIFOSKIP(fd,3);
- break;
-
- case 0x67: // ì¬
- if (RFIFOREST(fd) < 37)
- return 0;
- i = make_new_char(fd, RFIFOP(fd,2));
- if (i < 0) {
- WFIFOW(fd,0) = 0x6e;
- WFIFOB(fd,2) = 0x00;
- WFIFOSET(fd,3);
- RFIFOSKIP(fd,37);
- break;
- }
-
- WFIFOW(fd,0) = 0x6d;
- memset(WFIFOP(fd,2), 0, 106);
-
- WFIFOL(fd,2) = char_dat[i].char_id;
- WFIFOL(fd,2+4) = char_dat[i].base_exp;
- WFIFOL(fd,2+8) = char_dat[i].zeny;
- WFIFOL(fd,2+12) = char_dat[i].job_exp;
- WFIFOL(fd,2+16) = char_dat[i].job_level;
-
- WFIFOL(fd,2+28) = char_dat[i].karma;
- WFIFOL(fd,2+32) = char_dat[i].manner;
-
- WFIFOW(fd,2+40) = 0x30;
- WFIFOW(fd,2+42) = (char_dat[i].hp > 0x7fff) ? 0x7fff : char_dat[i].hp;
- WFIFOW(fd,2+44) = (char_dat[i].max_hp > 0x7fff) ? 0x7fff : char_dat[i].max_hp;
- WFIFOW(fd,2+46) = (char_dat[i].sp > 0x7fff) ? 0x7fff : char_dat[i].sp;
- WFIFOW(fd,2+48) = (char_dat[i].max_sp > 0x7fff) ? 0x7fff : char_dat[i].max_sp;
- WFIFOW(fd,2+50) = DEFAULT_WALK_SPEED; // char_dat[i].speed;
- WFIFOW(fd,2+52) = char_dat[i].class_;
- WFIFOW(fd,2+54) = char_dat[i].hair;
-
- WFIFOW(fd,2+58) = char_dat[i].base_level;
- WFIFOW(fd,2+60) = char_dat[i].skill_point;
-
- WFIFOW(fd,2+64) = char_dat[i].shield;
- WFIFOW(fd,2+66) = char_dat[i].head_top;
- WFIFOW(fd,2+68) = char_dat[i].head_mid;
- WFIFOW(fd,2+70) = char_dat[i].hair_color;
-
- memcpy(WFIFOP(fd,2+74), char_dat[i].name, 24);
-
- WFIFOB(fd,2+98) = (char_dat[i].str > 255) ? 255 : char_dat[i].str;
- WFIFOB(fd,2+99) = (char_dat[i].agi > 255) ? 255 : char_dat[i].agi;
- WFIFOB(fd,2+100) = (char_dat[i].vit > 255) ? 255 : char_dat[i].vit;
- WFIFOB(fd,2+101) = (char_dat[i].int_ > 255) ? 255 : char_dat[i].int_;
- WFIFOB(fd,2+102) = (char_dat[i].dex > 255) ? 255 : char_dat[i].dex;
- WFIFOB(fd,2+103) = (char_dat[i].luk > 255) ? 255 : char_dat[i].luk;
- WFIFOB(fd,2+104) = char_dat[i].char_num;
-
- WFIFOSET(fd,108);
- RFIFOSKIP(fd,37);
- for(ch = 0; ch < 9; ch++) {
- if (sd->found_char[ch] == -1) {
- sd->found_char[ch] = i;
- break;
- }
- }
-
- case 0x68: // delete char //Yor's Fix
- if (RFIFOREST(fd) < 46)
- return 0;
- memcpy(email, RFIFOP(fd,6), 40);
- if (e_mail_check(email) == 0)
- strncpy(email, "a@a.com", 40); // default e-mail
-
- // if we activated email creation and email is default email
- if (email_creation != 0 && strcmp(sd->email, "a@a.com") == 0 && login_fd > 0) { // to modify an e-mail, login-server must be online
- // if sended email is incorrect e-mail
- if (strcmp(email, "a@a.com") == 0) {
- WFIFOW(fd, 0) = 0x70;
- WFIFOB(fd, 2) = 0; // 00 = Incorrect Email address
- WFIFOSET(fd, 3);
- RFIFOSKIP(fd,46);
- // we act like we have selected a character
- } else {
- // we change the packet to set it like selection.
- for (i = 0; i < 9; i++)
- if (char_dat[sd->found_char[i]].char_id == RFIFOL(fd,2)) {
- // we save new e-mail
- memcpy(sd->email, email, 40);
- // we send new e-mail to login-server ('online' login-server is checked before)
- WFIFOW(login_fd,0) = 0x2715;
- WFIFOL(login_fd,2) = sd->account_id;
- memcpy(WFIFOP(login_fd, 6), email, 40);
- WFIFOSET(login_fd,46);
- // skip part of the packet! (46, but leave the size of select packet: 3)
- RFIFOSKIP(fd,43);
- // change value to put new packet (char selection)
- RFIFOW(fd, 0) = 0x66;
- RFIFOB(fd, 2) = char_dat[sd->found_char[i]].char_num;
- // not send packet, it's modify of actual packet
- break;
- }
- if (i == 9) {
- WFIFOW(fd, 0) = 0x70;
- WFIFOB(fd, 2) = 0; // 00 = Incorrect Email address
- WFIFOSET(fd, 3);
- RFIFOSKIP(fd,46);
- }
- }
-
- // otherwise, we delete the character
- } else {
- if (strcmpi(email, sd->email) != 0) { // if it's an invalid email
- WFIFOW(fd, 0) = 0x70;
- WFIFOB(fd, 2) = 0; // 00 = Incorrect Email address
- WFIFOSET(fd, 3);
- // if mail is correct
- } else {
- for (i = 0; i < 9; i++) {
- struct mmo_charstatus *cs = NULL;
- if ((cs = &char_dat[sd->found_char[i]])->char_id == RFIFOL(fd,2)) {
- char_delete(cs); // deletion process
-
- if (sd->found_char[i] != char_num - 1) {
- memcpy(&char_dat[sd->found_char[i]], &char_dat[char_num-1], sizeof(struct mmo_charstatus));
- // Correct moved character reference in the character's owner
- {
- int j, k;
- struct char_session_data *sd2;
- for (j = 0; j < fd_max; j++) {
- if (session[j] && (sd2 = (struct char_session_data*)session[j]->session_data) &&
- sd2->account_id == char_dat[char_num-1].account_id) {
- for (k = 0; k < 9; k++) {
- if (sd2->found_char[k] == char_num-1) {
- sd2->found_char[k] = sd->found_char[i];
- break;
- }
- }
- break;
- }
- }
- }
- }
-
- char_num--;
- for(ch = i; ch < 9-1; ch++)
- sd->found_char[ch] = sd->found_char[ch+1];
- sd->found_char[8] = -1;
- WFIFOW(fd,0) = 0x6f;
- WFIFOSET(fd,2);
- break;
- }
- }
-
- if (i == 9) {
- WFIFOW(fd,0) = 0x70;
- WFIFOB(fd,2) = 0;
- WFIFOSET(fd,3);
- }
- }
- RFIFOSKIP(fd,46);
- }
- break;
-
- case 0x2af8: // ƒ}ƒbƒvƒT[ƒo[ƒƒOƒCƒ“
- if (RFIFOREST(fd) < 60)
- return 0;
- WFIFOW(fd,0) = 0x2af9;
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- if (server_fd[i] < 0)
- break;
- }
- if (i == MAX_MAP_SERVERS || strcmp((char*)RFIFOP(fd,2), userid) || strcmp((char*)RFIFOP(fd,26), passwd)){
- WFIFOB(fd,2) = 3;
- WFIFOSET(fd,3);
- RFIFOSKIP(fd,60);
- } else {
- int len;
- WFIFOB(fd,2) = 0;
- session[fd]->func_parse = parse_frommap;
- server_fd[i] = fd;
- server[i].ip = RFIFOL(fd,54);
- server[i].port = RFIFOW(fd,58);
- server[i].users = 0;
- memset(server[i].map, 0, sizeof(server[i].map));
- WFIFOSET(fd,3);
- RFIFOSKIP(fd,60);
- realloc_fifo(fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
- char_mapif_init(fd);
- // send gm acccounts level to map-servers
- len = 4;
- WFIFOW(fd,0) = 0x2b15;
- for(i = 0; i < GM_num; i++) {
- WFIFOL(fd,len) = gm_account[i].account_id;
- WFIFOB(fd,len+4) = (unsigned char)gm_account[i].level;
- len += 5;
- }
- WFIFOW(fd,2) = len;
- WFIFOSET(fd,len);
- return 0;
- }
- break;
-
- case 0x187: // AliveM†H
- if (RFIFOREST(fd) < 6)
- return 0;
- RFIFOSKIP(fd, 6);
- break;
-
- case 0x7530: // Athenaî•ñŠ“¾
- WFIFOW(fd,0) = 0x7531;
- WFIFOB(fd,2) = ATHENA_MAJOR_VERSION;
- WFIFOB(fd,3) = ATHENA_MINOR_VERSION;
- WFIFOB(fd,4) = ATHENA_REVISION;
- WFIFOB(fd,5) = ATHENA_RELEASE_FLAG;
- WFIFOB(fd,6) = ATHENA_OFFICIAL_FLAG;
- WFIFOB(fd,7) = ATHENA_SERVER_INTER | ATHENA_SERVER_CHAR;
- WFIFOW(fd,8) = ATHENA_MOD_VERSION;
- WFIFOSET(fd,10);
- RFIFOSKIP(fd,2);
- return 0;
-
- case 0x7532: // Ú‘±‚ÌØ’f(default‚ƈ—‚͈ꂾ‚ª–¾Ž¦“I‚É‚·‚邽‚ß)
- session[fd]->eof = 1;
- return 0;
-
- default:
- session[fd]->eof = 1;
- return 0;
- }
- }
- RFIFOFLUSH(fd);
- return 0;
-}
-
-// Console Command Parser [Wizputer]
-int parse_console(char *buf) {
- char *type,*command;
-
- type = (char *)aMalloc(64);
- command = (char *)aMalloc(64);
-
- memset(type,0,64);
- memset(command,0,64);
-
- printf("Console: %s\n",buf);
-
- if ( sscanf(buf, "%[^:]:%[^\n]", type , command ) < 2 )
- sscanf(buf,"%[^\n]",type);
-
- printf("Type of command: %s || Command: %s \n",type,command);
-
- if(buf) aFree(buf);
- if(type) aFree(type);
- if(command) aFree(command);
-
- return 0;
-}
-
-// ‘S‚Ä‚ÌMAPƒT[ƒo[‚Ƀf[ƒ^‘—Mi‘—M‚µ‚½mapŽI‚Ì”‚ð•Ô‚·j
-int mapif_sendall(unsigned char *buf, unsigned int len) {
- int i, c;
-
- c = 0;
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- int fd;
- if ((fd = server_fd[i]) >= 0) {
- memcpy(WFIFOP(fd,0), buf, len);
- WFIFOSET(fd,len);
- c++;
- }
- }
- return c;
-}
-
-// Ž©•ªˆÈŠO‚Ì‘S‚Ä‚ÌMAPƒT[ƒo[‚Ƀf[ƒ^‘—Mi‘—M‚µ‚½mapŽI‚Ì”‚ð•Ô‚·j
-int mapif_sendallwos(int sfd, unsigned char *buf, unsigned int len) {
- int i, c;
-
- c = 0;
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- int fd;
- if ((fd = server_fd[i]) >= 0 && fd != sfd) {
- memcpy(WFIFOP(fd,0), buf, len);
- WFIFOSET(fd, len);
- c++;
- }
- }
- return c;
-}
-// MAPƒT[ƒo[‚Ƀf[ƒ^‘—MimapŽI¶‘¶Šm”F—L‚èj
-int mapif_send(int fd, unsigned char *buf, unsigned int len) {
- int i;
-
- if (fd >= 0) {
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- if (fd == server_fd[i]) {
- memcpy(WFIFOP(fd,0), buf, len);
- WFIFOSET(fd,len);
- return 1;
- }
- }
- }
- return 0;
-}
-
-int send_users_tologin(int tid, unsigned int tick, int id, int data) {
- int users = count_users();
- unsigned char buf[16];
-
- if (login_fd > 0 && session[login_fd]) {
- // send number of user to login server
- WFIFOW(login_fd,0) = 0x2714;
- WFIFOL(login_fd,2) = users;
- WFIFOSET(login_fd,6);
- }
- // send number of players to all map-servers
- WBUFW(buf,0) = 0x2b00;
- WBUFL(buf,2) = users;
- mapif_sendall(buf, 6);
-
- return 0;
-}
-
-int check_connect_login_server(int tid, unsigned int tick, int id, int data) {
- if (login_fd <= 0 || session[login_fd] == NULL) {
- printf("Attempt to connect to login-server...\n");
- login_fd = make_connection(login_ip, login_port);
- session[login_fd]->func_parse = parse_tologin;
- realloc_fifo(login_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
- WFIFOW(login_fd,0) = 0x2710;
- memset(WFIFOP(login_fd,2), 0, 24);
- memcpy(WFIFOP(login_fd,2), userid, strlen(userid) < 24 ? strlen(userid) : 24);
- memset(WFIFOP(login_fd,26), 0, 24);
- memcpy(WFIFOP(login_fd,26), passwd, strlen(passwd) < 24 ? strlen(passwd) : 24);
- WFIFOL(login_fd,50) = 0;
- WFIFOL(login_fd,54) = char_ip;
- WFIFOL(login_fd,58) = char_port;
- memset(WFIFOP(login_fd,60), 0, 20);
- memcpy(WFIFOP(login_fd,60), server_name, strlen(server_name) < 20 ? strlen(server_name) : 20);
- WFIFOW(login_fd,80) = 0;
- WFIFOW(login_fd,82) = char_maintenance;
- WFIFOW(login_fd,84) = char_new;
- WFIFOSET(login_fd,86);
- }
- return 0;
-}
-
-//----------------------------------------------------------
-// Return numerical value of a switch configuration by [Yor]
-// on/off, english, français, deutsch, español
-//----------------------------------------------------------
-int config_switch(const char *str) {
- if (strcmpi(str, "on") == 0 || strcmpi(str, "yes") == 0 || strcmpi(str, "oui") == 0 || strcmpi(str, "ja") == 0 || strcmpi(str, "si") == 0)
- return 1;
- if (strcmpi(str, "off") == 0 || strcmpi(str, "no") == 0 || strcmpi(str, "non") == 0 || strcmpi(str, "nein") == 0)
- return 0;
-
- return atoi(str);
-}
-
-//-------------------------------------------
-// Reading Lan Support configuration by [Yor]
-//-------------------------------------------
-int lan_config_read(const char *lancfgName) {
- int j;
- struct hostent * h = NULL;
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- // set default configuration
- strncpy(lan_map_ip, "127.0.0.1", sizeof(lan_map_ip));
- subneti[0] = 127;
- subneti[1] = 0;
- subneti[2] = 0;
- subneti[3] = 1;
- for(j = 0; j < 4; j++)
- subnetmaski[j] = 255;
-
- fp = fopen(lancfgName, "r");
-
- if (fp == NULL) {
- printf("LAN support configuration file not found: %s\n", lancfgName);
- return 1;
- }
-
- printf ("---start reading of Lan Support configuration...\n");
-
- while(fgets(line, sizeof(line)-1, fp)) {
- if (line[0] == '/' && line[1] == '/')
- continue;
-
- line[sizeof(line)-1] = '\0';
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2)
- continue;
-
- remove_control_chars((unsigned char *)w1);
- remove_control_chars((unsigned char *)w2);
- if (strcmpi(w1, "lan_map_ip") == 0) { // Read map-server Lan IP Address
- h = gethostbyname(w2);
- if (h != NULL) {
- sprintf(lan_map_ip, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- } else {
- strncpy(lan_map_ip, w2, sizeof(lan_map_ip));
- lan_map_ip[sizeof(lan_map_ip)-1] = 0;
- }
- printf("LAN IP of map-server: %s.\n", lan_map_ip);
- } else if (strcmpi(w1, "subnet") == 0) { // Read Subnetwork
- for(j = 0; j < 4; j++)
- subneti[j] = 0;
- h = gethostbyname(w2);
- if (h != NULL) {
- for(j = 0; j < 4; j++)
- subneti[j] = (unsigned char)h->h_addr[j];
- } else {
- sscanf(w2, "%d.%d.%d.%d", &subneti[0], &subneti[1], &subneti[2], &subneti[3]);
- }
- printf("Sub-network of the map-server: %d.%d.%d.%d.\n", subneti[0], subneti[1], subneti[2], subneti[3]);
- } else if (strcmpi(w1, "subnetmask") == 0){ // Read Subnetwork Mask
- for(j = 0; j < 4; j++)
- subnetmaski[j] = 255;
- h = gethostbyname(w2);
- if (h != NULL) {
- for(j = 0; j < 4; j++)
- subnetmaski[j] = (unsigned char)h->h_addr[j];
- } else {
- sscanf(w2, "%d.%d.%d.%d", &subnetmaski[0], &subnetmaski[1], &subnetmaski[2], &subnetmaski[3]);
- }
- printf("Sub-network mask of the map-server: %d.%d.%d.%d.\n", subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]);
- }
- }
- fclose(fp);
-
- // sub-network check of the map-server
- {
- unsigned int a0, a1, a2, a3;
- unsigned char p[4];
- sscanf(lan_map_ip, "%d.%d.%d.%d", &a0, &a1, &a2, &a3);
- p[0] = a0; p[1] = a1; p[2] = a2; p[3] = a3;
- printf("LAN test of LAN IP of the map-server: ");
- if (lan_ip_check(p) == 0) {
- printf("\033[1;31m***ERROR: LAN IP of the map-server doesn't belong to the specified Sub-network.\033[0m\n");
- }
- }
-
- printf("---End reading of Lan Support configuration...\n");
-
- return 0;
-}
-
-int char_config_read(const char *cfgName) {
- struct hostent *h = NULL;
- char line[1024], w1[1024], w2[1024];
- FILE *fp = fopen(cfgName, "r");
-
- if (fp == NULL) {
- printf("Configuration file not found: %s.\n", cfgName);
- exit(1);
- }
-
- while(fgets(line, sizeof(line)-1, fp)) {
- if (line[0] == '/' && line[1] == '/')
- continue;
-
- line[sizeof(line)-1] = '\0';
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2)
- continue;
-
- remove_control_chars((unsigned char *)w1);
- remove_control_chars((unsigned char *)w2);
- if (strcmpi(w1, "userid") == 0) {
- memcpy(userid, w2, 24);
- } else if (strcmpi(w1, "passwd") == 0) {
- memcpy(passwd, w2, 24);
- } else if (strcmpi(w1, "server_name") == 0) {
- memcpy(server_name, w2, sizeof(server_name));
- server_name[sizeof(server_name) - 1] = '\0';
- printf("%s server has been initialized\n", w2);
- } else if (strcmpi(w1, "wisp_server_name") == 0) {
- if (strlen(w2) >= 4) {
- memcpy(wisp_server_name, w2, sizeof(wisp_server_name));
- wisp_server_name[sizeof(wisp_server_name) - 1] = '\0';
- }
- } else if (strcmpi(w1, "login_ip") == 0) {
- login_ip_set_ = 1;
- h = gethostbyname(w2);
- if (h != NULL) {
- printf("Login server IP address : %s -> %d.%d.%d.%d\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- sprintf(login_ip_str, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- } else
- memcpy(login_ip_str, w2, 16);
- } else if (strcmpi(w1, "login_port") == 0) {
- login_port = atoi(w2);
- } else if (strcmpi(w1, "char_ip") == 0) {
- char_ip_set_ = 1;
- h = gethostbyname(w2);
- if (h != NULL) {
- printf("Character server IP address : %s -> %d.%d.%d.%d\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- sprintf(char_ip_str, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- } else
- memcpy(char_ip_str, w2, 16);
- } else if (strcmpi(w1, "bind_ip") == 0) {
- bind_ip_set_ = 1;
- h = gethostbyname(w2);
- if (h != NULL) {
- printf("Character server binding IP address : %s -> %d.%d.%d.%d\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- sprintf(bind_ip_str, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- } else
- memcpy(bind_ip_str, w2, 16);
- } else if (strcmpi(w1, "char_port") == 0) {
- char_port = atoi(w2);
- } else if (strcmpi(w1, "char_maintenance") == 0) {
- char_maintenance = atoi(w2);
- } else if (strcmpi(w1, "char_new") == 0) {
- char_new = atoi(w2);
- } else if (strcmpi(w1, "email_creation") == 0) {
- email_creation = config_switch(w2);
- } else if (strcmpi(w1, "char_txt") == 0) {
- strcpy(char_txt, w2);
- } else if (strcmpi(w1, "backup_txt") == 0) { //By zanetheinsane
- strcpy(backup_txt, w2);
- } else if (strcmpi(w1, "friends_txt") == 0) { //By davidsiaw
- strcpy(friends_txt, w2);
- } else if (strcmpi(w1, "backup_txt_flag") == 0) { // The backup_txt file was created because char deletion bug existed. Now it's finish and that take a lot of time to create a second file when there are a lot of characters. By [Yor]
- backup_txt_flag = config_switch(w2);
- } else if (strcmpi(w1, "max_connect_user") == 0) {
- max_connect_user = atoi(w2);
- if (max_connect_user < 0)
- max_connect_user = 0; // unlimited online players
- } else if(strcmpi(w1, "gm_allow_level") == 0) {
- gm_allow_level = atoi(w2);
- if(gm_allow_level < 0)
- gm_allow_level = 99;
- } else if (strcmpi(w1, "check_ip_flag") == 0) {
- check_ip_flag = config_switch(w2);
- } else if (strcmpi(w1, "autosave_time") == 0) {
- autosave_interval = atoi(w2)*1000;
- if (autosave_interval <= 0)
- autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
- } else if (strcmpi(w1, "start_point") == 0) {
- char map[32];
- int x, y;
- if (sscanf(w2, "%[^,],%d,%d", map, &x, &y) < 3)
- continue;
- if (strstr(map, ".gat") != NULL) { // Verify at least if '.gat' is in the map name
- memcpy(start_point.map, map, 16);
- start_point.x = x;
- start_point.y = y;
- }
- } else if(strcmpi(w1,"imalive_on")==0) { //Added by Mugendai for I'm Alive mod
- imalive_on = atoi(w2); //Added by Mugendai for I'm Alive mod
- } else if(strcmpi(w1,"imalive_time")==0) { //Added by Mugendai for I'm Alive mod
- imalive_time = atoi(w2); //Added by Mugendai for I'm Alive mod
- } else if(strcmpi(w1,"flush_on")==0) { //Added by Mugendai for GUI
- flush_on = atoi(w2); //Added by Mugendai for GUI
- } else if(strcmpi(w1,"flush_time")==0) { //Added by Mugendai for GUI
- flush_time = atoi(w2); //Added by Mugendai for GUI
- } else if(strcmpi(w1,"log_char")==0) { //log char or not [devil]
- log_char = atoi(w2);
- } else if (strcmpi(w1, "start_zeny") == 0) {
- start_zeny = atoi(w2);
- if (start_zeny < 0)
- start_zeny = 0;
- } else if (strcmpi(w1, "start_weapon") == 0) {
- start_weapon = atoi(w2);
- if (start_weapon < 0)
- start_weapon = 0;
- } else if (strcmpi(w1, "start_armor") == 0) {
- start_armor = atoi(w2);
- if (start_armor < 0)
- start_armor = 0;
- } else if (strcmpi(w1, "unknown_char_name") == 0) {
- strcpy(unknown_char_name, w2);
- unknown_char_name[24] = 0;
- } else if (strcmpi(w1, "char_log_filename") == 0) {
- strcpy(char_log_filename, w2);
- } else if (strcmpi(w1, "name_ignoring_case") == 0) {
- name_ignoring_case = config_switch(w2);
- } else if (strcmpi(w1, "char_name_option") == 0) {
- char_name_option = atoi(w2);
- } else if (strcmpi(w1, "char_name_letters") == 0) {
- strcpy(char_name_letters, w2);
-// online files options
- } else if (strcmpi(w1, "online_txt_filename") == 0) {
- strcpy(online_txt_filename, w2);
- } else if (strcmpi(w1, "online_html_filename") == 0) {
- strcpy(online_html_filename, w2);
- } else if (strcmpi(w1, "online_sorting_option") == 0) {
- online_sorting_option = atoi(w2);
- } else if (strcmpi(w1, "online_display_option") == 0) {
- online_display_option = atoi(w2);
- } else if (strcmpi(w1, "online_gm_display_min_level") == 0) { // minimum GM level to display 'GM' when we want to display it
- online_gm_display_min_level = atoi(w2);
- if (online_gm_display_min_level < 5) // send online file every 5 seconds to player is enough
- online_gm_display_min_level = 5;
- } else if (strcmpi(w1, "online_refresh_html") == 0) {
- online_refresh_html = atoi(w2);
- if (online_refresh_html < 1)
- online_refresh_html = 1;
- } else if(strcmpi(w1,"db_path")==0) {
- strcpy(db_path,w2);
- } else if (strcmpi(w1, "import") == 0) {
- char_config_read(w2);
- } else if (strcmpi(w1, "console") == 0) {
- if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
- console = 1;
- }
- }
- fclose(fp);
-
- return 0;
-}
-
-//-----------------------------------------------------
-//I'm Alive Alert
-//Used to output 'I'm Alive' every few seconds
-//Intended to let frontends know if the app froze
-//-----------------------------------------------------
-int imalive_timer(int tid, unsigned int tick, int id, int data){
- printf("I'm Alive\n");
- return 0;
-}
-
-//-----------------------------------------------------
-//Flush stdout
-//stdout buffer needs flushed to be seen in GUI
-//-----------------------------------------------------
-int flush_timer(int tid, unsigned int tick, int id, int data){
- fflush(stdout);
- return 0;
-}
-
-void do_final(void) {
- int i;
- printf("Terminating server.\n");
- // write online players files with no player
- for(i = 0; i < online_players_max; i++) {
- online_chars[i].char_id = -1;
- online_chars[i].server = -1;
- }
-
- create_online_files();
- if(online_chars) aFree(online_chars);
-
- mmo_char_sync();
- inter_save();
-
- if(gm_account) aFree(gm_account);
- if(char_dat) aFree(char_dat);
-
- delete_session(login_fd);
- delete_session(char_fd);
-
- inter_final();
- exit_dbn();
- timer_final();
-
- char_log("----End of char-server (normal end with closing of all files)." RETCODE);
-}
-
-int do_init(int argc, char **argv) {
- int i;
-
- SERVER_TYPE = SERVER_CHAR;
- char_config_read((argc < 2) ? CHAR_CONF_NAME : argv[1]);
- lan_config_read((argc > 1) ? argv[1] : LOGIN_LAN_CONF_NAME);
-
- // a newline in the log...
- char_log("");
- // moved behind char_config_read in case we changed the filename [celest]
- char_log("The char-server starting..." RETCODE);
-
- if ((naddr_ != 0) && (login_ip_set_ == 0 || char_ip_set_ == 0)) {
- // The char server should know what IP address it is running on
- // - MouseJstr
- int localaddr = ntohl(addr_[0]);
- unsigned char *ptr = (unsigned char *) &localaddr;
- char buf[16];
- sprintf(buf, "%d.%d.%d.%d", ptr[0], ptr[1], ptr[2], ptr[3]);;
- if (naddr_ != 1)
- printf("Multiple interfaces detected.. using %s as our IP address\n", buf);
- else
- printf("Defaulting to %s as our IP address\n", buf);
- if (login_ip_set_ == 0)
- strcpy(login_ip_str, buf);
- if (char_ip_set_ == 0)
- strcpy(char_ip_str, buf);
-
- if (ptr[0] == 192 && ptr[1] == 168)
- printf("Firewall detected.. edit lan_support.conf and char_athena.conf\n");
- }
-
- login_ip = inet_addr(login_ip_str);
- char_ip = inet_addr(char_ip_str);
-
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- memset(&server[i], 0, sizeof(struct mmo_map_server));
- server_fd[i] = -1;
- }
-
- online_players_max = 256;
- online_chars = (struct online_chars*)aCalloc(sizeof(struct online_chars) * 256, 1);
- if (!online_chars) {
- printf("out of memory: do_init (calloc).\n");
- exit(1);
- }
- for(i = 0; i < online_players_max; i++) {
- online_chars[i].char_id = -1;
- online_chars[i].server = -1;
- }
-
- mmo_char_init();
-
- update_online = time(NULL);
- create_online_files(); // update online players files at start of the server
-
- inter_init((argc > 2) ? argv[2] : inter_cfgName); // inter server ‰Šú‰»
-
- set_termfunc(do_final);
- set_defaultparse(parse_char);
-
- if (bind_ip_set_)
- char_fd = make_listen_bind(inet_addr(bind_ip_str),char_port);
- else
- char_fd = make_listen_bind(INADDR_ANY,char_port);
-
- add_timer_func_list(check_connect_login_server, "check_connect_login_server");
- add_timer_func_list(send_users_tologin, "send_users_tologin");
- add_timer_func_list(mmo_char_sync_timer, "mmo_char_sync_timer");
-
- i = add_timer_interval(gettick() + 1000, check_connect_login_server, 0, 0, 10 * 1000);
- i = add_timer_interval(gettick() + 1000, send_users_tologin, 0, 0, 5 * 1000);
- i = add_timer_interval(gettick() + autosave_interval, mmo_char_sync_timer, 0, 0, autosave_interval);
-
- //Added for Mugendais I'm Alive mod
- if (imalive_on)
- add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000);
-
- //Added by Mugendai for GUI support
- if (flush_on)
- add_timer_interval(gettick()+10, flush_timer,0,0,flush_time);
-
- if(console) {
- set_defaultconsoleparse(parse_console);
- start_console();
- }
-
- char_log("The char-server is ready (Server is listening on the port %d)." RETCODE, char_port);
-
- printf("The char-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", char_port);
-
- return 0;
-}
-
-int char_married(int pl1,int pl2) {
- if (char_dat[pl1].char_id == char_dat[pl2].partner_id && char_dat[pl2].char_id == char_dat[pl1].partner_id)
- return 1;
- else
- return 0;
-}
-
-int char_child(int parent_id, int child_id) {
- if (char_dat[parent_id].child == char_dat[child_id].char_id &&
- ((char_dat[parent_id].char_id == char_dat[child_id].father) ||
- (char_dat[parent_id].char_id == char_dat[child_id].mother)))
- return 1;
- else
- return 0;
-}
diff --git a/src/char/char.h b/src/char/char.h
deleted file mode 100644
index 78f4f0194..000000000
--- a/src/char/char.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// $Id: char.h,v 1.1.1.1 2004/09/10 17:26:50 MagicalTux Exp $
-#ifndef _CHAR_H_
-#define _CHAR_H_
-
-#define MAX_MAP_SERVERS 30
-
-#define CHAR_CONF_NAME "conf/char_athena.conf"
-
-#define LOGIN_LAN_CONF_NAME "conf/lan_support.conf"
-
-#define DEFAULT_AUTOSAVE_INTERVAL 300*1000
-
-struct mmo_map_server{
- long ip;
- short port;
- int users;
- char map[MAX_MAP_PER_SERVER][16];
-};
-
-int search_character_index(char* character_name);
-char * search_character_name(int index);
-
-int mapif_sendall(unsigned char *buf, unsigned int len);
-int mapif_sendallwos(int fd,unsigned char *buf, unsigned int len);
-int mapif_send(int fd,unsigned char *buf, unsigned int len);
-
-int char_married(int pl1,int pl2);
-int char_child(int parent_id, int child_id);
-
-int char_log(char *fmt, ...);
-
-extern int autosave_interval;
-extern char db_path[];
-
-#endif
diff --git a/src/char/int_guild.c b/src/char/int_guild.c
deleted file mode 100644
index 9268d9339..000000000
--- a/src/char/int_guild.c
+++ /dev/null
@@ -1,1473 +0,0 @@
-// $Id: int_guild.c,v 1.2 2004/09/25 19:36:53 Akitasha Exp $
-#include "inter.h"
-#include "int_guild.h"
-#include "int_storage.h"
-#include "mmo.h"
-#include "char.h"
-#include "socket.h"
-#include "db.h"
-#include "lock.h"
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-char guild_txt[1024] = "save/guild.txt";
-char castle_txt[1024] = "save/castle.txt";
-
-static struct dbt *guild_db;
-static struct dbt *castle_db;
-
-static int guild_newid = 10000;
-
-static int guild_exp[100];
-
-int mapif_parse_GuildLeave(int fd, int guild_id, int account_id, int char_id, int flag, const char *mes);
-int mapif_guild_broken(int guild_id, int flag);
-int guild_check_empty(struct guild *g);
-int guild_calcinfo(struct guild *g);
-int mapif_guild_basicinfochanged(int guild_id, int type, const void *data, int len);
-int mapif_guild_info(int fd, struct guild *g);
-int guild_break_sub(void *key, void *data, va_list ap);
-
-// ƒMƒ‹ƒhƒf[ƒ^‚Ì•¶Žš—ñ‚Ö‚Ì•ÏŠ·
-int inter_guild_tostr(char *str, struct guild *g) {
- int i, c, len;
-
- // Šî–{ƒf[ƒ^
- len = sprintf(str, "%d\t%s\t%s\t%d,%d,%d,%d,%d\t%s#\t%s#\t",
- g->guild_id, g->name, g->master,
- g->guild_lv, g->max_member, g->exp, g->skill_point, g->castle_id,
- g->mes1, g->mes2);
- // ƒƒ“ƒo[
- for(i = 0; i < g->max_member; i++) {
- struct guild_member *m = &g->member[i];
- len += sprintf(str + len, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\t%s\t",
- m->account_id, m->char_id,
- m->hair, m->hair_color, m->gender,
- m->class_, m->lv, m->exp, m->exp_payper, m->position,
- ((m->account_id > 0) ? m->name : "-"));
- }
- // –ðE
- for(i = 0; i < MAX_GUILDPOSITION; i++) {
- struct guild_position *p = &g->position[i];
- len += sprintf(str + len, "%d,%d\t%s#\t", p->mode, p->exp_mode, p->name);
- }
- // ƒGƒ“ƒuƒŒƒ€
- len += sprintf(str + len, "%d,%d,", g->emblem_len, g->emblem_id);
- for(i = 0; i < g->emblem_len; i++) {
- len += sprintf(str + len, "%02x", (unsigned char)(g->emblem_data[i]));
- }
- len += sprintf(str + len, "$\t");
- // “¯–¿ƒŠƒXƒg
- c = 0;
- for(i = 0; i < MAX_GUILDALLIANCE; i++)
- if (g->alliance[i].guild_id > 0)
- c++;
- len += sprintf(str + len, "%d\t", c);
- for(i = 0; i < MAX_GUILDALLIANCE; i++) {
- struct guild_alliance *a = &g->alliance[i];
- if (a->guild_id > 0)
- len += sprintf(str + len, "%d,%d\t%s\t", a->guild_id, a->opposition, a->name);
- }
- // ’Ç•úƒŠƒXƒg
- c = 0;
- for(i = 0; i < MAX_GUILDEXPLUSION; i++)
- if (g->explusion[i].account_id > 0)
- c++;
- len += sprintf(str + len, "%d\t", c);
- for(i = 0; i < MAX_GUILDEXPLUSION; i++) {
- struct guild_explusion *e = &g->explusion[i];
- if (e->account_id > 0)
- len += sprintf(str + len, "%d,%d,%d,%d\t%s\t%s\t%s#\t",
- e->account_id, e->rsv1, e->rsv2, e->rsv3,
- e->name, e->acc, e->mes );
- }
- // ƒMƒ‹ƒhƒXƒLƒ‹
- for(i = 0; i < MAX_GUILDSKILL; i++) {
- len += sprintf(str + len, "%d,%d ", g->skill[i].id, g->skill[i].lv);
- }
- len += sprintf(str + len, "\t");
-
- return 0;
-}
-
-// ƒMƒ‹ƒhƒf[ƒ^‚Ì•¶Žš—ñ‚©‚ç‚Ì•ÏŠ·
-int inter_guild_fromstr(char *str, struct guild *g) {
- int i, j, c;
- int tmp_int[16];
- char tmp_str[4][256];
- char tmp_str2[4096];
- char *pstr;
-
- // Šî–{ƒf[ƒ^
- memset(g, 0, sizeof(struct guild));
- if (sscanf(str, "%d\t%[^\t]\t%[^\t]\t%d,%d,%d,%d,%d\t%[^\t]\t%[^\t]\t", &tmp_int[0],
- tmp_str[0], tmp_str[1],
- &tmp_int[1], &tmp_int[2], &tmp_int[3], &tmp_int[4], &tmp_int[5],
- tmp_str[2], tmp_str[3]) < 8)
- return 1;
-
- g->guild_id = tmp_int[0];
- g->guild_lv = tmp_int[1];
- g->max_member = tmp_int[2];
- g->exp = tmp_int[3];
- g->skill_point = tmp_int[4];
- g->castle_id = tmp_int[5];
- memcpy(g->name, tmp_str[0], 24);
- memcpy(g->master, tmp_str[1], 24);
- memcpy(g->mes1, tmp_str[2], 60);
- memcpy(g->mes2, tmp_str[3], 120);
- g->mes1[strlen(g->mes1)-1] = 0;
- g->mes2[strlen(g->mes2)-1] = 0;
-
- for(j = 0; j < 6 && str != NULL; j++) // ˆÊ’uƒXƒLƒbƒv
- str = strchr(str + 1, '\t');
-// printf("GuildBaseInfo OK\n");
-
- // ƒƒ“ƒo[
- for(i = 0; i < g->max_member; i++) {
- struct guild_member *m = &g->member[i];
- if (sscanf(str + 1, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\t%[^\t]\t",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], &tmp_int[4],
- &tmp_int[5], &tmp_int[6], &tmp_int[7], &tmp_int[8], &tmp_int[9],
- tmp_str[0]) < 11)
- return 1;
- m->account_id = tmp_int[0];
- m->char_id = tmp_int[1];
- m->hair = tmp_int[2];
- m->hair_color = tmp_int[3];
- m->gender = tmp_int[4];
- m->class_ = tmp_int[5];
- m->lv = tmp_int[6];
- m->exp = tmp_int[7];
- m->exp_payper = tmp_int[8];
- m->position = tmp_int[9];
- memcpy(m->name, tmp_str[0], 24);
-
- for(j = 0; j < 2 && str != NULL; j++) // ˆÊ’uƒXƒLƒbƒv
- str = strchr(str + 1, '\t');
- }
-// printf("GuildMemberInfo OK\n");
- // –ðE
- i = 0;
- while (sscanf(str+1, "%d,%d%n", &tmp_int[0], &tmp_int[1], &j) == 2 && str[1+j] == '\t') {
- struct guild_position *p = &g->position[i];
- if (sscanf(str+1, "%d,%d\t%[^\t]\t", &tmp_int[0], &tmp_int[1], tmp_str[0]) < 3)
- return 1;
- p->mode = tmp_int[0];
- p->exp_mode = tmp_int[1];
- tmp_str[0][strlen(tmp_str[0])-1] = 0;
- memcpy(p->name, tmp_str[0], 24);
-
- for(j = 0; j < 2 && str != NULL; j++) // ˆÊ’uƒXƒLƒbƒv
- str = strchr(str+1, '\t');
- i++;
- }
-// printf("GuildPositionInfo OK\n");
- // ƒGƒ“ƒuƒŒƒ€
- tmp_int[1] = 0;
- if (sscanf(str + 1, "%d,%d,%[^\t]\t", &tmp_int[0], &tmp_int[1], tmp_str2)< 3 &&
- sscanf(str + 1, "%d,%[^\t]\t", &tmp_int[0], tmp_str2) < 2)
- return 1;
- g->emblem_len = tmp_int[0];
- g->emblem_id = tmp_int[1];
- for(i = 0, pstr = tmp_str2; i < g->emblem_len; i++, pstr += 2) {
- int c1 = pstr[0], c2 = pstr[1], x1 = 0, x2 = 0;
- if (c1 >= '0' && c1 <= '9') x1 = c1 - '0';
- if (c1 >= 'a' && c1 <= 'f') x1 = c1 - 'a' + 10;
- if (c1 >= 'A' && c1 <= 'F') x1 = c1 - 'A' + 10;
- if (c2 >= '0' && c2 <= '9') x2 = c2 - '0';
- if (c2 >= 'a' && c2 <= 'f') x2 = c2 - 'a' + 10;
- if (c2 >= 'A' && c2 <= 'F') x2 = c2 - 'A' + 10;
- g->emblem_data[i] = (x1<<4) | x2;
- }
-// printf("GuildEmblemInfo OK\n");
- str=strchr(str + 1, '\t'); // ˆÊ’uƒXƒLƒbƒv
-
- // “¯–¿ƒŠƒXƒg
- if (sscanf(str + 1, "%d\t", &c) < 1)
- return 1;
- str = strchr(str + 1, '\t'); // ˆÊ’uƒXƒLƒbƒv
- for(i = 0; i < c; i++) {
- struct guild_alliance *a = &g->alliance[i];
- if (sscanf(str + 1, "%d,%d\t%[^\t]\t", &tmp_int[0], &tmp_int[1], tmp_str[0]) < 3)
- return 1;
- a->guild_id = tmp_int[0];
- a->opposition = tmp_int[1];
- memcpy(a->name, tmp_str[0], 24);
-
- for(j = 0; j < 2 && str != NULL; j++) // ˆÊ’uƒXƒLƒbƒv
- str = strchr(str + 1, '\t');
- }
-// printf("GuildAllianceInfo OK\n");
- // ’Ç•úƒŠƒXƒg
- if (sscanf(str+1, "%d\t", &c) < 1)
- return 1;
- str = strchr(str + 1, '\t'); // ˆÊ’uƒXƒLƒbƒv
- for(i = 0; i < c; i++) {
- struct guild_explusion *e = &g->explusion[i];
- if (sscanf(str + 1, "%d,%d,%d,%d\t%[^\t]\t%[^\t]\t%[^\t]\t",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
- tmp_str[0], tmp_str[1], tmp_str[2]) < 6)
- return 1;
- e->account_id = tmp_int[0];
- e->rsv1 = tmp_int[1];
- e->rsv2 = tmp_int[2];
- e->rsv3 = tmp_int[3];
- memcpy(e->name, tmp_str[0], 24);
- memcpy(e->acc, tmp_str[1], 24);
- tmp_str[2][strlen(tmp_str[2])-1] = 0;
- memcpy(e->mes, tmp_str[2], 40);
-
- for(j = 0; j < 4 && str != NULL; j++) // ˆÊ’uƒXƒLƒbƒv
- str = strchr(str + 1, '\t');
- }
-// printf("GuildExplusionInfo OK\n");
- // ƒMƒ‹ƒhƒXƒLƒ‹
- for(i = 0; i < MAX_GUILDSKILL; i++) {
- if (sscanf(str+1,"%d,%d ", &tmp_int[0], &tmp_int[1]) < 2)
- break;
- g->skill[i].id = tmp_int[0];
- g->skill[i].lv = tmp_int[1];
- str = strchr(str + 1, ' ');
- }
- str = strchr(str + 1, '\t');
-// printf("GuildSkillInfo OK\n");
-
- return 0;
-}
-
-// ƒMƒ‹ƒhéƒf[ƒ^‚Ì•¶Žš—ñ‚Ö‚Ì•ÏŠ·
-int inter_guildcastle_tostr(char *str, struct guild_castle *gc) {
- int len;
-
- len = sprintf(str, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", // added Guardian HP [Valaris]
- gc->castle_id, gc->guild_id, gc->economy, gc->defense, gc->triggerE,
- gc->triggerD, gc->nextTime, gc->payTime, gc->createTime, gc->visibleC,
- gc->visibleG0, gc->visibleG1, gc->visibleG2, gc->visibleG3, gc->visibleG4,
- gc->visibleG5, gc->visibleG6, gc->visibleG7, gc->Ghp0, gc->Ghp1, gc->Ghp2,
- gc->Ghp3, gc->Ghp4, gc->Ghp5, gc->Ghp6, gc->Ghp7);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhéƒf[ƒ^‚Ì•¶Žš—ñ‚©‚ç‚Ì•ÏŠ·
-int inter_guildcastle_fromstr(char *str, struct guild_castle *gc) {
- int tmp_int[26];
-
- memset(gc, 0, sizeof(struct guild_castle));
- // new structure of guild castle
- if (sscanf(str, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], &tmp_int[4], &tmp_int[5], &tmp_int[6],
- &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12], &tmp_int[13],
- &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18], &tmp_int[19], &tmp_int[20],
- &tmp_int[21], &tmp_int[22], &tmp_int[23], &tmp_int[24], &tmp_int[25]) == 26) {
- gc->castle_id = tmp_int[0];
- gc->guild_id = tmp_int[1];
- gc->economy = tmp_int[2];
- gc->defense = tmp_int[3];
- gc->triggerE = tmp_int[4];
- gc->triggerD = tmp_int[5];
- gc->nextTime = tmp_int[6];
- gc->payTime = tmp_int[7];
- gc->createTime = tmp_int[8];
- gc->visibleC = tmp_int[9];
- gc->visibleG0 = tmp_int[10];
- gc->visibleG1 = tmp_int[11];
- gc->visibleG2 = tmp_int[12];
- gc->visibleG3 = tmp_int[13];
- gc->visibleG4 = tmp_int[14];
- gc->visibleG5 = tmp_int[15];
- gc->visibleG6 = tmp_int[16];
- gc->visibleG7 = tmp_int[17];
- gc->Ghp0 = tmp_int[18];
- gc->Ghp1 = tmp_int[19];
- gc->Ghp2 = tmp_int[20];
- gc->Ghp3 = tmp_int[21];
- gc->Ghp4 = tmp_int[22];
- gc->Ghp5 = tmp_int[23];
- gc->Ghp6 = tmp_int[24];
- gc->Ghp7 = tmp_int[25]; // end additions [Valaris]
- // old structure of guild castle
- } else if (sscanf(str, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], &tmp_int[4], &tmp_int[5], &tmp_int[6],
- &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12], &tmp_int[13],
- &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17]) == 18) {
- gc->castle_id = tmp_int[0];
- gc->guild_id = tmp_int[1];
- gc->economy = tmp_int[2];
- gc->defense = tmp_int[3];
- gc->triggerE = tmp_int[4];
- gc->triggerD = tmp_int[5];
- gc->nextTime = tmp_int[6];
- gc->payTime = tmp_int[7];
- gc->createTime = tmp_int[8];
- gc->visibleC = tmp_int[9];
- gc->visibleG0 = tmp_int[10];
- gc->visibleG1 = tmp_int[11];
- gc->visibleG2 = tmp_int[12];
- gc->visibleG3 = tmp_int[13];
- gc->visibleG4 = tmp_int[14];
- gc->visibleG5 = tmp_int[15];
- gc->visibleG6 = tmp_int[16];
- gc->visibleG7 = tmp_int[17];
- if (gc->visibleG0 == 1)
- gc->Ghp0 = 15670 + 2000 * gc->defense;
- else
- gc->Ghp0 = 0;
- if (gc->visibleG1 == 1)
- gc->Ghp1 = 15670 + 2000 * gc->defense;
- else
- gc->Ghp1 = 0;
- if (gc->visibleG2 == 1)
- gc->Ghp2 = 15670 + 2000 * gc->defense;
- else
- gc->Ghp2 = 0;
- if (gc->visibleG3 == 1)
- gc->Ghp3 = 30214 + 2000 * gc->defense;
- else
- gc->Ghp3 = 0;
- if (gc->visibleG4 == 1)
- gc->Ghp4 = 30214 + 2000 * gc->defense;
- else
- gc->Ghp4 = 0;
- if (gc->visibleG5 == 1)
- gc->Ghp5 = 28634 + 2000 * gc->defense;
- else
- gc->Ghp5 = 0;
- if (gc->visibleG6 == 1)
- gc->Ghp6 = 28634 + 2000 * gc->defense;
- else
- gc->Ghp6 = 0;
- if (gc->visibleG7 == 1)
- gc->Ghp7 = 28634 + 2000 * gc->defense;
- else
- gc->Ghp7 = 0;
- } else {
- return 1;
- }
-
- return 0;
-}
-
-// ƒMƒ‹ƒhŠÖ˜Aƒf[ƒ^ƒx[ƒX“Ç‚Ýž‚Ý
-int inter_guild_readdb() {
- int i;
- FILE *fp;
- char line[1024];
- char path[1024];
-
- sprintf(path, "%s%s", db_path, "/exp_guild.txt");
- fp = fopen(path, "r");
- if (fp == NULL) {
- printf("can't read db/exp_guild.txt\n");
- return 1;
- }
- i = 0;
- while(fgets(line, sizeof(line)-1, fp) && i < 100){
- if (line[0] == '/' && line[1] == '/')
- continue;
- guild_exp[i] = atoi(line);
- i++;
- }
- fclose(fp);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhƒf[ƒ^‚Ì“Ç‚Ýž‚Ý
-int inter_guild_init() {
- char line[16384];
- struct guild *g;
- struct guild_castle *gc;
- FILE *fp;
- int i, j, c = 0;
-
- inter_guild_readdb();
-
- guild_db = numdb_init();
- castle_db = numdb_init();
-
- if ((fp = fopen(guild_txt,"r")) == NULL)
- return 1;
- while(fgets(line, sizeof(line)-1, fp)) {
- j = 0;
- if (sscanf(line, "%d\t%%newid%%\n%n", &i, &j) == 1 && j > 0 && guild_newid <= i) {
- guild_newid = i;
- continue;
- }
-
- g = (struct guild *) aCalloc(sizeof(struct guild), 1);
- if(g == NULL){
- printf("int_guild: out of memory!\n");
- exit(0);
- }
- memset(g, 0, sizeof(struct guild));
- if (inter_guild_fromstr(line, g) == 0 && g->guild_id > 0) {
- if (g->guild_id >= guild_newid)
- guild_newid = g->guild_id + 1;
- numdb_insert(guild_db, g->guild_id, g);
- guild_check_empty(g);
- guild_calcinfo(g);
- } else {
- printf("int_guild: broken data [%s] line %d\n", guild_txt, c);
- aFree(g);
- }
- c++;
- }
- fclose(fp);
-// printf("int_guild: %s read done (%d guilds)\n", guild_txt, c);
-
- c = 0;//ƒJƒEƒ“ƒ^‰Šú‰»
-
- if ((fp = fopen(castle_txt, "r")) == NULL) {
- return 1;
- }
-
- while(fgets(line, sizeof(line)-1, fp)) {
- gc = (struct guild_castle *) aCalloc(sizeof(struct guild_castle), 1);
- if(gc == NULL){
- printf("int_guild: out of memory!\n");
- exit(0);
- }
- memset(gc, 0, sizeof(struct guild_castle));
- if (inter_guildcastle_fromstr(line, gc) == 0) {
- numdb_insert(castle_db, gc->castle_id, gc);
- } else {
- printf("int_guild: broken data [%s] line %d\n", castle_txt, c);
- aFree(gc);
- }
- c++;
- }
-
- if (!c) {
- printf(" %s - making Default Data...\n", castle_txt);
- //ƒfƒtƒHƒ‹ƒgƒf[ƒ^‚ðì¬
- for(i = 0; i < MAX_GUILDCASTLE; i++) {
- gc = (struct guild_castle *) aCalloc(sizeof(struct guild_castle), 1);
- if (gc == NULL) {
- printf("int_guild: out of memory!\n");
- exit(0);
- }
- memset(gc, 0, sizeof(struct guild_castle));
- gc->castle_id = i;
- gc->guild_id = 0;
- gc->economy = 0;
- gc->defense = 0;
- gc->triggerE = 0;
- gc->triggerD = 0;
- gc->nextTime = 0;
- gc->payTime = 0;
- gc->createTime = 0;
- gc->visibleC = 0;
- gc->visibleG0 = 0;
- gc->visibleG1 = 0;
- gc->visibleG2 = 0;
- gc->visibleG3 = 0;
- gc->visibleG4 = 0;
- gc->visibleG5 = 0;
- gc->visibleG6 = 0;
- gc->visibleG7 = 0;
- gc->Ghp0 = 0; // guardian HP [Valaris]
- gc->Ghp1 = 0;
- gc->Ghp2 = 0;
- gc->Ghp3 = 0;
- gc->Ghp4 = 0;
- gc->Ghp5 = 0;
- gc->Ghp6 = 0;
- gc->Ghp7 = 0; // end additions [Valaris]
- numdb_insert(castle_db, gc->castle_id, gc);
- }
- printf(" %s - making done\n",castle_txt);
- return 0;
- }
-
- fclose(fp);
-
- return 0;
-}
-
-int castle_db_final (void *k, void *data, va_list ap)
-{
- struct guild_castle *gc = (struct guild_castle *) data;
- if (gc) aFree(gc);
- return 0;
-}
-int guild_db_final (void *k, void *data, va_list ap)
-{
- struct guild *g = (struct guild *) data;
- if (g) aFree(g);
- return 0;
-}
-void inter_guild_final() {
- numdb_final(castle_db, castle_db_final);
- numdb_final(guild_db, guild_db_final);
- return;
-}
-
-struct guild *inter_guild_search(int guild_id) {
- struct guild *g;
-
- g = (struct guild *) numdb_search(guild_db, guild_id);
-
- return g;
-}
-
-// ƒMƒ‹ƒhƒf[ƒ^‚̃Z[ƒu—p
-int inter_guild_save_sub(void *key,void *data,va_list ap) {
- char line[16384];
- FILE *fp;
-
- inter_guild_tostr(line,(struct guild *)data);
- fp=va_arg(ap,FILE *);
- fprintf(fp,"%s" RETCODE,line);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhéƒf[ƒ^‚̃Z[ƒu—p
-int inter_castle_save_sub(void *key, void *data, va_list ap) {
- char line[16384];
- FILE *fp;
-
- inter_guildcastle_tostr(line, (struct guild_castle *)data);
- fp = va_arg(ap, FILE *);
- fprintf(fp, "%s" RETCODE, line);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhƒf[ƒ^‚̃Z[ƒu
-int inter_guild_save() {
- FILE *fp;
- int lock;
-
- if ((fp = lock_fopen(guild_txt, &lock)) == NULL) {
- printf("int_guild: cant write [%s] !!! data is lost !!!\n", guild_txt);
- return 1;
- }
- numdb_foreach(guild_db, inter_guild_save_sub, fp);
-// fprintf(fp, "%d\t%%newid%%\n", guild_newid);
- lock_fclose(fp, guild_txt, &lock);
-// printf("int_guild: %s saved.\n", guild_txt);
-
- if ((fp = lock_fopen(castle_txt,&lock)) == NULL) {
- printf("int_guild: cant write [%s] !!! data is lost !!!\n", castle_txt);
- return 1;
- }
- numdb_foreach(castle_db, inter_castle_save_sub, fp);
- lock_fclose(fp, castle_txt, &lock);
-
- return 0;
-}
-
-// ƒMƒ‹ƒh–¼ŒŸõ—p
-int search_guildname_sub(void *key, void *data, va_list ap) {
- struct guild *g = (struct guild *)data, **dst;
- char *str;
-
- str = va_arg(ap, char *);
- dst = va_arg(ap, struct guild **);
- if (strcmpi(g->name, str) == 0)
- *dst = g;
- return 0;
-}
-
-// ƒMƒ‹ƒh–¼ŒŸõ
-struct guild* search_guildname(char *str) {
- struct guild *g = NULL;
- numdb_foreach(guild_db, search_guildname_sub, str, &g);
- return g;
-}
-
-// ƒMƒ‹ƒh‚ª‹ó‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
-int guild_check_empty(struct guild *g) {
- int i;
-
- for(i = 0; i < g->max_member; i++) {
- if (g->member[i].account_id > 0) {
- return 0;
- }
- }
- // ’N‚à‚¢‚È‚¢‚̂ʼnðŽU
- numdb_foreach(guild_db, guild_break_sub, g->guild_id);
- numdb_erase(guild_db, g->guild_id);
- inter_guild_storage_delete(g->guild_id);
- mapif_guild_broken(g->guild_id, 0);
- aFree(g);
-
- return 1;
-}
-
-// ƒLƒƒƒ‰‚Ì‹£‡‚ª‚È‚¢‚©ƒ`ƒFƒbƒN—p
-int guild_check_conflict_sub(void *key, void *data, va_list ap) {
- struct guild *g = (struct guild *)data;
- int guild_id, account_id, char_id, i;
-
- guild_id = va_arg(ap, int);
- account_id = va_arg(ap, int);
- char_id = va_arg(ap, int);
-
- if (g->guild_id == guild_id) // –{—ˆ‚ÌŠ‘®‚È‚Ì‚Å–â‘è‚È‚µ
- return 0;
-
- for(i = 0; i < MAX_GUILD; i++) {
- if (g->member[i].account_id == account_id && g->member[i].char_id == char_id) {
- // •Ê‚̃Mƒ‹ƒh‚É‹U‚ÌŠ‘®ƒf[ƒ^‚ª‚ ‚é‚Ì‚Å’E‘Þ
- printf("int_guild: guild conflict! %d,%d %d!=%d\n", account_id, char_id, guild_id, g->guild_id);
- mapif_parse_GuildLeave(-1, g->guild_id, account_id, char_id, 0, "**ƒf[ƒ^‹£‡**");
- }
- }
-
- return 0;
-}
-// ƒLƒƒƒ‰‚Ì‹£‡‚ª‚È‚¢‚©ƒ`ƒFƒbƒN
-int guild_check_conflict(int guild_id, int account_id, int char_id) {
- numdb_foreach(guild_db, guild_check_conflict_sub, guild_id, account_id, char_id);
-
- return 0;
-}
-
-int guild_nextexp(int level) {
- if (level < 100)
- return guild_exp[level-1];
-
- return 0;
-}
-
-// ƒMƒ‹ƒhƒXƒLƒ‹‚ª‚ ‚é‚©Šm”F
-int guild_checkskill(struct guild *g, int id) {
- int idx = id - GD_SKILLBASE;
-
-
- if(idx < 0 || idx >= MAX_GUILDSKILL)
-
- return 0;
-
- return g->skill[idx].lv;
-}
-
-// ƒMƒ‹ƒh‚Ìî•ñ‚ÌÄŒvŽZ
-int guild_calcinfo(struct guild *g) {
- int i, c, nextexp;
- struct guild before = *g;
-
- // ƒXƒLƒ‹ID‚ÌÝ’è
- for(i = 0; i < MAX_GUILDSKILL; i++)
- g->skill[i].id=i+GD_SKILLBASE;
-
- // ƒMƒ‹ƒhƒŒƒxƒ‹
- if (g->guild_lv <= 0)
- g->guild_lv = 1;
- nextexp = guild_nextexp(g->guild_lv);
- if (nextexp > 0) {
- while(g->exp >= nextexp) { // ƒŒƒxƒ‹ƒAƒbƒvˆ—
- g->exp -= nextexp;
- g->guild_lv++;
- g->skill_point++;
- nextexp = guild_nextexp(g->guild_lv);
- }
- }
-
- // ƒMƒ‹ƒh‚ÌŽŸ‚ÌŒoŒ±’l
- g->next_exp = guild_nextexp(g->guild_lv);
-
- // ƒƒ“ƒoãŒÀiƒMƒ‹ƒhŠg’£“K—pj
- g->max_member = 16 + guild_checkskill(g, GD_EXTENSION) * 6; //Lupus 2 -> 6
-
- // •½‹ÏƒŒƒxƒ‹‚ƃIƒ“ƒ‰ƒCƒ“l”
- g->average_lv = 0;
- g->connect_member = 0;
- c = 0;
- for(i = 0; i < g->max_member; i++) {
- if (g->member[i].account_id > 0) {
- g->average_lv += g->member[i].lv;
- c++;
- if (g->member[i].online > 0)
- g->connect_member++;
- }
- }
- if(c) g->average_lv /= c;
-
- // ‘Sƒf[ƒ^‚ð‘—‚é•K—v‚ª‚ ‚è‚»‚¤
- if (g->max_member != before.max_member ||
- g->guild_lv != before.guild_lv ||
- g->skill_point != before.skill_point) {
- mapif_guild_info(-1, g);
- return 1;
- }
-
- return 0;
-}
-
-//-------------------------------------------------------------------
-// map server‚Ö‚Ì’ÊM
-
-// ƒMƒ‹ƒh쬉”Û
-int mapif_guild_created(int fd, int account_id, struct guild *g) {
- WFIFOW(fd,0) = 0x3830;
- WFIFOL(fd,2) = account_id;
- if (g != NULL) {
- WFIFOL(fd,6) = g->guild_id;
- printf("int_guild: created! %d %s\n", g->guild_id, g->name);
- }else{
- WFIFOL(fd,6) = 0;
- }
- WFIFOSET(fd,10);
- return 0;
-}
-
-// ƒMƒ‹ƒhî•ñŒ©‚‚©‚炸
-int mapif_guild_noinfo(int fd, int guild_id) {
- WFIFOW(fd,0) = 0x3831;
- WFIFOW(fd,2) = 8;
- WFIFOL(fd,4) = guild_id;
- WFIFOSET(fd,8);
- printf("int_guild: info not found %d\n", guild_id);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhî•ñ‚Ü‚Æ‚ß‘—‚è
-int mapif_guild_info(int fd, struct guild *g) {
- unsigned char buf[16384];
-
- WBUFW(buf,0) = 0x3831;
- memcpy(buf + 4, g, sizeof(struct guild));
- WBUFW(buf,2) = 4 + sizeof(struct guild);
-// printf("int_guild: sizeof(guild)=%d\n", sizeof(struct guild));
- if (fd < 0)
- mapif_sendall(buf, WBUFW(buf,2));
- else
- mapif_send(fd, buf, WBUFW(buf,2));
-// printf("int_guild: info %d %s\n", p->guild_id, p->name);
-
- return 0;
-}
-
-// ƒƒ“ƒo’ljÁ‰Â”Û
-int mapif_guild_memberadded(int fd, int guild_id, int account_id, int char_id, int flag) {
- WFIFOW(fd,0) = 0x3832;
- WFIFOL(fd,2) = guild_id;
- WFIFOL(fd,6) = account_id;
- WFIFOL(fd,10) = char_id;
- WFIFOB(fd,14) = flag;
- WFIFOSET(fd, 15);
-
- return 0;
-}
-
-// ’E‘Þ/’Ç•ú’Ê’m
-int mapif_guild_leaved(int guild_id, int account_id, int char_id, int flag, const char *name, const char *mes) {
- unsigned char buf[79];
-
- WBUFW(buf, 0) = 0x3834;
- WBUFL(buf, 2) = guild_id;
- WBUFL(buf, 6) = account_id;
- WBUFL(buf,10) = char_id;
- WBUFB(buf,14) = flag;
- memcpy(WBUFP(buf,15), mes, 40);
- memcpy(WBUFP(buf,55), name, 24);
- mapif_sendall(buf, 79);
- printf("int_guild: guild leaved %d %d %s %s\n", guild_id, account_id, name, mes);
-
- return 0;
-}
-
-// ƒIƒ“ƒ‰ƒCƒ“ó‘Ô‚ÆLvXV’Ê’m
-int mapif_guild_memberinfoshort(struct guild *g, int idx) {
- unsigned char buf[19];
-
- WBUFW(buf, 0) = 0x3835;
- WBUFL(buf, 2) = g->guild_id;
- WBUFL(buf, 6) = g->member[idx].account_id;
- WBUFL(buf,10) = g->member[idx].char_id;
- WBUFB(buf,14) = (unsigned char)g->member[idx].online;
- WBUFW(buf,15) = g->member[idx].lv;
- WBUFW(buf,17) = g->member[idx].class_;
- mapif_sendall(buf, 19);
- return 0;
-}
-
-// ‰ðŽU’Ê’m
-int mapif_guild_broken(int guild_id, int flag) {
- unsigned char buf[7];
-
- WBUFW(buf,0) = 0x3836;
- WBUFL(buf,2) = guild_id;
- WBUFB(buf,6) = flag;
- mapif_sendall(buf, 7);
- printf("int_guild: broken %d\n", guild_id);
-
- return 0;
-}
-
-// ƒMƒ‹ƒh“à”­Œ¾
-int mapif_guild_message(int guild_id, int account_id, char *mes, int len, int sfd) {
- unsigned char buf[2048];
-
- WBUFW(buf,0) = 0x3837;
- WBUFW(buf,2) = len + 12;
- WBUFL(buf,4) = guild_id;
- WBUFL(buf,8) = account_id;
- memcpy(WBUFP(buf,12), mes, len);
- mapif_sendallwos(sfd, buf, len + 12);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhŠî–{î•ñ•ÏX’Ê’m
-int mapif_guild_basicinfochanged(int guild_id, int type, const void *data, int len) {
- unsigned char buf[2048];
-
- WBUFW(buf,0) = 0x3839;
- WBUFW(buf,2) = len+10;
- WBUFL(buf,4) = guild_id;
- WBUFW(buf,8) = type;
- memcpy(WBUFP(buf,10),data,len);
- mapif_sendall(buf,len+10);
- return 0;
-}
-
-// ƒMƒ‹ƒhƒƒ“ƒoî•ñ•ÏX’Ê’m
-int mapif_guild_memberinfochanged(int guild_id, int account_id, int char_id, int type, const void *data, int len) {
- unsigned char buf[4096];
-
- WBUFW(buf, 0) = 0x383a;
- WBUFW(buf, 2) = len + 18;
- WBUFL(buf, 4) = guild_id;
- WBUFL(buf, 8) = account_id;
- WBUFL(buf,12) = char_id;
- WBUFW(buf,16) = type;
- memcpy(WBUFP(buf,18), data, len);
- mapif_sendall(buf,len+18);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhƒXƒLƒ‹ƒAƒbƒv’Ê’m
-int mapif_guild_skillupack(int guild_id, int skill_num, int account_id) {
- unsigned char buf[14];
-
- WBUFW(buf, 0) = 0x383c;
- WBUFL(buf, 2) = guild_id;
- WBUFL(buf, 6) = skill_num;
- WBUFL(buf,10) = account_id;
- mapif_sendall(buf, 14);
-
- return 0;
-}
-
-// ƒMƒ‹ƒh“¯–¿/“G‘Î’Ê’m
-int mapif_guild_alliance(int guild_id1, int guild_id2, int account_id1, int account_id2, int flag, const char *name1, const char *name2) {
- unsigned char buf[67];
-
- WBUFW(buf, 0) = 0x383d;
- WBUFL(buf, 2) = guild_id1;
- WBUFL(buf, 6) = guild_id2;
- WBUFL(buf,10) = account_id1;
- WBUFL(buf,14) = account_id2;
- WBUFB(buf,18) = flag;
- memcpy(WBUFP(buf,19), name1, 24);
- memcpy(WBUFP(buf,43), name2, 24);
- mapif_sendall(buf, 67);
-
- return 0;
-}
-
-// ƒMƒ‹ƒh–ðE•ÏX’Ê’m
-int mapif_guild_position(struct guild *g, int idx) {
- unsigned char buf[2048];
-
- WBUFW(buf,0) = 0x383b;
- WBUFW(buf,2) = sizeof(struct guild_position) + 12;
- WBUFL(buf,4) = g->guild_id;
- WBUFL(buf,8) = idx;
- memcpy(WBUFP(buf,12), &g->position[idx], sizeof(struct guild_position));
- mapif_sendall(buf, WBUFW(buf,2));
-
- return 0;
-}
-
-// ƒMƒ‹ƒh’m•ÏX’Ê’m
-int mapif_guild_notice(struct guild *g) {
- unsigned char buf[186];
-
- WBUFW(buf,0) = 0x383e;
- WBUFL(buf,2) = g->guild_id;
- memcpy(WBUFP(buf,6), g->mes1, 60);
- memcpy(WBUFP(buf,66), g->mes2, 120);
- mapif_sendall(buf, 186);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX’Ê’m
-int mapif_guild_emblem(struct guild *g) {
- unsigned char buf[2048];
-
- WBUFW(buf,0) = 0x383f;
- WBUFW(buf,2) = g->emblem_len + 12;
- WBUFL(buf,4) = g->guild_id;
- WBUFL(buf,8) = g->emblem_id;
- memcpy(WBUFP(buf,12), g->emblem_data, g->emblem_len);
- mapif_sendall(buf, WBUFW(buf,2));
-
- return 0;
-}
-
-int mapif_guild_castle_dataload(int castle_id, int index, int value) {
- unsigned char buf[9];
-
- WBUFW(buf,0) = 0x3840;
- WBUFW(buf,2) = castle_id;
- WBUFB(buf,4) = index;
- WBUFL(buf,5) = value;
- mapif_sendall(buf,9);
-
- return 0;
-}
-
-int mapif_guild_castle_datasave(int castle_id, int index, int value) {
- unsigned char buf[9];
-
- WBUFW(buf,0) = 0x3841;
- WBUFW(buf,2) = castle_id;
- WBUFB(buf,4) = index;
- WBUFL(buf,5) = value;
- mapif_sendall(buf,9);
-
- return 0;
-}
-
-int mapif_guild_castle_alldataload_sub(void *key, void *data, va_list ap) {
- int fd = va_arg(ap, int);
- int *p = va_arg(ap, int*);
-
- memcpy(WFIFOP(fd,*p), (struct guild_castle*)data, sizeof(struct guild_castle));
- (*p) += sizeof(struct guild_castle);
-
- return 0;
-}
-
-int mapif_guild_castle_alldataload(int fd) {
- int len = 4;
-
- WFIFOW(fd,0) = 0x3842;
- numdb_foreach(castle_db, mapif_guild_castle_alldataload_sub, fd, &len);
- WFIFOW(fd,2) = len;
- WFIFOSET(fd, len);
-
- return 0;
-}
-
-//-------------------------------------------------------------------
-// map server‚©‚ç‚Ì’ÊM
-
-// ƒMƒ‹ƒh쬗v‹
-int mapif_parse_CreateGuild(int fd, int account_id, char *name, struct guild_member *master) {
- struct guild *g;
- int i;
-
- for(i = 0; i < 24 && name[i]; i++) {
- if (!(name[i] & 0xe0) || name[i] == 0x7f) {
- printf("int_guild: illeagal guild name [%s]\n", name);
- mapif_guild_created(fd, account_id, NULL);
- return 0;
- }
- }
-
- if ((g = search_guildname(name)) != NULL) {
- printf("int_guild: same name guild exists [%s]\n", name);
- mapif_guild_created(fd, account_id, NULL);
- return 0;
- }
- g = (struct guild *) aCalloc(sizeof(struct guild), 1);
- if (g == NULL) {
- printf("int_guild: CreateGuild: out of memory !\n");
- mapif_guild_created(fd, account_id, NULL);
- exit(0);
- }
- memset(g, 0, sizeof(struct guild));
- g->guild_id = guild_newid++;
- memcpy(g->name, name, 24);
- memcpy(g->master, master->name, 24);
- memcpy(&g->member[0], master, sizeof(struct guild_member));
-
- g->position[0].mode = 0x11;
- strcpy(g->position[ 0].name, "GuildMaster");
- strcpy(g->position[MAX_GUILDPOSITION-1].name, "Newbie");
- for(i = 1; i < MAX_GUILDPOSITION-1; i++)
- sprintf(g->position[i].name, "Position %d", i + 1);
-
- // ‚±‚±‚ŃMƒ‹ƒhî•ñŒvŽZ‚ª•K—v‚ÆŽv‚í‚ê‚é
- g->max_member = 16;
- g->average_lv = master->lv;
- for(i = 0; i < MAX_GUILDSKILL; i++)
- g->skill[i].id=i + GD_SKILLBASE;
-
- numdb_insert(guild_db, g->guild_id, g);
-
- mapif_guild_created(fd, account_id, g);
- mapif_guild_info(fd, g);
-
- if(log_inter)
- inter_log("guild %s (id=%d) created by master %s (id=%d)" RETCODE,
- name, g->guild_id, master->name, master->account_id);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhî•ñ—v‹
-int mapif_parse_GuildInfo(int fd, int guild_id) {
- struct guild *g;
-
- g = (struct guild *) numdb_search(guild_db, guild_id);
- if (g != NULL){
- guild_calcinfo(g);
- mapif_guild_info(fd, g);
- } else
- mapif_guild_noinfo(fd, guild_id);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhƒƒ“ƒo’ljÁ—v‹
-int mapif_parse_GuildAddMember(int fd, int guild_id, struct guild_member *m) {
- struct guild *g;
- int i;
-
- g = (struct guild *) numdb_search(guild_db, guild_id);
- if (g == NULL) {
- mapif_guild_memberadded(fd, guild_id, m->account_id, m->char_id, 1);
- return 0;
- }
-
- for(i = 0; i < g->max_member; i++) {
- if (g->member[i].account_id == 0) {
- memcpy(&g->member[i], m, sizeof(struct guild_member));
- mapif_guild_memberadded(fd, guild_id, m->account_id, m->char_id, 0);
- guild_calcinfo(g);
- mapif_guild_info(-1, g);
-
- return 0;
- }
- }
- mapif_guild_memberadded(fd, guild_id, m->account_id, m->char_id, 1);
-
- return 0;
-}
-
-// ƒMƒ‹ƒh’E‘Þ/’Ç•ú—v‹
-int mapif_parse_GuildLeave(int fd, int guild_id, int account_id, int char_id, int flag, const char *mes) {
- struct guild *g = NULL;
- int i, j;
-
- g = (struct guild *)numdb_search(guild_db, guild_id);
- if (g != NULL) {
- for(i = 0; i < MAX_GUILD; i++) {
- if (g->member[i].account_id == account_id && g->member[i].char_id == char_id) {
-// printf("%d %d\n", i, (int)(&g->member[i]));
-// printf("%d %s\n", i, g->member[i].name);
-
- if (flag) { // ’Ç•ú‚ÌꇒǕúƒŠƒXƒg‚É“ü‚ê‚é
- for(j = 0; j < MAX_GUILDEXPLUSION; j++) {
- if (g->explusion[j].account_id == 0)
- break;
- }
- if (j == MAX_GUILDEXPLUSION) { // ˆê”t‚Ȃ̂Ō¢‚Ì‚ðÁ‚·
- for(j = 0; j < MAX_GUILDEXPLUSION - 1; j++)
- g->explusion[j] = g->explusion[j+1];
- j = MAX_GUILDEXPLUSION - 1;
- }
- g->explusion[j].account_id = account_id;
- memcpy(g->explusion[j].acc, "dummy", 24);
- memcpy(g->explusion[j].name, g->member[i].name, 24);
- memcpy(g->explusion[j].mes, mes, 40);
- }
-
- mapif_guild_leaved(guild_id, account_id, char_id, flag, g->member[i].name, mes);
-// printf("%d %d\n", i, (int)(&g->member[i]));
-// printf("%d %s\n", i, (&g->member[i])->name);
- memset(&g->member[i], 0, sizeof(struct guild_member));
-
- if (guild_check_empty(g) == 0)
- mapif_guild_info(-1,g);// ‚Ü‚¾l‚ª‚¢‚é‚̂Ńf[ƒ^‘—M
-
- return 0;
- }
- }
- }
- return 0;
-}
-
-// ƒIƒ“ƒ‰ƒCƒ“/LvXV
-int mapif_parse_GuildChangeMemberInfoShort(int fd, int guild_id, int account_id, int char_id, int online, int lv, int class_) {
- struct guild *g;
- int i, alv, c;
-
- g = (struct guild *) numdb_search(guild_db, guild_id);
- if (g == NULL)
- return 0;
-
- g->connect_member = 0;
-
- alv = 0;
- c = 0;
- for(i = 0; i < MAX_GUILD; i++) {
- if (g->member[i].account_id == account_id && g->member[i].char_id == char_id) {
- g->member[i].online = online;
- g->member[i].lv = lv;
- g->member[i].class_ = class_;
- mapif_guild_memberinfoshort(g, i);
- }
- if (g->member[i].account_id > 0) {
- alv += g->member[i].lv;
- c++;
- }
- if (g->member[i].online)
- g->connect_member++;
- }
-
- if (c)
- // •½‹ÏƒŒƒxƒ‹
- g->average_lv = alv / c;
-
- return 0;
-}
-
-// ƒMƒ‹ƒh‰ðŽUˆ——pi“¯–¿/“G‘΂ð‰ðœj
-int guild_break_sub(void *key, void *data, va_list ap) {
- struct guild *g = (struct guild *)data;
- int guild_id = va_arg(ap, int);
- int i;
-
- for(i = 0; i < MAX_GUILDALLIANCE; i++) {
- if (g->alliance[i].guild_id == guild_id)
- g->alliance[i].guild_id = 0;
- }
- return 0;
-}
-
-// ƒMƒ‹ƒh‰ðŽU—v‹
-int mapif_parse_BreakGuild(int fd, int guild_id) {
- struct guild *g;
-
- g = (struct guild *) numdb_search(guild_db, guild_id);
- if(g == NULL)
- return 0;
-
- numdb_foreach(guild_db, guild_break_sub, guild_id);
- numdb_erase(guild_db, guild_id);
- inter_guild_storage_delete(guild_id);
- mapif_guild_broken(guild_id, 0);
-
- if(log_inter)
- inter_log("guild %s (id=%d) broken" RETCODE, g->name, guild_id);
- aFree(g);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhƒƒbƒZ[ƒW‘—M
-int mapif_parse_GuildMessage(int fd, int guild_id, int account_id, char *mes, int len) {
- return mapif_guild_message(guild_id, account_id, mes, len, fd);
-}
-
-// ƒMƒ‹ƒhŠî–{ƒf[ƒ^•ÏX—v‹
-int mapif_parse_GuildBasicInfoChange(int fd, int guild_id, int type, const char *data, int len) {
- struct guild *g;
- short dw = *((short *)data);
-
- g = (struct guild *) numdb_search(guild_db, guild_id);
- if (g == NULL)
- return 0;
-
- switch(type) {
- case GBI_GUILDLV:
- if (dw > 0 && g->guild_lv + dw <= 50) {
- g->guild_lv+=dw;
- g->skill_point+=dw;
- } else if (dw < 0 && g->guild_lv + dw >= 1)
- g->guild_lv += dw;
- mapif_guild_info(-1, g);
- return 0;
- default:
- printf("int_guild: GuildBasicInfoChange: Unknown type %d\n", type);
- break;
- }
- mapif_guild_basicinfochanged(guild_id, type, data, len);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhƒƒ“ƒoƒf[ƒ^•ÏX—v‹
-int mapif_parse_GuildMemberInfoChange(int fd, int guild_id, int account_id, int char_id, int type, const char *data, int len) {
- int i;
- struct guild *g;
-
- g = (struct guild *) numdb_search(guild_db, guild_id);
- if(g == NULL)
- return 0;
-
- for(i = 0; i < g->max_member; i++)
- if (g->member[i].account_id == account_id && g->member[i].char_id == char_id)
- break;
- if (i == g->max_member) {
- printf("int_guild: GuildMemberChange: Not found %d,%d in %d[%s]\n", account_id, char_id, guild_id, g->name);
- return 0;
- }
- switch(type) {
- case GMI_POSITION: // –ðE
- g->member[i].position = *((int *)data);
- break;
- case GMI_EXP: // EXP
- {
- int exp, oldexp = g->member[i].exp;
- exp = g->member[i].exp = *((unsigned int *)data);
- g->exp += (exp - oldexp);
- guild_calcinfo(g); // LvƒAƒbƒv”»’f
- mapif_guild_basicinfochanged(guild_id, GBI_EXP, &g->exp, 4);
- }
- break;
- default:
- printf("int_guild: GuildMemberInfoChange: Unknown type %d\n", type);
- break;
- }
- mapif_guild_memberinfochanged(guild_id, account_id, char_id, type, data, len);
-
- return 0;
-}
-
-// ƒMƒ‹ƒh–ðE–¼•ÏX—v‹
-int mapif_parse_GuildPosition(int fd, int guild_id, int idx, struct guild_position *p) {
- struct guild *g = (struct guild *) numdb_search(guild_db, guild_id);
-
- if (g == NULL || idx < 0 || idx >= MAX_GUILDPOSITION) {
- return 0;
- }
- memcpy(&g->position[idx], p, sizeof(struct guild_position));
- mapif_guild_position(g, idx);
- printf("int_guild: position changed %d\n", idx);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhƒXƒLƒ‹ƒAƒbƒv—v‹
-int mapif_parse_GuildSkillUp(int fd, int guild_id, int skill_num, int account_id) {
- struct guild *g = (struct guild *) numdb_search(guild_db, guild_id);
- int idx = skill_num - GD_SKILLBASE;
-
- if (g == NULL || idx < 0 || idx >= MAX_GUILDSKILL)
- return 0;
-
- if (g->skill_point > 0 && g->skill[idx].id > 0 && g->skill[idx].lv < 10) {
- g->skill[idx].lv++;
- g->skill_point--;
- if (guild_calcinfo(g) == 0)
- mapif_guild_info(-1, g);
- mapif_guild_skillupack(guild_id, skill_num, account_id);
- printf("int_guild: skill %d up\n", skill_num);
- }
-
- return 0;
-}
-
-// ƒMƒ‹ƒh“¯–¿—v‹
-int mapif_parse_GuildAlliance(int fd, int guild_id1, int guild_id2, int account_id1, int account_id2, int flag) {
- struct guild *g[2];
- int j, i;
-
- g[0] = (struct guild *) numdb_search(guild_db, guild_id1);
- g[1] = (struct guild *) numdb_search(guild_db, guild_id2);
- if (g[0] == NULL || g[1] == NULL)
- return 0;
-
- if (!(flag & 0x8)) {
- for(i = 0; i < 2 - (flag & 1); i++) {
- for(j = 0; j < MAX_GUILDALLIANCE; j++)
- if (g[i]->alliance[j].guild_id == 0) {
- g[i]->alliance[j].guild_id = g[1-i]->guild_id;
- memcpy(g[i]->alliance[j].name, g[1-i]->name, 24);
- g[i]->alliance[j].opposition = flag & 1;
- break;
- }
- }
- } else { // ŠÖŒW‰ðÁ
- for(i = 0; i < 2 - (flag & 1); i++) {
- for(j = 0; j < MAX_GUILDALLIANCE; j++)
- if (g[i]->alliance[j].guild_id == g[1-i]->guild_id && g[i]->alliance[j].opposition == (flag & 1)) {
- g[i]->alliance[j].guild_id = 0;
- break;
- }
- }
- }
- mapif_guild_alliance(guild_id1, guild_id2, account_id1, account_id2, flag, g[0]->name, g[1]->name);
-
- return 0;
-}
-
-// ƒMƒ‹ƒh’m•ÏX—v‹
-int mapif_parse_GuildNotice(int fd, int guild_id, const char *mes1, const char *mes2) {
- struct guild *g;
-
- g = (struct guild *) numdb_search(guild_db, guild_id);
- if (g == NULL)
- return 0;
- memcpy(g->mes1, mes1, 60);
- memcpy(g->mes2, mes2, 120);
-
- return mapif_guild_notice(g);
-}
-
-// ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX—v‹
-int mapif_parse_GuildEmblem(int fd, int len, int guild_id, int dummy, const char *data) {
- struct guild *g;
-
- g = (struct guild *) numdb_search(guild_db, guild_id);
- if (g == NULL)
- return 0;
- memcpy(g->emblem_data, data, len);
- g->emblem_len = len;
- g->emblem_id++;
-
- return mapif_guild_emblem(g);
-}
-
-int mapif_parse_GuildCastleDataLoad(int fd, int castle_id, int index) {
- struct guild_castle *gc = (struct guild_castle *) numdb_search(castle_db, castle_id);
-
- if (gc == NULL) {
- return mapif_guild_castle_dataload(castle_id, 0, 0);
- }
- switch(index) {
- case 1: return mapif_guild_castle_dataload(gc->castle_id, index, gc->guild_id);
- case 2: return mapif_guild_castle_dataload(gc->castle_id, index, gc->economy);
- case 3: return mapif_guild_castle_dataload(gc->castle_id, index, gc->defense);
- case 4: return mapif_guild_castle_dataload(gc->castle_id, index, gc->triggerE);
- case 5: return mapif_guild_castle_dataload(gc->castle_id, index, gc->triggerD);
- case 6: return mapif_guild_castle_dataload(gc->castle_id, index, gc->nextTime);
- case 7: return mapif_guild_castle_dataload(gc->castle_id, index, gc->payTime);
- case 8: return mapif_guild_castle_dataload(gc->castle_id, index, gc->createTime);
- case 9: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleC);
- case 10: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG0);
- case 11: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG1);
- case 12: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG2);
- case 13: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG3);
- case 14: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG4);
- case 15: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG5);
- case 16: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG6);
- case 17: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG7);
- case 18: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp0); // guardian HP [Valaris]
- case 19: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp1);
- case 20: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp2);
- case 21: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp3);
- case 22: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp4);
- case 23: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp5);
- case 24: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp6);
- case 25: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp7); // end additions [Valaris]
-
- default:
- printf("mapif_parse_GuildCastleDataLoad ERROR!! (Not found index=%d)\n", index);
- return 0;
- }
-
- return 0;
-}
-
-int mapif_parse_GuildCastleDataSave(int fd, int castle_id, int index, int value) {
- struct guild_castle *gc= (struct guild_castle *) numdb_search(castle_db, castle_id);
-
- if (gc == NULL) {
- return mapif_guild_castle_datasave(castle_id, index, value);
- }
- switch(index) {
- case 1:
- if (gc->guild_id != value) {
- int gid = (value) ? value : gc->guild_id;
- struct guild *g = (struct guild *) numdb_search(guild_db, gid);
- if(log_inter)
- inter_log("guild %s (id=%d) %s castle id=%d" RETCODE,
- (g) ? g->name : "??", gid, (value) ? "occupy" : "abandon", castle_id);
- }
- gc->guild_id = value;
- break;
- case 2: gc->economy = value; break;
- case 3: gc->defense = value; break;
- case 4: gc->triggerE = value; break;
- case 5: gc->triggerD = value; break;
- case 6: gc->nextTime = value; break;
- case 7: gc->payTime = value; break;
- case 8: gc->createTime = value; break;
- case 9: gc->visibleC = value; break;
- case 10: gc->visibleG0 = value; break;
- case 11: gc->visibleG1 = value; break;
- case 12: gc->visibleG2 = value; break;
- case 13: gc->visibleG3 = value; break;
- case 14: gc->visibleG4 = value; break;
- case 15: gc->visibleG5 = value; break;
- case 16: gc->visibleG6 = value; break;
- case 17: gc->visibleG7 = value; break;
- case 18: gc->Ghp0 = value; break; // guardian HP [Valaris]
- case 19: gc->Ghp1 = value; break;
- case 20: gc->Ghp2 = value; break;
- case 21: gc->Ghp3 = value; break;
- case 22: gc->Ghp4 = value; break;
- case 23: gc->Ghp5 = value; break;
- case 24: gc->Ghp6 = value; break;
- case 25: gc->Ghp7 = value; break; // end additions [Valaris]
- default:
- printf("mapif_parse_GuildCastleDataSave ERROR!! (Not found index=%d)\n", index);
- return 0;
- }
-
- return mapif_guild_castle_datasave(gc->castle_id, index, value);
-}
-
-// ƒMƒ‹ƒhƒ`ƒFƒbƒN—v‹
-int mapif_parse_GuildCheck(int fd, int guild_id, int account_id, int char_id) {
- return guild_check_conflict(guild_id, account_id, char_id);
-}
-
-// map server ‚©‚ç‚Ì’ÊM
-// E‚PƒpƒPƒbƒg‚̂݉ðÍ‚·‚邱‚Æ
-// EƒpƒPƒbƒg’·ƒf[ƒ^‚Íinter.c‚ɃZƒbƒg‚µ‚Ä‚¨‚­‚±‚Æ
-// EƒpƒPƒbƒg’·ƒ`ƒFƒbƒN‚âARFIFOSKIP‚͌ĂÑo‚µŒ³‚Ås‚í‚ê‚é‚Ì‚Ås‚Á‚Ä‚Í‚È‚ç‚È‚¢
-// EƒGƒ‰[‚È‚ç0(false)A‚»‚¤‚Å‚È‚¢‚È‚ç1(true)‚ð‚©‚¦‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢
-int inter_guild_parse_frommap(int fd) {
- switch(RFIFOW(fd,0)) {
- case 0x3030: mapif_parse_CreateGuild(fd, RFIFOL(fd,4), (char*)RFIFOP(fd,8), (struct guild_member *)RFIFOP(fd,32)); break;
- case 0x3031: mapif_parse_GuildInfo(fd, RFIFOL(fd,2)); break;
- case 0x3032: mapif_parse_GuildAddMember(fd, RFIFOL(fd,4), (struct guild_member *)RFIFOP(fd,8)); break;
- case 0x3034: mapif_parse_GuildLeave(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOB(fd,14), (const char*)RFIFOP(fd,15)); break;
- case 0x3035: mapif_parse_GuildChangeMemberInfoShort(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOB(fd,14), RFIFOW(fd,15), RFIFOW(fd,17)); break;
- case 0x3036: mapif_parse_BreakGuild(fd, RFIFOL(fd,2)); break;
- case 0x3037: mapif_parse_GuildMessage(fd, RFIFOL(fd,4), RFIFOL(fd,8), (char*)RFIFOP(fd,12), RFIFOW(fd,2)-12); break;
- case 0x3038: mapif_parse_GuildCheck(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break;
- case 0x3039: mapif_parse_GuildBasicInfoChange(fd, RFIFOL(fd,4), RFIFOW(fd,8), (const char*)RFIFOP(fd,10), RFIFOW(fd,2)-10); break;
- case 0x303A: mapif_parse_GuildMemberInfoChange(fd, RFIFOL(fd,4), RFIFOL(fd,8), RFIFOL(fd,12), RFIFOW(fd,16), (const char*)RFIFOP(fd,18), RFIFOW(fd,2)-18); break;
- case 0x303B: mapif_parse_GuildPosition(fd, RFIFOL(fd,4), RFIFOL(fd,8), (struct guild_position *)RFIFOP(fd,12)); break;
- case 0x303C: mapif_parse_GuildSkillUp(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break;
- case 0x303D: mapif_parse_GuildAlliance(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOL(fd,14), RFIFOB(fd,18)); break;
- case 0x303E: mapif_parse_GuildNotice(fd, RFIFOL(fd,2), (const char*)RFIFOP(fd,6), (const char*)RFIFOP(fd,66)); break;
- case 0x303F: mapif_parse_GuildEmblem(fd, RFIFOW(fd,2)-12, RFIFOL(fd,4), RFIFOL(fd,8), (const char*)RFIFOP(fd,12)); break;
- case 0x3040: mapif_parse_GuildCastleDataLoad(fd, RFIFOW(fd,2), RFIFOB(fd,4)); break;
- case 0x3041: mapif_parse_GuildCastleDataSave(fd, RFIFOW(fd,2), RFIFOB(fd,4), RFIFOL(fd,5)); break;
-
- default:
- return 0;
- }
-
- return 1;
-}
-
-// ƒ}ƒbƒvƒT[ƒo[‚ÌÚ‘±Žžˆ—
-int inter_guild_mapif_init(int fd) {
- return mapif_guild_castle_alldataload(fd);
-}
-
-// ƒT[ƒo[‚©‚ç’E‘Þ—v‹iƒLƒƒƒ‰íœ—pj
-int inter_guild_leave(int guild_id, int account_id, int char_id) {
- return mapif_parse_GuildLeave(-1, guild_id, account_id, char_id, 0, "**ƒT[ƒo[–½—ß**");
-}
diff --git a/src/char/int_guild.h b/src/char/int_guild.h
deleted file mode 100644
index 3eeb1b3db..000000000
--- a/src/char/int_guild.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// $Id: int_guild.h,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
-#ifndef _INT_GUILD_H_
-#define _INT_GUILD_H_
-
-int inter_guild_init();
-void inter_guild_final();
-int inter_guild_save();
-int inter_guild_parse_frommap(int fd);
-struct guild *inter_guild_search(int guild_id);
-int inter_guild_mapif_init(int fd);
-
-int inter_guild_leave(int guild_id,int account_id,int char_id);
-
-extern char guild_txt[1024];
-extern char castle_txt[1024];
-
-#endif
diff --git a/src/char/int_party.c b/src/char/int_party.c
deleted file mode 100644
index 299a75135..000000000
--- a/src/char/int_party.c
+++ /dev/null
@@ -1,625 +0,0 @@
-// $Id: int_party.c,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
-#include "inter.h"
-#include "int_party.h"
-#include "mmo.h"
-#include "char.h"
-#include "socket.h"
-#include "db.h"
-#include "lock.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-char party_txt[1024] = "save/party.txt";
-
-static struct dbt *party_db;
-static int party_newid = 100;
-
-int mapif_party_broken(int party_id, int flag);
-int party_check_empty(struct party *p);
-int mapif_parse_PartyLeave(int fd, int party_id, int account_id);
-
-// ƒp?ƒeƒBƒf?ƒ^‚Ì•¶Žš—ñ‚Ö‚Ì?Š·
-int inter_party_tostr(char *str, struct party *p) {
- int i, len;
-
- len = sprintf(str, "%d\t%s\t%d,%d\t", p->party_id, p->name, p->exp, p->item);
- for(i = 0; i < MAX_PARTY; i++) {
- struct party_member *m = &p->member[i];
- len += sprintf(str + len, "%d,%d\t%s\t", m->account_id, m->leader, ((m->account_id > 0) ? m->name : "NoMember"));
- }
-
- return 0;
-}
-
-// ƒp?ƒeƒBƒf?ƒ^‚Ì•¶Žš—ñ‚©‚ç‚Ì?Š·
-int inter_party_fromstr(char *str, struct party *p) {
- int i, j;
- int tmp_int[16];
- char tmp_str[256];
-
- memset(p, 0, sizeof(struct party));
-
-// printf("sscanf party main info\n");
- if (sscanf(str, "%d\t%[^\t]\t%d,%d\t", &tmp_int[0], tmp_str, &tmp_int[1], &tmp_int[2]) != 4)
- return 1;
-
- p->party_id = tmp_int[0];
- strcpy(p->name, tmp_str);
- p->exp = tmp_int[1];
- p->item = tmp_int[2];
-// printf("%d [%s] %d %d\n", tmp_int[0], tmp_str[0], tmp_int[1], tmp_int[2]);
-
- for(j = 0; j < 3 && str != NULL; j++)
- str = strchr(str + 1, '\t');
-
- for(i = 0; i < MAX_PARTY; i++) {
- struct party_member *m = &p->member[i];
- if (str == NULL)
- return 1;
-// printf("sscanf party member info %d\n", i);
-
- if (sscanf(str + 1, "%d,%d\t%[^\t]\t", &tmp_int[0], &tmp_int[1], tmp_str) != 3)
- return 1;
-
- m->account_id = tmp_int[0];
- m->leader = tmp_int[1];
- strncpy(m->name, tmp_str, sizeof(m->name));
-// printf(" %d %d [%s]\n", tmp_int[0], tmp_int[1], tmp_str);
-
- for(j = 0; j < 2 && str != NULL; j++)
- str = strchr(str + 1, '\t');
- }
-
- return 0;
-}
-
-// ƒp?ƒeƒBƒf?ƒ^‚̃?ƒh
-int inter_party_init() {
- char line[8192];
- struct party *p;
- FILE *fp;
- int c = 0;
- int i, j;
-
- party_db = numdb_init();
-
- if ((fp = fopen(party_txt, "r")) == NULL)
- return 1;
-
- while(fgets(line, sizeof(line) - 1, fp)) {
- j = 0;
- if (sscanf(line, "%d\t%%newid%%\n%n", &i, &j) == 1 && j > 0 && party_newid <= i) {
- party_newid = i;
- continue;
- }
-
- p = (struct party*)aCalloc(sizeof(struct party), 1);
- if (p == NULL){
- printf("int_party: out of memory!\n");
- exit(0);
- }
- memset(p, 0, sizeof(struct party));
- if (inter_party_fromstr(line, p) == 0 && p->party_id > 0) {
- if (p->party_id >= party_newid)
- party_newid = p->party_id + 1;
- numdb_insert(party_db, p->party_id, p);
- party_check_empty(p);
- } else {
- printf("int_party: broken data [%s] line %d\n", party_txt, c + 1);
- aFree(p);
- }
- c++;
- }
- fclose(fp);
-// printf("int_party: %s read done (%d parties)\n", party_txt, c);
-
- return 0;
-}
-
-int party_db_final (void *k, void *data, va_list ap) {
- struct party *p = (struct party *) data;
- if (p) aFree(p);
- return 0;
-}
-void inter_party_final()
-{
- numdb_final(party_db, party_db_final);
- return;
-}
-
-// ƒp?ƒeƒB?ƒf?ƒ^‚̃Z?ƒu—p
-int inter_party_save_sub(void *key, void *data, va_list ap) {
- char line[8192];
- FILE *fp;
-
- inter_party_tostr(line, (struct party *)data);
- fp = va_arg(ap, FILE *);
- fprintf(fp, "%s" RETCODE, line);
-
- return 0;
-}
-
-// ƒp?ƒeƒB?ƒf?ƒ^‚̃Z?ƒu
-int inter_party_save() {
- FILE *fp;
- int lock;
-
- if ((fp = lock_fopen(party_txt, &lock)) == NULL) {
- printf("int_party: cant write [%s] !!! data is lost !!!\n", party_txt);
- return 1;
- }
- numdb_foreach(party_db, inter_party_save_sub, fp);
-// fprintf(fp, "%d\t%%newid%%\n", party_newid);
- lock_fclose(fp,party_txt, &lock);
-// printf("int_party: %s saved.\n", party_txt);
-
- return 0;
-}
-
-// ƒp?ƒeƒB–¼?õ—p
-int search_partyname_sub(void *key,void *data,va_list ap) {
- struct party *p = (struct party *)data,**dst;
- char *str;
-
- str = va_arg(ap, char *);
- dst = va_arg(ap, struct party **);
- if (strcmpi(p->name, str) == 0)
- *dst = p;
-
- return 0;
-}
-
-// ƒp?ƒeƒB–¼?õ
-struct party* search_partyname(char *str) {
- struct party *p = NULL;
- numdb_foreach(party_db, search_partyname_sub, str, &p);
-
- return p;
-}
-
-// EXPŒö•½•ª”z‚Å‚«‚é‚©ƒ`ƒFƒbƒN
-int party_check_exp_share(struct party *p) {
- int i, dudes=0;
- int pl1=0,pl2=0,pl3=0;
- int maxlv = 0, minlv = 0x7fffffff;
-
- for(i = 0; i < MAX_PARTY; i++) {
- int lv = p->member[i].lv;
- if (p->member[i].online) {
- if (lv < minlv)
- minlv = lv;
- if (maxlv < lv)
- maxlv = lv;
- if( lv >= 70 ) dudes+=1000;
- dudes++;
- }
- }
- if((dudes/1000 >= 2) && (dudes%1000 == 3) && (!strcmp(p->member[0].map,p->member[1].map)) && (!strcmp(p->member[1].map,p->member[2].map))) {
- pl1=search_character_index(p->member[0].name);
- pl2=search_character_index(p->member[1].name);
- pl3=search_character_index(p->member[2].name);
- printf("PARTY: group of 3 Id1 %d lv %d name %s Id2 %d lv %d name %s Id3 %d lv %d name %s\n",pl1,p->member[0].lv,p->member[0].name,pl2,p->member[1].lv,p->member[1].name,pl3,p->member[2].lv,p->member[2].name);
- if (char_married(pl1,pl2) && char_child(pl1,pl3))
- return 1;
- if (char_married(pl1,pl3) && char_child(pl1,pl2))
- return 1;
- if (char_married(pl2,pl3) && char_child(pl2,pl1))
- return 1;
- }
- return (maxlv==0 || maxlv-minlv<=party_share_level);
-}
-
-// ƒp?ƒeƒB‚ª‹ó‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
-int party_check_empty(struct party *p) {
- int i;
-
-// printf("party check empty %08X\n", (int)p);
- for(i = 0; i < MAX_PARTY; i++) {
-// printf("%d acc=%d\n", i, p->member[i].account_id);
- if (p->member[i].account_id > 0) {
- return 0;
- }
- }
- // ’N‚à‚¢‚È‚¢‚̂ʼnðŽU
- mapif_party_broken(p->party_id, 0);
- numdb_erase(party_db, p->party_id);
- aFree(p);
-
- return 1;
-}
-
-// ƒLƒƒƒ‰‚Ì‹£‡‚ª‚È‚¢‚©ƒ`ƒFƒbƒN—p
-int party_check_conflict_sub(void *key, void *data, va_list ap) {
- struct party *p = (struct party *)data;
- int party_id, account_id, i;
- char *nick;
-
- party_id=va_arg(ap, int);
- account_id=va_arg(ap, int);
- nick=va_arg(ap, char *);
-
- if (p->party_id == party_id) // –{?‚ÌŠ?‚È‚Ì‚Å–â‘è‚È‚µ
- return 0;
-
- for(i = 0; i < MAX_PARTY; i++) {
- if (p->member[i].account_id == account_id && strcmp(p->member[i].name, nick) == 0) {
- // •Ê‚̃p?ƒeƒB‚É?‚ÌŠ?ƒf?ƒ^‚ª‚ ‚é‚Ì‚Å?‘Þ
- printf("int_party: party conflict! %d %d %d\n", account_id, party_id, p->party_id);
- mapif_parse_PartyLeave(-1, p->party_id, account_id);
- }
- }
-
- return 0;
-}
-
-// ƒLƒƒƒ‰‚Ì‹£‡‚ª‚È‚¢‚©ƒ`ƒFƒbƒN
-int party_check_conflict(int party_id, int account_id, char *nick) {
- numdb_foreach(party_db, party_check_conflict_sub, party_id, account_id, nick);
-
- return 0;
-}
-
-//-------------------------------------------------------------------
-// map server‚Ö‚Ì’ÊM
-
-// ƒp?ƒeƒB쬉”Û
-int mapif_party_created(int fd,int account_id, struct party *p) {
- WFIFOW(fd,0) = 0x3820;
- WFIFOL(fd,2) = account_id;
- if (p != NULL) {
- WFIFOB(fd,6) = 0;
- WFIFOL(fd,7) = p->party_id;
- memcpy(WFIFOP(fd,11), p->name, 24);
- printf("int_party: created! %d %s\n", p->party_id, p->name);
- } else {
- WFIFOB(fd,6) = 1;
- WFIFOL(fd,7) = 0;
- memcpy(WFIFOP(fd,11), "error", 24);
- }
- WFIFOSET(fd,35);
-
- return 0;
-}
-
-// ƒp?ƒeƒBî•ñŒ©‚‚©‚炸
-int mapif_party_noinfo(int fd, int party_id) {
- WFIFOW(fd,0) = 0x3821;
- WFIFOW(fd,2) = 8;
- WFIFOL(fd,4) = party_id;
- WFIFOSET(fd,8);
- printf("int_party: info not found %d\n", party_id);
-
- return 0;
-}
-
-// ƒp?ƒeƒBî•ñ‚Ü‚Æ‚ß‘—‚è
-int mapif_party_info(int fd, struct party *p) {
- unsigned char buf[2048];
-
- WBUFW(buf,0) = 0x3821;
- memcpy(buf + 4, p, sizeof(struct party));
- WBUFW(buf,2) = 4 + sizeof(struct party);
- if (fd < 0)
- mapif_sendall(buf, WBUFW(buf,2));
- else
- mapif_send(fd, buf, WBUFW(buf,2));
-// printf("int_party: info %d %s\n", p->party_id, p->name);
-
- return 0;
-}
-
-// ƒp?ƒeƒBƒƒ“ƒo’ljÁ‰Â”Û
-int mapif_party_memberadded(int fd, int party_id, int account_id, int flag) {
- WFIFOW(fd,0) = 0x3822;
- WFIFOL(fd,2) = party_id;
- WFIFOL(fd,6) = account_id;
- WFIFOB(fd,10) = flag;
- WFIFOSET(fd,11);
-
- return 0;
-}
-
-// ƒp?ƒeƒBÝ’è?X’Ê’m
-int mapif_party_optionchanged(int fd,struct party *p, int account_id, int flag) {
- unsigned char buf[15];
-
- WBUFW(buf,0) = 0x3823;
- WBUFL(buf,2) = p->party_id;
- WBUFL(buf,6) = account_id;
- WBUFW(buf,10) = p->exp;
- WBUFW(buf,12) = p->item;
- WBUFB(buf,14) = flag;
- if (flag == 0)
- mapif_sendall(buf, 15);
- else
- mapif_send(fd, buf, 15);
- printf("int_party: option changed %d %d %d %d %d\n", p->party_id, account_id, p->exp, p->item, flag);
-
- return 0;
-}
-
-// ƒp?ƒeƒB?‘Þ’Ê’m
-int mapif_party_leaved(int party_id,int account_id, char *name) {
- unsigned char buf[34];
-
- WBUFW(buf,0) = 0x3824;
- WBUFL(buf,2) = party_id;
- WBUFL(buf,6) = account_id;
- memcpy(WBUFP(buf,10), name, 24);
- mapif_sendall(buf, 34);
- printf("int_party: party leaved %d %d %s\n", party_id, account_id, name);
-
- return 0;
-}
-
-// ƒp?ƒeƒBƒ}ƒbƒvXV’Ê’m
-int mapif_party_membermoved(struct party *p, int idx) {
- unsigned char buf[29];
-
- WBUFW(buf,0) = 0x3825;
- WBUFL(buf,2) = p->party_id;
- WBUFL(buf,6) = p->member[idx].account_id;
- memcpy(WBUFP(buf,10), p->member[idx].map, 16);
- WBUFB(buf,26) = p->member[idx].online;
- WBUFW(buf,27) = p->member[idx].lv;
- mapif_sendall(buf, 29);
-
- return 0;
-}
-
-// ƒp?ƒeƒB‰ðŽU’Ê’m
-int mapif_party_broken(int party_id, int flag) {
- unsigned char buf[7];
- WBUFW(buf,0) = 0x3826;
- WBUFL(buf,2) = party_id;
- WBUFB(buf,6) = flag;
- mapif_sendall(buf, 7);
- printf("int_party: broken %d\n", party_id);
-
- return 0;
-}
-
-// ƒp?ƒeƒB??Œ¾
-int mapif_party_message(int party_id, int account_id, char *mes, int len, int sfd) {
- unsigned char buf[2048];
-
- WBUFW(buf,0) = 0x3827;
- WBUFW(buf,2) = len + 12;
- WBUFL(buf,4) = party_id;
- WBUFL(buf,8) = account_id;
- memcpy(WBUFP(buf,12), mes, len);
- mapif_sendallwos(sfd, buf,len + 12);
-
- return 0;
-}
-
-//-------------------------------------------------------------------
-// map server‚©‚ç‚Ì’ÊM
-
-
-// ƒp?ƒeƒB
-int mapif_parse_CreateParty(int fd, int account_id, char *name, char *nick, char *map, int lv, int item, int item2) {
- struct party *p;
- int i;
-
- for(i = 0; i < 24 && name[i]; i++) {
- if (!(name[i] & 0xe0) || name[i] == 0x7f) {
- printf("int_party: illegal party name [%s]\n", name);
- mapif_party_created(fd, account_id, NULL);
- return 0;
- }
- }
-
- if ((p = search_partyname(name)) != NULL) {
- printf("int_party: same name party exists [%s]\n", name);
- mapif_party_created(fd, account_id, NULL);
- return 0;
- }
- p = (struct party *) aCalloc(sizeof(struct party), 1);
- if (p == NULL) {
- printf("int_party: out of memory !\n");
- mapif_party_created(fd,account_id,NULL);
- return 0;
- }
- memset(p, 0, sizeof(struct party));
- p->party_id = party_newid++;
- memcpy(p->name, name, 24);
- p->exp = 0;
- p->item = item;
- //<item1>ƒAƒCƒeƒ€?W•û–@B0‚ÅŒÂl•ÊA1‚Ńp?ƒeƒBŒö—L
- //<item2>ƒAƒCƒeƒ€•ª”z•û–@B0‚ÅŒÂl•ÊA1‚Ńp?ƒeƒB‚É‹Ï“™•ª”z
- //difference between "collection" and "distribution" is...? ^^;
- p->itemc = 0;
-
- p->member[0].account_id = account_id;
- memcpy(p->member[0].name, nick, 24);
- memcpy(p->member[0].map, map, 16);
- p->member[0].leader = 1;
- p->member[0].online = 1;
- p->member[0].lv = lv;
-
- numdb_insert(party_db, p->party_id, p);
-
- mapif_party_created(fd, account_id, p);
- mapif_party_info(fd, p);
-
- return 0;
-}
-
-// ƒp?ƒeƒBî•ñ—v‹
-int mapif_parse_PartyInfo(int fd, int party_id) {
- struct party *p;
-
- p = (struct party *) numdb_search(party_db, party_id);
- if (p != NULL)
- mapif_party_info(fd, p);
- else
- mapif_party_noinfo(fd, party_id);
-
- return 0;
-}
-
-// ƒp?ƒeƒB’ljÁ—v‹
-int mapif_parse_PartyAddMember(int fd, int party_id, int account_id, char *nick, char *map, int lv) {
- struct party *p;
- int i;
-
- p = (struct party *) numdb_search(party_db, party_id);
- if (p == NULL) {
- mapif_party_memberadded(fd, party_id, account_id, 1);
- return 0;
- }
-
- for(i = 0; i < MAX_PARTY; i++) {
- if (p->member[i].account_id == 0) {
- int flag = 0;
-
- p->member[i].account_id = account_id;
- memcpy(p->member[i].name, nick, 24);
- memcpy(p->member[i].map, map, 16);
- p->member[i].leader = 0;
- p->member[i].online = 1;
- p->member[i].lv = lv;
- mapif_party_memberadded(fd, party_id, account_id, 0);
- mapif_party_info(-1, p);
-
- if (p->exp > 0 && !party_check_exp_share(p)) {
- p->exp = 0;
- flag = 0x01;
- }
- if (flag)
- mapif_party_optionchanged(fd, p, 0, 0);
- return 0;
- }
- }
- mapif_party_memberadded(fd, party_id, account_id, 1);
-
- return 0;
-}
-
-// ƒp?ƒeƒB?Ý’è?X—v‹
-int mapif_parse_PartyChangeOption(int fd, int party_id, int account_id, int exp, int item) {
- struct party *p;
- int flag = 0;
-
- p = (struct party *) numdb_search(party_db, party_id);
- if (p == NULL)
- return 0;
-
- p->exp = exp;
- if (exp>0 && !party_check_exp_share(p)) {
- flag |= 0x01;
- p->exp = 0;
- }
-
- p->item = item;
-
- mapif_party_optionchanged(fd, p, account_id, flag);
- return 0;
-}
-
-// ƒp?ƒeƒB?‘Þ—v‹
-int mapif_parse_PartyLeave(int fd, int party_id, int account_id) {
- struct party *p;
- int i;
-
- p = (struct party *) numdb_search(party_db, party_id);
- if (p != NULL) {
- for(i = 0; i < MAX_PARTY; i++) {
- if (p->member[i].account_id == account_id) {
- mapif_party_leaved(party_id, account_id, p->member[i].name);
-
- memset(&p->member[i], 0, sizeof(struct party_member));
- if (party_check_empty(p) == 0)
- mapif_party_info(-1, p);// ‚Ü‚¾l‚ª‚¢‚é‚̂Ńf?ƒ^‘—M
- return 0;
- }
- }
- }
-
- return 0;
-}
-
-// ƒp?ƒeƒBƒ}ƒbƒvXV—v‹
-int mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, char *map, int online, int lv) {
- struct party *p;
- int i;
-
- p = (struct party *) numdb_search(party_db, party_id);
- if (p == NULL)
- return 0;
-
- for(i = 0; i < MAX_PARTY; i++) {
- if (p->member[i].account_id == account_id) {
- int flag = 0;
-
- memcpy(p->member[i].map, map, 16);
- p->member[i].online = online;
- p->member[i].lv = lv;
- mapif_party_membermoved(p, i);
-
- if (p->exp > 0 && !party_check_exp_share(p)) {
- p->exp = 0;
- flag = 1;
- }
- if (flag)
- mapif_party_optionchanged(fd, p, 0, 0);
- break;
- }
- }
-
- return 0;
-}
-
-// ƒp?ƒeƒB‰ðŽU—v‹
-int mapif_parse_BreakParty(int fd, int party_id) {
- struct party *p;
-
- p = (struct party *) numdb_search(party_db, party_id);
- if (p == NULL)
- return 0;
-
- numdb_erase(party_db, party_id);
- mapif_party_broken(fd, party_id);
-
- return 0;
-}
-
-// ƒp?ƒeƒBƒƒbƒZ?ƒW‘—M
-int mapif_parse_PartyMessage(int fd, int party_id, int account_id, char *mes, int len) {
- return mapif_party_message(party_id, account_id, mes, len, fd);
-}
-// ƒp?ƒeƒBƒ`ƒFƒbƒN—v‹
-int mapif_parse_PartyCheck(int fd, int party_id, int account_id, char *nick) {
- return party_check_conflict(party_id, account_id, nick);
-}
-
-// map server ‚©‚ç‚Ì’ÊM
-// ?‚PƒpƒPƒbƒg‚̂݉ðÍ‚·‚邱‚Æ
-// ?ƒpƒPƒbƒg’·ƒf?ƒ^‚Íinter.c‚ɃZƒbƒg‚µ‚Ä‚¨‚­‚±‚Æ
-// ?ƒpƒPƒbƒg’·ƒ`ƒFƒbƒN‚âARFIFOSKIP‚͌ĂÑo‚µŒ³‚Ås‚í‚ê‚é‚Ì‚Ås‚Á‚Ä‚Í‚È‚ç‚È‚¢
-// ?ƒGƒ‰?‚È‚ç0(false)A‚»‚¤‚Å‚È‚¢‚È‚ç1(true)‚ð‚©‚¦‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢
-int inter_party_parse_frommap(int fd) {
- switch(RFIFOW(fd,0)) {
- case 0x3020: mapif_parse_CreateParty(fd, RFIFOL(fd,2), (char*)RFIFOP(fd,6), (char*)RFIFOP(fd,30), (char*)RFIFOP(fd,54), RFIFOW(fd,70), RFIFOB(fd,72), RFIFOB(fd,73)); break;
- case 0x3021: mapif_parse_PartyInfo(fd, RFIFOL(fd,2)); break;
- case 0x3022: mapif_parse_PartyAddMember(fd, RFIFOL(fd,2), RFIFOL(fd,6), (char*)RFIFOP(fd,10), (char*)RFIFOP(fd,34), RFIFOW(fd,50)); break;
- case 0x3023: mapif_parse_PartyChangeOption(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOW(fd,10), RFIFOW(fd,12)); break;
- case 0x3024: mapif_parse_PartyLeave(fd, RFIFOL(fd,2), RFIFOL(fd,6)); break;
- case 0x3025: mapif_parse_PartyChangeMap(fd, RFIFOL(fd,2), RFIFOL(fd,6), (char*)RFIFOP(fd,10), RFIFOB(fd,26), RFIFOW(fd,27)); break;
- case 0x3026: mapif_parse_BreakParty(fd, RFIFOL(fd,2)); break;
- case 0x3027: mapif_parse_PartyMessage(fd, RFIFOL(fd,4), RFIFOL(fd,8), (char*)RFIFOP(fd,12), RFIFOW(fd,2)-12); break;
- case 0x3028: mapif_parse_PartyCheck(fd, RFIFOL(fd,2), RFIFOL(fd,6), (char*)RFIFOP(fd,10)); break;
- default:
- return 0;
- }
-
- return 1;
-}
-
-// ƒT?ƒo?‚©‚ç?‘Þ—v‹iƒLƒƒƒ‰íœ—pj
-int inter_party_leave(int party_id, int account_id) {
- return mapif_parse_PartyLeave(-1, party_id, account_id);
-}
-
diff --git a/src/char/int_party.h b/src/char/int_party.h
deleted file mode 100644
index e3180f3b7..000000000
--- a/src/char/int_party.h
+++ /dev/null
@@ -1,15 +0,0 @@
-// $Id: int_party.h,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
-#ifndef _INT_PARTY_H_
-#define _INT_PARTY_H_
-
-int inter_party_init();
-void inter_party_final();
-int inter_party_save();
-
-int inter_party_parse_frommap(int fd);
-
-int inter_party_leave(int party_id,int account_id);
-
-extern char party_txt[1024];
-
-#endif
diff --git a/src/char/int_pet.c b/src/char/int_pet.c
deleted file mode 100644
index ab53d0533..000000000
--- a/src/char/int_pet.c
+++ /dev/null
@@ -1,375 +0,0 @@
-// $Id: int_pet.c,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
-#include "inter.h"
-#include "int_pet.h"
-#include "mmo.h"
-#include "char.h"
-#include "socket.h"
-#include "db.h"
-#include "lock.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-char pet_txt[1024]="save/pet.txt";
-
-static struct dbt *pet_db;
-static int pet_newid = 100;
-
-int inter_pet_tostr(char *str,struct s_pet *p)
-{
- int len;
-
- if(p->hungry < 0)
- p->hungry = 0;
- else if(p->hungry > 100)
- p->hungry = 100;
- if(p->intimate < 0)
- p->intimate = 0;
- else if(p->intimate > 1000)
- p->intimate = 1000;
-
- len=sprintf(str,"%d,%d,%s\t%d,%d,%d,%d,%d,%d,%d,%d,%d",
- p->pet_id,p->class_,p->name,p->account_id,p->char_id,p->level,p->egg_id,
- p->equip,p->intimate,p->hungry,p->rename_flag,p->incuvate);
-
- return 0;
-}
-
-int inter_pet_fromstr(char *str,struct s_pet *p)
-{
- int s;
- int tmp_int[16];
- char tmp_str[256];
-
- memset(p,0,sizeof(struct s_pet));
-
-// printf("sscanf pet main info\n");
- s=sscanf(str,"%d,%d,%[^\t]\t%d,%d,%d,%d,%d,%d,%d,%d,%d",&tmp_int[0],&tmp_int[1],tmp_str,&tmp_int[2],
- &tmp_int[3],&tmp_int[4],&tmp_int[5],&tmp_int[6],&tmp_int[7],&tmp_int[8],&tmp_int[9],&tmp_int[10]);
-
- if(s!=12)
- return 1;
-
- p->pet_id = tmp_int[0];
- p->class_ = tmp_int[1];
- memcpy(p->name,tmp_str,24);
- p->account_id = tmp_int[2];
- p->char_id = tmp_int[3];
- p->level = tmp_int[4];
- p->egg_id = tmp_int[5];
- p->equip = tmp_int[6];
- p->intimate = tmp_int[7];
- p->hungry = tmp_int[8];
- p->rename_flag = tmp_int[9];
- p->incuvate = tmp_int[10];
-
- if(p->hungry < 0)
- p->hungry = 0;
- else if(p->hungry > 100)
- p->hungry = 100;
- if(p->intimate < 0)
- p->intimate = 0;
- else if(p->intimate > 1000)
- p->intimate = 1000;
-
- return 0;
-}
-
-int inter_pet_init()
-{
- char line[8192];
- struct s_pet *p;
- FILE *fp;
- int c=0;
-
- pet_db=numdb_init();
-
- if( (fp=fopen(pet_txt,"r"))==NULL )
- return 1;
- while(fgets(line,sizeof(line),fp)){
- p = (struct s_pet*)aCalloc(sizeof(struct s_pet), 1);
- if(p==NULL){
- printf("int_pet: out of memory!\n");
- exit(0);
- }
- memset(p,0,sizeof(struct s_pet));
- if(inter_pet_fromstr(line,p)==0 && p->pet_id>0){
- if( p->pet_id >= pet_newid)
- pet_newid=p->pet_id+1;
- numdb_insert(pet_db,p->pet_id,p);
- }else{
- printf("int_pet: broken data [%s] line %d\n",pet_txt,c);
- aFree(p);
- }
- c++;
- }
- fclose(fp);
-// printf("int_pet: %s read done (%d pets)\n",pet_txt,c);
- return 0;
-}
-
-int pet_db_final (void *k, void *data, va_list ap) {
- struct s_pet *p = (struct s_pet *) data;
- if (p) aFree(p);
- return 0;
-}
-void inter_pet_final()
-{
- numdb_final(pet_db, pet_db_final);
- return;
-}
-
-int inter_pet_save_sub(void *key,void *data,va_list ap)
-{
- char line[8192];
- FILE *fp;
- inter_pet_tostr(line,(struct s_pet *)data);
- fp=va_arg(ap,FILE *);
- fprintf(fp,"%s" RETCODE,line);
- return 0;
-}
-
-int inter_pet_save()
-{
- FILE *fp;
- int lock;
- if( (fp=lock_fopen(pet_txt,&lock))==NULL ){
- printf("int_pet: cant write [%s] !!! data is lost !!!\n",pet_txt);
- return 1;
- }
- numdb_foreach(pet_db,inter_pet_save_sub,fp);
- lock_fclose(fp,pet_txt,&lock);
-// printf("int_pet: %s saved.\n",pet_txt);
- return 0;
-}
-
-int inter_pet_delete(int pet_id)
-{
- struct s_pet *p;
- p = (struct s_pet *) numdb_search(pet_db,pet_id);
- if( p == NULL)
- return 1;
- else {
- numdb_erase(pet_db,pet_id);
- printf("pet_id: %d deleted\n",pet_id);
- }
- return 0;
-}
-
-int mapif_pet_created(int fd,int account_id,struct s_pet *p)
-{
- WFIFOW(fd,0)=0x3880;
- WFIFOL(fd,2)=account_id;
- if(p!=NULL){
- WFIFOB(fd,6)=0;
- WFIFOL(fd,7)=p->pet_id;
- printf("int_pet: created! %d %s\n",p->pet_id,p->name);
- }else{
- WFIFOB(fd,6)=1;
- WFIFOL(fd,7)=0;
- }
- WFIFOSET(fd,11);
-
- return 0;
-}
-
-int mapif_pet_info(int fd,int account_id,struct s_pet *p)
-{
- WFIFOW(fd,0)=0x3881;
- WFIFOW(fd,2)=sizeof(struct s_pet) + 9;
- WFIFOL(fd,4)=account_id;
- WFIFOB(fd,8)=0;
- memcpy(WFIFOP(fd,9),p,sizeof(struct s_pet));
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-int mapif_pet_noinfo(int fd,int account_id)
-{
- WFIFOW(fd,0)=0x3881;
- WFIFOW(fd,2)=sizeof(struct s_pet) + 9;
- WFIFOL(fd,4)=account_id;
- WFIFOB(fd,8)=1;
- memset(WFIFOP(fd,9),0,sizeof(struct s_pet));
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-int mapif_save_pet_ack(int fd,int account_id,int flag)
-{
- WFIFOW(fd,0)=0x3882;
- WFIFOL(fd,2)=account_id;
- WFIFOB(fd,6)=flag;
- WFIFOSET(fd,7);
-
- return 0;
-}
-
-int mapif_delete_pet_ack(int fd,int flag)
-{
- WFIFOW(fd,0)=0x3883;
- WFIFOB(fd,2)=flag;
- WFIFOSET(fd,3);
-
- return 0;
-}
-
-int mapif_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 incuvate,char *pet_name)
-{
- struct s_pet *p;
- p= (struct s_pet *) aMalloc(sizeof(struct s_pet));
- if(p==NULL){
- printf("int_pet: out of memory !\n");
- mapif_pet_created(fd,account_id,NULL);
- return 0;
- }
- memset(p,0,sizeof(struct s_pet));
- p->pet_id = pet_newid++;
- memcpy(p->name,pet_name,24);
- if(incuvate == 1)
- p->account_id = p->char_id = 0;
- else {
- p->account_id = account_id;
- p->char_id = char_id;
- }
- p->class_ = pet_class;
- p->level = pet_lv;
- p->egg_id = pet_egg_id;
- p->equip = pet_equip;
- p->intimate = intimate;
- p->hungry = hungry;
- p->rename_flag = rename_flag;
- p->incuvate = incuvate;
-
- if(p->hungry < 0)
- p->hungry = 0;
- else if(p->hungry > 100)
- p->hungry = 100;
- if(p->intimate < 0)
- p->intimate = 0;
- else if(p->intimate > 1000)
- p->intimate = 1000;
-
- numdb_insert(pet_db,p->pet_id,p);
-
- mapif_pet_created(fd,account_id,p);
-
- return 0;
-}
-
-int mapif_load_pet(int fd,int account_id,int char_id,int pet_id)
-{
- struct s_pet *p;
- p=(struct s_pet *)numdb_search(pet_db,pet_id);
- if(p!=NULL) {
- if(p->incuvate == 1) {
- p->account_id = p->char_id = 0;
- mapif_pet_info(fd,account_id,p);
- }
- else if(account_id == p->account_id && char_id == p->char_id)
- mapif_pet_info(fd,account_id,p);
- else
- mapif_pet_noinfo(fd,account_id);
- }
- else
- mapif_pet_noinfo(fd,account_id);
-
- return 0;
-}
-
-int mapif_save_pet(int fd,int account_id,struct s_pet *data)
-{
- struct s_pet *p;
- int pet_id;
- int len=RFIFOW(fd,2);
- if(sizeof(struct s_pet)!=len-8) {
- printf("inter pet: data size error %d %d\n",sizeof(struct s_pet),len-8);
- }
- else{
- pet_id = data->pet_id;
- p=(struct s_pet *)numdb_search(pet_db,pet_id);
- if(p == NULL) {
- p=(struct s_pet *)aMalloc(sizeof(struct s_pet));
- if(p==NULL){
- printf("int_pet: out of memory !\n");
- mapif_save_pet_ack(fd,account_id,1);
- return 0;
- }
- memset(p,0,sizeof(struct s_pet));
- p->pet_id = data->pet_id;
- if(p->pet_id == 0)
- data->pet_id = p->pet_id = pet_newid++;
- numdb_insert(pet_db,p->pet_id,p);
- }
- if(data->hungry < 0)
- data->hungry = 0;
- else if(data->hungry > 100)
- data->hungry = 100;
- if(data->intimate < 0)
- data->intimate = 0;
- else if(data->intimate > 1000)
- data->intimate = 1000;
- memcpy(p,data,sizeof(struct s_pet));
- if(p->incuvate == 1)
- p->account_id = p->char_id = 0;
-
- mapif_save_pet_ack(fd,account_id,0);
- }
-
- return 0;
-}
-
-int mapif_delete_pet(int fd,int pet_id)
-{
- mapif_delete_pet_ack(fd,inter_pet_delete(pet_id));
-
- return 0;
-}
-
-int mapif_parse_CreatePet(int fd)
-{
- mapif_create_pet(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOW(fd,10),RFIFOW(fd,12),RFIFOW(fd,14),RFIFOW(fd,16),RFIFOL(fd,18),
- RFIFOL(fd,20),RFIFOB(fd,22),RFIFOB(fd,23),(char*)RFIFOP(fd,24));
- return 0;
-}
-
-int mapif_parse_LoadPet(int fd)
-{
- mapif_load_pet(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10));
- return 0;
-}
-
-int mapif_parse_SavePet(int fd)
-{
- mapif_save_pet(fd,RFIFOL(fd,4),(struct s_pet *)RFIFOP(fd,8));
- return 0;
-}
-
-int mapif_parse_DeletePet(int fd)
-{
- mapif_delete_pet(fd,RFIFOL(fd,2));
- return 0;
-}
-
-// map server ‚©‚ç‚Ì’ÊM
-// E‚PƒpƒPƒbƒg‚̂݉ðÍ‚·‚邱‚Æ
-// EƒpƒPƒbƒg’·ƒf[ƒ^‚Íinter.c‚ɃZƒbƒg‚µ‚Ä‚¨‚­‚±‚Æ
-// EƒpƒPƒbƒg’·ƒ`ƒFƒbƒN‚âARFIFOSKIP‚͌ĂÑo‚µŒ³‚Ås‚í‚ê‚é‚Ì‚Ås‚Á‚Ä‚Í‚È‚ç‚È‚¢
-// EƒGƒ‰[‚È‚ç0(false)A‚»‚¤‚Å‚È‚¢‚È‚ç1(true)‚ð‚©‚¦‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢
-int inter_pet_parse_frommap(int fd)
-{
- switch(RFIFOW(fd,0)){
- case 0x3080: mapif_parse_CreatePet(fd); break;
- case 0x3081: mapif_parse_LoadPet(fd); break;
- case 0x3082: mapif_parse_SavePet(fd); break;
- case 0x3083: mapif_parse_DeletePet(fd); break;
- default:
- return 0;
- }
- return 1;
-}
-
diff --git a/src/char/int_pet.h b/src/char/int_pet.h
deleted file mode 100644
index 3a48ada3b..000000000
--- a/src/char/int_pet.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// $Id: int_pet.h,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
-#ifndef _INT_PET_H_
-#define _INT_PET_H_
-
-int inter_pet_init();
-void inter_pet_final();
-int inter_pet_save();
-int inter_pet_delete(int pet_id);
-
-int inter_pet_parse_frommap(int fd);
-
-extern char pet_txt[1024];
-
-#endif
diff --git a/src/char/int_storage.c b/src/char/int_storage.c
deleted file mode 100644
index eaf9e001a..000000000
--- a/src/char/int_storage.c
+++ /dev/null
@@ -1,516 +0,0 @@
-// $Id: int_storage.c,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
-#include "inter.h"
-#include "int_storage.h"
-#include "int_pet.h"
-#include "int_guild.h"
-#include "mmo.h"
-#include "char.h"
-#include "socket.h"
-#include "db.h"
-#include "lock.h"
-
-#include <string.h>
-#include <stdlib.h>
-
-// ƒtƒ@ƒCƒ‹–¼‚̃fƒtƒHƒ‹ƒg
-// inter_config_read()‚ÅÄݒ肳‚ê‚é
-char storage_txt[1024]="save/storage.txt";
-char guild_storage_txt[1024]="save/g_storage.txt";
-
-static struct dbt *storage_db;
-static struct dbt *guild_storage_db;
-
-// ‘qŒÉƒf[ƒ^‚𕶎š—ñ‚É•ÏŠ·
-int storage_tostr(char *str,struct storage *p)
-{
- int i,f=0;
- char *str_p = str;
- str_p += sprintf(str_p,"%d,%d\t",p->account_id,p->storage_amount);
-
- for(i=0;i<MAX_STORAGE;i++)
- if( (p->storage_[i].nameid) && (p->storage_[i].amount) ){
- str_p += sprintf(str_p,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ",
- p->storage_[i].id,p->storage_[i].nameid,p->storage_[i].amount,p->storage_[i].equip,
- p->storage_[i].identify,p->storage_[i].refine,p->storage_[i].attribute,
- p->storage_[i].card[0],p->storage_[i].card[1],p->storage_[i].card[2],p->storage_[i].card[3]);
- f++;
- }
-
- *(str_p++)='\t';
-
- *str_p='\0';
- if(!f)
- str[0]=0;
- return 0;
-}
-
-// •¶Žš—ñ‚ð‘qŒÉƒf[ƒ^‚É•ÏŠ·
-int storage_fromstr(char *str,struct storage *p)
-{
- int tmp_int[256];
- int set,next,len,i;
-
- set=sscanf(str,"%d,%d%n",&tmp_int[0],&tmp_int[1],&next);
- p->storage_amount=tmp_int[1];
-
- if(set!=2)
- return 1;
- if(str[next]=='\n' || str[next]=='\r')
- return 0;
- next++;
- for(i=0;str[next] && str[next]!='\t';i++){
- if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
- &tmp_int[4], &tmp_int[5], &tmp_int[6],
- &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[10], &len) == 12) {
- p->storage_[i].id = tmp_int[0];
- p->storage_[i].nameid = tmp_int[1];
- p->storage_[i].amount = tmp_int[2];
- p->storage_[i].equip = tmp_int[3];
- p->storage_[i].identify = tmp_int[4];
- p->storage_[i].refine = tmp_int[5];
- p->storage_[i].attribute = tmp_int[6];
- p->storage_[i].card[0] = tmp_int[7];
- p->storage_[i].card[1] = tmp_int[8];
- p->storage_[i].card[2] = tmp_int[9];
- p->storage_[i].card[3] = tmp_int[10];
- next += len;
- if (str[next] == ' ')
- next++;
- }
-
- else if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
- &tmp_int[4], &tmp_int[5], &tmp_int[6],
- &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &len) == 11) {
- p->storage_[i].id = tmp_int[0];
- p->storage_[i].nameid = tmp_int[1];
- p->storage_[i].amount = tmp_int[2];
- p->storage_[i].equip = tmp_int[3];
- p->storage_[i].identify = tmp_int[4];
- p->storage_[i].refine = tmp_int[5];
- p->storage_[i].attribute = tmp_int[6];
- p->storage_[i].card[0] = tmp_int[7];
- p->storage_[i].card[1] = tmp_int[8];
- p->storage_[i].card[2] = tmp_int[9];
- p->storage_[i].card[3] = tmp_int[10];
- next += len;
- if (str[next] == ' ')
- next++;
- }
-
- else return 1;
- }
- return 0;
-}
-
-int guild_storage_tostr(char *str,struct guild_storage *p)
-{
- int i,f=0;
- char *str_p = str;
- str_p+=sprintf(str,"%d,%d\t",p->guild_id,p->storage_amount);
-
- for(i=0;i<MAX_GUILD_STORAGE;i++)
- if( (p->storage_[i].nameid) && (p->storage_[i].amount) ){
- str_p += sprintf(str_p,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ",
- p->storage_[i].id,p->storage_[i].nameid,p->storage_[i].amount,p->storage_[i].equip,
- p->storage_[i].identify,p->storage_[i].refine,p->storage_[i].attribute,
- p->storage_[i].card[0],p->storage_[i].card[1],p->storage_[i].card[2],p->storage_[i].card[3]);
- f++;
- }
-
- *(str_p++)='\t';
-
- *str_p='\0';
- if(!f)
- str[0]=0;
- return 0;
-}
-
-int guild_storage_fromstr(char *str,struct guild_storage *p)
-{
- int tmp_int[256];
- int set,next,len,i;
-
- set=sscanf(str,"%d,%d%n",&tmp_int[0],&tmp_int[1],&next);
- p->storage_amount=tmp_int[1];
-
- if(set!=2)
- return 1;
- if(str[next]=='\n' || str[next]=='\r')
- return 0;
- next++;
- for(i=0;str[next] && str[next]!='\t';i++){
- if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
- &tmp_int[4], &tmp_int[5], &tmp_int[6],
- &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[10], &len) == 12) {
- p->storage_[i].id = tmp_int[0];
- p->storage_[i].nameid = tmp_int[1];
- p->storage_[i].amount = tmp_int[2];
- p->storage_[i].equip = tmp_int[3];
- p->storage_[i].identify = tmp_int[4];
- p->storage_[i].refine = tmp_int[5];
- p->storage_[i].attribute = tmp_int[6];
- p->storage_[i].card[0] = tmp_int[7];
- p->storage_[i].card[1] = tmp_int[8];
- p->storage_[i].card[2] = tmp_int[9];
- p->storage_[i].card[3] = tmp_int[10];
- next += len;
- if (str[next] == ' ')
- next++;
- }
-
- else if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
- &tmp_int[4], &tmp_int[5], &tmp_int[6],
- &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &len) == 11) {
- p->storage_[i].id = tmp_int[0];
- p->storage_[i].nameid = tmp_int[1];
- p->storage_[i].amount = tmp_int[2];
- p->storage_[i].equip = tmp_int[3];
- p->storage_[i].identify = tmp_int[4];
- p->storage_[i].refine = tmp_int[5];
- p->storage_[i].attribute = tmp_int[6];
- p->storage_[i].card[0] = tmp_int[7];
- p->storage_[i].card[1] = tmp_int[8];
- p->storage_[i].card[2] = tmp_int[9];
- p->storage_[i].card[3] = tmp_int[10];
- next += len;
- if (str[next] == ' ')
- next++;
- }
-
- else return 1;
- }
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒg‚©‚ç‘qŒÉƒf[ƒ^ƒCƒ“ƒfƒbƒNƒX‚𓾂éiV‹K‘qŒÉ’ljÁ‰Â”\j
-struct storage *account2storage(int account_id)
-{
- struct storage *s;
- s= (struct storage *) numdb_search(storage_db,account_id);
- if(s == NULL) {
- s = (struct storage *) aCalloc(sizeof(struct storage), 1);
- if(s==NULL){
- printf("int_storage: out of memory!\n");
- exit(0);
- }
- memset(s,0,sizeof(struct storage));
- s->account_id=account_id;
- numdb_insert(storage_db,s->account_id,s);
- }
- return s;
-}
-
-struct guild_storage *guild2storage(int guild_id)
-{
- struct guild_storage *gs = NULL;
- if(inter_guild_search(guild_id) != NULL) {
- gs= (struct guild_storage *) numdb_search(guild_storage_db,guild_id);
- if(gs == NULL) {
- gs = (struct guild_storage *) aCalloc(sizeof(struct guild_storage), 1);
- if(gs==NULL){
- printf("int_storage: out of memory!\n");
- exit(0);
- }
- memset(gs,0,sizeof(struct guild_storage));
- gs->guild_id=guild_id;
- numdb_insert(guild_storage_db,gs->guild_id,gs);
- }
- }
- return gs;
-}
-
-//---------------------------------------------------------
-// ‘qŒÉƒf[ƒ^‚ð“Ç‚Ýž‚Þ
-int inter_storage_init()
-{
- char line[65536];
- int c=0,tmp_int;
- struct storage *s;
- struct guild_storage *gs;
- FILE *fp;
-
- storage_db = numdb_init();
-
- fp=fopen(storage_txt,"r");
- if(fp==NULL){
- printf("cant't read : %s\n",storage_txt);
- return 1;
- }
- while(fgets(line,65535,fp)){
- sscanf(line,"%d",&tmp_int);
- s = (struct storage*)aCalloc(sizeof(struct storage), 1);
- if(s==NULL){
- printf("int_storage: out of memory!\n");
- exit(0);
- }
- memset(s,0,sizeof(struct storage));
- s->account_id=tmp_int;
- if(s->account_id > 0 && storage_fromstr(line,s) == 0) {
- numdb_insert(storage_db,s->account_id,s);
- }
- else{
- printf("int_storage: broken data [%s] line %d\n",storage_txt,c);
- aFree(s);
- }
- c++;
- }
- fclose(fp);
-
- c = 0;
- guild_storage_db = numdb_init();
-
- fp=fopen(guild_storage_txt,"r");
- if(fp==NULL){
- printf("cant't read : %s\n",guild_storage_txt);
- return 1;
- }
- while(fgets(line,65535,fp)){
- sscanf(line,"%d",&tmp_int);
- gs = (struct guild_storage*)aCalloc(sizeof(struct guild_storage), 1);
- if(gs==NULL){
- printf("int_storage: out of memory!\n");
- exit(0);
- }
- memset(gs,0,sizeof(struct guild_storage));
- gs->guild_id=tmp_int;
- if(gs->guild_id > 0 && guild_storage_fromstr(line,gs) == 0) {
- numdb_insert(guild_storage_db,gs->guild_id,gs);
- }
- else{
- printf("int_storage: broken data [%s] line %d\n",guild_storage_txt,c);
- aFree(gs);
- }
- c++;
- }
- fclose(fp);
-
- return 0;
-}
-
-int storage_db_final (void *k, void *data, va_list ap) {
- struct storage *p = (struct storage *) data;
- if (p) aFree(p);
- return 0;
-}
-int guild_storage_db_final (void *k, void *data, va_list ap) {
- struct guild_storage *p = (struct guild_storage *) data;
- if (p) aFree(p);
- return 0;
-}
-void inter_storage_final() {
- numdb_final(storage_db, storage_db_final);
- numdb_final(guild_storage_db, guild_storage_db_final);
- return;
-}
-
-int inter_storage_save_sub(void *key,void *data,va_list ap)
-{
- char line[65536];
- FILE *fp;
- storage_tostr(line,(struct storage *)data);
- fp=va_arg(ap,FILE *);
- if(*line)
- fprintf(fp,"%s" RETCODE,line);
- return 0;
-}
-//---------------------------------------------------------
-// ‘qŒÉƒf[ƒ^‚ð‘‚«ž‚Þ
-int inter_storage_save()
-{
- FILE *fp;
- int lock;
- if( (fp=lock_fopen(storage_txt,&lock))==NULL ){
- printf("int_storage: cant write [%s] !!! data is lost !!!\n",storage_txt);
- return 1;
- }
- numdb_foreach(storage_db,inter_storage_save_sub,fp);
- lock_fclose(fp,storage_txt,&lock);
-// printf("int_storage: %s saved.\n",storage_txt);
- return 0;
-}
-
-int inter_guild_storage_save_sub(void *key,void *data,va_list ap)
-{
- char line[65536];
- FILE *fp;
- if(inter_guild_search(((struct guild_storage *)data)->guild_id) != NULL) {
- guild_storage_tostr(line,(struct guild_storage *)data);
- fp=va_arg(ap,FILE *);
- if(*line)
- fprintf(fp,"%s" RETCODE,line);
- }
- return 0;
-}
-//---------------------------------------------------------
-// ‘qŒÉƒf[ƒ^‚ð‘‚«ž‚Þ
-int inter_guild_storage_save()
-{
- FILE *fp;
- int lock;
- if( (fp=lock_fopen(guild_storage_txt,&lock))==NULL ){
- printf("int_storage: cant write [%s] !!! data is lost !!!\n",guild_storage_txt);
- return 1;
- }
- numdb_foreach(guild_storage_db,inter_guild_storage_save_sub,fp);
- lock_fclose(fp,guild_storage_txt,&lock);
-// printf("int_storage: %s saved.\n",guild_storage_txt);
- return 0;
-}
-
-// ‘qŒÉƒf[ƒ^íœ
-int inter_storage_delete(int account_id)
-{
- struct storage *s = (struct storage *) numdb_search(storage_db,account_id);
- if(s) {
- int i;
- for(i=0;i<s->storage_amount;i++){
- if(s->storage_[i].card[0] == (short)0xff00)
- inter_pet_delete(*((long *)(&s->storage_[i].card[2])));
- }
- numdb_erase(storage_db,account_id);
- aFree(s);
- }
- return 0;
-}
-
-// ƒMƒ‹ƒh‘qŒÉƒf[ƒ^íœ
-int inter_guild_storage_delete(int guild_id)
-{
- struct guild_storage *gs = (struct guild_storage *) numdb_search(guild_storage_db,guild_id);
- if(gs) {
- int i;
- for(i=0;i<gs->storage_amount;i++){
- if(gs->storage_[i].card[0] == (short)0xff00)
- inter_pet_delete(*((long *)(&gs->storage_[i].card[2])));
- }
- numdb_erase(guild_storage_db,guild_id);
- aFree(gs);
- }
- return 0;
-}
-
-//---------------------------------------------------------
-// map server‚Ö‚Ì’ÊM
-
-// ‘qŒÉƒf[ƒ^‚Ì‘—M
-int mapif_load_storage(int fd,int account_id)
-{
- struct storage *s=account2storage(account_id);
- WFIFOW(fd,0)=0x3810;
- WFIFOW(fd,2)=sizeof(struct storage)+8;
- WFIFOL(fd,4)=account_id;
- memcpy(WFIFOP(fd,8),s,sizeof(struct storage));
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-// ‘qŒÉƒf[ƒ^•Û‘¶Š®—¹‘—M
-int mapif_save_storage_ack(int fd,int account_id)
-{
- WFIFOW(fd,0)=0x3811;
- WFIFOL(fd,2)=account_id;
- WFIFOB(fd,6)=0;
- WFIFOSET(fd,7);
- return 0;
-}
-
-int mapif_load_guild_storage(int fd,int account_id,int guild_id)
-{
- struct guild_storage *gs=guild2storage(guild_id);
- WFIFOW(fd,0)=0x3818;
- if(gs) {
- WFIFOW(fd,2)=sizeof(struct guild_storage)+12;
- WFIFOL(fd,4)=account_id;
- WFIFOL(fd,8)=guild_id;
- memcpy(WFIFOP(fd,12),gs,sizeof(struct guild_storage));
- }
- else {
- WFIFOW(fd,2)=12;
- WFIFOL(fd,4)=account_id;
- WFIFOL(fd,8)=0;
- }
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-int mapif_save_guild_storage_ack(int fd,int account_id,int guild_id,int fail)
-{
- WFIFOW(fd,0)=0x3819;
- WFIFOL(fd,2)=account_id;
- WFIFOL(fd,6)=guild_id;
- WFIFOB(fd,10)=fail;
- WFIFOSET(fd,11);
- return 0;
-}
-
-//---------------------------------------------------------
-// map server‚©‚ç‚Ì’ÊM
-
-// ‘qŒÉƒf[ƒ^—v‹ŽóM
-int mapif_parse_LoadStorage(int fd)
-{
- mapif_load_storage(fd,RFIFOL(fd,2));
- return 0;
-}
-// ‘qŒÉƒf[ƒ^ŽóM••Û‘¶
-int mapif_parse_SaveStorage(int fd)
-{
- struct storage *s;
- int account_id=RFIFOL(fd,4);
- int len=RFIFOW(fd,2);
- if(sizeof(struct storage)!=len-8){
- printf("inter storage: data size error %d %d\n",sizeof(struct storage),len-8);
- }
- else {
- s=account2storage(account_id);
- memcpy(s,RFIFOP(fd,8),sizeof(struct storage));
- mapif_save_storage_ack(fd,account_id);
- }
- return 0;
-}
-
-int mapif_parse_LoadGuildStorage(int fd)
-{
- mapif_load_guild_storage(fd,RFIFOL(fd,2),RFIFOL(fd,6));
- return 0;
-}
-int mapif_parse_SaveGuildStorage(int fd)
-{
- struct guild_storage *gs;
- int guild_id=RFIFOL(fd,8);
- int len=RFIFOW(fd,2);
- if(sizeof(struct guild_storage)!=len-12){
- printf("inter storage: data size error %d %d\n",sizeof(struct guild_storage),len-12);
- }
- else {
- gs=guild2storage(guild_id);
- if(gs) {
- memcpy(gs,RFIFOP(fd,12),sizeof(struct guild_storage));
- mapif_save_guild_storage_ack(fd,RFIFOL(fd,4),guild_id,0);
- }
- else
- mapif_save_guild_storage_ack(fd,RFIFOL(fd,4),guild_id,1);
- }
- return 0;
-}
-
-// map server ‚©‚ç‚Ì’ÊM
-// E‚PƒpƒPƒbƒg‚̂݉ðÍ‚·‚邱‚Æ
-// EƒpƒPƒbƒg’·ƒf[ƒ^‚Íinter.c‚ɃZƒbƒg‚µ‚Ä‚¨‚­‚±‚Æ
-// EƒpƒPƒbƒg’·ƒ`ƒFƒbƒN‚âARFIFOSKIP‚͌ĂÑo‚µŒ³‚Ås‚í‚ê‚é‚Ì‚Ås‚Á‚Ä‚Í‚È‚ç‚È‚¢
-// EƒGƒ‰[‚È‚ç0(false)A‚»‚¤‚Å‚È‚¢‚È‚ç1(true)‚ð‚©‚¦‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢
-int inter_storage_parse_frommap(int fd)
-{
- switch(RFIFOW(fd,0)){
- case 0x3010: mapif_parse_LoadStorage(fd); break;
- case 0x3011: mapif_parse_SaveStorage(fd); break;
- case 0x3018: mapif_parse_LoadGuildStorage(fd); break;
- case 0x3019: mapif_parse_SaveGuildStorage(fd); break;
- default:
- return 0;
- }
- return 1;
-}
diff --git a/src/char/int_storage.h b/src/char/int_storage.h
deleted file mode 100644
index f228be53d..000000000
--- a/src/char/int_storage.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// $Id: int_storage.h,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
-#ifndef _INT_STORAGE_H_
-#define _INT_STORAGE_H_
-
-int inter_storage_init();
-void inter_storage_final();
-int inter_storage_save();
-int inter_guild_storage_save();
-int inter_storage_delete(int account_id);
-int inter_guild_storage_delete(int guild_id);
-
-int inter_storage_parse_frommap(int fd);
-
-extern char storage_txt[1024];
-extern char guild_storage_txt[1024];
-
-#endif
diff --git a/src/char/inter.c b/src/char/inter.c
deleted file mode 100644
index 0dca38559..000000000
--- a/src/char/inter.c
+++ /dev/null
@@ -1,586 +0,0 @@
-// $Id: inter.c,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
-#include "mmo.h"
-#include "char.h"
-#include "socket.h"
-#include "timer.h"
-#include "db.h"
-#include <string.h>
-#include <stdlib.h>
-
-#include "inter.h"
-#include "int_party.h"
-#include "int_guild.h"
-#include "int_storage.h"
-#include "int_pet.h"
-#include "lock.h"
-
-#define WISDATA_TTL (60*1000) // Existence time of Wisp/page data (60 seconds)
- // that is the waiting time of answers of all map-servers
-#define WISDELLIST_MAX 256 // Number of elements of Wisp/page data deletion list
-
-char inter_log_filename[1024] = "log/inter.log";
-
-char accreg_txt[1024] = "save/accreg.txt";
-static struct dbt *accreg_db = NULL;
-
-struct accreg {
- int account_id, reg_num;
- struct global_reg reg[ACCOUNT_REG_NUM];
-};
-
-int party_share_level = 10;
-
-
-// ‘—MƒpƒPƒbƒg’·ƒŠƒXƒg
-int inter_send_packet_length[] = {
- -1,-1,27,-1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- -1, 7, 0, 0, 0, 0, 0, 0, -1,11, 0, 0, 0, 0, 0, 0,
- 35,-1,11,15, 34,29, 7,-1, 0, 0, 0, 0, 0, 0, 0, 0,
- 10,-1,15, 0, 79,19, 7,-1, 0,-1,-1,-1, 14,67,186,-1,
- 9, 9,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 11,-1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-// ŽóMƒpƒPƒbƒg’·ƒŠƒXƒg
-int inter_recv_packet_length[] = {
- -1,-1, 7,-1, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 6,-1, 0, 0, 0, 0, 0, 0, 10,-1, 0, 0, 0, 0, 0, 0,
- 74, 6,52,14, 10,29, 6,-1, 34, 0, 0, 0, 0, 0, 0, 0,
- -1, 6,-1, 0, 55,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1,
- 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 48,14,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-struct WisData {
- int id, fd, count, len;
- unsigned long tick;
- unsigned char src[24], dst[24], msg[1024];
-};
-static struct dbt * wis_db = NULL;
-static int wis_dellist[WISDELLIST_MAX], wis_delnum;
-
-
-//--------------------------------------------------------
-
-// ƒAƒJƒEƒ“ƒg•Ï”‚𕶎š—ñ‚Ö•ÏŠ·
-int inter_accreg_tostr(char *str, struct accreg *reg) {
- int j;
- char *p = str;
-
- p += sprintf(p, "%d\t", reg->account_id);
- for(j = 0; j < reg->reg_num; j++) {
- p += sprintf(p,"%s,%d ", reg->reg[j].str, reg->reg[j].value);
- }
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒg•Ï”‚𕶎š—ñ‚©‚ç•ÏŠ·
-int inter_accreg_fromstr(const char *str, struct accreg *reg) {
- int j, v, n;
- char buf[128];
- const char *p = str;
-
- if (sscanf(p, "%d\t%n", &reg->account_id, &n ) != 1 || reg->account_id <= 0)
- return 1;
-
- for(j = 0, p += n; j < ACCOUNT_REG_NUM; j++, p += n) {
- if (sscanf(p, "%[^,],%d %n", buf, &v, &n) != 2)
- break;
- memcpy(reg->reg[j].str, buf, 32);
- reg->reg[j].value = v;
- }
- reg->reg_num = j;
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒg•Ï”‚Ì“Ç‚Ýž‚Ý
-int inter_accreg_init() {
- char line[8192];
- FILE *fp;
- int c = 0;
- struct accreg *reg;
-
- accreg_db = numdb_init();
-
- if( (fp = fopen(accreg_txt, "r")) == NULL)
- return 1;
- while(fgets(line, sizeof(line)-1, fp)){
- line[sizeof(line)-1] = '\0';
-
- reg = (struct accreg*)aCalloc(sizeof(struct accreg), 1);
- if (reg == NULL) {
- printf("inter: accreg: out of memory!\n");
- exit(0);
- }
- if (inter_accreg_fromstr(line, reg) == 0 && reg->account_id > 0) {
- numdb_insert(accreg_db, reg->account_id, reg);
- } else {
- printf("inter: accreg: broken data [%s] line %d\n", accreg_txt, c);
- aFree(reg);
- }
- c++;
- }
- fclose(fp);
-// printf("inter: %s read done (%d)\n", accreg_txt, c);
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒg•Ï”‚̃Z[ƒu—p
-int inter_accreg_save_sub(void *key, void *data, va_list ap) {
- char line[8192];
- FILE *fp;
- struct accreg *reg = (struct accreg *)data;
-
- if (reg->reg_num > 0) {
- inter_accreg_tostr(line,reg);
- fp = va_arg(ap, FILE *);
- fprintf(fp, "%s" RETCODE, line);
- }
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒg•Ï”‚̃Z[ƒu
-int inter_accreg_save() {
- FILE *fp;
- int lock;
-
- if ((fp = lock_fopen(accreg_txt,&lock)) == NULL) {
- printf("int_accreg: cant write [%s] !!! data is lost !!!\n", accreg_txt);
- return 1;
- }
- numdb_foreach(accreg_db, inter_accreg_save_sub,fp);
- lock_fclose(fp, accreg_txt, &lock);
-// printf("inter: %s saved.\n", accreg_txt);
-
- return 0;
-}
-
-//--------------------------------------------------------
-
-/*==========================================
- * Ý’èƒtƒ@ƒCƒ‹‚ð“Ç‚Ýž‚Þ
- *------------------------------------------
- */
-int inter_config_read(const char *cfgName) {
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- fp = fopen(cfgName, "r");
- if (fp == NULL) {
- printf("file not found: %s\n", cfgName);
- return 1;
- }
- while(fgets(line, sizeof(line) - 1, fp)) {
- if (line[0] == '/' && line[1] == '/')
- continue;
- line[sizeof(line)-1] = '\0';
-
- if (sscanf(line,"%[^:]: %[^\r\n]", w1, w2) != 2)
- continue;
-
- if (strcmpi(w1, "storage_txt") == 0) {
- strncpy(storage_txt, w2, sizeof(storage_txt));
- } else if (strcmpi(w1, "party_txt") == 0) {
- strncpy(party_txt, w2, sizeof(party_txt));
- } else if (strcmpi(w1, "guild_txt") == 0) {
- strncpy(guild_txt, w2, sizeof(guild_txt));
- } else if (strcmpi(w1, "pet_txt") == 0) {
- strncpy(pet_txt, w2, sizeof(pet_txt));
- } else if (strcmpi(w1, "castle_txt") == 0) {
- strncpy(castle_txt, w2, sizeof(castle_txt));
- } else if (strcmpi(w1, "accreg_txt") == 0) {
- strncpy(accreg_txt, w2, sizeof(accreg_txt));
- } else if (strcmpi(w1, "guild_storage_txt") == 0) {
- strncpy(guild_storage_txt, w2, sizeof(guild_storage_txt));
- } else if (strcmpi(w1, "party_share_level") == 0) {
- party_share_level = atoi(w2);
- if (party_share_level < 0)
- party_share_level = 0;
- } else if (strcmpi(w1, "inter_log_filename") == 0) {
- strncpy(inter_log_filename, w2, sizeof(inter_log_filename));
- } else if (strcmpi(w1, "import") == 0) {
- inter_config_read(w2);
- } else if(strcmpi(w1,"log_inter")==0) {
- log_inter = atoi(w2);
- }
- }
- fclose(fp);
-
- return 0;
-}
-
-// ƒƒO‘‚«o‚µ
-int inter_log(char *fmt,...) {
- FILE *logfp;
- va_list ap;
-
- va_start(ap,fmt);
- logfp = fopen(inter_log_filename, "a");
- if (logfp) {
- vfprintf(logfp, fmt, ap);
- fclose(logfp);
- }
- va_end(ap);
-
- return 0;
-}
-
-// ƒZ[ƒu
-int inter_save() {
- inter_party_save();
- inter_guild_save();
- inter_storage_save();
- inter_guild_storage_save();
- inter_pet_save();
- inter_accreg_save();
-
- return 0;
-}
-
-// ‰Šú‰»
-int inter_init(const char *file) {
- inter_config_read(file);
-
- wis_db = numdb_init();
-
- inter_party_init();
- inter_guild_init();
- inter_storage_init();
- inter_pet_init();
- inter_accreg_init();
-
- return 0;
-}
-
-// finalize
-int accreg_db_final (void *k, void *data, va_list ap) {
- struct accreg *p = (struct accreg *) data;
- if (p) aFree(p);
- return 0;
-}
-int wis_db_final (void *k, void *data, va_list ap) {
- struct WisData *p = (struct WisData *) data;
- if (p) aFree(p);
- return 0;
-}
-void inter_final() {
- numdb_final(accreg_db, accreg_db_final);
- numdb_final(wis_db, wis_db_final);
-
- inter_party_final();
- inter_guild_final();
- inter_storage_final();
- inter_pet_final();
-
- return;
-}
-
-// ƒ}ƒbƒvƒT[ƒo[Ú‘±
-int inter_mapif_init(int fd) {
- inter_guild_mapif_init(fd);
-
- return 0;
-}
-
-//--------------------------------------------------------
-// sended packets to map-server
-
-// GMƒƒbƒZ[ƒW‘—M
-int mapif_GMmessage(unsigned char *mes, int len, int sfd) {
- unsigned char buf[2048];
-
- WBUFW(buf,0) = 0x3800;
- WBUFW(buf,2) = len;
- memcpy(WBUFP(buf,4), mes, len - 4);
- mapif_sendallwos(sfd, buf, len);
-// printf("inter server: GM:%d %s\n", len, mes);
-
- return 0;
-}
-
-// Wisp/page transmission to all map-server
-int mapif_wis_message(struct WisData *wd) {
- unsigned char buf[2048];
-
- WBUFW(buf, 0) = 0x3801;
- WBUFW(buf, 2) = 56 + wd->len;
- WBUFL(buf, 4) = wd->id;
- memcpy(WBUFP(buf, 8), wd->src, 24);
- memcpy(WBUFP(buf,32), wd->dst, 24);
- memcpy(WBUFP(buf,56), wd->msg, wd->len);
- wd->count = mapif_sendall(buf, WBUFW(buf,2));
-
- return 0;
-}
-
-// Wisp/page transmission result to map-server
-int mapif_wis_end(struct WisData *wd, int flag) {
- unsigned char buf[27];
-
- WBUFW(buf, 0) = 0x3802;
- memcpy(WBUFP(buf, 2), wd->src, 24);
- WBUFB(buf,26) = flag; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- mapif_send(wd->fd, buf, 27);
-// printf("inter server wis_end: flag: %d\n", flag);
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒg•Ï”‘—M
-int mapif_account_reg(int fd, unsigned char *src) {
- unsigned char buf[2048];
-
- memcpy(WBUFP(buf,0),src,WBUFW(src,2));
- WBUFW(buf, 0) = 0x3804;
- mapif_sendallwos(fd, buf, WBUFW(buf,2));
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒg•Ï”—v‹•ÔM
-int mapif_account_reg_reply(int fd,int account_id) {
- struct accreg *reg = (struct accreg*)numdb_search(accreg_db,account_id);
-
- WFIFOW(fd,0) = 0x3804;
- WFIFOL(fd,4) = account_id;
- if (reg == NULL) {
- WFIFOW(fd,2) = 8;
- } else {
- int j, p;
- for(j = 0, p = 8; j < reg->reg_num; j++, p += 36) {
- memcpy(WFIFOP(fd,p), reg->reg[j].str, 32);
- WFIFOL(fd,p+32) = reg->reg[j].value;
- }
- WFIFOW(fd,2) = p;
- }
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-//--------------------------------------------------------
-
-// Existence check of WISP data
-int check_ttl_wisdata_sub(void *key, void *data, va_list ap) {
- unsigned long tick;
- struct WisData *wd = (struct WisData *)data;
- tick = va_arg(ap, unsigned long);
-
- if (DIFF_TICK(tick, wd->tick) > WISDATA_TTL && wis_delnum < WISDELLIST_MAX)
- wis_dellist[wis_delnum++] = wd->id;
-
- return 0;
-}
-
-int check_ttl_wisdata() {
- unsigned long tick = gettick();
- int i;
-
- do {
- wis_delnum = 0;
- numdb_foreach(wis_db, check_ttl_wisdata_sub, tick);
- for(i = 0; i < wis_delnum; i++) {
- struct WisData *wd = (struct WisData*)numdb_search(wis_db, wis_dellist[i]);
- printf("inter: wis data id=%d time out : from %s to %s\n", wd->id, wd->src, wd->dst);
- // removed. not send information after a timeout. Just no answer for the player
- //mapif_wis_end(wd, 1); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- numdb_erase(wis_db, wd->id);
- aFree(wd);
- }
- } while(wis_delnum >= WISDELLIST_MAX);
-
- return 0;
-}
-
-//--------------------------------------------------------
-// received packets from map-server
-
-// GMƒƒbƒZ[ƒW‘—M
-int mapif_parse_GMmessage(int fd) {
- mapif_GMmessage(RFIFOP(fd,4), RFIFOW(fd,2), fd);
-
- return 0;
-}
-
-// Wisp/page request to send
-int mapif_parse_WisRequest(int fd) {
- struct WisData* wd;
- static int wisid = 0;
- int index;
-
- if (RFIFOW(fd,2)-52 >= sizeof(wd->msg)) {
- printf("inter: Wis message size too long.\n");
- return 0;
- } else if (RFIFOW(fd,2)-52 <= 0) { // normaly, impossible, but who knows...
- printf("inter: Wis message doesn't exist.\n");
- return 0;
- }
-
- // search if character exists before to ask all map-servers
- if ((index = search_character_index((char*)RFIFOP(fd,28))) == -1) {
- unsigned char buf[27];
- WBUFW(buf, 0) = 0x3802;
- memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), 24);
- WBUFB(buf,26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- mapif_send(fd, buf, 27);
- // Character exists. So, ask all map-servers
- } else {
- // to be sure of the correct name, rewrite it
- memset(RFIFOP(fd,28), 0, 24);
- strncpy((char*)RFIFOP(fd,28), search_character_name(index), 24);
- // if source is destination, don't ask other servers.
- if (strcmp((char*)RFIFOP(fd,4),(char*)RFIFOP(fd,28)) == 0) {
- unsigned char buf[27];
- WBUFW(buf, 0) = 0x3802;
- memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), 24);
- WBUFB(buf,26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- mapif_send(fd, buf, 27);
- } else {
-
- wd = (struct WisData *)aCalloc(sizeof(struct WisData), 1);
- if (wd == NULL){
- printf("inter: WisRequest: out of memory !\n");
- return 0;
- }
-
- // Whether the failure of previous wisp/page transmission (timeout)
- check_ttl_wisdata();
-
- wd->id = ++wisid;
- wd->fd = fd;
- wd->len= RFIFOW(fd,2)-52;
- memcpy(wd->src, RFIFOP(fd, 4), 24);
- memcpy(wd->dst, RFIFOP(fd,28), 24);
- memcpy(wd->msg, RFIFOP(fd,52), wd->len);
- wd->tick = gettick();
- numdb_insert(wis_db, wd->id, wd);
- mapif_wis_message(wd);
- }
- }
-
- return 0;
-}
-
-// Wisp/page transmission result
-int mapif_parse_WisReply(int fd) {
- int id = RFIFOL(fd,2), flag = RFIFOB(fd,6);
- struct WisData *wd = (struct WisData*)numdb_search(wis_db, id);
-
- if (wd == NULL)
- return 0; // This wisp was probably suppress before, because it was timeout of because of target was found on another map-server
-
- if ((--wd->count) <= 0 || flag != 1) {
- mapif_wis_end(wd, flag); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- numdb_erase(wis_db, id);
- aFree(wd);
- }
-
- return 0;
-}
-
-// Received wisp message from map-server for ALL gm (just copy the message and resends it to ALL map-servers)
-int mapif_parse_WisToGM(int fd) {
- unsigned char buf[2048]; // 0x3003/0x3803 <packet_len>.w <wispname>.24B <min_gm_level>.w <message>.?B
-
- memcpy(WBUFP(buf,0), RFIFOP(fd,0), RFIFOW(fd,2));
- WBUFW(buf, 0) = 0x3803;
- mapif_sendall(buf, RFIFOW(fd,2));
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒg•Ï”•Û‘¶—v‹
-int mapif_parse_AccReg(int fd) {
- int j, p;
- struct accreg *reg = (struct accreg*)numdb_search(accreg_db, RFIFOL(fd,4));
-
- if (reg == NULL) {
- if ((reg = (struct accreg*)aCalloc(sizeof(struct accreg), 1)) == NULL) {
- printf("inter: accreg: out of memory !\n");
- exit(0);
- }
- reg->account_id = RFIFOL(fd,4);
- numdb_insert(accreg_db, RFIFOL(fd,4), reg);
- }
-
- for(j = 0, p = 8; j < ACCOUNT_REG_NUM && p < RFIFOW(fd,2); j++, p += 36) {
- memcpy(reg->reg[j].str, RFIFOP(fd,p), 32);
- reg->reg[j].value = RFIFOL(fd, p + 32);
- }
- reg->reg_num = j;
-
- mapif_account_reg(fd, RFIFOP(fd,0)); // ‘¼‚ÌMAPƒT[ƒo[‚É‘—M
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒg•Ï”‘—M—v‹
-int mapif_parse_AccRegRequest(int fd) {
-// printf("mapif: accreg request\n");
- return mapif_account_reg_reply(fd, RFIFOL(fd,2));
-}
-
-//--------------------------------------------------------
-
-// map server ‚©‚ç‚Ì’ÊMi‚PƒpƒPƒbƒg‚̂݉ðÍ‚·‚邱‚Æj
-// ƒGƒ‰[‚È‚ç0(false)Aˆ—‚Å‚«‚½‚È‚ç1A
-// ƒpƒPƒbƒg’·‚ª‘«‚è‚È‚¯‚ê‚Î2‚ð‚©‚¦‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢
-int inter_parse_frommap(int fd) {
- int cmd = RFIFOW(fd,0);
- int len = 0;
-
- // interŽIŠÇŠ‚©‚𒲂ׂé
- if (cmd < 0x3000 || cmd >= 0x3000 + (sizeof(inter_recv_packet_length) / sizeof(inter_recv_packet_length[0])))
- return 0;
-
- // ƒpƒPƒbƒg’·‚𒲂ׂé
- if ((len = inter_check_length(fd, inter_recv_packet_length[cmd - 0x3000])) == 0)
- return 2;
-
- switch(cmd) {
- case 0x3000: mapif_parse_GMmessage(fd); break;
- case 0x3001: mapif_parse_WisRequest(fd); break;
- case 0x3002: mapif_parse_WisReply(fd); break;
- case 0x3003: mapif_parse_WisToGM(fd); break;
- case 0x3004: mapif_parse_AccReg(fd); break;
- case 0x3005: mapif_parse_AccRegRequest(fd); break;
- default:
- if (inter_party_parse_frommap(fd))
- break;
- if (inter_guild_parse_frommap(fd))
- break;
- if (inter_storage_parse_frommap(fd))
- break;
- if (inter_pet_parse_frommap(fd))
- break;
- return 0;
- }
- RFIFOSKIP(fd, len);
-
- return 1;
-}
-
-// RFIFO‚̃pƒPƒbƒg’·Šm”F
-// •K—vƒpƒPƒbƒg’·‚ª‚ ‚ê‚΃pƒPƒbƒg’·A‚Ü‚¾‘«‚è‚È‚¯‚ê‚Î0
-int inter_check_length(int fd, int length) {
- if (length == -1) { // ‰Â•ÏƒpƒPƒbƒg’·
- if (RFIFOREST(fd) < 4) // ƒpƒPƒbƒg’·‚ª–¢’…
- return 0;
- length = RFIFOW(fd,2);
- }
-
- if (RFIFOREST(fd) < length) // ƒpƒPƒbƒg‚ª–¢’…
- return 0;
-
- return length;
-}
-
diff --git a/src/char/inter.h b/src/char/inter.h
deleted file mode 100644
index 636ce31d8..000000000
--- a/src/char/inter.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// $Id: inter.h,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
-#ifndef _INTER_H_
-#define _INTER_H_
-
-int inter_init(const char *file);
-void inter_final();
-int inter_save();
-int inter_parse_frommap(int fd);
-int inter_mapif_init(int fd);
-
-int inter_check_length(int fd,int length);
-
-int inter_log(char *fmt,...);
-
-#define inter_cfgName "conf/inter_athena.conf"
-
-extern int party_share_level;
-extern char inter_log_filename[1024];
-extern int log_inter;
-
-#endif
diff --git a/src/char_sql/Makefile b/src/char_sql/Makefile
deleted file mode 100644
index 1741b5ab6..000000000
--- a/src/char_sql/Makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-all: char-server_sql
-sql: char-server_sql
-
-COMMON_OBJ = ../common/obj/core.o ../common/obj/socket.o ../common/obj/timer.o ../common/obj/db.o ../common/obj/malloc.o ../common/obj/showmsg.o ../common/obj/utils.o ../common/obj/strlib.o
-COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/db.h ../common/malloc.h ../common/showmsg.h ../common/utils.h ../common/strlib.h
-
-char-server_sql: char.o inter.o int_party.o int_guild.o int_storage.o int_pet.o itemdb.o $(COMMON_OBJ)
- $(CC) -o ../../$@ $^ $(LIB_S)
-
-char.o: char.c char.h ../common/strlib.h itemdb.h ../common/showmsg.h
-inter.o: inter.c inter.h int_party.h int_guild.h int_storage.h int_pet.h ../common/mmo.h char.h ../common/socket.h ../common/showmsg.h
-int_party.o: int_party.c int_party.h inter.h ../common/mmo.h char.h ../common/socket.h ../common/timer.h ../common/db.h ../common/showmsg.h
-int_guild.o: int_guild.c int_guild.h inter.h ../common/mmo.h char.h ../common/socket.h ../common/db.h ../common/showmsg.h
-int_storage.o: int_storage.c int_storage.h char.h itemdb.h ../common/showmsg.h
-int_pet.o: int_pet.c int_pet.h inter.h char.h ../common/mmo.h ../common/socket.h ../common/db.h ../common/showmsg.h
-itemdb.o: itemdb.c itemdb.h ../common/db.h ../common/mmo.h ../common/showmsg.h
-$(COMMON_OBJ): $(COMMON_H)
-
-clean:
- rm -f *.o ../../char-server_sql
diff --git a/src/char_sql/char.c b/src/char_sql/char.c
deleted file mode 100644
index d672bc0eb..000000000
--- a/src/char_sql/char.c
+++ /dev/null
@@ -1,3578 +0,0 @@
-// $Id: char.c,v 1.16 2004/09/23 18:31:16 MouseJstr Exp $
-// original : char2.c 2003/03/14 11:58:35 Rev.1.5
-//
-// original code from athena
-// SQL conversion by Jioh L. Jung
-// TXT 1.105
-#include <sys/types.h>
-
-#ifdef LCCWIN32
-#include <winsock.h>
-#pragma lib <libmysql.lib>
-#else
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <sys/time.h>
-#include <sys/ioctl.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <netinet/in.h>
-#include <sys/time.h>
-#include <time.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <stdarg.h>
-
-#include "char.h"
-#include "../common/utils.h"
-#include "../common/strlib.h"
-#include "itemdb.h"
-#include "inter.h"
-#include "db.h"
-#include "malloc.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-static struct dbt *char_db_;
-
-char char_db[256] = "char";
-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 reg_db[256] = "global_reg_value";
-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 login_db[256] = "login";
-char friend_db[256] = "friends";
-int db_use_sqldbs;
-
-char login_db_account_id[32] = "account_id";
-char login_db_level[32] = "level";
-
-int lowest_gm_level = 1;
-
-char *SQL_CONF_NAME = "conf/inter_athena.conf";
-
-struct mmo_map_server server[MAX_MAP_SERVERS];
-int server_fd[MAX_MAP_SERVERS];
-
-int login_fd, char_fd;
-char userid[24];
-char passwd[24];
-char server_name[20];
-char wisp_server_name[24] = "Server";
-int login_ip_set_ = 0;
-char login_ip_str[128];
-in_addr_t login_ip;
-int login_port = 6900;
-int char_ip_set_ = 0;
-char char_ip_str[128];
-int bind_ip_set_ = 0;
-char bind_ip_str[128];
-in_addr_t char_ip;
-int char_port = 6121;
-int char_maintenance;
-int char_new;
-int name_ignoring_case = 0; // Allow or not identical name for characters but with a different case by [Yor]
-int char_name_option = 0; // Option to know which letters/symbols are authorised in the name of a character (0: all, 1: only those in char_name_letters, 2: all EXCEPT those in char_name_letters) by [Yor]
-char char_name_letters[1024] = ""; // list of letters/symbols used to authorise or not a name of a character. by [Yor]
-int char_per_account = 0; //Maximum charas per account (default unlimited) [Sirius]
-
-
-int log_char = 1; // loggin char or not [devil]
-int log_inter = 1; // loggin inter or not [devil]
-
-char lan_map_ip[128]; // Lan map ip added by kashy
-int subnetmaski[4]; // Subnetmask added by kashy
-char unknown_char_name[1024] = "Unknown";
-char db_path[1024]="db";
-
-//Added for Mugendai's I'm Alive mod
-int imalive_on=0;
-int imalive_time=60;
-//Added by Mugendai for GUI
-int flush_on=1;
-int flush_time=100;
-
-struct char_session_data{
- int account_id,login_id1,login_id2,sex;
- int found_char[9];
- char email[40]; // e-mail (default: a@a.com) by [Yor]
- time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
-};
-
-#define AUTH_FIFO_SIZE 256
-struct {
- int account_id,char_id,login_id1,login_id2,ip,char_pos,delflag,sex;
- time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
-} auth_fifo[AUTH_FIFO_SIZE];
-int auth_fifo_pos = 0;
-
-int check_ip_flag = 1; // It's to check IP of a player between char-server and other servers (part of anti-hacking system)
-
-//int char_id_count = 150000; //removed by [Sirius] for new charcreate issue (auto_increment @sql)
-struct mmo_charstatus *char_dat;
-int char_num,char_max;
-int max_connect_user = 0;
-int gm_allow_level = 99;
-int autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
-int start_zeny = 500;
-int start_weapon = 1201;
-int start_armor = 2301;
-
-// check for exit signal
-// 0 is saving complete
-// other is char_id
-unsigned int save_flag = 0;
-
-// start point (you can reset point on conf file)
-struct point start_point = {"new_1-1.gat", 53, 111};
-
-struct gm_account *gm_account = NULL;
-int GM_num = 0;
-
-int console = 0;
-
-#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
-
-//-------------------------------------------------
-// Set Character online/offline [Wizputer]
-//-------------------------------------------------
-
-void set_char_online(int char_id, int account_id) {
- if ( char_id != 99 ) {
- sprintf(tmp_sql, "UPDATE `%s` SET `online`='1' WHERE `char_id`='%d'",char_db,char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (set char online)- %s\n", mysql_error(&mysql_handle));
- }
- }
-
- if (login_fd <= 0 || session[login_fd]->eof)
- return;
- WFIFOW(login_fd,0) = 0x272b;
- WFIFOL(login_fd,2) = account_id;
- WFIFOSET(login_fd,6);
-
-}
-
-void set_all_offline(void) {
- sprintf(tmp_sql, "SELECT `account_id` FROM `%s` WHERE `online`='1'",char_db);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select all online)- %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- while((sql_row = mysql_fetch_row(sql_res))) {
- if ( login_fd > 0 ) {
- printf("send user offline: %d\n",atoi(sql_row[0]));
- WFIFOW(login_fd,0) = 0x272c;
- WFIFOL(login_fd,2) = atoi(sql_row[0]);
- WFIFOSET(login_fd,6);
- }
- }
- }
-
- mysql_free_result(sql_res);
- sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `online`='1'", char_db);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (set_all_offline)- %s\n", mysql_error(&mysql_handle));
- }
-
-}
-
-void set_char_offline(int char_id, int account_id) {
- struct mmo_charstatus *cp;
-
- if ( char_id == 99 )
- sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `account_id`='%d'", char_db, account_id);
- else {
- cp = (struct mmo_charstatus*)numdb_search(char_db_,char_id);
- if (cp != NULL) {
- aFree(cp);
- numdb_erase(char_db_,char_id);
- }
-
- sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `char_id`='%d'", char_db, char_id);
-
- if (mysql_query(&mysql_handle, tmp_sql))
- printf("DB server Error (set_char_offline)- %s\n", mysql_error(&mysql_handle));
- }
-
- if (login_fd <= 0 || session[login_fd]->eof)
- return;
-
- WFIFOW(login_fd,0) = 0x272c;
- WFIFOL(login_fd,2) = account_id;
- WFIFOSET(login_fd,6);
-}
-
-//----------------------------------------------------------------------
-// Determine if an account (id) is a GM account
-// and returns its level (or 0 if it isn't a GM account or if not found)
-//----------------------------------------------------------------------
-// Removed since nothing GM related goes on in the char server [CLOWNISIUS]
-int isGM(int account_id) {
- int i;
-
- for(i = 0; i < GM_num; i++)
- if (gm_account[i].account_id == account_id)
- return gm_account[i].level;
- return 0;
-}
-
-void read_gm_account(void) {
- if (gm_account != NULL)
- aFree(gm_account);
- GM_num = 0;
-
- sprintf(tmp_lsql, "SELECT `%s`,`%s` FROM `%s` WHERE `%s`>='%d'",login_db_account_id,login_db_level,login_db,login_db_level,lowest_gm_level);
- if (mysql_query(&lmysql_handle, tmp_lsql)) {
- printf("DB server Error (select %s to Memory)- %s\n",login_db,mysql_error(&lmysql_handle));
- }
- lsql_res = mysql_store_result(&lmysql_handle);
- if (lsql_res) {
- gm_account = (struct gm_account*)aCalloc(sizeof(struct gm_account) * mysql_num_rows(lsql_res), 1);
- while ((lsql_row = mysql_fetch_row(lsql_res))) {
- gm_account[GM_num].account_id = atoi(lsql_row[0]);
- gm_account[GM_num].level = atoi(lsql_row[1]);
- GM_num++;
- }
- }
-
- mysql_free_result(lsql_res);
- mapif_send_gmaccounts();
-}
-
-// Insert friends list
-int insert_friends(int char_id){
- int i;
- char *tmp_p = tmp_sql;
-
- tmp_p += sprintf(tmp_p, "REPLACE INTO `%s` (`id`, `account_id`",friend_db);
-
- for (i=0;i<20;i++)
- tmp_p += sprintf(tmp_p, ", `friend_id%d`, `name%d`", i, i);
-
- tmp_p += sprintf(tmp_p, ") VALUES (NULL, '%d'", char_id);
-
- for (i=0;i<20;i++)
- tmp_p += sprintf(tmp_p, ", '0', ''");
-
- tmp_p += sprintf(tmp_p, ")");
-
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (insert `friend`)- %s\n", mysql_error(&mysql_handle));
- return 0;
- }
-return 1;
-}
-
-int compare_item(struct item *a, struct item *b) {
- return (
- (a->id == b->id) &&
- (a->nameid == b->nameid) &&
- (a->amount == b->amount) &&
- (a->equip == b->equip) &&
- (a->identify == b->identify) &&
- (a->refine == b->refine) &&
- (a->attribute == b->attribute) &&
- (a->card[0] == b->card[0]) &&
- (a->card[1] == b->card[1]) &&
- (a->card[2] == b->card[2]) &&
- (a->card[3] == b->card[3]));
-}
-
-//=====================================================================================================
-int mmo_char_tosql(int char_id, struct mmo_charstatus *p){
- int i=0,party_exist,guild_exist;
-// int eqcount=1;
-// int noteqcount=1;
- int count = 0;
- int diff = 0;
- char temp_str[1024];
- char *tmp_p = tmp_sql;
- struct mmo_charstatus *cp;
- struct itemtmp mapitem[MAX_GUILD_STORAGE];
-
- if (char_id!=p->char_id) return 0;
-
- cp = (struct mmo_charstatus*)numdb_search(char_db_,char_id);
-
- if (cp == NULL) {
- cp = (struct mmo_charstatus *) aMalloc(sizeof(struct mmo_charstatus));
- memset(cp, 0, sizeof(struct mmo_charstatus));
- numdb_insert(char_db_, char_id,cp);
- }
-
- save_flag = p->char_id;
- printf("(\033[1;32m%d\033[0m) %s \trequest save char data - ",char_id,char_dat[0].name);
-
-//for(testcount=1;testcount<50;testcount++){//---------------------------test count--------------------
-// printf("test count : %d\n", testcount);
-// eqcount=1;
-// noteqcount=1;
-// dbeqcount=1;
-// dbnoteqcount=1;
-//-----------------------------------------------------------------------------------------------------
-
-//=========================================map inventory data > memory ===============================
- diff = 0;
-
- //map inventory data
- for(i=0;i<MAX_INVENTORY;i++){
- if (!compare_item(&p->inventory[i], &cp->inventory[i]))
- diff = 1;
- if(p->inventory[i].nameid>0){
- mapitem[count].flag=0;
- mapitem[count].id = p->inventory[i].id;
- mapitem[count].nameid=p->inventory[i].nameid;
- mapitem[count].amount = p->inventory[i].amount;
- mapitem[count].equip = p->inventory[i].equip;
- mapitem[count].identify = p->inventory[i].identify;
- mapitem[count].refine = p->inventory[i].refine;
- mapitem[count].attribute = p->inventory[i].attribute;
- mapitem[count].card[0] = p->inventory[i].card[0];
- mapitem[count].card[1] = p->inventory[i].card[1];
- mapitem[count].card[2] = p->inventory[i].card[2];
- mapitem[count].card[3] = p->inventory[i].card[3];
- count++;
- }
- }
- //printf("- Save item data to MySQL!\n");
- if (diff)
- memitemdata_to_sql(mapitem, count, p->char_id,TABLE_INVENTORY);
-
-//=========================================map cart data > memory ====================================
-// eqcount=1;
-// noteqcount=1;
- count = 0;
- diff = 0;
-
- //map cart data
- for(i=0;i<MAX_CART;i++){
- if (!compare_item(&p->cart[i], &cp->cart[i]))
- diff = 1;
- if(p->cart[i].nameid>0){
- mapitem[count].flag=0;
- mapitem[count].id = p->cart[i].id;
- mapitem[count].nameid=p->cart[i].nameid;
- mapitem[count].amount = p->cart[i].amount;
- mapitem[count].equip = p->cart[i].equip;
- mapitem[count].identify = p->cart[i].identify;
- mapitem[count].refine = p->cart[i].refine;
- mapitem[count].attribute = p->cart[i].attribute;
- mapitem[count].card[0] = p->cart[i].card[0];
- mapitem[count].card[1] = p->cart[i].card[1];
- mapitem[count].card[2] = p->cart[i].card[2];
- mapitem[count].card[3] = p->cart[i].card[3];
- count++;
- }
- }
-
- //printf("- Save cart data to MySQL!\n");
- if (diff)
- memitemdata_to_sql(mapitem, count, p->char_id,TABLE_CART);
-
-//=====================================================================================================
-
- if ((p->base_exp != cp->base_exp) || (p->class_ != cp->class_) ||
- (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.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->karma != cp->karma) || (p->manner != cp->manner) ||
- (p->party_id != cp->party_id) || (p->guild_id != cp->guild_id) ||
- (p->pet_id != cp->pet_id) || (p->hair != cp->hair) || (p->hair_color != cp->hair_color) ||
- (p->clothes_color != cp->clothes_color) || (p->weapon != cp->weapon) ||
- (p->shield != cp->shield) || (p->head_top != cp->head_top) ||
- (p->head_mid != cp->head_mid) || (p->head_bottom != cp->head_bottom) ||
- (p->partner_id != cp->partner_id) || (p->father != cp->father) ||
- (p->mother != cp->mother) || (p->child != cp->child)) {
-
-//}//---------------------------test count------------------------------
- //check party_exist
- party_exist=0;
- sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `party_id` = '%d'",party_db, p->party_id); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
- sql_row = mysql_fetch_row(sql_res);
- if (sql_row) party_exist = atoi(sql_row[0]);
- mysql_free_result(sql_res);
-
- //check guild_exist
- guild_exist=0;
- sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id` = '%d'",guild_db, p->guild_id); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
- sql_row = mysql_fetch_row(sql_res);
- if (sql_row) guild_exist = atoi(sql_row[0]);
- mysql_free_result(sql_res);
-
- if (guild_exist==0) p->guild_id=0;
- if (party_exist==0) p->party_id=0;
-
- //sql query
- //`char`( `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`, //9
- //`str`,`agi`,`vit`,`int`,`dex`,`luk`, //15
- //`max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point`, //21
- //`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`, //27
- //`hair`,`hair_color`,`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`, //35
- //`last_map`,`last_x`,`last_y`,`save_map`,`save_x`,`save_y`)
- //printf("- Save char data to MySQL!\n");
- sprintf(tmp_sql ,"UPDATE `%s` SET `class`='%d', `base_level`='%d', `job_level`='%d',"
- "`base_exp`='%d', `job_exp`='%d', `zeny`='%d',"
- "`max_hp`='%d',`hp`='%d',`max_sp`='%d',`sp`='%d',`status_point`='%d',`skill_point`='%d',"
- "`str`='%d',`agi`='%d',`vit`='%d',`int`='%d',`dex`='%d',`luk`='%d',"
- "`option`='%d',`karma`='%d',`manner`='%d',`party_id`='%d',`guild_id`='%d',`pet_id`='%d',"
- "`hair`='%d',`hair_color`='%d',`clothes_color`='%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',`partner_id`='%d', `father`='%d', `mother`='%d', `child`='%d' WHERE `account_id`='%d' AND `char_id` = '%d'",
- char_db, p->class_, 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->karma, p->manner, p->party_id, p->guild_id, p->pet_id,
- p->hair, p->hair_color, p->clothes_color,
- p->weapon, p->shield, p->head_top, p->head_mid, p->head_bottom,
- p->last_point.map, p->last_point.x, p->last_point.y,
- p->save_point.map, p->save_point.x, p->save_point.y, p->partner_id, p->father, p->mother,
- p->child, p->account_id, p->char_id
- );
-
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle));
- }
-
- }
-
- diff = 0;
-
- for(i=0;i<10;i++){
- if((strcmp(p->memo_point[i].map,cp->memo_point[i].map) == 0) && (p->memo_point[i].x == cp->memo_point[i].x) && (p->memo_point[i].y == cp->memo_point[i].y))
- continue;
- diff = 1;
- break;
- }
-
- if (diff) {
- //printf("- Save memo data to MySQL!\n");
- //`memo` (`memo_id`,`char_id`,`map`,`x`,`y`)
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",memo_db, p->char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (delete `memo`)- %s\n", mysql_error(&mysql_handle));
- }
-
- //insert here.
- for(i=0;i<10;i++){
- if(p->memo_point[i].map[0]){
- sprintf(tmp_sql,"INSERT INTO `%s`(`char_id`,`map`,`x`,`y`) VALUES ('%d', '%s', '%d', '%d')",
- memo_db, char_id, p->memo_point[i].map, p->memo_point[i].x, p->memo_point[i].y);
- if(mysql_query(&mysql_handle, tmp_sql))
- printf("DB server Error (insert `memo`)- %s\n", mysql_error(&mysql_handle));
- }
- }
- }
-
- diff = 0;
- for(i=0;i<MAX_SKILL;i++) {
- if ((p->skill[i].lv != 0) && (p->skill[i].id == 0))
- p->skill[i].id = i; // Fix skill tree
-
- if((p->skill[i].id != cp->skill[i].id) || (p->skill[i].lv != cp->skill[i].lv) ||
- (p->skill[i].flag != cp->skill[i].flag)) {
- diff = 1;
- break;
- }
- }
-
- if (diff) {
- //printf("- Save skill data to MySQL!\n");
- //`skill` (`char_id`, `id`, `lv`)
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",skill_db, p->char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (delete `skill`)- %s\n", mysql_error(&mysql_handle));
- }
- //printf("- Insert skill \n");
- //insert here.
- for(i=0;i<MAX_SKILL;i++){
- if(p->skill[i].id){
- if (p->skill[i].id && p->skill[i].flag!=1) {
- sprintf(tmp_sql,"INSERT INTO `%s`(`char_id`, `id`, `lv`) VALUES ('%d', '%d','%d')",
- skill_db, char_id, p->skill[i].id, (p->skill[i].flag==0)?p->skill[i].lv:p->skill[i].flag-2);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (insert `skill`)- %s\n", mysql_error(&mysql_handle));
- }
- }
- }
- }
- }
-
- diff = 0;
- for(i=0;i<p->global_reg_num;i++) {
- if ((p->global_reg[i].str == NULL) && (cp->global_reg[i].str == NULL))
- continue;
- if (((p->global_reg[i].str == NULL) != (cp->global_reg[i].str == NULL)) ||
- (p->global_reg[i].value != cp->global_reg[i].value) ||
- strcmp(p->global_reg[i].str, cp->global_reg[i].str) != 0) {
- diff = 1;
- break;
- }
- }
-
- if (diff) {
- //printf("- Save global_reg_value data to MySQL!\n");
- //`global_reg_value` (`char_id`, `str`, `value`)
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `type`=3 AND `char_id`='%d'",reg_db, p->char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (delete `global_reg_value`)- %s\n", mysql_error(&mysql_handle));
- }
-
- //insert here.
- for(i=0;i<p->global_reg_num;i++){
- if (p->global_reg[i].str) {
- if(p->global_reg[i].value !=0){
- sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`, `str`, `value`) VALUES ('%d', '%s','%d')",
- reg_db, char_id, jstrescapecpy(temp_str,p->global_reg[i].str), p->global_reg[i].value);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (insert `global_reg_value`)- %s\n", mysql_error(&mysql_handle));
- }
- }
- }
- }
- }
-
- // Friends list
- // account_id, friend_id0, name0, ...
- #if 0
- tmp_p += sprintf(tmp_p, "REPLACE INTO `%s` (`id`, `account_id`",friend_db);
-
- diff = 0;
-
- for (i=0;i<20;i++)
- tmp_p += sprintf(tmp_p, ", `friend_id%d`, `name%d`", i, i);
-
- tmp_p += sprintf(tmp_p, ") VALUES (NULL, '%d'", char_id);
-
- for (i=0;i<20;i++) {
- tmp_p += sprintf(tmp_p, ", '%d', '%s'", p->friend_id[i], p->friend_name[i]);
- if ((p->friend_id[i] != cp->friend_id[i]) ||
- strcmp(p->friend_name[i], cp->friend_name[i]))
- diff = 1;
- }
-
- tmp_p += sprintf(tmp_p, ")");
- #else // [Dino9021]
- tmp_p += sprintf(tmp_p, "UPDATE `%s` SET ",friend_db);
-
- diff = 0;
-
- for (i=0;i<20;i++) {
- if (i>0)
- tmp_p += sprintf(tmp_p, ", ");
-
- tmp_p += sprintf(tmp_p, "`friend_id%d`='%d', `name%d`='%s'", i, p->friend_id[i], i, p->friend_name[i]);
-
- if ((p->friend_id[i] != cp->friend_id[i]) || strcmp(p->friend_name[i], cp->friend_name[i]))
- diff = 1;
- }
-
- tmp_p += sprintf(tmp_p, " where account_id='%d';", char_id);
- #endif
-
- if (diff)
- mysql_query(&mysql_handle, tmp_sql);
-
- printf("saving char is done.\n");
- save_flag = 0;
-
- memcpy(cp, p, sizeof(struct mmo_charstatus));
-
- return 0;
-}
-
-// [Ilpalazzo-sama]
-int memitemdata_to_sql(struct itemtmp mapitem[], int count, int char_id, int tableswitch)
-{
- int i, flag, id;
- char *tablename;
- char selectoption[16];
-
- switch (tableswitch) {
- case TABLE_INVENTORY:
- tablename = inventory_db; // no need for sprintf here as *_db are char*.
- sprintf(selectoption,"char_id");
- break;
- case TABLE_CART:
- tablename = cart_db;
- sprintf(selectoption,"char_id");
- break;
- case TABLE_STORAGE:
- tablename = storage_db;
- sprintf(selectoption,"account_id");
- break;
- case TABLE_GUILD_STORAGE:
- tablename = guild_storage_db;
- sprintf(selectoption,"guild_id");
- break;
- default:
- printf("Invalid table name!\n");
- return 1;
- }
- //printf("Working Table : %s \n",tablename);
-
- //=======================================mysql database data > memory===============================================
- sprintf(tmp_sql, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3` "
- "FROM `%s` WHERE `%s`='%d'", tablename, selectoption, char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `%s` to Memory)- %s\n",tablename ,mysql_error(&mysql_handle));
- return 1;
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- while ((sql_row = mysql_fetch_row(sql_res))) {
- flag = 0;
- id = atoi(sql_row[0]);
- for(i = 0; i < count; i++) {
- if(mapitem[i].flag == 1)
- continue;
- if(mapitem[i].nameid == atoi(sql_row[1])) { // produced items fixup
- if((mapitem[i].equip == atoi(sql_row[3])) &&
- (mapitem[i].identify == atoi(sql_row[4])) &&
- (mapitem[i].amount == atoi(sql_row[2])) &&
- (mapitem[i].refine == atoi(sql_row[5])) &&
- (mapitem[i].attribute == atoi(sql_row[6])) &&
- (mapitem[i].card[0] == atoi(sql_row[7])) &&
- (mapitem[i].card[1] == atoi(sql_row[8])) &&
- (mapitem[i].card[2] == atoi(sql_row[9])) &&
- (mapitem[i].card[3] == atoi(sql_row[10]))) {
- //printf("the same item : %d , equip : %d , i : %d , flag : %d\n", mapitem.equip[i].nameid,mapitem.equip[i].equip , i, mapitem.equip[i].flag); //DEBUG-STRING
- } else {
-//==============================================Memory data > SQL ===============================
- if(itemdb_isequip(mapitem[i].nameid) || (mapitem[i].card[0] == atoi(sql_row[7]))) {
- sprintf(tmp_sql,"UPDATE `%s` SET `equip`='%d', `identify`='%d', `refine`='%d',"
- "`attribute`='%d', `card0`='%d', `card1`='%d', `card2`='%d', `card3`='%d', `amount`='%d' WHERE `id`='%d' LIMIT 1",
- tablename, mapitem[i].equip, mapitem[i].identify, mapitem[i].refine, mapitem[i].attribute, mapitem[i].card[0],
- mapitem[i].card[1], mapitem[i].card[2], mapitem[i].card[3], mapitem[i].amount, id);
- if(mysql_query(&mysql_handle, tmp_sql))
- printf("DB server Error (UPdate `equ %s`)- %s\n", tablename, mysql_error(&mysql_handle));
- }
- //printf("not the same item : %d ; i : %d ; flag : %d\n", mapitem.equip[i].nameid, i, mapitem.equip[i].flag);
- }
- flag = mapitem[i].flag = 1;
- break;
- }
- }
- if(!flag) {
- sprintf(tmp_sql,"DELETE from `%s` where `id`='%d'", tablename, id);
- if(mysql_query(&mysql_handle, tmp_sql))
- printf("DB server Error (DELETE `equ %s`)- %s\n", tablename, mysql_error(&mysql_handle));
- }
- }
- mysql_free_result(sql_res);
- }
-
- for(i = 0; i < count; i++) {
- if(!mapitem[i].flag) {
- sprintf(tmp_sql,"INSERT INTO `%s`(`%s`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3` )"
- " VALUES ( '%d','%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d' )",
- tablename, selectoption, char_id, mapitem[i].nameid, mapitem[i].amount, mapitem[i].equip, mapitem[i].identify, mapitem[i].refine,
- mapitem[i].attribute, mapitem[i].card[0], mapitem[i].card[1], mapitem[i].card[2], mapitem[i].card[3]);
- if(mysql_query(&mysql_handle, tmp_sql))
- printf("DB server Error (INSERT `equ %s`)- %s\n", tablename, mysql_error(&mysql_handle));
- }
- }
-
- //======================================DEBUG=================================================
-
-// gettimeofday(&tv,NULL);
-// strftime(tmpstr,24,"%Y-%m-%d %H:%M:%S",localtime(&(tv.tv_sec)));
-// printf("\n\n");
-// printf("Working Table Name : Not EQU %s, Count : map %3d | db %3d \n",tablename ,noteqcount ,dbnoteqcount);
-// printf("*********************************************************************************\n");
-// printf("======================================MAP===================Char ID %10d===\n",char_id);
-// printf("==flag ===name ===equip===ident===refin===attri===card0===card1===card2===card3==\n");
-// for(j=1;j<noteqcount;j++)
-// printf("| %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d |\n", mapitem.notequip[j].flag,mapitem.notequip[j].nameid, mapitem.notequip[j].equip, mapitem.notequip[j].identify, mapitem.notequip[j].refine,mapitem.notequip[j].attribute, mapitem.notequip[j].card[0], mapitem.notequip[j].card[1], mapitem.notequip[j].card[2], mapitem.notequip[j].card[3]);
-// printf("======================================DB=========================================\n");
-// printf("==flag ===name ===equip===ident===refin===attri===card0===card1===card2===card3==\n");
-// for(j=1;j<dbnoteqcount;j++)
-// printf("| %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d |\n", dbitem.notequip[j].flag ,dbitem.notequip[j].nameid, dbitem.notequip[j].equip, dbitem.notequip[j].identify, dbitem.notequip[j].refine,dbitem.notequip[j].attribute, dbitem.notequip[j].card[0], dbitem.notequip[j].card[1], dbitem.notequip[j].card[2], dbitem.notequip[j].card[3]);
-// printf("=================================================================================\n");
-// printf("=================================================Data Time %s===\n", tmpstr);
-// printf("=================================================================================\n");
-//
-
- return 0;
-}
-//=====================================================================================================
-int mmo_char_fromsql(int char_id, struct mmo_charstatus *p, int online){
- int i, n;
- char *tmp_p = tmp_sql;
- struct mmo_charstatus *cp;
-
- cp = (struct mmo_charstatus*)numdb_search(char_db_,char_id);
- if (cp != NULL)
- aFree(cp);
-
- memset(p, 0, sizeof(struct mmo_charstatus));
-
- p->char_id = char_id;
- printf("Loaded: ");
- //`char`( `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`, //9
- //`str`,`agi`,`vit`,`int`,`dex`,`luk`, //15
- //`max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point`, //21
- //`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`, //27
- //`hair`,`hair_color`,`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`, //35
- //`last_map`,`last_x`,`last_y`,`save_map`,`save_x`,`save_y`)
- //splite 2 parts. cause veeeery long SQL syntax
-
- sprintf(tmp_sql, "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` FROM `%s` WHERE `char_id` = '%d'",char_db, char_id); // TBR
-
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle));
- }
-
- sql_res = mysql_store_result(&mysql_handle);
-
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res);
-
- p->char_id = char_id;
- p->account_id = atoi(sql_row[1]);
- p->char_num = atoi(sql_row[2]);
- strcpy(p->name, sql_row[3]);
- p->class_ = atoi(sql_row[4]);
- p->base_level = atoi(sql_row[5]);
- p->job_level = atoi(sql_row[6]);
- p->base_exp = atoi(sql_row[7]);
- p->job_exp = atoi(sql_row[8]);
- p->zeny = atoi(sql_row[9]);
- p->str = atoi(sql_row[10]);
- p->agi = atoi(sql_row[11]);
- p->vit = atoi(sql_row[12]);
- p->int_ = atoi(sql_row[13]);
- p->dex = atoi(sql_row[14]);
- p->luk = atoi(sql_row[15]);
- p->max_hp = atoi(sql_row[16]);
- p->hp = atoi(sql_row[17]);
- p->max_sp = atoi(sql_row[18]);
- p->sp = atoi(sql_row[19]);
- p->status_point = atoi(sql_row[20]);
- p->skill_point = atoi(sql_row[21]);
- //free mysql result.
- mysql_free_result(sql_res);
- } else
- printf("char1 - failed\n"); //Error?! ERRRRRR WHAT THAT SAY!?
- printf("(\033[1;32m%d\033[0m)\033[1;32m%s\033[0m\t[",p->char_id,p->name);
- printf("char1 ");
-
- sprintf(tmp_sql, "SELECT `option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`,`hair`,`hair_color`,"
- "`clothes_color`,`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` FROM `%s` WHERE `char_id` = '%d'",char_db, char_id); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `char2`)- %s\n", mysql_error(&mysql_handle));
- }
-
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res);
-
-
- p->option = atoi(sql_row[0]); p->karma = atoi(sql_row[1]); p->manner = atoi(sql_row[2]);
- p->party_id = atoi(sql_row[3]); p->guild_id = atoi(sql_row[4]); p->pet_id = atoi(sql_row[5]);
-
- p->hair = atoi(sql_row[6]); p->hair_color = atoi(sql_row[7]); p->clothes_color = atoi(sql_row[8]);
- p->weapon = atoi(sql_row[9]); p->shield = atoi(sql_row[10]);
- p->head_top = atoi(sql_row[11]); p->head_mid = atoi(sql_row[12]); p->head_bottom = atoi(sql_row[13]);
- strcpy(p->last_point.map,sql_row[14]); p->last_point.x = atoi(sql_row[15]); p->last_point.y = atoi(sql_row[16]);
- strcpy(p->save_point.map,sql_row[17]); p->save_point.x = atoi(sql_row[18]); p->save_point.y = atoi(sql_row[19]);
- p->partner_id = atoi(sql_row[20]); p->father = atoi(sql_row[21]); p->mother = atoi(sql_row[22]); p->child = atoi(sql_row[23]);
-
- //free mysql result.
- mysql_free_result(sql_res);
- } else
- printf("char2 - failed\n"); //Error?! ERRRRRR WHAT THAT SAY!?
-
- if (p->last_point.x == 0 || p->last_point.y == 0 || p->last_point.map[0] == '\0')
- memcpy(&p->last_point, &start_point, sizeof(start_point));
-
- if (p->save_point.x == 0 || p->save_point.y == 0 || p->save_point.map[0] == '\0')
- memcpy(&p->save_point, &start_point, sizeof(start_point));
-
- printf("char2 ");
-
- //read memo data
- //`memo` (`memo_id`,`char_id`,`map`,`x`,`y`)
- sprintf(tmp_sql, "SELECT `map`,`x`,`y` FROM `%s` WHERE `char_id`='%d'",memo_db, char_id); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `memo`)- %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
-
- if (sql_res) {
- for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
- strcpy (p->memo_point[i].map,sql_row[0]);
- p->memo_point[i].x=atoi(sql_row[1]);
- p->memo_point[i].y=atoi(sql_row[2]);
- //i ++;
- }
- mysql_free_result(sql_res);
- }
- printf("memo ");
-
- //read inventory
- //`inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)
- sprintf(tmp_sql, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`"
- "FROM `%s` WHERE `char_id`='%d'",inventory_db, char_id); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `inventory`)- %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
- p->inventory[i].id = atoi(sql_row[0]);
- p->inventory[i].nameid = atoi(sql_row[1]);
- p->inventory[i].amount = atoi(sql_row[2]);
- p->inventory[i].equip = atoi(sql_row[3]);
- p->inventory[i].identify = atoi(sql_row[4]);
- p->inventory[i].refine = atoi(sql_row[5]);
- p->inventory[i].attribute = atoi(sql_row[6]);
- p->inventory[i].card[0] = atoi(sql_row[7]);
- p->inventory[i].card[1] = atoi(sql_row[8]);
- p->inventory[i].card[2] = atoi(sql_row[9]);
- p->inventory[i].card[3] = atoi(sql_row[10]);
- }
- mysql_free_result(sql_res);
- }
- printf("inventory ");
-
-
- //read cart.
- //`cart_inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)
- sprintf(tmp_sql, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`"
- "FROM `%s` WHERE `char_id`='%d'",cart_db, char_id); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `cart_inventory`)- %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
- p->cart[i].id = atoi(sql_row[0]);
- p->cart[i].nameid = atoi(sql_row[1]);
- p->cart[i].amount = atoi(sql_row[2]);
- p->cart[i].equip = atoi(sql_row[3]);
- p->cart[i].identify = atoi(sql_row[4]);
- p->cart[i].refine = atoi(sql_row[5]);
- p->cart[i].attribute = atoi(sql_row[6]);
- p->cart[i].card[0] = atoi(sql_row[7]);
- p->cart[i].card[1] = atoi(sql_row[8]);
- p->cart[i].card[2] = atoi(sql_row[9]);
- p->cart[i].card[3] = atoi(sql_row[10]);
- }
- mysql_free_result(sql_res);
- }
- printf("cart ");
-
- //read skill
- //`skill` (`char_id`, `id`, `lv`)
- sprintf(tmp_sql, "SELECT `id`, `lv` FROM `%s` WHERE `char_id`='%d'",skill_db, char_id); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `skill`)- %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
- n = atoi(sql_row[0]);
- p->skill[n].id = n; //memory!? shit!.
- p->skill[n].lv = atoi(sql_row[1]);
- }
- mysql_free_result(sql_res);
- }
- printf("skill ");
-
- //global_reg
- //`global_reg_value` (`char_id`, `str`, `value`)
- sprintf(tmp_sql, "SELECT `str`, `value` FROM `%s` WHERE `type`=3 AND `char_id`='%d'",reg_db, char_id); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `global_reg_value`)- %s\n", mysql_error(&mysql_handle));
- }
- i = 0;
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
- strcpy (p->global_reg[i].str, sql_row[0]);
- p->global_reg[i].value = atoi (sql_row[1]);
- }
- mysql_free_result(sql_res);
- }
- p->global_reg_num=i;
-
- //Friends List Load
-
- for(i=0;i<20;i++) {
- p->friend_id[i] = 0;
- p->friend_name[i][0] = '\0';
- }
-
- tmp_p += sprintf(tmp_p, "SELECT `id`, `account_id`");
-
- for(i=0;i<20;i++)
- tmp_p += sprintf(tmp_p, ", `friend_id%d`, `name%d`", i, i);
-
- tmp_p += sprintf(tmp_p, " FROM `%s` WHERE `account_id`='%d' ", friend_db, char_id); // TBR
-
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `friends list`)- %s\n", mysql_error(&mysql_handle));
- }
-
- sql_res = mysql_store_result(&mysql_handle);
- sql_row = mysql_fetch_row(sql_res);
-
- i=mysql_num_rows(sql_res);
-
- // debugg
- //printf("mysql: %d\n",i);
-
- // Create an entry for the character if it doesnt already have one
- if(!i) {
-
- insert_friends(char_id);
-
- } else {
-
- if (sql_res) {
- for(i=0;i<20;i++) {
- p->friend_id[i] = atoi(sql_row[i*2 +2]);
- sprintf(p->friend_name[i], "%s", sql_row[i*2 +3]);
- }
- mysql_free_result(sql_res);
- }
- }
-
- printf("friends ");
-
- //-- end friends list load --
-
- if (online) {
- set_char_online(char_id,p->account_id);
- }
-
- printf("char data load success]\n"); //ok. all data load successfuly!
-
- cp = (struct mmo_charstatus *) aMalloc(sizeof(struct mmo_charstatus));
- memcpy(cp, p, sizeof(struct mmo_charstatus));
- numdb_insert(char_db_, char_id,cp);
-
- return 1;
-}
-//==========================================================================================================
-int mmo_char_sql_init(void) {
- int charcount;
-
- char_db_=numdb_init();
-
- printf("init start.......\n");
- // memory initialize
- // no need to set twice size in this routine. but some cause segmentation error. :P
- printf("initializing char memory...(%d byte)\n",sizeof(struct mmo_charstatus)*2);
- CREATE(char_dat, struct mmo_charstatus, 2);
-
- memset(char_dat, 0, sizeof(struct mmo_charstatus)*2);
-/* Initialized in inter.c already [Wizputer]
- // DB connection initialized
- // for char-server session only
- mysql_init(&mysql_handle);
- printf("Connect DB server....(char server)\n");
- if(!mysql_real_connect(&mysql_handle, char_server_ip, char_server_id, char_server_pw, char_server_db ,char_server_port, (char *)NULL, 0)) {
- // SQL connection pointer check
- printf("%s\n",mysql_error(&mysql_handle));
- exit(1);
- } else {
- printf("connect success! (char server)\n");
- }
-
-*/ /* Removed .. not needed now :P
- sprintf(tmp_sql , "SELECT count(*) FROM `%s`", char_db);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = mysql_fetch_row(sql_res);
- printf("total char data -> '%s'.......\n",sql_row[0]);
- i = atoi (sql_row[0]);
- mysql_free_result(sql_res);
-
- if (i !=0) {
- sprintf(tmp_sql , "SELECT max(`char_id`) FROM `%s`", char_db);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = mysql_fetch_row(sql_res);
- char_id_count = atoi (sql_row[0]);
-
- mysql_free_result(sql_res);
- } else
- printf("set char_id_count: %d.......\n",char_id_count);
- */
- sprintf(tmp_sql, "SELECT `char_id` FROM `%s`", char_db);
- if(mysql_query(&mysql_handle, tmp_sql)){
- //fail :(
- printf("SQL Error (in select the charid .. (all)): %s", mysql_error(&mysql_handle));
- }else{
- sql_res = mysql_store_result(&mysql_handle);
- if(sql_res){
- charcount = mysql_num_rows(sql_res);
- printf("total char data -> '%d'.......\n", charcount);
- mysql_free_result(sql_res);
- }else{
- printf("total char data -> '0'.......\n");
- }
- }
-
- if(char_per_account == 0){
- printf("Chars per Account: 'Unlimited'.......\n");
- }else{
- printf("Chars per Account: '%d'.......\n", char_per_account);
- }
-
- //sprintf(tmp_sql , "REPLACE INTO `%s` SET `online`=0", char_db); //OLD QUERY ! BUGGED
- sprintf(tmp_sql, "UPDATE `%s` SET `online` = '0'", char_db);//fixed the on start 0 entrys!
- if (mysql_query(&mysql_handle, tmp_sql))
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
-
- //sprintf(tmp_sql , "REPLACE INTO `%s` SET `online`=0", guild_member_db); //OLD QUERY ! BUGGED
- sprintf(tmp_sql, "UPDATE `%s` SET `online` = '0'", guild_member_db);//fixed the 0 entrys in start ..
- if (mysql_query(&mysql_handle, tmp_sql))
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
-
- //sprintf(tmp_sql , "REPLACE INTO `%s` SET `connect_member`=0", guild_db); //OLD QUERY BUGGED!
- sprintf(tmp_sql, "UPDATE `%s` SET `connect_member` = '0'", guild_db);//fixed the 0 entrys in start.....
- if (mysql_query(&mysql_handle, tmp_sql))
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
-
- printf("init end.......\n");
-
- return 0;
-}
-
-//==========================================================================================================
-
-int make_new_char_sql(int fd, unsigned char *dat) {
- struct char_session_data *sd;
- char t_name[100];
- int i, char_id, temp;
-
-
- //aphostropy error check! - fixed!
- jstrescapecpy(t_name, (char*)dat);
-
- sd = (struct char_session_data*)session[fd]->session_data;
-
- printf("[CHAR] Add - ");
-
- //check for charcount (maxchars) :)
- if(char_per_account != 0){
- sprintf(tmp_sql, "SELECT `account_id` FROM `%s` WHERE `account_id` = '%d'", char_db, sd->account_id);
- if(mysql_query(&mysql_handle, tmp_sql)){
- printf("fail, SQL Error: %s !!FAIL!!\n", tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if(sql_res){
- //ok
- temp = mysql_num_rows(sql_res);
- if(temp >= char_per_account){
- //hehe .. limit exceeded :P
- printf("fail (aid: %d), charlimit exceeded.\n", sd->account_id);
- mysql_free_result(sql_res);
- return -2;
- }
- mysql_free_result(sql_res);
- }
- }
-
- // Check Authorised letters/symbols in the name of the character
- if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
- for (i = 0; i < strlen((const char*)dat); i++)
- if (strchr(char_name_letters, dat[i]) == NULL)
- return -2;
- } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
- for (i = 0; i < strlen((const char*)dat); i++)
- if (strchr(char_name_letters, dat[i]) != NULL)
- return -2;
- } // else, all letters/symbols are authorised (except control char removed before)
-
-
- //check stat error
- if ((dat[24]+dat[25]+dat[26]+dat[27]+dat[28]+dat[29]!=5*6 ) ||
- (dat[30] >= 9) ||
- (dat[33] <= 0) || (dat[33] >= 20) ||
- (dat[31] >= 9)) {
-
- // check individual stat value
- for(i = 24; i <= 29; i++) {
- if (dat[i] < 1 || dat[i] > 9) {
- printf("fail (aid: %d), stats error(bot cheat?!)\n", sd->account_id);
- return -2;
- }
- }
-
- if (log_char) {
- // char.log to charlog
- sprintf(tmp_sql,"INSERT INTO `%s` (`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)"
- "VALUES (NOW(), '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- charlog_db,"make new char error", sd->account_id, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
- //query
- mysql_query(&mysql_handle, tmp_sql);
- }
- //printf("make new char error %d-%d %s %d, %d, %d, %d, %d, %d %d, %d" RETCODE,
- // fd, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
-
- printf("fail (aid: %d), stats error(bot cheat?!)\n", sd->account_id);
- return -2;
- }
-
- if (log_char) {
- // char.log to charlog
- sprintf(tmp_sql,"INSERT INTO `%s`(`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)"
- "VALUES (NOW(), '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- charlog_db,"make new char", sd->account_id, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
- //query
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("fail(log error), SQL error: %s\n", mysql_error(&mysql_handle));
- }
- }
- //printf("make new char %d-%d %s %d, %d, %d, %d, %d, %d - %d, %d" RETCODE,
- // fd, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
-
- //Check Name (already in use?)
- sprintf(tmp_sql, "SELECT `name` FROM `%s` WHERE `name` = '%s'",char_db, t_name);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("fail (namecheck!), SQL error: %s\n", mysql_error(&mysql_handle));
- return -2;
- }
- sql_res = mysql_store_result(&mysql_handle);
- if(sql_res){
- temp = mysql_num_rows(sql_res);
-
- if (temp > 0) {
- mysql_free_result(sql_res);
- printf("fail, charname already in use\n");
- return -1;
- }
- mysql_free_result(sql_res);
- }
-
- // check char slot.
- sprintf(tmp_sql, "SELECT `account_id`, `char_num` FROM `%s` WHERE `account_id` = '%d' AND `char_num` = '%d'",char_db, sd->account_id, dat[30]);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("fail (charslot check), SQL error: %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
-
- if(sql_res){
- temp = mysql_num_rows(sql_res);
-
- if (temp > 0) {
- mysql_free_result(sql_res);
- printf("fail (aid: %d, slot: %d), slot already in use\n", sd->account_id, dat[30]);
- return -2;
- }
- mysql_free_result(sql_res);
- }
-
- //char_id_count++;
-
- // make new char.
- /*
- sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`,`account_id`,`char_num`,`name`,`zeny`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`max_hp`,`hp`,`max_sp`,`sp`,`hair`,`hair_color`)"
- " VALUES ('%d', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d','%d', '%d','%d', '%d')",
- char_db, char_id_count, sd->account_id , dat[30] , t_name, start_zeny, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29],
- (40 * (100 + dat[26])/100) , (40 * (100 + dat[26])/100 ), (11 * (100 + dat[27])/100), (11 * (100 + dat[27])/100), dat[33], dat[31]);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (insert `char`)- %s\n", mysql_error(&mysql_handle));
- }
-
- //`inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)
- sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `equip`, `identify`) VALUES ('%d', '%d', '%d', '%d', '%d')",
- inventory_db, char_id_count, 1201,1,0x02,1); //add Knife
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (insert `inventory`)- %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `equip`, `identify`) VALUES ('%d', '%d', '%d', '%d', '%d')",
- inventory_db, char_id_count, 2301,1,0x10,1); //add Cotton Shirt
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (insert `inventory`)- %s\n", mysql_error(&mysql_handle));
- }
- // respawn map and start point set
- sprintf(tmp_sql,"UPDATE `%s` SET `last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d' WHERE `char_id` = '%d'",
- char_db, start_point.map,start_point.x,start_point.y, start_point.map,start_point.x,start_point.y, char_id_count);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle));
- }
-
-
- // Insert friends list
- insert_friends(char_id_count);
- */
-
- //New Querys [Sirius]
- //Insert the char to the 'chardb' ^^
- sprintf(tmp_sql, "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 , dat[30] , t_name, start_zeny, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], (40 * (100 + dat[26])/100) , (40 * (100 + dat[26])/100 ), (11 * (100 + dat[27])/100), (11 * (100 + dat[27])/100), dat[33], dat[31], start_point.map, start_point.x, start_point.y, start_point.map, start_point.x, start_point.y);
- if(mysql_query(&mysql_handle, tmp_sql)){
- printf("failed (insert in chardb), SQL error: %s\n", mysql_error(&mysql_handle));
- return -2; //No, stop the procedure!
- }
-
- //Now we need the charid from sql!
- sprintf(tmp_sql, "SELECT `char_id` FROM `%s` WHERE `account_id` = '%d' AND `char_num` = '%d' AND `name` = '%s'", char_db, sd->account_id , dat[30] , t_name);
- if(mysql_query(&mysql_handle, tmp_sql)){
- printf("failed (get char_id), SQL error: %s\n", mysql_error(&mysql_handle));
- //delete the char ..(no trash in DB!)
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `char_num` = '%d' AND `name` = '%s'", char_db, sd->account_id, dat[30], t_name);
- mysql_query(&mysql_handle, tmp_sql);
- return -2; //XD end of the (World? :P) .. charcreate (denied)
- }else{
- //query ok -> get the data!
- sql_res = mysql_store_result(&mysql_handle);
- if(sql_res){
- sql_row = mysql_fetch_row(sql_res);
- char_id = atoi(sql_row[0]); //char id :)
- mysql_free_result(sql_res);
- if(char_id <= 0){
- printf("failed (get char id..) CHARID wrong!\n");
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `char_num` = '%d' AND `name` = '%s'", char_db, sd->account_id, dat[30], t_name);
- mysql_query(&mysql_handle, tmp_sql);
- return -2; //charcreate denied ..
- }
- }else{
- //prevent to crash (if its false, and we want to free -> segfault :)
- printf("failed (get char id.. res), SQL error: %s\n", mysql_error(&mysql_handle));
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `char_num` = '%d' AND `name` = '%s'", char_db, sd->account_id, dat[30], t_name);
- mysql_query(&mysql_handle, tmp_sql);
- return -2; //end ...... -> charcreate failed :)
- }
- }
-
- //Give the char the default items
- //knife
- sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `equip`, `identify`) VALUES ('%d', '%d', '%d', '%d', '%d')", inventory_db, char_id, 1201,1,0x02,1); //add Knife
- if (mysql_query(&mysql_handle, tmp_sql)){
- printf("fail (insert in inventory the 'knife'), SQL error: %s\n", mysql_error(&mysql_handle));
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `char_num` = '%d' AND `name` = '%s'", char_db, sd->account_id, dat[30], t_name);
- mysql_query(&mysql_handle, tmp_sql);
- return -2;//end XD
- }
- //cotton shirt
- sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `equip`, `identify`) VALUES ('%d', '%d', '%d', '%d', '%d')", inventory_db, char_id, 2301,1,0x10,1); //add Cotton Shirt
- if (mysql_query(&mysql_handle, tmp_sql)){
- printf("fail (insert in inventroxy the 'cotton shirt'), SQL error: %s\n", mysql_error(&mysql_handle));
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `char_num` = '%d' AND `name` = '%s'", char_db, sd->account_id, dat[30], t_name);
- mysql_query(&mysql_handle, tmp_sql);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `char_id` = '%d'", inventory_db, char_id);
- mysql_query(&mysql_handle, tmp_sql);
- return -2; //end....
- }
-
- if(!insert_friends(char_id)){
- printf("fail (friendlist entrys..)\n");
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `char_id` = '%d'", char_db, char_id);
- mysql_query(&mysql_handle, tmp_sql);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `char_id` = '%d'", inventory_db, char_id);
- mysql_query(&mysql_handle, tmp_sql);
- return -2; //end.. charcreate failed
- }
-
- //printf("making new char success - id:(\033[1;32m%d\033[0m\tname:\033[1;32%s\033[0m\n", char_id, t_name);
- printf("success, aid: %d, cid: %d, slot: %d, name: %s\n", sd->account_id, char_id, dat[30], t_name);
- return char_id;
-}
-
-//==========================================================================================================
-
-void mmo_char_sync(void){
- printf("mmo_char_sync() - nothing to do\n");
-}
-
-// to do
-///////////////////////////
-
-int mmo_char_sync_timer(int tid, unsigned int tick, int id, int data) {
- printf("mmo_char_sync_timer() tic - no works to do\n");
- return 0;
-}
-
-int count_users(void) {
- int i, users;
-
- if (login_fd > 0 && session[login_fd]){
- users = 0;
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- if (server_fd[i] >= 0) {
- users += server[i].users;
- }
- }
- return users;
- }
- return 0;
-}
-
-int mmo_char_send006b(int fd, struct char_session_data *sd) {
- int i, j, found_num = 0;
- struct mmo_charstatus *p = NULL;
-// hehe. commented other. anyway there's no need to use older version.
-// if use older packet version just uncomment that!
-//#ifdef NEW_006b
- const int offset = 24;
-//#else
-// int offset = 4;
-//#endif
-
- printf("mmo_char_send006b start.. (account:%d)\n",sd->account_id);
-// printf("offset -> %d...\n",offset);
-
- set_char_online(99,sd->account_id);
-
- //search char.
- sprintf(tmp_sql, "SELECT `char_id` FROM `%s` WHERE `account_id` = '%d'",char_db, sd->account_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- found_num = mysql_num_rows(sql_res);
- printf("number of chars: %d\n", found_num);
- i = 0;
- while((sql_row = mysql_fetch_row(sql_res))) {
- sd->found_char[i] = atoi(sql_row[0]);
- i++;
- }
- mysql_free_result(sql_res);
- }
-
-// printf("char fetching end (total: %d)....\n", found_num);
-
- for(i = found_num; i < 9; i++)
- sd->found_char[i] = -1;
-
- memset(WFIFOP(fd, 0), 0, offset + found_num * 106);
- WFIFOW(fd, 0) = 0x6b;
- WFIFOW(fd, 2) = offset + found_num * 106;
-
- printf("(\033[1;13m%d\033[0m) Request Char Data:\n",sd->account_id);
-
- for(i = 0; i < found_num; i++) {
- mmo_char_fromsql(sd->found_char[i], char_dat, 0);
-
- p = &char_dat[0];
-
- j = offset + (i * 106); // increase speed of code
-
- WFIFOL(fd,j) = p->char_id;
- WFIFOL(fd,j+4) = p->base_exp;
- WFIFOL(fd,j+8) = p->zeny;
- WFIFOL(fd,j+12) = p->job_exp;
- WFIFOL(fd,j+16) = p->job_level;
-
- WFIFOL(fd,j+20) = 0;
- WFIFOL(fd,j+24) = 0;
- WFIFOL(fd,j+28) = p->option;
-
- WFIFOL(fd,j+32) = p->karma;
- WFIFOL(fd,j+36) = p->manner;
-
- WFIFOW(fd,j+40) = p->status_point;
- WFIFOW(fd,j+42) = (p->hp > 0x7fff) ? 0x7fff : p->hp;
- WFIFOW(fd,j+44) = (p->max_hp > 0x7fff) ? 0x7fff : p->max_hp;
- WFIFOW(fd,j+46) = (p->sp > 0x7fff) ? 0x7fff : p->sp;
- WFIFOW(fd,j+48) = (p->max_sp > 0x7fff) ? 0x7fff : p->max_sp;
- WFIFOW(fd,j+50) = DEFAULT_WALK_SPEED; // p->speed;
- WFIFOW(fd,j+52) = p->class_;
- WFIFOW(fd,j+54) = p->hair;
-
- // pecopeco knights/crusaders crash fix
- if (p->class_ == 13 || p->class_ == 21 ||
- p->class_ == 4014 || p->class_ == 4022)
- WFIFOW(fd,j+56) = 0;
- else WFIFOW(fd,j+56) = p->weapon;
-
- WFIFOW(fd,j+58) = p->base_level;
- WFIFOW(fd,j+60) = p->skill_point;
- WFIFOW(fd,j+62) = p->head_bottom;
- WFIFOW(fd,j+64) = p->shield;
- WFIFOW(fd,j+66) = p->head_top;
- WFIFOW(fd,j+68) = p->head_mid;
- WFIFOW(fd,j+70) = p->hair_color;
- WFIFOW(fd,j+72) = p->clothes_color;
-
- memcpy(WFIFOP(fd,j+74), p->name, 24);
-
- WFIFOB(fd,j+98) = (p->str > 255) ? 255 : p->str;
- WFIFOB(fd,j+99) = (p->agi > 255) ? 255 : p->agi;
- WFIFOB(fd,j+100) = (p->vit > 255) ? 255 : p->vit;
- WFIFOB(fd,j+101) = (p->int_ > 255) ? 255 : p->int_;
- WFIFOB(fd,j+102) = (p->dex > 255) ? 255 : p->dex;
- WFIFOB(fd,j+103) = (p->luk > 255) ? 255 : p->luk;
- WFIFOB(fd,j+104) = p->char_num;
- }
-
- WFIFOSET(fd,WFIFOW(fd,2));
-// printf("mmo_char_send006b end..\n");
- return 0;
-}
-
-int parse_tologin(int fd) {
- int i;
- struct char_session_data *sd;
-
- // only login-server can have an access to here.
- // so, if it isn't the login-server, we disconnect the session.
- //session eof check!
- if(fd != login_fd)
- session[fd]->eof = 1;
- if(session[fd]->eof) {
- if (fd == login_fd) {
- printf("Char-server can't connect to login-server (connection #%d).\n", fd);
- login_fd = -1;
- }
- close(fd);
- delete_session(fd);
- return 0;
- }
-
- sd = (struct char_session_data*)session[fd]->session_data;
-
- // hehe. no need to set user limite on SQL version. :P
- // but char limitation is good way to maintain server. :D
- while(RFIFOREST(fd) >= 2) {
-// printf("parse_tologin : %d %d %x\n", fd, RFIFOREST(fd), RFIFOW(fd, 0));
-
- switch(RFIFOW(fd, 0)){
- case 0x2711:
- if (RFIFOREST(fd) < 3)
- return 0;
- if (RFIFOB(fd, 2)) {
- //printf("connect login server error : %d\n", RFIFOB(fd, 2));
- printf("Can not connect to login-server.\n");
- printf("The server communication passwords (default s1/p1) is probably invalid.\n");
- printf("Also, please make sure your login db has the username/password present and the sex of the account is S.\n");
- printf("If you changed the communication passwords, change them back at map_athena.conf and char_athena.conf\n");
- return 0;
- //exit(1); //fixed for server shutdown.
- }else {
- printf("Connected to login-server (connection #%d).\n", fd);
- set_all_offline();
- // if no map-server already connected, display a message...
- for(i = 0; i < MAX_MAP_SERVERS; i++)
- if (server_fd[i] >= 0 && server[i].map[0][0]) // if map-server online and at least 1 map
- break;
- if (i == MAX_MAP_SERVERS)
- printf("Awaiting maps from map-server.\n");
- }
- RFIFOSKIP(fd, 3);
- break;
-
- case 0x2713:
- if(RFIFOREST(fd)<51)
- return 0;
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = (struct char_session_data*)session[i]->session_data) && sd->account_id == RFIFOL(fd,2)) {
- if (RFIFOB(fd,6) != 0) {
- WFIFOW(i,0) = 0x6c;
- WFIFOB(i,2) = 0x42;
- WFIFOSET(i,3);
- } else if (max_connect_user == 0 || count_users() < max_connect_user) {
-// if (max_connect_user == 0)
-// printf("max_connect_user (unlimited) -> accepted.\n");
-// else
-// printf("count_users(): %d < max_connect_user (%d) -> accepted.\n", count_users(), max_connect_user);
- sd->connect_until_time = (time_t)RFIFOL(fd,47);
- // send characters to player
- mmo_char_send006b(i, sd);
- } else if(isGM(sd->account_id) >= gm_allow_level) {
- sd->connect_until_time = (time_t)RFIFOL(fd,47);
- // send characters to player
- mmo_char_send006b(i, sd);
- } else {
- // refuse connection: too much online players
-// printf("count_users(): %d < max_connect_use (%d) -> fail...\n", count_users(), max_connect_user);
- WFIFOW(i,0) = 0x6c;
- WFIFOW(i,2) = 0;
- WFIFOSET(i,3);
- }
- }
- }
- RFIFOSKIP(fd,51);
- break;
-
- case 0x2717:
- if (RFIFOREST(fd) < 50)
- return 0;
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = (struct char_session_data*)session[i]->session_data)) {
- if (sd->account_id == RFIFOL(fd,2)) {
- sd->connect_until_time = (time_t)RFIFOL(fd,46);
- break;
- }
- }
- }
- RFIFOSKIP(fd,50);
- break;
-
- // login-server alive packet
- case 0x2718:
- if (RFIFOREST(fd) < 2)
- return 0;
- RFIFOSKIP(fd,2);
- break;
-
- // Receiving authentification from Freya-type login server (to avoid char->login->char)
- case 0x2719:
- if (RFIFOREST(fd) < 18)
- return 0;
- // to conserv a maximum of authentification, search if account is already authentified and replace it
- // that will reduce multiple connection too
- for(i = 0; i < AUTH_FIFO_SIZE; i++)
- if (auth_fifo[i].account_id == RFIFOL(fd,2))
- break;
- // if not found, use next value
- if (i == AUTH_FIFO_SIZE) {
- if (auth_fifo_pos >= AUTH_FIFO_SIZE)
- auth_fifo_pos = 0;
- i = auth_fifo_pos;
- auth_fifo_pos++;
- }
- //printf("auth_fifo set (auth #%d) - account: %d, secure: %08x-%08x\n", i, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10));
- auth_fifo[i].account_id = RFIFOL(fd,2);
- auth_fifo[i].char_id = 0;
- auth_fifo[i].login_id1 = RFIFOL(fd,6);
- auth_fifo[i].login_id2 = RFIFOL(fd,10);
- auth_fifo[i].delflag = 2; // 0: auth_fifo canceled/void, 2: auth_fifo received from login/map server in memory, 1: connection authentified
- auth_fifo[i].char_pos = 0;
- auth_fifo[i].connect_until_time = 0; // unlimited/unknown time by default (not display in map-server)
- auth_fifo[i].ip = RFIFOL(fd,14);
- //auth_fifo[i].map_auth = 0;
- RFIFOSKIP(fd,18);
- break;
-
-/* case 0x2721: // gm reply. I don't want to support this function.
- printf("0x2721:GM reply\n");
- {
- int oldacc, newacc;
- unsigned char buf[64];
- if (RFIFOREST(fd) < 10)
- return 0;
- oldacc = RFIFOL(fd, 2);
- newacc = RFIFOL(fd, 6);
- RFIFOSKIP(fd, 10);
- if (newacc > 0) {
- for(i=0;i<char_num;i++){
- if(char_dat[i].account_id==oldacc)
- char_dat[i].account_id=newacc;
- }
- }
- WBUFW(buf,0)=0x2b0b;
- WBUFL(buf,2)=oldacc;
- WBUFL(buf,6)=newacc;
- mapif_sendall(buf,10);
-// printf("char -> map\n");
- }
- break;
-*/
- case 0x2723: // changesex reply (modified by [Yor])
- if (RFIFOREST(fd) < 7)
- return 0;
- {
- int acc, sex;
- unsigned char buf[16];
-
- acc = RFIFOL(fd,2);
- sex = RFIFOB(fd,6);
- RFIFOSKIP(fd, 7);
- if (acc > 0) {
- sprintf(tmp_sql, "SELECT `char_id`,`class`,`skill_point` FROM `%s` WHERE `account_id` = '%d'",char_db, acc);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
-
- if (sql_res) {
- int char_id, jobclass, skill_point, class_;
- sql_row = mysql_fetch_row(sql_res);
- char_id = atoi(sql_row[0]);
- jobclass = atoi(sql_row[1]);
- skill_point = atoi(sql_row[2]);
- class_ = jobclass;
- if (jobclass == 19 || jobclass == 20 ||
- jobclass == 4020 || jobclass == 4021 ||
- jobclass == 4042 || jobclass == 4043) {
- // job modification
- if (jobclass == 19 || jobclass == 20) {
- class_ = (sex) ? 19 : 20;
- } else if (jobclass == 4020 || jobclass == 4021) {
- class_ = (sex) ? 4020 : 4021;
- } else if (jobclass == 4042 || jobclass == 4043) {
- class_ = (sex) ? 4042 : 4043;
- }
- // remove specifical skills of classes 19,20 4020,4021 and 4042,4043
- sprintf(tmp_sql, "SELECT `lv` FROM `%s` WHERE `char_id` = '%d' AND `id` >= '315' AND `id` <= '330'",skill_db, char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- while(( sql_row = mysql_fetch_row(sql_res))) {
- skill_point += atoi(sql_row[0]);
- }
- }
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `char_id` = '%d' AND `id` >= '315' AND `id` <= '330'",skill_db, char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle));
- }
- }
- // to avoid any problem with equipment and invalid sex, equipment is unequiped.
- sprintf(tmp_sql, "UPDATE `%s` SET `equip` = '0' WHERE `char_id` = '%d'",inventory_db, char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle));
- }
- sprintf(tmp_sql, "UPDATE `%s` SET `class`='%d' , `skill_point`='%d' , `weapon`='0' , `shield='0' , `head_top`='0' , `head_mid`='0' , `head_bottom`='0' WHERE `char_id` = '%d'",char_db, class_, skill_point, char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle));
- }
- }
- }
- // disconnect player if online on char-server
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = (struct char_session_data*)session[i]->session_data)) {
- if (sd->account_id == acc) {
- session[i]->eof = 1;
- break;
- }
- }
- }
-
- WBUFW(buf,0) = 0x2b0d;
- WBUFL(buf,2) = acc;
- WBUFB(buf,6) = sex;
-
- mapif_sendall(buf, 7);
- }
- break;
-
- // account_reg2•ÏX’Ê’m
- case 0x2729:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- struct global_reg reg[ACCOUNT_REG2_NUM];
- unsigned char buf[4096];
- int j, p, acc;
- acc = RFIFOL(fd,4);
- for(p = 8, j = 0; p < RFIFOW(fd,2) && j < ACCOUNT_REG2_NUM; p += 36, j++) {
- memcpy(reg[j].str, RFIFOP(fd,p), 32);
- reg[j].value = RFIFOL(fd,p+32);
- }
- // set_account_reg2(acc,j,reg);
- // “¯CƒƒOƒCƒ“‚ð‹ÖŽ~‚µ‚Ä‚¢‚ê‚Α—‚é•K—v‚Í–³‚¢
- memcpy(buf,RFIFOP(fd,0), RFIFOW(fd,2));
- WBUFW(buf,0) = 0x2b11;
- mapif_sendall(buf, WBUFW(buf,2));
- RFIFOSKIP(fd, RFIFOW(fd,2));
-// printf("char: save_account_reg_reply\n");
- }
- break;
-
- // State change of account/ban notification (from login-server) by [Yor]
- case 0x2731:
- if (RFIFOREST(fd) < 11)
- return 0;
- // send to all map-servers to disconnect the player
- {
- unsigned char buf[16];
- WBUFW(buf,0) = 0x2b14;
- WBUFL(buf,2) = RFIFOL(fd,2);
- WBUFB(buf,6) = RFIFOB(fd,6); // 0: change of statut, 1: ban
- WBUFL(buf,7) = RFIFOL(fd,7); // status or final date of a banishment
- mapif_sendall(buf, 11);
- }
- // disconnect player if online on char-server
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = (struct char_session_data*)session[i]->session_data)) {
- if (sd->account_id == RFIFOL(fd,2)) {
- session[i]->eof = 1;
- break;
- }
- }
- }
- RFIFOSKIP(fd,11);
- break;
-
- // Receive GM accounts [Freya login server packet by Yor]
- case 0x2733:
- // add test here to remember that the login-server is Freya-type
- // sprintf (login_server_type, "Freya");
- if (RFIFOREST(fd) < 7)
- return 0;
- {
- int new_level = 0;
- for(i = 0; i < GM_num; i++)
- if (gm_account[i].account_id == RFIFOL(fd,2)) {
- if (gm_account[i].level != (int)RFIFOB(fd,6)) {
- gm_account[i].level = (int)RFIFOB(fd,6);
- new_level = 1;
- }
- break;
- }
- // if not found, add it
- if (i == GM_num) {
- // limited to 4000, because we send information to char-servers (more than 4000 GM accounts???)
- // int (id) + int (level) = 8 bytes * 4000 = 32k (limit of packets in windows)
- if (((int)RFIFOB(fd,6)) > 0 && GM_num < 4000) {
- if (GM_num == 0) {
- gm_account = (struct gm_account*)aMalloc(sizeof(struct gm_account));
- } else {
- gm_account = (struct gm_account*)aRealloc(gm_account, sizeof(struct gm_account) * (GM_num + 1));
- }
- gm_account[GM_num].account_id = RFIFOL(fd,2);
- gm_account[GM_num].level = (int)RFIFOB(fd,6);
- new_level = 1;
- GM_num++;
- if (GM_num >= 4000)
- printf("***WARNING: 4000 GM accounts found. Next GM accounts are not readed.\n");
- }
- }
- if (new_level == 1) {
- printf("From login-server: receiving a GM account information (%d: level %d).\n", RFIFOL(fd,2), (int)RFIFOB(fd,6));
- mapif_send_gmaccounts();
-
- //create_online_files(); // not change online file for only 1 player (in next timer, that will be done
- // send gm acccounts level to map-servers
- }
- }
- RFIFOSKIP(fd,7);
- break;
-
- default:
- printf("set eof.\n");
- session[fd]->eof = 1;
- return 0;
- }
- }
-
- RFIFOFLUSH(fd);
-
- return 0;
-}
-
-int parse_frommap(int fd) {
- int i = 0, j = 0;
- int id;
-
- // Sometimes fd=0, and it will cause server crash. Don't know why. :(
- if (fd <= 0) {
- printf("parse_frommap error fd=0\n");
- return 0;
- }
-
- for(id = 0; id < MAX_MAP_SERVERS; id++)
- if (server_fd[id] == fd)
- break;
- if(id == MAX_MAP_SERVERS)
- session[fd]->eof = 1;
- if(session[fd]->eof) {
- if (id < MAX_MAP_SERVERS) {
- memset(&server[id], 0, sizeof(struct mmo_map_server));
- printf("Map-server %d (session #%d) has disconnected.\n", id, fd);
- sprintf(tmp_sql, "DELETE FROM `ragsrvinfo` WHERE `index`='%d'", server_fd[id]);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- server_fd[id] = -1;
- }
- close(fd);
- delete_session(fd);
- return 0;
- }
-
- while(RFIFOREST(fd) >= 2) {
-// printf("parse_frommap : %d %d %x\n", fd, RFIFOREST(fd), RFIFOW(fd,0));
-
- switch(RFIFOW(fd, 0)) {
-
- // map-server alive packet
- case 0x2718:
- if (RFIFOREST(fd) < 2)
- return 0;
- RFIFOSKIP(fd,2);
- break;
-
- case 0x2af7:
- RFIFOSKIP(fd,2);
- read_gm_account();
- break;
-
- // mapserver -> map names recv.
- case 0x2afa:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- memset(server[id].map, 0, sizeof(server[id].map));
- j = 0;
- for(i = 4; i < RFIFOW(fd,2); i += 16) {
- memcpy(server[id].map[j], RFIFOP(fd,i), 16);
-// printf("set map %d.%d : %s\n", id, j, server[id].map[j]);
- j++;
- }
- i = server[id].ip;
- {
- unsigned char *p = (unsigned char *)&server[id].ip;
- printf("Map-Server %d connected: %d maps, from IP %d.%d.%d.%d port %d.\n",
- id, j, p[0], p[1], p[2], p[3], server[id].port);
- printf("Map-server %d loading complete.\n", id);
- set_all_offline();
- }
- WFIFOW(fd,0) = 0x2afb;
- WFIFOB(fd,2) = 0;
- memcpy(WFIFOP(fd,3), wisp_server_name, 24); // name for wisp to player
- WFIFOSET(fd,27);
- {
- unsigned char buf[16384];
- int x;
- if (j == 0) {
- printf("WARNING: Map-Server %d have NO maps.\n", id);
- // Transmitting maps information to the other map-servers
- } else {
- WBUFW(buf,0) = 0x2b04;
- WBUFW(buf,2) = j * 16 + 10;
- WBUFL(buf,4) = server[id].ip;
- WBUFW(buf,8) = server[id].port;
- memcpy(WBUFP(buf,10), RFIFOP(fd,4), j * 16);
- mapif_sendallwos(fd, buf, WBUFW(buf,2));
- }
- // Transmitting the maps of the other map-servers to the new map-server
- for(x = 0; x < MAX_MAP_SERVERS; x++) {
- if (server_fd[x] >= 0 && x != id) {
- WFIFOW(fd,0) = 0x2b04;
- WFIFOL(fd,4) = server[x].ip;
- WFIFOW(fd,8) = server[x].port;
- j = 0;
- for(i = 0; i < MAX_MAP_PER_SERVER; i++)
- if (server[x].map[i][0])
- memcpy(WFIFOP(fd,10+(j++)*16), server[x].map[i], 16);
- if (j > 0) {
- WFIFOW(fd,2) = j * 16 + 10;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
- }
- }
- }
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
-
- // auth request
- case 0x2afc:
- if (RFIFOREST(fd) < 22)
- return 0;
-// printf("(AUTH request) auth_fifo search %d %d %d\n", RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOL(fd, 10));
- for(i = 0; i < AUTH_FIFO_SIZE; i++) {
- if (auth_fifo[i].account_id == RFIFOL(fd,2) &&
- auth_fifo[i].char_id == RFIFOL(fd,6) &&
- auth_fifo[i].login_id1 == RFIFOL(fd,10) &&
-#if CMP_AUTHFIFO_LOGIN2 != 0
- // here, it's the only area where it's possible that we doesn't know login_id2 (map-server asks just after 0x72 packet, that doesn't given the value)
- (auth_fifo[i].login_id2 == RFIFOL(fd,14) || RFIFOL(fd,14) == 0) && // relate to the versions higher than 18
-#endif
- (!check_ip_flag || auth_fifo[i].ip == RFIFOL(fd,18)) &&
- !auth_fifo[i].delflag) {
- auth_fifo[i].delflag = 1;
- WFIFOW(fd,0) = 0x2afd;
- WFIFOW(fd,2) = 16 + sizeof(struct mmo_charstatus);
- WFIFOL(fd,4) = RFIFOL(fd,2);
- WFIFOL(fd,8) = auth_fifo[i].login_id2;
- WFIFOL(fd,12) = (unsigned long)auth_fifo[i].connect_until_time;
- mmo_char_fromsql(auth_fifo[i].char_id, char_dat, 1);
- char_dat[0].sex = auth_fifo[i].sex;
- memcpy(WFIFOP(fd,16), &char_dat[0], sizeof(struct mmo_charstatus));
- WFIFOSET(fd, WFIFOW(fd,2));
- //printf("auth_fifo search success (auth #%d, account %d, character: %d).\n", i, RFIFOL(fd,2), RFIFOL(fd,6));
- break;
- }
- }
- if (i == AUTH_FIFO_SIZE) {
- WFIFOW(fd,0) = 0x2afe;
- WFIFOL(fd,2) = RFIFOL(fd,2);
- WFIFOSET(fd,6);
-// printf("(AUTH request) auth_fifo search error!\n");
- }
- RFIFOSKIP(fd,22);
- break;
-
- // set MAP user
- case 0x2aff:
- if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- if (RFIFOW(fd,4) != server[id].users)
- printf("[UserCount]: %d (Server: %d)\n", RFIFOW(fd,4), id);
- server[id].users = RFIFOW(fd,4);
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
-
- // char saving
- case 0x2b01:
- i = 0;
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- //check account
- sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'",char_db, RFIFOL(fd,4),RFIFOL(fd,8)); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res);
- if (sql_row)
- i = atoi(sql_row[0]);
- }
- mysql_free_result(sql_res);
-
- if (i == 1) {
- memcpy(&char_dat[0], RFIFOP(fd,12), sizeof(struct mmo_charstatus));
- mmo_char_tosql(RFIFOL(fd,8), char_dat);
- //save to DB
- }
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
-
- // req char selection
- case 0x2b02:
- if (RFIFOREST(fd) < 18)
- return 0;
-
- if (auth_fifo_pos >= AUTH_FIFO_SIZE)
- auth_fifo_pos = 0;
-
-// printf("(charselect) auth_fifo set %d - account_id:%08x login_id1:%08x\n", auth_fifo_pos, RFIFOL(fd, 2), RFIFOL(fd, 6));
- auth_fifo[auth_fifo_pos].account_id = RFIFOL(fd, 2);
- auth_fifo[auth_fifo_pos].char_id = 0;
- auth_fifo[auth_fifo_pos].login_id1 = RFIFOL(fd, 6);
- auth_fifo[auth_fifo_pos].login_id2 = RFIFOL(fd,10);
- auth_fifo[auth_fifo_pos].delflag = 2;
- auth_fifo[auth_fifo_pos].char_pos = 0;
- auth_fifo[auth_fifo_pos].connect_until_time = 0; // unlimited/unknown time by default (not display in map-server)
- auth_fifo[auth_fifo_pos].ip = RFIFOL(fd,14);
- auth_fifo_pos++;
-
- WFIFOW(fd, 0) = 0x2b03;
- WFIFOL(fd, 2) = RFIFOL(fd, 2);
- WFIFOB(fd, 6) = 0;
- WFIFOSET(fd, 7);
-
- RFIFOSKIP(fd, 18);
- break;
-
- // request "change map server"
- case 0x2b05:
- if (RFIFOREST(fd) < 49)
- return 0;
-
- if (auth_fifo_pos >= AUTH_FIFO_SIZE)
- auth_fifo_pos = 0;
-
- WFIFOW(fd, 0) = 0x2b06;
- memcpy(WFIFOP(fd,2), RFIFOP(fd,2), 42);
-// printf("(map change) auth_fifo set %d - account_id:%08x login_id1:%08x\n", auth_fifo_pos, RFIFOL(fd, 2), RFIFOL(fd, 6));
- printf("[MapChange] ");
- auth_fifo[auth_fifo_pos].account_id = RFIFOL(fd, 2);
- auth_fifo[auth_fifo_pos].login_id1 = RFIFOL(fd, 6);
- auth_fifo[auth_fifo_pos].login_id2 = RFIFOL(fd,10);
- auth_fifo[auth_fifo_pos].char_id = RFIFOL(fd,14);
- auth_fifo[auth_fifo_pos].delflag = 0;
- auth_fifo[auth_fifo_pos].sex = RFIFOB(fd,44);
- auth_fifo[auth_fifo_pos].ip = RFIFOL(fd,45);
-
- sprintf(tmp_sql, "SELECT `char_id`, `name` FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'", char_db, RFIFOL(fd,2), RFIFOL(fd,14));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
- if(sql_res){
- i = atoi(sql_row[0]);
- printf("aid: %d, cid: %d, name: %s", RFIFOL(fd,2), atoi(sql_row[0]), sql_row[1]);
- mysql_free_result(sql_res);
- auth_fifo[auth_fifo_pos].char_pos = auth_fifo[auth_fifo_pos].char_id;
- auth_fifo_pos++;
- WFIFOL(fd,6) = 0;
- }else{
- printf("Error, aborted\n");
- return 0;
- }
-
- if(i == 0){
- WFIFOW(fd, 6) = 0;
- }
-
- WFIFOSET(fd, 44);
- RFIFOSKIP(fd, 49);
- printf(" done.\n");
- /*
- if (( sql_row = mysql_fetch_row(sql_res))) {
- i = atoi(sql_row[0]);
- mysql_free_result(sql_res);
-
- auth_fifo[auth_fifo_pos].char_pos = auth_fifo[auth_fifo_pos].char_id;
- auth_fifo_pos++;
-
- WFIFOL(fd,6) = 0;
- break;
- }
- if (i == 0)
- WFIFOW(fd,6) = 1;
-
- WFIFOSET(fd,44);
- RFIFOSKIP(fd,49);
- break;
- */
-
- break;
-
- // char name check
- case 0x2b08:
- if (RFIFOREST(fd) < 6)
- return 0;
-
- sprintf(tmp_sql, "SELECT `name` FROM `%s` WHERE `char_id`='%d'", char_db, RFIFOL(fd,2));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
-
- sql_row = mysql_fetch_row(sql_res);
-
- WFIFOW(fd,0) = 0x2b09;
- WFIFOL(fd,2) = RFIFOL(fd,2);
-
- if (sql_row)
- memcpy(WFIFOP(fd,6), sql_row[0], 24);
- else
- memcpy(WFIFOP(fd,6), unknown_char_name, 24);
- mysql_free_result(sql_res);
-
- WFIFOSET(fd,30);
-
- RFIFOSKIP(fd,6);
- break;
-
-/* // I want become GM - fuck!
- case 0x2b0a:
- if(RFIFOREST(fd)<4)
- return 0;
- if(RFIFOREST(fd)<RFIFOW(fd,2))
- return 0;
- memcpy(WFIFOP(login_fd,2),RFIFOP(fd,2),RFIFOW(fd,2)-2);
- WFIFOW(login_fd,0)=0x2720;
- WFIFOSET(login_fd,RFIFOW(fd,2));
-// printf("char : change gm -> login %d %s %d\n", RFIFOL(fd, 4), RFIFOP(fd, 8), RFIFOW(fd, 2));
- RFIFOSKIP(fd, RFIFOW(fd, 2));
- break;
- */
-
- // account_reg•Û‘¶—v‹
- case 0x2b10:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- struct global_reg reg[ACCOUNT_REG2_NUM];
- int j,p,acc;
- acc=RFIFOL(fd,4);
- for(p=8,j=0;p<RFIFOW(fd,2) && j<ACCOUNT_REG2_NUM;p+=36,j++){
- memcpy(reg[j].str,RFIFOP(fd,p),32);
- reg[j].value=RFIFOL(fd,p+32);
- }
- // set_account_reg2(acc,j,reg);
- // loginƒT[ƒo[‚Ö‘—‚é
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd, 0) = 0x2728;
- memcpy(WFIFOP(login_fd,0), RFIFOP(fd,0), RFIFOW(fd,2));
- WFIFOSET(login_fd, WFIFOW(login_fd,2));
- }
- // ƒ[ƒ‹ƒh‚Ö‚Ì“¯CƒƒOƒCƒ“‚ª‚È‚¯‚ê‚ÎmapƒT[ƒo[‚É‘—‚é•K—v‚Í‚È‚¢
- //memcpy(buf,RFIFOP(fd,0),RFIFOW(fd,2));
- //WBUFW(buf,0)=0x2b11;
- //mapif_sendall(buf,WBUFW(buf,2));
- RFIFOSKIP(fd,RFIFOW(fd,2));
-// printf("char: save_account_reg (from map)\n");
- }
- break;
-
- // Map server send information to change an email of an account -> login-server
- case 0x2b0c:
- if (RFIFOREST(fd) < 86)
- return 0;
- if (login_fd > 0) { // don't send request if no login-server
- memcpy(WFIFOP(login_fd,0), RFIFOP(fd,0), 86); // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B
- WFIFOW(login_fd,0) = 0x2722;
- WFIFOSET(login_fd, 86);
- }
- RFIFOSKIP(fd, 86);
- break;
-
- // Receiving from map-server a status change resquest. Transmission to login-server (by Yor)
- case 0x2b0e:
- if (RFIFOREST(fd) < 44)
- return 0;
- {
- char character_name[24];
- int acc = RFIFOL(fd,2); // account_id of who ask (-1 if nobody)
- memcpy(character_name, RFIFOP(fd,6), 24);
- character_name[sizeof(character_name) -1] = '\0';
- // prepare answer
- WFIFOW(fd,0) = 0x2b0f; // answer
- WFIFOL(fd,2) = acc; // who want do operation
- WFIFOW(fd,30) = RFIFOW(fd, 30); // type of operation: 1-block, 2-ban, 3-unblock, 4-unban
- sprintf(tmp_sql, "SELECT `account_id`,`name` FROM `%s` WHERE `name` = '%s'",char_db, character_name);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle));
- }
-
- sql_res = mysql_store_result(&mysql_handle);
-
- if (sql_res) {
- if (mysql_num_rows(sql_res)) {
- sql_row = mysql_fetch_row(sql_res);
- memcpy(WFIFOP(fd,6), sql_row[1], 24); // put correct name if found
- WFIFOW(fd,32) = 0; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- switch(RFIFOW(fd, 30)) {
- case 1: // block
- if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd,0) = 0x2724;
- WFIFOL(login_fd,2) = atoi(sql_row[0]); // account value
- WFIFOL(login_fd,6) = 5; // status of the account
- WFIFOSET(login_fd, 10);
-// printf("char : status -> login: account %d, status: %d \n", char_dat[i].account_id, 5);
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- } else
- WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- case 2: // ban
- if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd, 0) = 0x2725;
- WFIFOL(login_fd, 2) = atoi(sql_row[0]); // account value
- WFIFOW(login_fd, 6) = RFIFOW(fd,32); // year
- WFIFOW(login_fd, 8) = RFIFOW(fd,34); // month
- WFIFOW(login_fd,10) = RFIFOW(fd,36); // day
- WFIFOW(login_fd,12) = RFIFOW(fd,38); // hour
- WFIFOW(login_fd,14) = RFIFOW(fd,40); // minute
- WFIFOW(login_fd,16) = RFIFOW(fd,42); // second
- WFIFOSET(login_fd,18);
-// printf("char : status -> login: account %d, ban: %dy %dm %dd %dh %dmn %ds\n",
-// char_dat[i].account_id, (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), (short)RFIFOW(fd,38), (short)RFIFOW(fd,40), (short)RFIFOW(fd,42));
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- } else
- WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- case 3: // unblock
- if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd,0) = 0x2724;
- WFIFOL(login_fd,2) = atoi(sql_row[0]); // account value
- WFIFOL(login_fd,6) = 0; // status of the account
- WFIFOSET(login_fd, 10);
-// printf("char : status -> login: account %d, status: %d \n", char_dat[i].account_id, 0);
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- } else
- WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- case 4: // unban
- if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd, 0) = 0x272a;
- WFIFOL(login_fd, 2) = atoi(sql_row[0]); // account value
- WFIFOSET(login_fd, 6);
-// printf("char : status -> login: account %d, unban request\n", char_dat[i].account_id);
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- } else
- WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- case 5: // changesex
- if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd, 0) = 0x2727;
- WFIFOL(login_fd, 2) = atoi(sql_row[0]); // account value
- WFIFOSET(login_fd, 6);
-// printf("char : status -> login: account %d, change sex request\n", char_dat[i].account_id);
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- } else
- WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- }
- } else {
- // character name not found
- memcpy(WFIFOP(fd,6), character_name, 24);
- WFIFOW(fd,32) = 1; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline
- }
- // send answer if a player ask, not if the server ask
- if (acc != -1) {
- WFIFOSET(fd, 34);
- }
- }
- }
- RFIFOSKIP(fd, 44);
- break;
-
- // Recieve rates [Wizputer]
- case 0x2b16:
- if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,8))
- return 0;
- sprintf(tmp_sql, "INSERT INTO `ragsrvinfo` SET `index`='%d',`name`='%s',`exp`='%d',`jexp`='%d',`drop`='%d',`motd`='%s'",
- fd, server_name, RFIFOW(fd,2), RFIFOW(fd,4), RFIFOW(fd,6), RFIFOP(fd,10));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- RFIFOSKIP(fd,RFIFOW(fd,8));
- break;
-
- // Character disconnected set online 0 [Wizputer]
- case 0x2b17:
- if (RFIFOREST(fd) < 6 )
- return 0;
- //printf("Setting %d char offline\n",RFIFOL(fd,2));
- set_char_offline(RFIFOL(fd,2),RFIFOL(fd,6));
- RFIFOSKIP(fd,10);
- break;
- // Reset all chars to offline [Wizputer]
- case 0x2b18:
- set_all_offline();
- RFIFOSKIP(fd,2);
- break;
- // Character set online [Wizputer]
- case 0x2b19:
- if (RFIFOREST(fd) < 6 )
- return 0;
- //printf("Setting %d char online\n",RFIFOL(fd,2));
- set_char_online(RFIFOL(fd,2),RFIFOL(fd,6));
- RFIFOSKIP(fd,10);
- break;
-
- default:
- // inter server - packet
- {
- int r = inter_parse_frommap(fd);
- if (r == 1) break; // processed
- if (r == 2) return 0; // need more packet
- }
-
- // no inter server packet. no char server packet -> disconnect
- printf("parse_frommap: unknown packet %x! \n", RFIFOW(fd,0));
- session[fd]->eof = 1;
- return 0;
- }
- }
- return 0;
-}
-
-int search_mapserver(char *map) {
- int i, j;
- char temp_map[16];
- int temp_map_len;
-
-// printf("Searching the map-server for map '%s'... ", map);
- strncpy(temp_map, map, sizeof(temp_map));
- temp_map[sizeof(temp_map)-1] = '\0';
- if (strchr(temp_map, '.') != NULL)
- temp_map[strchr(temp_map, '.') - temp_map + 1] = '\0'; // suppress the '.gat', but conserve the '.' to be sure of the name of the map
-
- temp_map_len = strlen(temp_map);
- for(i = 0; i < MAX_MAP_SERVERS; i++)
- if (server_fd[i] >= 0)
- for (j = 0; server[i].map[j][0]; j++)
- //printf("%s : %s = %d\n", server[i].map[j], map, strncmp(server[i].map[j], temp_map, temp_map_len));
- if (strncmp(server[i].map[j], temp_map, temp_map_len) == 0) {
-// printf("found -> server #%d.\n", i);
- return i;
- }
-
-// printf("not found.\n");
- return -1;
-}
-
-int char_mapif_init(int fd) {
- return inter_mapif_init(fd);
-}
-
-//-----------------------------------------------------
-// Test to know if an IP come from LAN or WAN. by [Yor]
-//-----------------------------------------------------
-int lan_ip_check(unsigned char *p){
- int i;
- int lancheck = 1;
- int subneti[4];
- unsigned int k0, k1, k2, k3;
-
- sscanf(lan_map_ip, "%d.%d.%d.%d", &k0, &k1, &k2, &k3);
- subneti[0] = k0; subneti[1] = k1; subneti[2] = k2; subneti[3] = k3;
-
-// printf("lan_ip_check: to compare: %d.%d.%d.%d, network: %d.%d.%d.%d/%d.%d.%d.%d\n",
-// p[0], p[1], p[2], p[3],
-// subneti[0], subneti[1], subneti[2], subneti[3],
-// subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]);
- for(i = 0; i < 4; i++) {
- if ((subneti[i] & subnetmaski[i]) != (p[i] & subnetmaski[i])) {
- lancheck = 0;
- break;
- }
- }
-// printf("LAN test (result): %s source\033[0m.\n", (lancheck) ? "\033[1;36mLAN" : "\033[1;32mWAN");
- return lancheck;
-}
-
-int parse_char(int fd) {
- int i, ch = 0;
- char email[40];
- unsigned short cmd;
- struct char_session_data *sd;
- unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
-
- sd = (struct char_session_data*)session[fd]->session_data;
-
- if(login_fd < 0)
- session[fd]->eof = 1;
- if(session[fd]->eof) {
- if (fd == login_fd)
- login_fd = -1;
- if (sd != NULL)
- set_char_offline(99,sd->account_id);
- close(fd);
- delete_session(fd);
- return 0;
- }
-
- while(RFIFOREST(fd) >= 2) {
- cmd = RFIFOW(fd,0);
- // crc32‚̃XƒLƒbƒv—p
- if( sd==NULL && // –¢ƒƒOƒCƒ“orŠÇ—ƒpƒPƒbƒg
- RFIFOREST(fd)>=4 && // Å’áƒoƒCƒg”§ŒÀ • 0x7530,0x7532ŠÇ—ƒpƒPœ‹Ž
- RFIFOREST(fd)<=21 && // Å‘åƒoƒCƒg”§ŒÀ • ƒT[ƒo[ƒƒOƒCƒ“œ‹Ž
- cmd!=0x20b && // md5’Ê’mƒpƒPƒbƒgœ‹Ž
- (RFIFOREST(fd)<6 || RFIFOW(fd,4)==0x65) ){ // ŽŸ‚ɉ½‚©ƒpƒPƒbƒg‚ª—ˆ‚Ä‚é‚È‚çAÚ‘±‚Å‚È‚¢‚Æ‚¾‚ß
- RFIFOSKIP(fd,4);
- cmd = RFIFOW(fd,0);
- printf("parse_char : %d crc32 skipped\n",fd);
- if(RFIFOREST(fd)==0)
- return 0;
- }
-
-// if(cmd<30000 && cmd!=0x187)
-// printf("parse_char : %d %d %d\n",fd,RFIFOREST(fd),cmd);
-
- // •s³ƒpƒPƒbƒg‚̈—
-// if (sd == NULL && cmd != 0x65 && cmd != 0x20b && cmd != 0x187 &&
-// cmd != 0x2af8 && cmd != 0x7530 && cmd != 0x7532)
-// cmd = 0xffff; // ƒpƒPƒbƒgƒ_ƒ“ƒv‚ð•\Ž¦‚³‚¹‚é
-
- switch(cmd){
- case 0x20b: //20040622 encryption ragexe correspondence
- if (RFIFOREST(fd) < 19)
- return 0;
- RFIFOSKIP(fd,19);
- break;
-
- case 0x65: // request to connect
- printf("request connect - account_id:%d/login_id1:%d/login_id2:%d\n", RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOL(fd, 10));
- if (RFIFOREST(fd) < 17)
- return 0;
- {
-/*removed from isGM setup
- if (isGM(RFIFOL(fd,2)))
- printf("Account Logged On; Account ID: %d (GM level %d).\n", RFIFOL(fd,2), isGM(RFIFOL(fd,2)));
- else
- printf("Account Logged On; Account ID: %d.\n", RFIFOL(fd,2));
-*/
- if (sd == NULL) {
- CREATE(session[fd]->session_data, struct char_session_data, 1);
- sd = (struct char_session_data*)session[fd]->session_data;
- sd->connect_until_time = 0; // unknow or illimited (not displaying on map-server)
- }
- sd->account_id = RFIFOL(fd, 2);
- sd->login_id1 = RFIFOL(fd, 6);
- sd->login_id2 = RFIFOL(fd, 10);
- sd->sex = RFIFOB(fd, 16);
-
- WFIFOL(fd, 0) = RFIFOL(fd, 2);
- WFIFOSET(fd, 4);
-
- for(i = 0; i < AUTH_FIFO_SIZE; i++) {
- if (auth_fifo[i].account_id == sd->account_id &&
- auth_fifo[i].login_id1 == sd->login_id1 &&
-#if CMP_AUTHFIFO_LOGIN2 != 0
- auth_fifo[i].login_id2 == sd->login_id2 && // relate to the versions higher than 18
-#endif
- (!check_ip_flag || auth_fifo[i].ip == session[fd]->client_addr.sin_addr.s_addr) &&
- auth_fifo[i].delflag == 2) {
- auth_fifo[i].delflag = 1;
-
- if (max_connect_user == 0 || count_users() < max_connect_user) {
- if (login_fd > 0) { // don't send request if no login-server
- // request to login-server to obtain e-mail/time limit
- WFIFOW(login_fd,0) = 0x2716;
- WFIFOL(login_fd,2) = sd->account_id;
- WFIFOSET(login_fd,6);
- }
- // send characters to player
- mmo_char_send006b(fd, sd);
- } else {
- // refuse connection (over populated)
- WFIFOW(fd,0) = 0x6c;
- WFIFOW(fd,2) = 0;
- WFIFOSET(fd,3);
- }
-// printf("connection request> set delflag 1(o:2)- account_id:%d/login_id1:%d(fifo_id:%d)\n", sd->account_id, sd->login_id1, i);
- break;
- }
- }
- if (i == AUTH_FIFO_SIZE) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd,0) = 0x2712; // ask login-server to authentify an account
- WFIFOL(login_fd,2) = sd->account_id;
- WFIFOL(login_fd,6) = sd->login_id1;
- WFIFOL(login_fd,10) = sd->login_id2;
- WFIFOB(login_fd,14) = sd->sex;
- WFIFOL(login_fd,15) = session[fd]->client_addr.sin_addr.s_addr;
- WFIFOSET(login_fd,19);
- } else { // if no login-server, we must refuse connection
- WFIFOW(fd,0) = 0x6c;
- WFIFOW(fd,2) = 0;
- WFIFOSET(fd,3);
- }
- }
- }
- RFIFOSKIP(fd, 17);
- break;
-
- case 0x66: // char select
-// printf("0x66> request connect - account_id:%d/char_num:%d\n",sd->account_id,RFIFOB(fd, 2));
- if (RFIFOREST(fd) < 3)
- return 0;
-
- if (sd == NULL)
- return 0;
-
- sprintf(tmp_sql, "SELECT `char_id` FROM `%s` WHERE `account_id`='%d' AND `char_num`='%d'",char_db, sd->account_id, RFIFOB(fd, 2));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
-
- sql_row = mysql_fetch_row(sql_res);
-
- if (sql_row)
- mmo_char_fromsql(atoi(sql_row[0]), char_dat, 1);
- else {
- mysql_free_result(sql_res);
- RFIFOSKIP(fd, 3);
- break;
- }
-
- if (log_char) {
- sprintf(tmp_sql,"INSERT INTO `%s`(`time`, `account_id`,`char_num`,`name`) VALUES (NOW(), '%d', '%d', '%s')",
- charlog_db, sd->account_id, RFIFOB(fd, 2), char_dat[0].name);
- //query
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- }
- printf("(\033[1;64m%d\033[0m) char selected (\033[1;32m%d\033[0m) \033[1;32m%s\033[0m" RETCODE, sd->account_id, RFIFOB(fd, 2), char_dat[0].name);
-
- i = search_mapserver(char_dat[0].last_point.map);
-
- // if map is not found, we check major cities
- if (i < 0) {
- if ((i = search_mapserver("prontera.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[0].last_point.map, "prontera.gat", 16);
- char_dat[0].last_point.x = 273; // savepoint coordonates
- char_dat[0].last_point.y = 354;
- } else if ((i = search_mapserver("geffen.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[0].last_point.map, "geffen.gat", 16);
- char_dat[0].last_point.x = 120; // savepoint coordonates
- char_dat[0].last_point.y = 100;
- } else if ((i = search_mapserver("morocc.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[0].last_point.map, "morocc.gat", 16);
- char_dat[0].last_point.x = 160; // savepoint coordonates
- char_dat[0].last_point.y = 94;
- } else if ((i = search_mapserver("alberta.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[0].last_point.map, "alberta.gat", 16);
- char_dat[0].last_point.x = 116; // savepoint coordonates
- char_dat[0].last_point.y = 57;
- } else if ((i = search_mapserver("payon.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[0].last_point.map, "payon.gat", 16);
- char_dat[0].last_point.x = 87; // savepoint coordonates
- char_dat[0].last_point.y = 117;
- } else if ((i = search_mapserver("izlude.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[0].last_point.map, "izlude.gat", 16);
- char_dat[0].last_point.x = 94; // savepoint coordonates
- char_dat[0].last_point.y = 103;
- } else {
- int j;
- // get first online server
- i = 0;
- for(j = 0; j < MAX_MAP_SERVERS; j++)
- if (server_fd[j] >= 0 && server[j].map[0][0]) {
- i = j;
- printf("Map-server #%d found with a map: '%s'.\n", j, server[j].map[0]);
- break;
- }
- // if no map-servers are connected, we send: server closed
- if (j == MAX_MAP_SERVERS) {
- WFIFOW(fd,0) = 0x81;
- WFIFOL(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- RFIFOSKIP(fd,3);
- break;
- }
- }
- }
- WFIFOW(fd, 0) =0x71;
- WFIFOL(fd, 2) =char_dat[0].char_id;
- memcpy(WFIFOP(fd, 6), char_dat[0].last_point.map, 16);
- //Lan check added by Kashy
- if (lan_ip_check(p))
- WFIFOL(fd, 22) = inet_addr(lan_map_ip);
- else
- WFIFOL(fd, 22) = server[i].ip;
- WFIFOW(fd, 26) = server[i].port;
- WFIFOSET(fd, 28);
-
- if (auth_fifo_pos >= AUTH_FIFO_SIZE) {
- auth_fifo_pos = 0;
- }
-// printf("auth_fifo set (auth_fifo_pos:%d) - account_id:%d char_id:%d login_id1:%d\n", auth_fifo_pos, sd->account_id, char_dat[0].char_id, sd->login_id1);
- auth_fifo[auth_fifo_pos].account_id = sd->account_id;
- auth_fifo[auth_fifo_pos].char_id = char_dat[0].char_id;
- auth_fifo[auth_fifo_pos].login_id1 = sd->login_id1;
- auth_fifo[auth_fifo_pos].login_id2 = sd->login_id2;
- auth_fifo[auth_fifo_pos].delflag = 0;
- //auth_fifo[auth_fifo_pos].char_pos = sd->found_char[ch];
- auth_fifo[auth_fifo_pos].char_pos = 0;
- auth_fifo[auth_fifo_pos].sex = sd->sex;
- auth_fifo[auth_fifo_pos].connect_until_time = sd->connect_until_time;
- auth_fifo[auth_fifo_pos].ip = session[fd]->client_addr.sin_addr.s_addr;
- auth_fifo_pos++;
-// printf("0x66> end\n");
- RFIFOSKIP(fd, 3);
- break;
-
- case 0x67: // make new
-// printf("0x67>request make new char\n");
- if (RFIFOREST(fd) < 37)
- return 0;
- i = make_new_char_sql(fd, RFIFOP(fd, 2));
-
- //if (i < 0) {
- // WFIFOW(fd, 0) = 0x6e;
- // WFIFOB(fd, 2) = 0x00;
- // WFIFOSET(fd, 3);
- // RFIFOSKIP(fd, 37);
- // break;
- //}
- //Changed that we can support 'Charname already exists' (-1) amd 'Char creation denied' (-2)
- //And 'You are underaged' (-3) (XD) [Sirius]
- if(i == -1){
- //already exists
- WFIFOW(fd, 0) = 0x6e;
- WFIFOB(fd, 2) = 0x00;
- WFIFOSET(fd, 3);
- RFIFOSKIP(fd, 37);
- break;
- }else if(i == -2){
- //denied
- WFIFOW(fd, 0) = 0x6e;
- WFIFOB(fd, 2) = 0x02;
- WFIFOSET(fd, 3);
- RFIFOSKIP(fd, 37);
- break;
- }else if(i == -3){
- //underaged XD
- WFIFOW(fd, 0) = 0x6e;
- WFIFOB(fd, 2) = 0x01;
- WFIFOSET(fd, 3);
- RFIFOSKIP(fd, 37);
- break;
- }
-
- WFIFOW(fd, 0) = 0x6d;
- memset(WFIFOP(fd, 2), 0x00, 106);
-
- mmo_char_fromsql(i, char_dat, 0);
- i = 0;
- WFIFOL(fd, 2) = char_dat[i].char_id;
- WFIFOL(fd,2+4) = char_dat[i].base_exp;
- WFIFOL(fd,2+8) = char_dat[i].zeny;
- WFIFOL(fd,2+12) = char_dat[i].job_exp;
- WFIFOL(fd,2+16) = char_dat[i].job_level;
-
- WFIFOL(fd,2+28) = char_dat[i].karma;
- WFIFOL(fd,2+32) = char_dat[i].manner;
-
- WFIFOW(fd,2+40) = 0x30;
- WFIFOW(fd,2+42) = (char_dat[i].hp > 0x7fff) ? 0x7fff : char_dat[i].hp;
- WFIFOW(fd,2+44) = (char_dat[i].max_hp > 0x7fff) ? 0x7fff : char_dat[i].max_hp;
- WFIFOW(fd,2+46) = (char_dat[i].sp > 0x7fff) ? 0x7fff : char_dat[i].sp;
- WFIFOW(fd,2+48) = (char_dat[i].max_sp > 0x7fff) ? 0x7fff : char_dat[i].max_sp;
- WFIFOW(fd,2+50) = DEFAULT_WALK_SPEED; // char_dat[i].speed;
- WFIFOW(fd,2+52) = char_dat[i].class_;
- WFIFOW(fd,2+54) = char_dat[i].hair;
-
- WFIFOW(fd,2+58) = char_dat[i].base_level;
- WFIFOW(fd,2+60) = char_dat[i].skill_point;
-
- WFIFOW(fd,2+64) = char_dat[i].shield;
- WFIFOW(fd,2+66) = char_dat[i].head_top;
- WFIFOW(fd,2+68) = char_dat[i].head_mid;
- WFIFOW(fd,2+70) = char_dat[i].hair_color;
-
- memcpy(WFIFOP(fd,2+74), char_dat[i].name, 24);
-
- WFIFOB(fd,2+98) = char_dat[i].str;
- WFIFOB(fd,2+99) = char_dat[i].agi;
- WFIFOB(fd,2+100) = char_dat[i].vit;
- WFIFOB(fd,2+101) = char_dat[i].int_;
- WFIFOB(fd,2+102) = char_dat[i].dex;
- WFIFOB(fd,2+103) = char_dat[i].luk;
- WFIFOB(fd,2+104) = char_dat[i].char_num;
-
- WFIFOSET(fd, 108);
- RFIFOSKIP(fd, 37);
- //to do
- for(ch = 0; ch < 9; ch++) {
- if (sd->found_char[ch] == -1) {
- sd->found_char[ch] = char_dat[i].char_id;
- break;
- }
- }
-
- case 0x68: // delete
- if (RFIFOREST(fd) < 46)
- return 0;
- printf("\033[1;31m Request Char Del:\033[0m \033[1;32m%d\033[0m(\033[1;32m%d\033[0m)\n", sd->account_id, RFIFOL(fd, 2));
- memcpy(email, RFIFOP(fd,6), 40);
- sprintf(tmp_sql, "SELECT `email` FROM `%s` WHERE `%s`='%d'",login_db, login_db_account_id, sd->account_id);
- if (mysql_query(&lmysql_handle, tmp_sql)) {
- printf("\033[1;31m DB server Error Delete Char data - %s \033[0m \n", mysql_error(&lmysql_handle));
- }
- sql_res = mysql_store_result(&lmysql_handle);
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res);
-
- if ( (strcmp(email,sql_row[0]) == 0) || // client_value == db_value?
- ((strcmp(email,"") == 0) &&
- (strcmp(sql_row[0],"a@a.com") == 0)) ) { // client_value == "" && db_value == "a@a.com" ?
- mysql_free_result(sql_res);
- } else {
- WFIFOW(fd, 0) = 0x70;
- WFIFOB(fd, 2) = 0;
- WFIFOSET(fd, 3);
- RFIFOSKIP(fd, 46);
- mysql_free_result(sql_res);
- break;
- }
- } else {
- WFIFOW(fd, 0) = 0x70;
- WFIFOB(fd, 2) = 0;
- WFIFOSET(fd, 3);
- RFIFOSKIP(fd, 46);
- mysql_free_result(sql_res);
- break;
- }
- sprintf(tmp_sql, "SELECT `name`,`partner_id` FROM `%s` WHERE `char_id`='%d'",char_db, RFIFOL(fd,2));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
- if(sql_res)
- sql_row = mysql_fetch_row(sql_res);
-
- if (sql_res && sql_row[0]) {
- //delete char from SQL
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",pet_db, RFIFOL(fd, 2));
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",inventory_db, RFIFOL(fd, 2));
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",cart_db, RFIFOL(fd, 2));
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",memo_db, RFIFOL(fd, 2));
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",skill_db, RFIFOL(fd, 2));
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",char_db, RFIFOL(fd, 2));
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- //Divorce [Wizputer]
- if (sql_row[1] != 0) {
- unsigned char buf[64];
- sprintf(tmp_sql,"UPDATE `%s` SET `partner_id`='0' WHERE `char_id`='%d'",char_db,atoi(sql_row[1]));
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE (`nameid`='%d' OR `nameid`='%d') AND `char_id`='%d'",inventory_db,WEDDING_RING_M,WEDDING_RING_F,atoi(sql_row[1]));
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- WBUFW(buf,0) = 0x2b12;
- WBUFL(buf,2) = atoi(sql_row[0]);
- WBUFL(buf,6) = atoi(sql_row[1]);
- mapif_sendall(buf,10);
- }
- // Also delete info from guildtables.
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",guild_member_db, RFIFOL(fd,2));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql, "SELECT `guild_id` FROM `%s` WHERE `master` = '%s'", guild_db, sql_row[0]);
-
- if (mysql_query(&mysql_handle, tmp_sql) == 0) {
- sql_res = mysql_store_result(&mysql_handle);
-
- if (sql_res != NULL) {
- if (mysql_num_rows(sql_res) != 0) {
- sql_row = mysql_fetch_row(sql_res);
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_db, atoi(sql_row[0]));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_member_db, atoi(sql_row[0]));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_castle_db, atoi(sql_row[0]));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_storage_db, atoi(sql_row[0]));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d' OR `alliance_id` = '%d'", guild_alliance_db, atoi(sql_row[0]), atoi(sql_row[0]));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_position_db, atoi(sql_row[0]));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_skill_db, atoi(sql_row[0]));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_expulsion_db, atoi(sql_row[0]));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- mysql_free_result(sql_res);
- }
- } else {
- if (mysql_errno(&mysql_handle) != 0) {
- printf("Database server error: %s\n", mysql_error(&mysql_handle));
- }
- }
- } else {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- }
-
- for(i = 0; i < 9; i++) {
- printf("char comp: %d - %d (%d)\n", sd->found_char[i], RFIFOL(fd, 2), sd->account_id);
- if (sd->found_char[i] == RFIFOL(fd, 2)) {
- for(ch = i; ch < 9-1; ch++)
- sd->found_char[ch] = sd->found_char[ch+1];
- sd->found_char[8] = -1;
- break;
- }
- }
- if (i == 9) { // reject
- WFIFOW(fd, 0) = 0x70;
- WFIFOB(fd, 2) = 0;
- WFIFOSET(fd, 3);
- } else { // deleted!
- WFIFOW(fd, 0) = 0x6f;
- WFIFOSET(fd, 2);
- }
- RFIFOSKIP(fd, 46);
- break;
-
- case 0x2af8: // login as map-server
- if (RFIFOREST(fd) < 60)
- return 0;
- WFIFOW(fd, 0) = 0x2af9;
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- if (server_fd[i] < 0)
- break;
- }
- if (i == MAX_MAP_SERVERS || strcmp((const char*)RFIFOP(fd,2), userid) || strcmp((const char*)RFIFOP(fd,26), passwd)) {
- WFIFOB(fd,2) = 3;
- WFIFOSET(fd, 3);
- } else {
-// int len;
- WFIFOB(fd,2) = 0;
- WFIFOSET(fd, 3);
- session[fd]->func_parse = parse_frommap;
- server_fd[i] = fd;
- server[i].ip = RFIFOL(fd, 54);
- server[i].port = RFIFOW(fd, 58);
- server[i].users = 0;
- memset(server[i].map, 0, sizeof(server[i].map));
- realloc_fifo(fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
- char_mapif_init(fd);
- // send gm acccounts level to map-servers
-/* removed by CLOWNISIUS due to isGM
- len = 4;
- WFIFOW(fd,0) = 0x2b15;
- for(i = 0; i < GM_num; i++) {
- WFIFOL(fd,len) = gm_account[i].account_id;
- WFIFOB(fd,len+4) = (unsigned char)gm_account[i].level;
- len += 5;
- }
- WFIFOW(fd,2) = len;
- WFIFOSET(fd,len);*/
- }
- RFIFOSKIP(fd,60);
- break;
-
- case 0x187: // Alive?
- if (RFIFOREST(fd) < 6) {
- return 0;
- }
- RFIFOSKIP(fd, 6);
- break;
-
- case 0x7530: // Athena info get
- WFIFOW(fd, 0) = 0x7531;
- WFIFOB(fd, 2) = ATHENA_MAJOR_VERSION;
- WFIFOB(fd, 3) = ATHENA_MINOR_VERSION;
- WFIFOB(fd, 4) = ATHENA_REVISION;
- WFIFOB(fd, 5) = ATHENA_RELEASE_FLAG;
- WFIFOB(fd, 6) = ATHENA_OFFICIAL_FLAG;
- WFIFOB(fd, 7) = ATHENA_SERVER_INTER | ATHENA_SERVER_CHAR;
- WFIFOW(fd, 8) = ATHENA_MOD_VERSION;
- WFIFOSET(fd, 10);
- RFIFOSKIP(fd, 2);
- return 0;
-
- case 0x7532: // disconnect(default also disconnect)
- default:
- session[fd]->eof = 1;
- return 0;
- }
- }
- RFIFOFLUSH(fd);
-
- return 0;
-}
-
-// Console Command Parser [Wizputer]
-int parse_console(char *buf) {
- char *type,*command;
-
- type = (char *)aMalloc(64);
- command = (char *)aMalloc(64);
-
- memset(type,0,64);
- memset(command,0,64);
-
- printf("Console: %s\n",buf);
-
- if ( sscanf(buf, "%[^:]:%[^\n]", type , command ) < 2 )
- sscanf(buf,"%[^\n]",type);
-
- printf("Type of command: %s || Command: %s \n",type,command);
-
- if(buf) aFree(buf);
- if(type) aFree(type);
- if(command) aFree(command);
-
- return 0;
-}
-
-// MAP send all
-int mapif_sendall(unsigned char *buf, unsigned int len) {
- int i, c;
- int fd;
-
- c = 0;
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- if ((fd = server_fd[i]) >= 0) {
- 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;
- int fd;
-
- c = 0;
- for(i=0, c=0;i<MAX_MAP_SERVERS;i++){
- if ((fd = server_fd[i]) >= 0 && fd != sfd) {
- memcpy(WFIFOP(fd,0), buf, len);
- WFIFOSET(fd, len);
- c++;
- }
- }
-
- return c;
-}
-
-int mapif_send(int fd, unsigned char *buf, unsigned int len) {
- int i;
-
- if (fd >= 0) {
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- if (fd == server_fd[i]) {
- memcpy(WFIFOP(fd,0), buf, len);
- WFIFOSET(fd,len);
- return 1;
- }
- }
- }
- return 0;
-}
-
-int send_users_tologin(int tid, unsigned int tick, int id, int data) {
- int users = count_users();
- unsigned char buf[16];
-
- if (login_fd > 0 && session[login_fd]) {
- // send number of user to login server
- WFIFOW(login_fd,0) = 0x2714;
- WFIFOL(login_fd,2) = users;
- WFIFOSET(login_fd,6);
- }
- // send number of players to all map-servers
- WBUFW(buf,0) = 0x2b00;
- WBUFL(buf,2) = users;
- mapif_sendall(buf, 6);
-
- return 0;
-}
-
-int check_connect_login_server(int tid, unsigned int tick, int id, int data) {
- if (login_fd <= 0 || session[login_fd] == NULL) {
- printf("Attempt to connect to login-server...\n");
- login_fd = make_connection(login_ip, login_port);
- session[login_fd]->func_parse = parse_tologin;
- realloc_fifo(login_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
- WFIFOW(login_fd,0) = 0x2710;
- memset(WFIFOP(login_fd,2), 0, 24);
- memcpy(WFIFOP(login_fd,2), userid, strlen(userid) < 24 ? strlen(userid) : 24);
- memset(WFIFOP(login_fd,26), 0, 24);
- memcpy(WFIFOP(login_fd,26), passwd, strlen(passwd) < 24 ? strlen(passwd) : 24);
- WFIFOL(login_fd,50) = 0;
- WFIFOL(login_fd,54) = char_ip;
- WFIFOL(login_fd,58) = char_port;
- memset(WFIFOP(login_fd,60), 0, 20);
- memcpy(WFIFOP(login_fd,60), server_name, strlen(server_name) < 20 ? strlen(server_name) : 20);
- WFIFOW(login_fd,80) = 0;
- WFIFOW(login_fd,82) = char_maintenance;
- WFIFOW(login_fd,84) = char_new;
- WFIFOSET(login_fd,86);
- }
- return 0;
-}
-
-//----------------------------------------------------------
-// Return numerical value of a switch configuration by [Yor]
-// on/off, english, français, deutsch, español
-//----------------------------------------------------------
-int config_switch(const char *str) {
- if (strcmpi(str, "on") == 0 || strcmpi(str, "yes") == 0 || strcmpi(str, "oui") == 0 || strcmpi(str, "ja") == 0 || strcmpi(str, "si") == 0)
- return 1;
- if (strcmpi(str, "off") == 0 || strcmpi(str, "no") == 0 || strcmpi(str, "non") == 0 || strcmpi(str, "nein") == 0)
- return 0;
-
- return atoi(str);
-}
-
-// Lan Support conf reading added by Kashy
-int char_lan_config_read(const char *lancfgName){
- char subnetmask[128];
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
- struct hostent * h = NULL;
-
- if ((fp = fopen(lancfgName, "r")) == NULL) {
- printf("file not found: %s\n", lancfgName);
- return 1;
- }
-
- printf("Start reading of Lan Support configuration file\n");
-
- while(fgets(line, sizeof(line)-1, fp)){
- if (line[0] == '/' && line[1] == '/')
- continue;
-
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2)
- continue;
-
- else if (strcmpi(w1, "lan_map_ip") == 0) {
- h = gethostbyname(w2);
- if (h != NULL) {
- sprintf(lan_map_ip, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- } else {
- strncpy(lan_map_ip, w2, sizeof(lan_map_ip));
- lan_map_ip[sizeof(lan_map_ip)-1] = 0;
- }
- printf("set Lan_map_IP : %s\n", lan_map_ip);
- }
-
- else if (strcmpi(w1, "subnetmask") == 0) {
- unsigned int k0, k1, k2, k3;
- strcpy(subnetmask, w2);
- sscanf(subnetmask, "%d.%d.%d.%d", &k0, &k1, &k2, &k3);
- subnetmaski[0] = k0; subnetmaski[1] = k1; subnetmaski[2] = k2; subnetmaski[3] = k3;
- printf("set subnetmask : %s\n", w2);
- }
- }
- fclose(fp);
-
- printf("End reading of Lan Support configuration file\n");
- return 0;
-}
-
-static int char_db_final(void *key,void *data,va_list ap)
-{
- struct mmo_charstatus *p = (struct mmo_charstatus *) data;
- if (p) aFree(p);
- return 0;
-}
-void do_final(void) {
- printf("Doing final stage...\n");
- //mmo_char_sync();
- //inter_save();
- do_final_itemdb();
- //check SQL save progress.
- //wait until save char complete
-
- set_all_offline();
-
- flush_fifos();
-
- sprintf(tmp_sql,"DELETE FROM `ragsrvinfo");
- if (mysql_query(&mysql_handle, tmp_sql))
- printf("DB server Error (insert `char`)- %s\n", mysql_error(&mysql_handle));
-
- if(gm_account) {
- aFree(gm_account);
- gm_account = 0;
- }
-
- if(char_dat) {
- aFree(char_dat);
- char_dat = 0;
- }
-
- delete_session(login_fd);
- delete_session(char_fd);
- numdb_final(char_db_, char_db_final);
- exit_dbn();
-
- mysql_close(&mysql_handle);
- mysql_close(&lmysql_handle);
- timer_final();
-
- printf("ok! all done...\n");
-}
-
-void sql_config_read(const char *cfgName){ /* Kalaspuff, to get login_db */
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- printf("reading configure: %s\n", cfgName);
-
- if ((fp = fopen(cfgName, "r")) == NULL) {
- printf("file not found: %s\n", cfgName);
- exit(1);
- }
-
- while(fgets(line, sizeof(line)-1, fp)){
- if(line[0] == '/' && line[1] == '/')
- continue;
-
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2)
- continue;
-
- if(strcmpi(w1, "login_db") == 0) {
- strcpy(login_db, w2);
- }else if(strcmpi(w1,"char_db")==0){
- strcpy(char_db,w2);
- }else if(strcmpi(w1,"cart_db")==0){
- strcpy(cart_db,w2);
- }else if(strcmpi(w1,"inventory_db")==0){
- strcpy(inventory_db,w2);
- }else if(strcmpi(w1,"charlog_db")==0){
- strcpy(charlog_db,w2);
- }else if(strcmpi(w1,"storage_db")==0){
- strcpy(storage_db,w2);
- }else if(strcmpi(w1,"reg_db")==0){
- strcpy(reg_db,w2);
- }else if(strcmpi(w1,"skill_db")==0){
- strcpy(skill_db,w2);
- }else if(strcmpi(w1,"interlog_db")==0){
- strcpy(interlog_db,w2);
- }else if(strcmpi(w1,"memo_db")==0){
- strcpy(memo_db,w2);
- }else if(strcmpi(w1,"guild_db")==0){
- strcpy(guild_db,w2);
- }else if(strcmpi(w1,"guild_alliance_db")==0){
- strcpy(guild_alliance_db,w2);
- }else if(strcmpi(w1,"guild_castle_db")==0){
- strcpy(guild_castle_db,w2);
- }else if(strcmpi(w1,"guild_expulsion_db")==0){
- strcpy(guild_expulsion_db,w2);
- }else if(strcmpi(w1,"guild_member_db")==0){
- strcpy(guild_member_db,w2);
- }else if(strcmpi(w1,"guild_skill_db")==0){
- strcpy(guild_skill_db,w2);
- }else if(strcmpi(w1,"guild_position_db")==0){
- strcpy(guild_position_db,w2);
- }else if(strcmpi(w1,"guild_storage_db")==0){
- strcpy(guild_storage_db,w2);
- }else if(strcmpi(w1,"party_db")==0){
- strcpy(party_db,w2);
- }else if(strcmpi(w1,"pet_db")==0){
- strcpy(pet_db,w2);
- }else if(strcmpi(w1,"db_path")==0){
- strcpy(db_path,w2);
- //Map server option to use SQL db or not
- }else if(strcmpi(w1,"use_sql_db")==0){ // added for sql item_db read for char server [Valaris]
- db_use_sqldbs = config_switch(w2);
- printf("Using SQL dbs: %s\n",w2);
- //custom columns for login database
- }else if(strcmpi(w1,"login_db_level")==0){
- strcpy(login_db_level,w2);
- }else if(strcmpi(w1,"login_db_account_id")==0){
- strcpy(login_db_account_id,w2);
- }else if(strcmpi(w1,"lowest_gm_level")==0){
- lowest_gm_level = atoi(w2);
- printf("set lowest_gm_level : %s\n",w2);
- //support the import command, just like any other config
- }else if(strcmpi(w1,"import")==0){
- sql_config_read(w2);
- }
-
- }
- fclose(fp);
- printf("reading configure done.....\n");
-}
-
-int char_config_read(const char *cfgName) {
- struct hostent *h = NULL;
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- if ((fp = fopen(cfgName, "r")) == NULL) {
- printf("Configuration file not found: %s.\n", cfgName);
- exit(1);
- }
-
- while(fgets(line, sizeof(line)-1, fp)) {
- if (line[0] == '/' && line[1] == '/')
- continue;
-
- line[sizeof(line)-1] = '\0';
- if (sscanf(line,"%[^:]: %[^\r\n]", w1, w2) != 2)
- continue;
-
- remove_control_chars((unsigned char *) w1);
- remove_control_chars((unsigned char *) w2);
- if (strcmpi(w1, "userid") == 0) {
- memcpy(userid, w2, 24);
- } else if (strcmpi(w1, "passwd") == 0) {
- memcpy(passwd, w2, 24);
- } else if (strcmpi(w1, "server_name") == 0) {
- memcpy(server_name, w2, 16);
- printf("%s server has been initialized\n", w2);
- } else if (strcmpi(w1, "wisp_server_name") == 0) {
- if (strlen(w2) >= 4) {
- memcpy(wisp_server_name, w2, sizeof(wisp_server_name));
- wisp_server_name[sizeof(wisp_server_name) - 1] = '\0';
- }
- } else if (strcmpi(w1, "login_ip") == 0) {
- login_ip_set_ = 1;
- h = gethostbyname (w2);
- if (h != NULL) {
- printf("Login server IP address : %s -> %d.%d.%d.%d\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- sprintf(login_ip_str, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- } else
- memcpy(login_ip_str,w2,16);
- } else if (strcmpi(w1, "login_port") == 0) {
- login_port=atoi(w2);
- } else if (strcmpi(w1, "char_ip") == 0) {
- char_ip_set_ = 1;
- h = gethostbyname (w2);
- if(h != NULL) {
- printf("Character server IP address : %s -> %d.%d.%d.%d\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- sprintf(char_ip_str, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- } else
- memcpy(char_ip_str, w2, 16);
- } else if (strcmpi(w1, "bind_ip") == 0) {
- bind_ip_set_ = 1;
- h = gethostbyname (w2);
- if(h != NULL) {
- printf("Character server binding IP address : %s -> %d.%d.%d.%d\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- sprintf(bind_ip_str, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- } else
- memcpy(bind_ip_str, w2, 16);
- } else if (strcmpi(w1, "char_port") == 0) {
- char_port = atoi(w2);
- } else if (strcmpi(w1, "char_maintenance") == 0) {
- char_maintenance = atoi(w2);
- } else if (strcmpi(w1, "char_new")==0){
- char_new = atoi(w2);
- } else if (strcmpi(w1, "max_connect_user") == 0) {
- max_connect_user = atoi(w2);
- if (max_connect_user < 0)
- max_connect_user = 0; // unlimited online players
- } else if(strcmpi(w1, "gm_allow_level") == 0) {
- gm_allow_level = atoi(w2);
- if(gm_allow_level < 0)
- gm_allow_level = 99;
- } else if (strcmpi(w1, "check_ip_flag") == 0) {
- check_ip_flag = config_switch(w2);
- } else if (strcmpi(w1, "autosave_time") == 0) {
- autosave_interval = atoi(w2)*1000;
- if (autosave_interval <= 0)
- autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
- } else if (strcmpi(w1, "start_point") == 0) {
- char map[32];
- int x, y;
- if (sscanf(w2,"%[^,],%d,%d", map, &x, &y) < 3)
- continue;
- if (strstr(map, ".gat") != NULL) { // Verify at least if '.gat' is in the map name
- memcpy(start_point.map, map, 16);
- start_point.x = x;
- start_point.y = y;
- }
- } else if (strcmpi(w1, "start_zeny") == 0) {
- start_zeny = atoi(w2);
- if (start_zeny < 0)
- start_zeny = 0;
- } else if (strcmpi(w1, "start_weapon") == 0) {
- start_weapon = atoi(w2);
- if (start_weapon < 0)
- start_weapon = 0;
- } else if (strcmpi(w1, "start_armor") == 0) {
- start_armor = atoi(w2);
- if (start_armor < 0)
- start_armor = 0;
- } else if(strcmpi(w1,"imalive_on")==0){ //Added by Mugendai for I'm Alive mod
- imalive_on = atoi(w2); //Added by Mugendai for I'm Alive mod
- } else if(strcmpi(w1,"imalive_time")==0){ //Added by Mugendai for I'm Alive mod
- imalive_time = atoi(w2); //Added by Mugendai for I'm Alive mod
- } else if(strcmpi(w1,"flush_on")==0){ //Added by Mugendai for GUI
- flush_on = atoi(w2); //Added by Mugendai for GUI
- } else if(strcmpi(w1,"flush_time")==0){ //Added by Mugendai for GUI
- flush_time = atoi(w2); //Added by Mugendai for GUI
- } else if(strcmpi(w1,"log_char")==0){ //log char or not [devil]
- log_char = atoi(w2);
- } else if (strcmpi(w1, "unknown_char_name") == 0) {
- strcpy(unknown_char_name, w2);
- unknown_char_name[24] = 0;
- } else if (strcmpi(w1, "name_ignoring_case") == 0) {
- name_ignoring_case = config_switch(w2);
- } else if (strcmpi(w1, "char_name_option") == 0) {
- char_name_option = atoi(w2);
- } else if (strcmpi(w1, "char_name_letters") == 0) {
- strcpy(char_name_letters, w2);
- } else if (strcmpi(w1, "check_ip_flag") == 0) {
- check_ip_flag = config_switch(w2);
- } else if (strcmpi(w1, "chars_per_account") == 0) { //maxchars per account [Sirius]
- char_per_account = atoi(w2);
- } else if (strcmpi(w1, "import") == 0) {
- char_config_read(w2);
- } else if (strcmpi(w1, "console") == 0) {
- if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
- console = 1;
- }
- }
- fclose(fp);
-
- return 0;
-}
-
-//-----------------------------------------------------
-//I'm Alive Alert
-//Used to output 'I'm Alive' every few seconds
-//Intended to let frontends know if the app froze
-//-----------------------------------------------------
-int imalive_timer(int tid, unsigned int tick, int id, int data){
- printf("I'm Alive\n");
- return 0;
-}
-
-//-----------------------------------------------------
-//Flush stdout
-//stdout buffer needs flushed to be seen in GUI
-//-----------------------------------------------------
-int flush_timer(int tid, unsigned int tick, int id, int data){
- fflush(stdout);
- return 0;
-}
-
-int do_init(int argc, char **argv){
- int i;
-
- SERVER_TYPE = SERVER_CHAR;
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- memset(&server[i], 0, sizeof(struct mmo_map_server));
- server_fd[i] = -1;
- }
-
- char_config_read((argc < 2) ? CHAR_CONF_NAME : argv[1]);
- char_lan_config_read((argc > 1) ? argv[1] : LAN_CONF_NAME);
- sql_config_read(SQL_CONF_NAME);
-
- printf("charserver configuration reading done.....\n");
-
- inter_init((argc > 2) ? argv[2] : inter_cfgName); // inter server ÃʱâÈ­
- printf("interserver configuration reading done.....\n");
-
- //Read ItemDB
- do_init_itemdb();
-
- printf("start char server initializing.....\n");
- mmo_char_sql_init();
- printf("char server initializing done.....\n");
-
- printf("set parser -> parse_char().....\n");
- set_defaultparse(parse_char);
-
- printf("set terminate function -> do_final().....\n");
- set_termfunc(do_final);
-
- if ((naddr_ != 0) && (login_ip_set_ == 0 || char_ip_set_ == 0)) {
- // The char server should know what IP address it is running on
- // - MouseJstr
- int localaddr = ntohl(addr_[0]);
- unsigned char *ptr = (unsigned char *) &localaddr;
- char buf[16];
- sprintf(buf, "%d.%d.%d.%d", ptr[0], ptr[1], ptr[2], ptr[3]);
- if (naddr_ != 1)
- printf("Multiple interfaces detected.. using %s as our IP address\n", buf);
- else
- printf("Defaulting to %s as our IP address\n", buf);
- if (login_ip_set_ == 0)
- strcpy(login_ip_str, buf);
- if (char_ip_set_ == 0)
- strcpy(char_ip_str, buf);
-
- if (ptr[0] == 192 && ptr[1] == 168)
- printf("Firewall detected.. edit lan_support.conf and char_athena.conf\n");
- }
-
- login_ip = inet_addr(login_ip_str);
- char_ip = inet_addr(char_ip_str);
-
- printf("open port %d.....\n",char_port);
- //char_fd = make_listen_port(char_port);
- if (bind_ip_set_)
- char_fd = make_listen_bind(inet_addr(bind_ip_str),char_port);
- else
- char_fd = make_listen_bind(INADDR_ANY,char_port);
-
- // send ALIVE PING to login server.
- printf("add interval tic (check_connect_login_server)....\n");
- i = add_timer_interval(gettick() + 10, check_connect_login_server, 0, 0, 10 * 1000);
-
- // send USER COUNT PING to login server.
- printf("add interval tic (send_users_tologin)....\n");
- i = add_timer_interval(gettick() + 10, send_users_tologin, 0, 0, 5 * 1000);
-
- //no need to set sync timer on SQL version.
- //printf("add interval tic (mmo_char_sync_timer)....\n");
- //i = add_timer_interval(gettick() + 10, mmo_char_sync_timer, 0, 0, autosave_interval);
-
- //Added for Mugendais I'm Alive mod
- if(imalive_on)
- add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000);
-
- //Added by Mugendai for GUI support
- if(flush_on)
- add_timer_interval(gettick()+10, flush_timer,0,0,flush_time);
-
- read_gm_account();
-
- if ( console ) {
- set_defaultconsoleparse(parse_console);
- start_console();
- }
-
- //Cleaning the tables for NULL entrys @ startup [Sirius]
- //Chardb clean
- printf("Cleaning the '%s' table...", char_db);
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `account_id` = '0'", char_db);
- if(mysql_query(&mysql_handle, tmp_sql)){
- //error on clean
- printf(" fail.\n");
- }else{
- printf(" done.\n");
- }
-
- //guilddb clean
- printf("Cleaning the '%s' table...", guild_db);
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_lv` = '0' AND `max_member` = '0' AND `exp` = '0' AND `next_exp` = '0' AND `average_lv` = '0'", guild_db);
- if(mysql_query(&mysql_handle, tmp_sql)){
- //error on clean
- printf(" fail.\n");
- }else{
- printf(" done.\n");
- }
-
- //guildmemberdb clean
- printf("Cleaning the '%s' table...", guild_member_db);
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '0' AND `account_id` = '0' AND `char_id` = '0'", guild_member_db);
- if(mysql_query(&mysql_handle, tmp_sql)){
- //error on clean
- printf(" fail.\n");
- }else{
- printf(" done.\n");
- }
-
-
-
- printf("char server init func end (now unlimited loop start!)....\n");
- printf("The char-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", char_port);
- return 0;
-}
-
-#undef mysql_query
-
-int debug_mysql_query(char *file, int line, void *mysql, const char *q) {
-#ifdef TWILIGHT
- printf("sql: %s:%d# %s\n", file, line, q);
-#endif
- return mysql_query((MYSQL *) mysql, q);
-}
-
-int char_child(int parent_id, int child_id) {
- int tmp_id = 0;
- sprintf (tmp_sql, "SELECT `child` FROM `%s` WHERE `char_id` = '%d'", char_db, parent_id);
- if (mysql_query (&mysql_handle, tmp_sql)) {
- printf ("DB server Error (select `char2`)- %s\n", mysql_error (&mysql_handle));
- }
- sql_res = mysql_store_result (&mysql_handle);
- if (sql_res) {
- sql_row = mysql_fetch_row (sql_res);
- tmp_id = atoi (sql_row[0]);
- mysql_free_result (sql_res);
- }
- else
- printf("CHAR: child Failed!\n");
- if ( tmp_id == child_id )
- return 1;
- else
- return 0;
-}
-
-int char_married(int pl1,int pl2) {
- int tmp_id = 0;
- sprintf (tmp_sql, "SELECT `partner_id` FROM `%s` WHERE `char_id` = '%d'", char_db, pl1);
- if (mysql_query (&mysql_handle, tmp_sql)) {
- printf ("DB server Error (select `char2`)- %s\n", mysql_error (&mysql_handle));
- }
- sql_res = mysql_store_result (&mysql_handle);
- if (sql_res) {
- sql_row = mysql_fetch_row (sql_res);
- tmp_id = atoi (sql_row[0]);
- mysql_free_result (sql_res);
- }
- else
- printf("CHAR: married Failed!\n");
- if ( tmp_id == pl2 )
- return 1;
- else
- return 0;
-}
-
-int char_nick2id (char *name) {
- int char_id = 0;
- sprintf (tmp_sql, "SELECT `char_id` FROM `%s` WHERE `name` = '%s'", char_db, name);
- if (mysql_query (&mysql_handle, tmp_sql)) {
- printf ("DB server Error (select `char2`)- %s\n", mysql_error (&mysql_handle));
- }
- sql_res = mysql_store_result (&mysql_handle);
- if (sql_res) {
- sql_row = mysql_fetch_row (sql_res);
- char_id = atoi (sql_row[0]);
- mysql_free_result (sql_res);
- }
- else
- printf ("CHAR: nick2id Failed!\n");
- return char_id;
-}
-
diff --git a/src/char_sql/char.h b/src/char_sql/char.h
deleted file mode 100644
index 6ade96c36..000000000
--- a/src/char_sql/char.h
+++ /dev/null
@@ -1,90 +0,0 @@
-#include "../common/core.h"
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/mmo.h"
-#include "../common/version.h"
-#include "../common/db.h"
-
-#ifndef _CHAR_H_
-#define _CHAR_H_
-
-#define MAX_MAP_SERVERS 30
-
-#define LAN_CONF_NAME "conf/lan_support.conf"
-
-#define DEFAULT_AUTOSAVE_INTERVAL 300*1000
-
-struct mmo_map_server{
- long ip;
- short port;
- int users;
- char map[MAX_MAP_PER_SERVER][16];
-};
-struct itemtmp {
- int flag;//checked = 1 else 0
- int id;
- short nameid;
- short amount;
- unsigned short equip;
- char identify;
- char refine;
- char attribute;
- short card[4];
-};
-enum {
- TABLE_INVENTORY,
- TABLE_CART,
- TABLE_STORAGE,
- TABLE_GUILD_STORAGE,
-};
-struct itemtemp{
- struct itemtmp equip[MAX_GUILD_STORAGE],notequip[MAX_GUILD_STORAGE];
-};
-int memitemdata_to_sql(struct itemtmp mapitem[], int count, int char_id,int tableswitch);
-int mapif_sendall(unsigned char *buf,unsigned int len);
-int mapif_sendallwos(int fd,unsigned char *buf,unsigned int len);
-int mapif_send(int fd,unsigned char *buf,unsigned int len);
-
-int char_nick2id (char *name);
-int char_married(int pl1,int pl2);
-int char_child(int parent_id, int child_id);
-
-extern int autosave_interval;
-extern char db_path[];
-extern char char_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 reg_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 int db_use_sqldbs; // added for sql item_db read for char server [Valaris]
-extern char login_db_level[32];
-extern char login_db_account_id[32];
-
-extern int lowest_gm_level;
-extern int GM_num;
-extern struct gm_account *gm_account;
-
-extern int debug_mysql_query(char *file, int line, void *mysql, const char *q);
-
-#endif
-
-#include "inter.h"
-#include "int_pet.h"
-#include "int_guild.h"
-#include "int_party.h"
-#include "int_storage.h"
diff --git a/src/char_sql/int_guild.c b/src/char_sql/int_guild.c
deleted file mode 100644
index 794f2e01f..000000000
--- a/src/char_sql/int_guild.c
+++ /dev/null
@@ -1,1719 +0,0 @@
-//
-// original code from athena
-// SQL conversion by hack
-//
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "char.h"
-#include "../common/strlib.h"
-#include "int_storage.h"
-#include "inter.h"
-#include "int_guild.h"
-#include "int_storage.h"
-#include "mmo.h"
-#include "socket.h"
-#include "db.h"
-#include "malloc.h"
-
-static struct dbt *guild_db_;
-static struct dbt *castle_db_;
-
-static struct guild *guild_pt;
-static struct guild *guild_pt2;
-static struct guild_castle * guildcastle_pt;
-static int guild_newid=10000;
-
-static int guild_exp[100];
-
-int mapif_parse_GuildLeave(int fd,int guild_id,int account_id,int char_id,int flag,const char *mes);
-int mapif_guild_broken(int guild_id,int flag);
-int guild_check_empty(struct guild *g);
-int guild_calcinfo(struct guild *g);
-int mapif_guild_basicinfochanged(int guild_id,int type,const void *data,int len);
-int mapif_guild_info(int fd,struct guild *g);
-int guild_break_sub(void *key,void *data,va_list ap);
-
-#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
-
-static int _erase_guild(void *key, void *data, va_list ap) {
- int guild = va_arg(ap, int);
- struct guild_castle * castle = (struct guild_castle *) data;
- if (castle->guild_id == guild) {
- aFree(castle);
- db_erase(castle_db_, key);
- }
-
- return 0;
-}
-
-// Save guild into sql
-int inter_guild_tosql(struct guild *g,int flag)
-{
- // 1 `guild` (`guild_id`, `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`castle_id`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data`)
- // 2 `guild_member` (`guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name`)
- // 4 `guild_position` (`guild_id`,`position`,`name`,`mode`,`exp_mode`)
- // 8 `guild_alliance` (`guild_id`,`opposition`,`alliance_id`,`name`)
- // 16 `guild_expulsion` (`guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3`)
- // 32 `guild_skill` (`guild_id`,`id`,`lv`)
-
- char t_name[100],t_master[24],t_mes1[60],t_mes2[240],t_member[24],t_position[24],t_alliance[24]; // temporay storage for str convertion;
- char t_ename[24],t_emes[40];
- char emblem_data[4096];
- int i=0;
- int guild_exist=0,guild_member=0,guild_online_member=0;
-
- if (g->guild_id<=0) return -1;
-
- printf("(\033[1;35m%d\033[0m) Request save guild -(flag 0x%x) ",g->guild_id, flag);
-
- jstrescapecpy(t_name, g->name);
-
- //printf("- Check if guild %d exists\n",g->guild_id);
- sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_db,g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) );
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- sql_row = mysql_fetch_row(sql_res);
- guild_exist = atoi (sql_row[0]);
- //printf("- Check if guild %d exists : %s\n",g->guild_id,((guild_exist==0)?"No":"Yes"));
- }
- mysql_free_result(sql_res) ; //resource free
-
- if (guild_exist >0){
- // Check members in party
- sprintf(tmp_sql,"SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_member_db, g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- return -1;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- sql_row = mysql_fetch_row(sql_res);
-
- guild_member = atoi (sql_row[0]);
- // printf("- Check members in guild %d : %d \n",g->guild_id,guild_member);
-
- }
- mysql_free_result(sql_res) ; //resource free
-
- // Delete old guild from sql
- if (flag&1||guild_member==0){
- // printf("- Delete guild %d from guild\n",g->guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_db, g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- if (flag&2||guild_member==0){
- // printf("- Delete guild %d from guild_member\n",g->guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_member_db, g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_member`)- %s\n", mysql_error(&mysql_handle) );
- }
- sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d'",char_db, g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- if (flag&32||guild_member==0){
- // printf("- Delete guild %d from guild_skill\n",g->guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_skill_db, g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_skill`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- if (flag&4||guild_member==0){
- // printf("- Delete guild %d from guild_position\n",g->guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_position_db, g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- if (flag&16||guild_member==0){
- // printf("- Delete guild %d from guild_expulsion\n",g->guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_expulsion_db, g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_expulsion`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- if (flag&8||guild_member==0){
- // printf("- Delete guild %d from guild_alliance\n",g->guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d' OR `alliance_id`='%d'",guild_alliance_db, g->guild_id,g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_alliance`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- if (flag&2||guild_member==0){
- // printf("- Delete guild %d from char\n",g->guild_id);
- sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d'",char_db, g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_alliance`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- if (guild_member==0){
- // printf("- Delete guild %d from guild_castle\n",g->guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_castle_db, g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_castle`)- %s\n", mysql_error(&mysql_handle) );
- }
- db_foreach(castle_db_, _erase_guild, g->guild_id);
- }
- }
-
- guild_online_member = 0;
- i=0;
- while (i<g->max_member) {
- if (g->member[i].account_id>0) guild_online_member++;
- i++;
- }
-
- // No member in guild , no need to create it in sql
- if (guild_member <= 0 && guild_online_member <=0) {
- inter_guild_storage_delete(g->guild_id);
- printf("No member in guild %d , break it! \n",g->guild_id);
- return -2;
- }
-
- // Insert new guild to sqlserver
- if (flag&1||guild_member==0){
- int len=0;
- //printf("- Insert guild %d to guild\n",g->guild_id);
- for(i=0;i<g->emblem_len;i++){
- len+=sprintf(emblem_data+len,"%02x",(unsigned char)(g->emblem_data[i]));
- //printf("%02x",(unsigned char)(g->emblem_data[i]));
- }
- emblem_data[len] = '\0';
- //printf("- emblem_len = %d \n",g->emblem_len);
- sprintf(tmp_sql,"INSERT INTO `%s` "
- "(`guild_id`, `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`castle_id`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data`) "
- "VALUES ('%d', '%s', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s', '%s', '%d', '%d', '%s')",
- guild_db, g->guild_id,t_name,jstrescapecpy(t_master,g->master),
- g->guild_lv,g->connect_member,g->max_member,g->average_lv,g->exp,g->next_exp,g->skill_point,g->castle_id,
- jstrescapecpy(t_mes1,g->mes1),jstrescapecpy(t_mes2,g->mes2),g->emblem_len,g->emblem_id,emblem_data);
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (insert `guild`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
-
- if (flag&2||guild_member==0){
- struct StringBuf sbuf;
- struct StringBuf sbuf2;
- int first = 1;
- StringBuf_Init(&sbuf2);
- StringBuf_Init(&sbuf);
-
- StringBuf_Printf(&sbuf,"REPLACE `%s` (`guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name`) VALUES \n", guild_member_db);
-
- StringBuf_Printf(&sbuf2, "UPDATE `%s` SET `guild_id`='%d' WHERE `char_id` IN (",char_db, g->guild_id);
-
- //printf("- Insert guild %d to guild_member\n",g->guild_id);
- for(i=0;i<g->max_member;i++){
- if (g->member[i].account_id>0){
- struct guild_member *m = &g->member[i];
- if (first == 0) {
- StringBuf_Printf(&sbuf , ", ");
- StringBuf_Printf(&sbuf2, ", ");
- } else
- first = 0;
- StringBuf_Printf(&sbuf, "('%d','%d','%d','%d','%d', '%d','%d','%d','%d','%d','%d','%d','%d','%d','%s')\n",
- g->guild_id,
- m->account_id,m->char_id,
- m->hair,m->hair_color,m->gender,
- m->class_,m->lv,m->exp,m->exp_payper,m->online,m->position,
- 0,0,
- jstrescapecpy(t_member,m->name));
-
- StringBuf_Printf(&sbuf2, "'%d'", m->char_id);
- }
- }
- StringBuf_Printf(&sbuf2,")");
-
- if(mysql_query(&mysql_handle, StringBuf_Value(&sbuf)))
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
-
- if(mysql_query(&mysql_handle, StringBuf_Value(&sbuf2)))
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
-
- StringBuf_Destroy(&sbuf2);
- StringBuf_Destroy(&sbuf);
- }
-
- if (flag&4||guild_member==0){
- //printf("- Insert guild %d to guild_position\n",g->guild_id);
- for(i=0;i<MAX_GUILDPOSITION;i++){
- struct guild_position *p = &g->position[i];
- sprintf(tmp_sql,"INSERT INTO `%s` (`guild_id`,`position`,`name`,`mode`,`exp_mode`) VALUES ('%d','%d', '%s','%d','%d')",
- guild_position_db, g->guild_id, i, jstrescapecpy(t_position,p->name),p->mode,p->exp_mode);
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (insert `guild_position`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- }
-
- if (flag&8||guild_member==0){
- //printf("- Insert guild %d to guild_alliance\n",g->guild_id);
- for(i=0;i<MAX_GUILDALLIANCE;i++){
- struct guild_alliance *a=&g->alliance[i];
- if(a->guild_id>0){
- sprintf(tmp_sql,"INSERT INTO `%s` (`guild_id`,`opposition`,`alliance_id`,`name`) "
- "VALUES ('%d','%d','%d','%s')",
- guild_alliance_db, g->guild_id,a->opposition,a->guild_id,jstrescapecpy(t_alliance,a->name));
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (insert `guild_alliance`)- %s\n", mysql_error(&mysql_handle) );
- }
- sprintf(tmp_sql,"INSERT INTO `%s` (`guild_id`,`opposition`,`alliance_id`,`name`) "
- "VALUES ('%d','%d','%d','%s')",
- guild_alliance_db, a->guild_id,a->opposition,g->guild_id,t_name);
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (insert `guild_alliance`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- }
- }
-
- if (flag&16||guild_member==0){
- //printf("- Insert guild %d to guild_expulsion\n",g->guild_id);
- for(i=0;i<MAX_GUILDEXPLUSION;i++){
- struct guild_explusion *e=&g->explusion[i];
- if(e->account_id>0){
- sprintf(tmp_sql,"INSERT INTO `%s` (`guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3`) "
- "VALUES ('%d','%s','%s','%s','%d','%d','%d','%d')",
- guild_expulsion_db, g->guild_id,
- jstrescapecpy(t_ename,e->name),jstrescapecpy(t_emes,e->mes),e->acc,e->account_id,e->rsv1,e->rsv2,e->rsv3 );
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (insert `guild_expulsion`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- }
- }
-
- if (flag&32||guild_member==0){
- //printf("- Insert guild %d to guild_skill\n",g->guild_id);
- for(i=0;i<MAX_GUILDSKILL;i++){
- if (g->skill[i].id>0){
- sprintf(tmp_sql,"INSERT INTO `%s` (`guild_id`,`id`,`lv`) VALUES ('%d','%d','%d')",
- guild_skill_db, g->guild_id,g->skill[i].id,g->skill[i].lv);
- //printf("%s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (insert `guild_skill`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- }
- }
-
- printf("Save guild done\n");
- return 0;
-}
-
-// Read guild from sql
-struct guild * inter_guild_fromsql(int guild_id)
-{
- int i;
- char emblem_data[4096];
- char *pstr;
- struct guild *g;
-
- if (guild_id<=0) return 0;
-
- g = (struct guild*)numdb_search(guild_db_,guild_id);
- if (g != NULL)
- return g;
-
- g = (struct guild*)aMalloc(sizeof(struct guild));
- memset(g,0,sizeof(struct guild));
-
-// printf("Retrieve guild information from sql ......\n");
-// printf("- Read guild %d from sql \n",guild_id);
-
- sprintf(tmp_sql,"SELECT `guild_id`, `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`castle_id`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data` "
- "FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id);
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (select `guild`)- %s\n", mysql_error(&mysql_handle) );
- aFree(g);
- return 0;
- }
-
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- sql_row = mysql_fetch_row(sql_res);
- if (sql_row==NULL) {
- mysql_free_result(sql_res);
- aFree(g);
- return 0;
- }
-
- g->guild_id=atoi(sql_row[0]);
- strncpy(g->name,sql_row[1],24);
- strncpy(g->master,sql_row[2],24);
- g->guild_lv=atoi(sql_row[3]);
- g->connect_member=atoi(sql_row[4]);
- if (atoi(sql_row[5]) > MAX_GUILD) // Fix reduction of MAX_GUILD [PoW]
- g->max_member = MAX_GUILD;
- else
- g->max_member = atoi(sql_row[5]);
- g->average_lv=atoi(sql_row[6]);
- g->exp=atoi(sql_row[7]);
- g->next_exp=atoi(sql_row[8]);
- g->skill_point=atoi(sql_row[9]);
- g->castle_id=atoi(sql_row[10]);
- strncpy(g->mes1,sql_row[11],60);
- strncpy(g->mes2,sql_row[12],120);
- g->emblem_len=atoi(sql_row[13]);
- g->emblem_id=atoi(sql_row[14]);
- strncpy(emblem_data,sql_row[15],4096);
- for(i=0,pstr=emblem_data;i<g->emblem_len;i++,pstr+=2){
- int c1=pstr[0],c2=pstr[1],x1=0,x2=0;
- if(c1>='0' && c1<='9')x1=c1-'0';
- if(c1>='a' && c1<='f')x1=c1-'a'+10;
- if(c1>='A' && c1<='F')x1=c1-'A'+10;
- if(c2>='0' && c2<='9')x2=c2-'0';
- if(c2>='a' && c2<='f')x2=c2-'a'+10;
- if(c2>='A' && c2<='F')x2=c2-'A'+10;
- g->emblem_data[i]=(x1<<4)|x2;
- }
- }
- mysql_free_result(sql_res);
-
- //printf("- Read guild_member %d from sql \n",guild_id);
- sprintf(tmp_sql,"SELECT `guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name` "
- "FROM `%s` WHERE `guild_id`='%d' ORDER BY `position`", guild_member_db, guild_id);
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (select `guild_member`)- %s\n", mysql_error(&mysql_handle) );
- aFree(g);
- return 0;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- int i;
- for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<g->max_member);i++){
- struct guild_member *m = &g->member[i];
- m->account_id=atoi(sql_row[1]);
- m->char_id=atoi(sql_row[2]);
- m->hair=atoi(sql_row[3]);
- m->hair_color=atoi(sql_row[4]);
- m->gender=atoi(sql_row[5]);
- m->class_=atoi(sql_row[6]);
- m->lv=atoi(sql_row[7]);
- m->exp=atoi(sql_row[8]);
- m->exp_payper=atoi(sql_row[9]);
- m->online=atoi(sql_row[10]);
- if (atoi(sql_row[11]) >= MAX_GUILDPOSITION) // Fix reduction of MAX_GUILDPOSITION [PoW]
- m->position = MAX_GUILDPOSITION - 1;
- else
- m->position = atoi(sql_row[11]);
-
- strncpy(m->name,sql_row[14],24);
- }
- }
- mysql_free_result(sql_res);
-
- //printf("- Read guild_position %d from sql \n",guild_id);
- sprintf(tmp_sql,"SELECT `guild_id`,`position`,`name`,`mode`,`exp_mode` FROM `%s` WHERE `guild_id`='%d'",guild_position_db, guild_id);
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (select `guild_position`)- %s\n", mysql_error(&mysql_handle) );
- aFree(g);
- return 0;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- int i;
- for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDPOSITION);i++){
- int position = atoi(sql_row[1]);
- struct guild_position *p = &g->position[position];
- strncpy(p->name,sql_row[2],24);
- p->mode=atoi(sql_row[3]);
- p->exp_mode=atoi(sql_row[4]);
- }
- }
- mysql_free_result(sql_res);
-
- //printf("- Read guild_alliance %d from sql \n",guild_id);
- sprintf(tmp_sql,"SELECT `guild_id`,`opposition`,`alliance_id`,`name` FROM `%s` WHERE `guild_id`='%d'",guild_alliance_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (select `guild_alliance`)- %s\n", mysql_error(&mysql_handle) );
- aFree(g);
- return 0;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- int i;
- for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDALLIANCE);i++){
- struct guild_alliance *a = &g->alliance[i];
- a->opposition=atoi(sql_row[1]);
- a->guild_id=atoi(sql_row[2]);
- strncpy(a->name,sql_row[3],24);
- }
- }
- mysql_free_result(sql_res);
-
- //printf("- Read guild_expulsion %d from sql \n",guild_id);
- sprintf(tmp_sql,"SELECT `guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3` FROM `%s` WHERE `guild_id`='%d'",guild_expulsion_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (select `guild_expulsion`)- %s\n", mysql_error(&mysql_handle) );
- aFree(g);
- return 0;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- int i;
- for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDEXPLUSION);i++){
- struct guild_explusion *e = &g->explusion[i];
-
- strncpy(e->name,sql_row[1],24);
- strncpy(e->mes,sql_row[2],40);
- strncpy(e->acc,sql_row[3],24);
- e->account_id=atoi(sql_row[4]);
- e->rsv1=atoi(sql_row[5]);
- e->rsv2=atoi(sql_row[6]);
- e->rsv3=atoi(sql_row[7]);
-
- }
- }
- mysql_free_result(sql_res);
-
- //printf("- Read guild_skill %d from sql \n",guild_id);
- sprintf(tmp_sql,"SELECT `guild_id`,`id`,`lv` FROM `%s` WHERE `guild_id`='%d' ORDER BY `id`",guild_skill_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (select `guild_skill`)- %s\n", mysql_error(&mysql_handle) );
- aFree(g);
- return 0;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- int i;
- for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDSKILL);i++){
- g->skill[i].id=atoi(sql_row[1]);
- g->skill[i].lv=atoi(sql_row[2]);
- }
- }
- mysql_free_result(sql_res);
-
-// printf("Successfully retrieve guild information from sql!\n");
-
- numdb_insert(guild_db_, guild_id,g);
-
- return g;
-}
-
-#if 1
-static int _set_guild_castle(void *key, void *data, va_list ap) {
- int castle_id = va_arg(ap, int);
- int guild_id = va_arg(ap, int);
- struct guild * g = (struct guild *) data;
-
- if (g->castle_id == castle_id)
- g->castle_id = -1;
- if (g->guild_id == guild_id)
- g->castle_id = castle_id;
- return 0;
-}
-#endif
-
-int inter_guildcastle_tosql(struct guild_castle *gc)
-{
- struct guild_castle *gcopy;
- if(gc == NULL || gc->castle_id < 0 ){ //gc->castle_id can be == 0 (for the 1st castle it's == 0) [Lupus]
- return 0;
- }
- //printf("[Guild Castle %02i]: Save...\n",gc->castle_id);
- gcopy = (struct guild_castle *) numdb_search(castle_db_,gc->castle_id);
- if (gcopy == NULL) {
- gcopy = (struct guild_castle *) aMalloc(sizeof(struct guild_castle));
- numdb_insert(castle_db_, gc->castle_id, gcopy);
- } else {
- //if the castle data hasn't been changed, then we don't write it into SQL
- if ((gc->guild_id == gcopy->guild_id ) && ( gc->economy == gcopy->economy ) && ( gc->defense == gcopy->defense ) && ( gc->triggerE == gcopy->triggerE ) && ( gc->triggerD == gcopy->triggerD ) && ( gc->nextTime == gcopy->nextTime ) && ( gc->payTime == gcopy->payTime ) && ( gc->createTime == gcopy->createTime ) && ( gc->visibleC == gcopy->visibleC ) && ( gc->visibleG0 == gcopy->visibleG0 ) && ( gc->visibleG1 == gcopy->visibleG1 ) && ( gc->visibleG2 == gcopy->visibleG2 ) && ( gc->visibleG3 == gcopy->visibleG3 ) && ( gc->visibleG4 == gcopy->visibleG4 ) && ( gc->visibleG5 == gcopy->visibleG5 ) && ( gc->visibleG6 == gcopy->visibleG6 ) && ( gc->visibleG7 == gcopy->visibleG7 ) && ( gc->Ghp0 == gcopy->Ghp0 ) && ( gc->Ghp1 == gcopy->Ghp1 ) && ( gc->Ghp2 == gcopy->Ghp2 ) && ( gc->Ghp3 == gcopy->Ghp3 ) && ( gc->Ghp4 == gcopy->Ghp4 ) && ( gc->Ghp5 == gcopy->Ghp5 ) && ( gc->Ghp6 == gcopy->Ghp6 ) && ( gc->Ghp7 == gcopy->Ghp7 ))
- return 0;
- }
- //printf("[Guild Castle %02i]: Save... ->SQL\n",gc->castle_id);
- memcpy(gcopy, gc, sizeof(struct guild_castle));
-
- sprintf(tmp_sql,"REPLACE INTO `%s` "
- "(`castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`,"
- "`visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`,"
- "`Ghp0`, `Ghp1`, `Ghp2`, `Ghp3`, `Ghp4`, `Ghp5`, `Ghp6`, `Ghp7`)"
- "VALUES ('%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d')",
- guild_castle_db, gc->castle_id, gc->guild_id, gc->economy, gc->defense, gc->triggerE, gc->triggerD, gc->nextTime, gc->payTime,
- gc->createTime, gc->visibleC, gc->visibleG0, gc->visibleG1, gc->visibleG2, gc->visibleG3, gc->visibleG4, gc->visibleG5,
- gc->visibleG6, gc->visibleG7, gc->Ghp0, gc->Ghp1, gc->Ghp2, gc->Ghp3, gc->Ghp4, gc->Ghp5, gc->Ghp6, gc->Ghp7);
-
- //printf(" %s\n",tmp_sql);
-
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- return 0;
- }
-
- db_foreach(guild_db_, _set_guild_castle, gc->castle_id,gc->guild_id);
-
- return 0;
-}
-
-// Read guild_castle from sql
-int inter_guildcastle_fromsql(int castle_id,struct guild_castle *gc)
-{
- struct guild_castle *gcopy;
- if (gc==NULL) return 0;
- //printf("Read from guild_castle\n");
-
- gcopy = (struct guild_castle*)numdb_search(castle_db_, castle_id);
- if (gcopy == NULL) {
- gcopy = (struct guild_castle*)aMalloc(sizeof(struct guild_castle));
- numdb_insert(castle_db_, gc->castle_id, gcopy);
- } else {
- memcpy(gc, gcopy, sizeof(struct guild_castle));
- return 0;
- }
-
- gc->castle_id=castle_id;
- if (castle_id==-1) return 0;
- sprintf(tmp_sql,"SELECT `castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`, "
- "`visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`,"
- "`Ghp0`, `Ghp1`, `Ghp2`, `Ghp3`, `Ghp4`, `Ghp5`, `Ghp6`, `Ghp7`"
- " FROM `%s` WHERE `castle_id`='%d'",guild_castle_db, castle_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- return 0;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- sql_row = mysql_fetch_row(sql_res);
- if (sql_row==NULL){
- mysql_free_result(sql_res);
- return 0;
- }
-
- gc->guild_id = atoi (sql_row[1]);
- gc->economy = atoi (sql_row[2]);
- gc->defense = atoi (sql_row[3]);
- gc->triggerE = atoi (sql_row[4]);
- gc->triggerD = atoi (sql_row[5]);
- gc->nextTime = atoi (sql_row[6]);
- gc->payTime = atoi (sql_row[7]);
- gc->createTime = atoi (sql_row[8]);
- gc->visibleC = atoi (sql_row[9]);
- gc->visibleG0 = atoi (sql_row[10]);
- gc->visibleG1 = atoi (sql_row[11]);
- gc->visibleG2 = atoi (sql_row[12]);
- gc->visibleG3 = atoi (sql_row[13]);
- gc->visibleG4 = atoi (sql_row[14]);
- gc->visibleG5 = atoi (sql_row[15]);
- gc->visibleG6 = atoi (sql_row[16]);
- gc->visibleG7 = atoi (sql_row[17]);
- gc->Ghp0 = atoi (sql_row[18]);
- gc->Ghp1 = atoi (sql_row[19]);
- gc->Ghp2 = atoi (sql_row[20]);
- gc->Ghp3 = atoi (sql_row[21]);
- gc->Ghp4 = atoi (sql_row[22]);
- gc->Ghp5 = atoi (sql_row[23]);
- gc->Ghp6 = atoi (sql_row[24]);
- gc->Ghp7 = atoi (sql_row[25]);
-
- //printf("Read Castle %d of guild %d from sql \n",castle_id,gc->guild_id);
-
- }
- mysql_free_result(sql_res) ; //resource free
-
- memcpy(gcopy, gc, sizeof(struct guild_castle));
-
- return 0;
-}
-
-// Read exp_guild.txt
-int inter_guild_readdb()
-{
- int i;
- FILE *fp;
- char line[1024];
- for (i=0;i<100;i++) guild_exp[i]=0;
-
- fp=fopen("db/exp_guild.txt","r");
- if(fp==NULL){
- printf("can't read db/exp_guild.txt\n");
- return 1;
- }
- i=0;
- while(fgets(line,256,fp) && i<100){
- if(line[0]=='/' && line[1]=='/')
- continue;
- guild_exp[i]=atoi(line);
- i++;
- }
- fclose(fp);
-
- return 0;
-}
-
-
-// Initialize guild sql
-int inter_guild_sql_init()
-{
- int i;
-
- guild_db_=numdb_init();
- castle_db_=numdb_init();
-
- printf("interserver guild memory initialize.... (%d byte)\n",sizeof(struct guild));
- guild_pt = (struct guild*)aCalloc(sizeof(struct guild), 1);
- guild_pt2= (struct guild*)aCalloc(sizeof(struct guild), 1);
- guildcastle_pt = (struct guild_castle*)aCalloc(sizeof(struct guild_castle), 1);
-
- inter_guild_readdb(); // Read exp
-
- sprintf (tmp_sql , "SELECT count(*) FROM `%s`",guild_db);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- exit(0);
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = mysql_fetch_row(sql_res);
- printf("total guild data -> '%s'.......\n",sql_row[0]);
- i = atoi (sql_row[0]);
- mysql_free_result(sql_res);
-
- if (i > 0) {
- //set party_newid
- sprintf (tmp_sql , "SELECT max(`guild_id`) FROM `%s`",guild_db);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- exit(0);
- }
-
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = mysql_fetch_row(sql_res);
- guild_newid = atoi(sql_row[0])+1;
- mysql_free_result(sql_res);
- }
-
- printf("set guild_newid: %d.......\n",guild_newid);
-
- return 0;
-}
-
-int guild_db_final (void *k, void *data, va_list ap)
-{
- struct guild *g = (struct guild *) data;
- if (g) aFree(g);
- return 0;
-}
-int castle_db_final (void *k, void *data, va_list ap)
-{
- struct guild_castle *gc = (struct guild_castle *) data;
- if (gc) aFree(gc);
- return 0;
-}
-void inter_guild_sql_final()
-{
- if (guild_pt) aFree(guild_pt);
- if (guild_pt2) aFree(guild_pt2);
- if (guildcastle_pt) aFree(guildcastle_pt);
-
- numdb_final(guild_db_, guild_db_final);
- numdb_final(castle_db_, castle_db_final);
-
- return;
-}
-
-// Get guild by its name
-struct guild* search_guildname(char *str)
-{
- char t_name[24];
- int guild_id=0;
- printf("search_guildname\n");
- sprintf (tmp_sql , "SELECT `guild_id` FROM `%s` WHERE `name`='%s'",guild_db, jstrescapecpy(t_name,str));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- sql_row = mysql_fetch_row(sql_res);
- guild_id = atoi (sql_row[0]);
- }
- mysql_free_result(sql_res);
- return inter_guild_fromsql(guild_id);
-}
-
-// Check if guild is empty
-int guild_check_empty(struct guild *g)
-{
- int i;
- for(i=0;i<g->max_member;i++){
- if(g->member[i].account_id>0){
- return 0;
- }
- }
-
- // ’N‚à‚¢‚È‚¢‚̂ʼnðŽU
- mapif_guild_broken(g->guild_id,0);
- inter_guild_storage_delete(g->guild_id);
- inter_guild_tosql(g,255);
- memset(g,0,sizeof(struct guild));
- return 1;
-}
-
-int guild_nextexp(int level)
-{
- if(level < 100 && level >0) // Change by hack
- return guild_exp[level-1];
-
- return 0;
-}
-
-// ƒMƒ‹ƒhƒXƒLƒ‹‚ª‚ ‚é‚©Šm”F
-int guild_checkskill(struct guild *g,int id) {
-
- int idx = id - GD_SKILLBASE;
-
-
- if(idx < 0 || idx >= MAX_GUILDSKILL)
-
- return 0;
-
- return g->skill[idx].lv;
-
-}
-
-// ƒMƒ‹ƒh‚Ìî•ñ‚ÌÄŒvŽZ
-int guild_calcinfo(struct guild *g)
-{
- int i,c,nextexp;
- struct guild before=*g;
-
- // ƒXƒLƒ‹ID‚ÌÝ’è
- for(i=0;i<MAX_GUILDSKILL;i++)
- g->skill[i].id=i+GD_SKILLBASE;
-
- // ƒMƒ‹ƒhƒŒƒxƒ‹
- if(g->guild_lv<=0) g->guild_lv=1;
- nextexp = guild_nextexp(g->guild_lv);
- if(nextexp > 0) {
- while(g->exp >= nextexp && nextexp>0){ // Change by hack
- g->exp-=nextexp;
- g->guild_lv++;
- g->skill_point++;
- nextexp = guild_nextexp(g->guild_lv);
- }
- }
-
- // ƒMƒ‹ƒh‚ÌŽŸ‚ÌŒoŒ±’l
- g->next_exp = guild_nextexp(g->guild_lv);
-
- // ƒƒ“ƒoãŒÀiƒMƒ‹ƒhŠg’£“K—pj
- g->max_member = 16 + guild_checkskill(g, GD_EXTENSION) * 6; // Guild Extention skill - adds by 6 people per level to Max Member [Lupus]
-
- // •½‹ÏƒŒƒxƒ‹‚ƃIƒ“ƒ‰ƒCƒ“l”
- g->average_lv=0;
- g->connect_member=0;
- for(i=c=0;i<g->max_member;i++){
- if(g->member[i].account_id>0){
- g->average_lv+=g->member[i].lv;
- c++;
-
- if(g->member[i].online>0)
- g->connect_member++;
- }
- }
- if(c) g->average_lv/=c;
-
- // ‘Sƒf[ƒ^‚ð‘—‚é•K—v‚ª‚ ‚è‚»‚¤
- if( g->max_member!=before.max_member ||
- g->guild_lv!=before.guild_lv ||
- g->skill_point!=before.skill_point ){
- mapif_guild_info(-1,g);
- return 1;
- }
-
- return 0;
-}
-
-//-------------------------------------------------------------------
-// map server‚Ö‚Ì’ÊM
-
-// ƒMƒ‹ƒh쬉”Û
-int mapif_guild_created(int fd,int account_id,struct guild *g)
-{
- WFIFOW(fd,0)=0x3830;
- WFIFOL(fd,2)=account_id;
- if(g!=NULL){
- WFIFOL(fd,6)=g->guild_id;
- printf("int_guild: created! %d %s\n",g->guild_id,g->name);
- }else{
- WFIFOL(fd,6)=0;
- }
- WFIFOSET(fd,10);
- return 0;
-}
-// ƒMƒ‹ƒhî•ñŒ©‚‚©‚炸
-int mapif_guild_noinfo(int fd,int guild_id)
-{
- WFIFOW(fd,0)=0x3831;
- WFIFOW(fd,2)=8;
- WFIFOL(fd,4)=guild_id;
- WFIFOSET(fd,8);
- printf("int_guild: info not found %d\n",guild_id);
- return 0;
-}
-// ƒMƒ‹ƒhî•ñ‚Ü‚Æ‚ß‘—‚è
-int mapif_guild_info(int fd,struct guild *g)
-{
- unsigned char buf[16384];
- WBUFW(buf,0)=0x3831;
- memcpy(buf+4,g,sizeof(struct guild));
- WBUFW(buf,2)=4+sizeof(struct guild);
-// printf("int_guild: sizeof(guild)=%d\n",sizeof(struct guild));
- if(fd<0)
- mapif_sendall(buf,WBUFW(buf,2));
- else
- mapif_send(fd,buf,WBUFW(buf,2));
-// printf("int_guild: info %d %s\n",p->guild_id,p->name);
- return 0;
-}
-
-// ƒƒ“ƒo’ljÁ‰Â”Û
-int mapif_guild_memberadded(int fd,int guild_id,int account_id,int char_id,int flag)
-{
- WFIFOW(fd,0)=0x3832;
- WFIFOL(fd,2)=guild_id;
- WFIFOL(fd,6)=account_id;
- WFIFOL(fd,10)=char_id;
- WFIFOB(fd,14)=flag;
- WFIFOSET(fd,15);
- return 0;
-}
-// ’E‘Þ/’Ç•ú’Ê’m
-int mapif_guild_leaved(int guild_id,int account_id,int char_id,int flag,
- const char *name,const char *mes)
-{
- unsigned char buf[128];
- WBUFW(buf, 0)=0x3834;
- WBUFL(buf, 2)=guild_id;
- WBUFL(buf, 6)=account_id;
- WBUFL(buf,10)=char_id;
- WBUFB(buf,14)=flag;
- memcpy(WBUFP(buf,15),mes,40);
- memcpy(WBUFP(buf,55),name,24);
- mapif_sendall(buf,79);
- printf("int_guild: guild leaved %d %d %s %s\n",guild_id,account_id,name,mes);
- return 0;
-}
-
-// ƒIƒ“ƒ‰ƒCƒ“ó‘Ô‚ÆLvXV’Ê’m
-int mapif_guild_memberinfoshort(struct guild *g,int idx)
-{
- unsigned char buf[32];
- WBUFW(buf, 0)=0x3835;
- WBUFL(buf, 2)=g->guild_id;
- WBUFL(buf, 6)=g->member[idx].account_id;
- WBUFL(buf,10)=g->member[idx].char_id;
- WBUFB(buf,14)=(unsigned char)g->member[idx].online;
- WBUFW(buf,15)=g->member[idx].lv;
- WBUFW(buf,17)=g->member[idx].class_;
- mapif_sendall(buf,19);
- return 0;
-}
-
-// ‰ðŽU’Ê’m
-int mapif_guild_broken(int guild_id,int flag)
-{
- unsigned char buf[16];
- WBUFW(buf,0)=0x3836;
- WBUFL(buf,2)=guild_id;
- WBUFB(buf,6)=flag;
- mapif_sendall(buf,7);
- printf("int_guild: broken %d\n",guild_id);
- return 0;
-}
-
-// ƒMƒ‹ƒh“à”­Œ¾
-int mapif_guild_message(int guild_id,int account_id,char *mes,int len, int sfd)
-{
- unsigned char buf[512];
- WBUFW(buf,0)=0x3837;
- WBUFW(buf,2)=len+12;
- WBUFL(buf,4)=guild_id;
- WBUFL(buf,8)=account_id;
- memcpy(WBUFP(buf,12),mes,len);
- mapif_sendallwos(sfd, buf,len+12);
- return 0;
-}
-
-// ƒMƒ‹ƒhŠî–{î•ñ•ÏX’Ê’m
-int mapif_guild_basicinfochanged(int guild_id,int type,const void *data,int len)
-{
- unsigned char buf[2048];
- WBUFW(buf, 0)=0x3839;
- WBUFW(buf, 2)=len+10;
- WBUFL(buf, 4)=guild_id;
- WBUFW(buf, 8)=type;
- memcpy(WBUFP(buf,10),data,len);
- mapif_sendall(buf,len+10);
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒoî•ñ•ÏX’Ê’m
-int mapif_guild_memberinfochanged(int guild_id,int account_id,int char_id,
- int type,const void *data,int len)
-{
- unsigned char buf[2048];
- WBUFW(buf, 0)=0x383a;
- WBUFW(buf, 2)=len+18;
- WBUFL(buf, 4)=guild_id;
- WBUFL(buf, 8)=account_id;
- WBUFL(buf,12)=char_id;
- WBUFW(buf,16)=type;
- memcpy(WBUFP(buf,18),data,len);
- mapif_sendall(buf,len+18);
- return 0;
-}
-// ƒMƒ‹ƒhƒXƒLƒ‹ƒAƒbƒv’Ê’m
-int mapif_guild_skillupack(int guild_id,int skill_num,int account_id)
-{
- unsigned char buf[16];
- WBUFW(buf, 0)=0x383c;
- WBUFL(buf, 2)=guild_id;
- WBUFL(buf, 6)=skill_num;
- WBUFL(buf,10)=account_id;
- mapif_sendall(buf,14);
- return 0;
-}
-// ƒMƒ‹ƒh“¯–¿/“G‘Î’Ê’m
-int mapif_guild_alliance(int guild_id1,int guild_id2,int account_id1,int account_id2,
- int flag,const char *name1,const char *name2)
-{
- unsigned char buf[128];
- WBUFW(buf, 0)=0x383d;
- WBUFL(buf, 2)=guild_id1;
- WBUFL(buf, 6)=guild_id2;
- WBUFL(buf,10)=account_id1;
- WBUFL(buf,14)=account_id2;
- WBUFB(buf,18)=flag;
- memcpy(WBUFP(buf,19),name1,24);
- memcpy(WBUFP(buf,43),name2,24);
- mapif_sendall(buf,67);
- return 0;
-}
-
-// ƒMƒ‹ƒh–ðE•ÏX’Ê’m
-int mapif_guild_position(struct guild *g,int idx)
-{
- unsigned char buf[128];
- WBUFW(buf,0)=0x383b;
- WBUFW(buf,2)=sizeof(struct guild_position)+12;
- WBUFL(buf,4)=g->guild_id;
- WBUFL(buf,8)=idx;
- memcpy(WBUFP(buf,12),&g->position[idx],sizeof(struct guild_position));
- mapif_sendall(buf,WBUFW(buf,2));
- return 0;
-}
-
-// ƒMƒ‹ƒh’m•ÏX’Ê’m
-int mapif_guild_notice(struct guild *g)
-{
- unsigned char buf[256];
- WBUFW(buf,0)=0x383e;
- WBUFL(buf,2)=g->guild_id;
- memcpy(WBUFP(buf,6),g->mes1,60);
- memcpy(WBUFP(buf,66),g->mes2,120);
- mapif_sendall(buf,186);
- return 0;
-}
-// ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX’Ê’m
-int mapif_guild_emblem(struct guild *g)
-{
- unsigned char buf[2048];
- WBUFW(buf,0)=0x383f;
- WBUFW(buf,2)=g->emblem_len+12;
- WBUFL(buf,4)=g->guild_id;
- WBUFL(buf,8)=g->emblem_id;
- memcpy(WBUFP(buf,12),g->emblem_data,g->emblem_len);
- mapif_sendall(buf,WBUFW(buf,2));
- return 0;
-}
-
-int mapif_guild_castle_dataload(int castle_id,int index,int value) // <Agit>
-{
- unsigned char buf[16];
- WBUFW(buf, 0)=0x3840;
- WBUFW(buf, 2)=castle_id;
- WBUFB(buf, 4)=index;
- WBUFL(buf, 5)=value;
- mapif_sendall(buf,9);
- return 0;
-}
-
-int mapif_guild_castle_datasave(int castle_id,int index,int value) // <Agit>
-{
- unsigned char buf[16];
- WBUFW(buf, 0)=0x3841;
- WBUFW(buf, 2)=castle_id;
- WBUFB(buf, 4)=index;
- WBUFL(buf, 5)=value;
- mapif_sendall(buf,9);
- return 0;
-}
-
-int mapif_guild_castle_alldataload(int fd) {
- struct guild_castle* gc = guildcastle_pt;
- struct guild_castle *gcopy;
- int i, len = 4;
-
- WFIFOW(fd,0) = 0x3842;
- sprintf(tmp_sql, "SELECT * FROM `%s` ORDER BY `castle_id`", guild_castle_db);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res != NULL && mysql_num_rows(sql_res) > 0) {
- for(i = 0; ((sql_row = mysql_fetch_row(sql_res)) && i < MAX_GUILDCASTLE); i++) {
- memset(gc, 0, sizeof(struct guild_castle));
- gc->castle_id = atoi(sql_row[0]);
- gc->guild_id = atoi(sql_row[1]);
- gc->economy = atoi(sql_row[2]);
- gc->defense = atoi(sql_row[3]);
- gc->triggerE = atoi(sql_row[4]);
- gc->triggerD = atoi(sql_row[5]);
- gc->nextTime = atoi(sql_row[6]);
- gc->payTime = atoi(sql_row[7]);
- gc->createTime = atoi(sql_row[8]);
- gc->visibleC = atoi(sql_row[9]);
- gc->visibleG0 = atoi(sql_row[10]);
- gc->visibleG1 = atoi(sql_row[11]);
- gc->visibleG2 = atoi(sql_row[12]);
- gc->visibleG3 = atoi(sql_row[13]);
- gc->visibleG4 = atoi(sql_row[14]);
- gc->visibleG5 = atoi(sql_row[15]);
- gc->visibleG6 = atoi(sql_row[16]);
- gc->visibleG7 = atoi(sql_row[17]);
- gc->Ghp0 = atoi(sql_row[18]);
- gc->Ghp1 = atoi(sql_row[19]);
- gc->Ghp2 = atoi(sql_row[20]);
- gc->Ghp3 = atoi(sql_row[21]);
- gc->Ghp4 = atoi(sql_row[22]);
- gc->Ghp5 = atoi(sql_row[23]);
- gc->Ghp6 = atoi(sql_row[24]);
- gc->Ghp7 = atoi(sql_row[25]);
- memcpy(WFIFOP(fd,len), gc, sizeof(struct guild_castle));
-
- gcopy = (struct guild_castle*)numdb_search(castle_db_,gc->castle_id);
- if (gcopy == NULL) {
- gcopy = (struct guild_castle *) aMalloc(sizeof(struct guild_castle));
- numdb_insert(castle_db_, gc->castle_id, gcopy);
- }
- memcpy(gcopy, gc, sizeof(struct guild_castle));
-
- len += sizeof(struct guild_castle);
- }
- }
- mysql_free_result(sql_res);
- WFIFOW(fd,2) = len;
- WFIFOSET(fd,len);
-
- return 0;
-}
-
-
-//-------------------------------------------------------------------
-// map server‚©‚ç‚Ì’ÊM
-
-
-// ƒMƒ‹ƒh쬗v‹
-int mapif_parse_CreateGuild(int fd,int account_id,char *name,struct guild_member *master)
-{
- struct guild *g;
- int i;
-
- printf("CreateGuild\n");
- g=search_guildname(name);
- if(g!=NULL&&g->guild_id>0){
- printf("int_guild: same name guild exists [%s]\n",name);
- mapif_guild_created(fd,account_id,NULL);
- return 0;
- }
- g=guild_pt;
- memset(g,0,sizeof(struct guild));
- g->guild_id=guild_newid++;
- memcpy(g->name,name,24);
- memcpy(g->master,master->name,24);
- memcpy(&g->member[0],master,sizeof(struct guild_member));
-
- g->position[0].mode=0x11;
- strcpy(g->position[0].name,"GuildMaster");
- strcpy(g->position[MAX_GUILDPOSITION-1].name,"Newbie");
- for(i=1;i<MAX_GUILDPOSITION-1;i++)
- sprintf(g->position[i].name,"Position %d",i+1);
-
- // Initialize guild property
- g->max_member=16;
- g->average_lv=master->lv;
- g->castle_id=-1;
- for(i=0;i<MAX_GUILDSKILL;i++)
- g->skill[i].id=i + GD_SKILLBASE;
-
- // Save to sql
- printf("Create initialize OK!\n");
- i=inter_guild_tosql(g,255);
-
- if (i<0) {
- mapif_guild_created(fd,account_id,NULL);
- return 0;
- }
-
- // Report to client
- mapif_guild_created(fd,account_id,g);
- mapif_guild_info(fd,g);
-
- if(log_inter)
- inter_log("guild %s (id=%d) created by master %s (id=%d)" RETCODE,
- name, g->guild_id, master->name, master->account_id );
-
-
- return 0;
-}
-// Return guild info to client
-int mapif_parse_GuildInfo(int fd,int guild_id)
-{
- struct guild * g = inter_guild_fromsql(guild_id);
- if(g!=NULL&&g->guild_id>0){
- guild_calcinfo(g);
- mapif_guild_info(fd,g);
- //inter_guild_tosql(g,1); // Change guild
- }else
- mapif_guild_noinfo(fd,guild_id);
- return 0;
-}
-// Add member to guild
-int mapif_parse_GuildAddMember(int fd,int guild_id,struct guild_member *m)
-{
- struct guild *g = inter_guild_fromsql(guild_id);
- int i;
-
- if(g==NULL||g->guild_id<=0){
- mapif_guild_memberadded(fd,guild_id,m->account_id,m->char_id,1);
- return 0;
- }
-
- for(i=0;i<g->max_member;i++){
- if(g->member[i].account_id==0){
-
- memcpy(&g->member[i],m,sizeof(struct guild_member));
- mapif_guild_memberadded(fd,guild_id,m->account_id,m->char_id,0);
- guild_calcinfo(g);
- mapif_guild_info(-1,g);
- inter_guild_tosql(g,3); // Change guild & guild_member
- return 0;
- }
- }
- mapif_guild_memberadded(fd,guild_id,m->account_id,m->char_id,1);
- //inter_guild_tosql(g,3); // Change guild & guild_member
- return 0;
-}
-// Delete member from guild
-int mapif_parse_GuildLeave(int fd,int guild_id,int account_id,int char_id,int flag,const char *mes)
-{
- struct guild *g= inter_guild_fromsql(guild_id);
-
- if(g!=NULL&&g->guild_id>0){
- int i;
- for(i=0;i<g->max_member;i++){
- if( g->member[i].account_id==account_id &&
- g->member[i].char_id==char_id){
- printf("%d %d\n",i, (int)(&g->member[i]));
- printf("%d %s\n",i, g->member[i].name);
-
- if(flag){ // ’Ç•ú‚ÌꇒǕúƒŠƒXƒg‚É“ü‚ê‚é
- int j;
- for(j=0;j<MAX_GUILDEXPLUSION;j++){
- if(g->explusion[j].account_id==0)
- break;
- }
- if(j==MAX_GUILDEXPLUSION){ // ˆê”t‚Ȃ̂Ō¢‚Ì‚ðÁ‚·
- for(j=0;j<MAX_GUILDEXPLUSION-1;j++)
- g->explusion[j]=g->explusion[j+1];
- j=MAX_GUILDEXPLUSION-1;
- }
- g->explusion[j].account_id=account_id;
- memcpy(g->explusion[j].acc,"dummy",24);
- memcpy(g->explusion[j].name,g->member[i].name,24);
- memcpy(g->explusion[j].mes,mes,40);
- }
-
- mapif_guild_leaved(guild_id,account_id,char_id,flag,g->member[i].name,mes);
- printf("%d %d\n",i, (int)(&g->member[i]));
- printf("%d %s\n",i, (&g->member[i])->name);
- memset(&g->member[i],0,sizeof(struct guild_member));
-
- if( guild_check_empty(g)==0 )
- mapif_guild_info(-1,g);// ‚Ü‚¾l‚ª‚¢‚é‚̂Ńf[ƒ^‘—M
- /*
- else
- inter_guild_save(); // ‰ðŽU‚µ‚½‚̂ňê‰cZ[ƒu
- return 0;*/
- }
- }
- guild_calcinfo(g);
- inter_guild_tosql(g,19); // Change guild & guild_member & guild_expulsion
- }else{
- sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `account_id`='%d' AND `char_id`='%d'",char_db, account_id,char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
- }
- /* mapif_guild_leaved(guild_id,account_id,char_id,flag,g->member[i].name,mes); */
- }
-
- return 0;
-}
-// Change member info
-int mapif_parse_GuildChangeMemberInfoShort(int fd,int guild_id,
- int account_id,int char_id,int online,int lv,int class_)
-{
- // Could speed up by manipulating only guild_member
- struct guild * g= inter_guild_fromsql(guild_id);
- int i,alv,c, idx;
-
- if(g==NULL||g->guild_id<=0)
- return 0;
-
- g->connect_member=0;
-
- idx = -1;
-
- for(i=0,alv=0,c=0;i<g->max_member;i++){
- if( g->member[i].account_id==account_id &&
- g->member[i].char_id==char_id){
-
- g->member[i].online=online;
- g->member[i].lv=lv;
- g->member[i].class_=class_;
- mapif_guild_memberinfoshort(g,i);
- idx = i;
- }
- if( g->member[i].account_id>0 ){
- alv+=g->member[i].lv;
- c++;
- }
- if( g->member[i].online )
- g->connect_member++;
- }
-
- if (c)
- // •½‹ÏƒŒƒxƒ‹
- g->average_lv=alv/c;
-
- sprintf(tmp_sql, "UPDATE `%s` SET `connect_member`=%d,`average_lv`=%d WHERE `guild_id`='%d'", guild_db, g->connect_member, g->average_lv, g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) )
- printf("DB server Error: %s - %s\n", tmp_sql, mysql_error(&mysql_handle) );
-
- sprintf(tmp_sql, "UPDATE `%s` SET `online`=%d,`lv`=%d,`class`=%d WHERE `char_id`=%d", guild_member_db, g->member[idx].online, g->member[idx].lv, g->member[idx].class_, g->member[idx].char_id);
- if(mysql_query(&mysql_handle, tmp_sql) )
- printf("DB server Error: %s - %s\n", tmp_sql, mysql_error(&mysql_handle) );
-
- return 0;
-}
-
-// BreakGuild
-int mapif_parse_BreakGuild(int fd,int guild_id)
-{
- struct guild *g= inter_guild_fromsql(guild_id);
- if(g==NULL)
- return 0;
-
- // Delete guild from sql
- //printf("- Delete guild %d from guild\n",guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) );
- }
- //printf("- Delete guild %d from guild_member\n",guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_member_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_member`)- %s\n", mysql_error(&mysql_handle) );
- }
- //printf("- Delete guild %d from guild_skill\n",guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_skill_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_skill`)- %s\n", mysql_error(&mysql_handle) );
- }
- //printf("- Delete guild %d from guild_position\n",guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_position_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) );
- }
- //printf("- Delete guild %d from guild_expulsion\n",guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_expulsion_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_expulsion`)- %s\n", mysql_error(&mysql_handle) );
- }
- //printf("- Delete guild %d from guild_alliance\n",guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d' OR `alliance_id`='%d'",guild_alliance_db, guild_id,guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- //printf("- Delete guild %d from guild_castle\n",guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_castle_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- db_foreach(castle_db_, _erase_guild, guild_id);
-
- //printf("- Update guild %d of char\n",guild_id);
- sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d'",char_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- inter_guild_storage_delete(guild_id);
- mapif_guild_broken(guild_id,0);
-
- if(log_inter)
- inter_log("guild %s (id=%d) broken" RETCODE,g->name,guild_id);
-
- return 0;
-}
-
-// ƒMƒ‹ƒhƒƒbƒZ[ƒW‘—M
-int mapif_parse_GuildMessage(int fd,int guild_id,int account_id,char *mes,int len)
-{
- return mapif_guild_message(guild_id,account_id,mes,len, fd);
-}
-// ƒMƒ‹ƒhŠî–{ƒf[ƒ^•ÏX—v‹
-int mapif_parse_GuildBasicInfoChange(int fd,int guild_id,
- int type,const char *data,int len)
-{
- struct guild * g = inter_guild_fromsql(guild_id);
-// int dd=*((int *)data);
- short dw=*((short *)data);
-
- if(g==NULL||g->guild_id<=0)
- return 0;
- switch(type){
- case GBI_GUILDLV: {
- printf("GBI_GUILDLV\n");
- if(dw>0 && g->guild_lv+dw<=50){
- g->guild_lv+=dw;
- g->skill_point+=dw;
- }else if(dw<0 && g->guild_lv+dw>=1)
- g->guild_lv+=dw;
- mapif_guild_info(-1,g);
- inter_guild_tosql(g,1);
- } return 0;
- default:
- printf("int_guild: GuildBasicInfoChange: Unknown type %d\n",type);
- break;
- }
- mapif_guild_basicinfochanged(guild_id,type,data,len);
- //inter_guild_tosql(g,1); // Change guild
- return 0;
-}
-
-// ƒMƒ‹ƒhƒƒ“ƒoƒf[ƒ^•ÏX—v‹
-int mapif_parse_GuildMemberInfoChange(int fd,int guild_id,int account_id,int char_id,
- int type,const char *data,int len)
-{
- // Could make some improvement in speed, because only change guild_member
- int i;
- struct guild * g = inter_guild_fromsql(guild_id);
-
- //printf("GuildMemberInfoChange %s \n",(type==GMI_EXP)?"GMI_EXP":"OTHER");
-
- if(g==NULL){
- return 0;
- }
- for(i=0;i<g->max_member;i++)
- if( g->member[i].account_id==account_id &&
- g->member[i].char_id==char_id )
- break;
- if(i==g->max_member){
- printf("int_guild: GuildMemberChange: Not found %d,%d in %d[%s]\n",
- account_id,char_id,guild_id,g->name);
- return 0;
- }
- switch(type){
- case GMI_POSITION: // –ðE
- {
- g->member[i].position=*((int *)data);
- mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
- inter_guild_tosql(g,3); // Change guild & guild_member
- break;
- }
- case GMI_EXP:
- { // EXP
- int exp,oldexp=g->member[i].exp;
- exp=g->member[i].exp=*((unsigned int *)data);
- g->exp+=(exp-oldexp);
- guild_calcinfo(g); // LvƒAƒbƒv”»’f
- mapif_guild_basicinfochanged(guild_id,GBI_EXP,&g->exp,4);
- mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
-
- sprintf(tmp_sql, "UPDATE `%s` SET `guild_lv`=%d,`connect_member`=%d,`max_member`=%d,`average_lv`=%d,`exp`=%d,`next_exp`=%d,`skill_point`=%d WHERE `guild_id`='%d'", guild_db, g->guild_lv, g->connect_member, g->max_member, g->average_lv, g->exp, g->next_exp, g->skill_point, g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) )
- printf("DB server Error: %s - %s\n", tmp_sql, mysql_error(&mysql_handle) );
-
- sprintf(tmp_sql, "UPDATE `%s` SET `exp`=%d WHERE `char_id`=%d", guild_member_db, g->member[i].exp, g->member[i].char_id);
- if(mysql_query(&mysql_handle, tmp_sql) )
- printf("DB server Error: %s - %s\n", tmp_sql, mysql_error(&mysql_handle) );
- break;
- }
- default:
- printf("int_guild: GuildMemberInfoChange: Unknown type %d\n",type);
- break;
- }
- return 0;
-}
-
-// ƒMƒ‹ƒh–ðE–¼•ÏX—v‹
-int mapif_parse_GuildPosition(int fd,int guild_id,int idx,struct guild_position *p)
-{
- // Could make some improvement in speed, because only change guild_position
- struct guild * g = inter_guild_fromsql(guild_id);
-
- if(g==NULL || idx<0 || idx>=MAX_GUILDPOSITION){
- return 0;
- }
- memcpy(&g->position[idx],p,sizeof(struct guild_position));
- mapif_guild_position(g,idx);
- printf("int_guild: position changed %d\n",idx);
- inter_guild_tosql(g,4); // Change guild_position
- return 0;
-}
-// ƒMƒ‹ƒhƒXƒLƒ‹ƒAƒbƒv—v‹
-int mapif_parse_GuildSkillUp(int fd,int guild_id,int skill_num,int account_id)
-{
- // Could make some improvement in speed, because only change guild_position
- struct guild *g = inter_guild_fromsql(guild_id);
- int idx = skill_num - GD_SKILLBASE;
-
-
- if(g == NULL || idx < 0 || idx >= MAX_GUILDSKILL)
- return 0;
- //printf("GuildSkillUp\n");
-
- if( g->skill_point>0 && g->skill[idx].id>0 &&
- g->skill[idx].lv<10 ){
- g->skill[idx].lv++;
- g->skill_point--;
- if(guild_calcinfo(g)==0)
- mapif_guild_info(-1,g);
- mapif_guild_skillupack(guild_id,skill_num,account_id);
- printf("int_guild: skill %d up\n",skill_num);
- inter_guild_tosql(g,33); // Change guild & guild_skill
- }
-
- return 0;
-}
-// ƒMƒ‹ƒh“¯–¿—v‹
-int mapif_parse_GuildAlliance(int fd,int guild_id1,int guild_id2,
- int account_id1,int account_id2,int flag)
-{
- // Could speed up
- struct guild *g[2];
- int j,i;
- g[0]= inter_guild_fromsql(guild_id1);
- g[1]= inter_guild_fromsql(guild_id2);
-
- if(g[0]==NULL || g[1]==NULL || g[0]->guild_id ==0 || g[1]->guild_id==0)
- return 0;
-
- if(!(flag&0x8)){
- for(i=0;i<2-(flag&1);i++){
- for(j=0;j<MAX_GUILDALLIANCE;j++)
- if(g[i]->alliance[j].guild_id==0){
- g[i]->alliance[j].guild_id=g[1-i]->guild_id;
- memcpy(g[i]->alliance[j].name,g[1-i]->name,24);
- g[i]->alliance[j].opposition=flag&1;
- break;
- }
- }
- }else{ // ŠÖŒW‰ðÁ
- for(i=0;i<2-(flag&1);i++){
- for(j=0;j<MAX_GUILDALLIANCE;j++)
- if( g[i]->alliance[j].guild_id==g[1-i]->guild_id &&
- g[i]->alliance[j].opposition==(flag&1)){
- g[i]->alliance[j].guild_id=0;
- break;
- }
- }
- }
- mapif_guild_alliance(guild_id1,guild_id2,account_id1,account_id2,flag,
- g[0]->name,g[1]->name);
- inter_guild_tosql(g[0],8); // Change guild_alliance
- inter_guild_tosql(g[1],8); // Change guild_alliance
- return 0;
-}
-// ƒMƒ‹ƒh’m•ÏX—v‹
-int mapif_parse_GuildNotice(int fd,int guild_id,const char *mes1,const char *mes2)
-{
- struct guild *g= inter_guild_fromsql(guild_id);
-
- if(g==NULL||g->guild_id<=0)
- return 0;
- memcpy(g->mes1,mes1,60);
- memcpy(g->mes2,mes2,120);
- inter_guild_tosql(g,1); // Change mes of guild
- return mapif_guild_notice(g);
-}
-// ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX—v‹
-int mapif_parse_GuildEmblem(int fd,int len,int guild_id,int dummy,const char *data)
-{
- struct guild * g= inter_guild_fromsql(guild_id);
-
- if(g==NULL||g->guild_id<=0)
- return 0;
- memcpy(g->emblem_data,data,len);
- g->emblem_len=len;
- g->emblem_id++;
- inter_guild_tosql(g,1); // Change guild
- return mapif_guild_emblem(g);
-}
-
-int mapif_parse_GuildCastleDataLoad(int fd,int castle_id,int index) // <Agit>
-{
- struct guild_castle *gc=guildcastle_pt;
- inter_guildcastle_fromsql(castle_id, gc);
- if(gc==NULL||gc->castle_id==-1){
- return mapif_guild_castle_dataload(castle_id,0,0);
- }
- switch(index){
- case 1: return mapif_guild_castle_dataload(gc->castle_id,index,gc->guild_id); break;
- case 2: return mapif_guild_castle_dataload(gc->castle_id,index,gc->economy); break;
- case 3: return mapif_guild_castle_dataload(gc->castle_id,index,gc->defense); break;
- case 4: return mapif_guild_castle_dataload(gc->castle_id,index,gc->triggerE); break;
- case 5: return mapif_guild_castle_dataload(gc->castle_id,index,gc->triggerD); break;
- case 6: return mapif_guild_castle_dataload(gc->castle_id,index,gc->nextTime); break;
- case 7: return mapif_guild_castle_dataload(gc->castle_id,index,gc->payTime); break;
- case 8: return mapif_guild_castle_dataload(gc->castle_id,index,gc->createTime); break;
- case 9: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleC); break;
- case 10: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG0); break;
- case 11: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG1); break;
- case 12: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG2); break;
- case 13: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG3); break;
- case 14: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG4); break;
- case 15: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG5); break;
- case 16: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG6); break;
- case 17: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG7); break;
- case 18: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp0); break; // guardian HP [Valaris]
- case 19: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp1); break;
- case 20: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp2); break;
- case 21: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp3); break;
- case 22: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp4); break;
- case 23: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp5); break;
- case 24: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp6); break;
- case 25: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp7); break; // end additions [Valaris]
- default:
- printf("mapif_parse_GuildCastleDataLoad ERROR!! (Not found index=%d)\n", index);
- return 0;
- }
-}
-
-int mapif_parse_GuildCastleDataSave(int fd,int castle_id,int index,int value) // <Agit>
-{
- struct guild_castle *gc=guildcastle_pt;
- inter_guildcastle_fromsql(castle_id, gc);
- if(gc==NULL||gc->castle_id==-1){
- return mapif_guild_castle_datasave(castle_id,index,value);
- }
- switch(index){
- case 1:
- if( gc->guild_id!=value ){
- int gid=(value)?value:gc->guild_id;
- struct guild *g=inter_guild_fromsql(gid);
- if(log_inter)
- inter_log("guild %s (id=%d) %s castle id=%d" RETCODE,
- (g)?g->name:"??" ,gid, (value)?"occupy":"abandon", castle_id);
- }
- gc->guild_id = value;
- break;
- case 2: gc->economy = value; break;
- case 3: gc->defense = value; break;
- case 4: gc->triggerE = value; break;
- case 5: gc->triggerD = value; break;
- case 6: gc->nextTime = value; break;
- case 7: gc->payTime = value; break;
- case 8: gc->createTime = value; break;
- case 9: gc->visibleC = value; break;
- case 10: gc->visibleG0 = value; break;
- case 11: gc->visibleG1 = value; break;
- case 12: gc->visibleG2 = value; break;
- case 13: gc->visibleG3 = value; break;
- case 14: gc->visibleG4 = value; break;
- case 15: gc->visibleG5 = value; break;
- case 16: gc->visibleG6 = value; break;
- case 17: gc->visibleG7 = value; break;
- case 18: gc->Ghp0 = value; break; // guardian HP [Valaris]
- case 19: gc->Ghp1 = value; break;
- case 20: gc->Ghp2 = value; break;
- case 21: gc->Ghp3 = value; break;
- case 22: gc->Ghp4 = value; break;
- case 23: gc->Ghp5 = value; break;
- case 24: gc->Ghp6 = value; break;
- case 25: gc->Ghp7 = value; break; // end additions [Valaris]
- default:
- printf("mapif_parse_GuildCastleDataSave ERROR!! (Not found index=%d)\n", index);
- return 0;
- }
- inter_guildcastle_tosql(gc);
- return mapif_guild_castle_datasave(gc->castle_id,index,value);
-}
-
-// ƒMƒ‹ƒhƒ`ƒFƒbƒN—v‹
-int mapif_parse_GuildCheck(int fd,int guild_id,int account_id,int char_id)
-{
- // What does this mean? Check if belong to another guild?
- return 0;
-}
-
-// map server ‚©‚ç‚Ì’ÊM
-// E‚PƒpƒPƒbƒg‚̂݉ðÍ‚·‚邱‚Æ
-// EƒpƒPƒbƒg’·ƒf[ƒ^‚Íinter.c‚ɃZƒbƒg‚µ‚Ä‚¨‚­‚±‚Æ
-// EƒpƒPƒbƒg’·ƒ`ƒFƒbƒN‚âARFIFOSKIP‚͌ĂÑo‚µŒ³‚Ås‚í‚ê‚é‚Ì‚Ås‚Á‚Ä‚Í‚È‚ç‚È‚¢
-// EƒGƒ‰[‚È‚ç0(false)A‚»‚¤‚Å‚È‚¢‚È‚ç1(true)‚ð‚©‚¦‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢
-int inter_guild_parse_frommap(int fd)
-{
- switch(RFIFOW(fd,0)){
- case 0x3030: mapif_parse_CreateGuild(fd,RFIFOL(fd,4),(char*)RFIFOP(fd,8),(struct guild_member *)RFIFOP(fd,32)); break;
- case 0x3031: mapif_parse_GuildInfo(fd,RFIFOL(fd,2)); break;
- case 0x3032: mapif_parse_GuildAddMember(fd,RFIFOL(fd,4),(struct guild_member *)RFIFOP(fd,8)); break;
- case 0x3034: mapif_parse_GuildLeave(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),(const char*)RFIFOP(fd,15)); break;
- case 0x3035: mapif_parse_GuildChangeMemberInfoShort(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),RFIFOW(fd,15),RFIFOW(fd,17)); break;
- case 0x3036: mapif_parse_BreakGuild(fd,RFIFOL(fd,2)); break;
- case 0x3037: mapif_parse_GuildMessage(fd,RFIFOL(fd,4),RFIFOL(fd,8),(char*)RFIFOP(fd,12),RFIFOW(fd,2)-12); break;
- case 0x3038: mapif_parse_GuildCheck(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10)); break;
- case 0x3039: mapif_parse_GuildBasicInfoChange(fd,RFIFOL(fd,4),RFIFOW(fd,8),(const char*)RFIFOP(fd,10),RFIFOW(fd,2)-10); break;
- case 0x303A: mapif_parse_GuildMemberInfoChange(fd,RFIFOL(fd,4),RFIFOL(fd,8),RFIFOL(fd,12),RFIFOW(fd,16),(const char*)RFIFOP(fd,18),RFIFOW(fd,2)-18); break;
- case 0x303B: mapif_parse_GuildPosition(fd,RFIFOL(fd,4),RFIFOL(fd,8),(struct guild_position *)RFIFOP(fd,12)); break;
- case 0x303C: mapif_parse_GuildSkillUp(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10)); break;
- case 0x303D: mapif_parse_GuildAlliance(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOL(fd,14),RFIFOB(fd,18)); break;
- case 0x303E: mapif_parse_GuildNotice(fd,RFIFOL(fd,2),(const char*)RFIFOP(fd,6),(const char*)RFIFOP(fd,66)); break;
- case 0x303F: mapif_parse_GuildEmblem(fd,RFIFOW(fd,2)-12,RFIFOL(fd,4),RFIFOL(fd,8),(const char*)RFIFOP(fd,12)); break;
- case 0x3040: mapif_parse_GuildCastleDataLoad(fd,RFIFOW(fd,2),RFIFOB(fd,4)); break;
- case 0x3041: mapif_parse_GuildCastleDataSave(fd,RFIFOW(fd,2),RFIFOB(fd,4),RFIFOL(fd,5)); break;
-
- default:
- return 0;
- }
- return 1;
-}
-
-int inter_guild_mapif_init(int fd)
-{
- return mapif_guild_castle_alldataload(fd);
-}
-
-// ƒT[ƒo[‚©‚ç’E‘Þ—v‹iƒLƒƒƒ‰íœ—pj
-int inter_guild_leave(int guild_id,int account_id,int char_id)
-{
- return mapif_parse_GuildLeave(-1,guild_id,account_id,char_id,0,"**ƒT[ƒo[–½—ß**");
-}
diff --git a/src/char_sql/int_guild.h b/src/char_sql/int_guild.h
deleted file mode 100644
index 8257cf8f6..000000000
--- a/src/char_sql/int_guild.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef _INT_GUILD_H_
-#define _INT_GUILD_H_
-
-int inter_guild_parse_frommap(int fd);
-int inter_guild_sql_init();
-void inter_guild_sql_final();
-int inter_guild_mapif_init(int fd);
-
-int inter_guild_leave(int guild_id,int account_id,int char_id);
-
-#endif
diff --git a/src/char_sql/int_party.c b/src/char_sql/int_party.c
deleted file mode 100644
index 430385110..000000000
--- a/src/char_sql/int_party.c
+++ /dev/null
@@ -1,777 +0,0 @@
-//
-// original code from athena
-// SQL conversion by hack
-//
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "char.h"
-#include "../common/strlib.h"
-#include "socket.h"
-
-static struct party *party_pt;
-static int party_newid=100;
-
-int mapif_party_broken(int party_id,int flag);
-int party_check_empty(struct party *p);
-int mapif_parse_PartyLeave(int fd,int party_id,int account_id);
-
-#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
-
-// Save party to mysql
-int inter_party_tosql(int party_id,struct party *p)
-{
- // 'party' ('party_id','name','exp','item','leader')
-
- char t_name[100];
- char t_member[24];
- int party_member = 0, party_online_member = 0;
- int party_exist = 0;
- int leader_id = 0;
- int i = 0;
-
- printf("(\033[1;64m%d\033[0m) Request save party - ",party_id);
-
- jstrescapecpy(t_name, p->name);
-
- if (p==NULL || party_id==0 || p->party_id ==0 || party_id!=p->party_id) {
- printf("- Party pointer or party_id error \n");
- return 0;
- }
-
- // Check if party exists
- sprintf(tmp_sql,"SELECT count(*) FROM `%s` WHERE `party_id`='%d'",party_db, party_id); // TBR
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- return 0;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- sql_row = mysql_fetch_row(sql_res);
- party_exist = atoi (sql_row[0]);
- //printf("- Check if party %d exists : %s\n",party_id,party_exist==0?"No":"Yes");
- }
- mysql_free_result(sql_res) ; //resource free
-
- if (party_exist >0){
- // Check members in party
- sprintf(tmp_sql,"SELECT count(*) FROM `%s` WHERE `party_id`='%d'",char_db, party_id); // TBR
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- return 0;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- sql_row = mysql_fetch_row(sql_res);
-
- party_member = atoi (sql_row[0]);
- // printf("- Check members in party %d : %d \n",party_id,party_member);
-
- }
- mysql_free_result(sql_res) ; //resource free
-
- party_online_member = 0;
- i=0;
- while (i<MAX_PARTY){
- if (p->member[i].account_id>0) party_online_member++;
- i++;
- }
-
- //if (party_online_member==0) printf("- No member online \n"); else printf("- Some member %d online \n", party_online_member);
-
- if (party_member <= 0 && party_online_member == 0) {
-
- // Delete the party, if has no member.
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `party_id`='%d'",party_db, party_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- // printf("No member in party %d, break it \n",party_id);
- memset(p, 0, sizeof(struct party));
- return 0;
- } else {
- // Update party information, if exists
-
- int i=0;
-
- for (i=0;i<MAX_PARTY;i++){
-
- if (p->member[i].account_id>0){
- sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='%d' WHERE `account_id`='%d' AND `name`='%s'",
- char_db, party_id, p->member[i].account_id,jstrescapecpy(t_member,p->member[i].name));
- //printf("%s",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- }
-
-
- sprintf(tmp_sql,"UPDATE `%s` SET `name`='%s', `exp`='%d', `item`='%d', `leader_id`=`leader_id` WHERE `party_id`='%d'",
- party_db, t_name,p->exp,p->item,party_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (inset/update `party`)- %s\n", mysql_error(&mysql_handle) );
- }
-
-
- // printf("- Update party %d information \n",party_id);
- }
- } else {
- // Add new party, if not exist
- int i = 0;
- while (i<MAX_PARTY&&((p->member[i].account_id>0&&p->member[i].leader==0)||(p->member[i].account_id<0))) i++;
- if (i<MAX_PARTY) leader_id = p->member[i].account_id;
- sprintf(tmp_sql,"INSERT INTO `%s` (`party_id`, `name`, `exp`, `item`, `leader_id`) VALUES ('%d', '%s', '%d', '%d', '%d')",
- party_db, party_id, t_name, p->exp, p->item,leader_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (inset/update `party`)- %s\n", mysql_error(&mysql_handle) );
- return 0;
- }
-
- sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='%d' WHERE `account_id`='%d' AND `name`='%s'",
- char_db, party_id,leader_id, jstrescapecpy(t_member,p->member[i].name));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (inset/update `party`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- //printf("- Insert new party %d \n",party_id);
- }
-
- printf("Party save success\n");
- return 0;
-
-}
-
-// Read party from mysql
-int inter_party_fromsql(int party_id,struct party *p)
-{
- int leader_id=0;
- printf("(\033[1;64m%d\033[0m) Request load party - ",party_id);
-
- memset(p, 0, sizeof(struct party));
-
- sprintf(tmp_sql,"SELECT `party_id`, `name`,`exp`,`item`, `leader_id` FROM `%s` WHERE `party_id`='%d'",party_db, party_id); // TBR
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (select `party`)- %s\n", mysql_error(&mysql_handle) );
- return 0;
- }
-
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- sql_row = mysql_fetch_row(sql_res);
- // printf("- Read party %d from MySQL\n",party_id);
- p->party_id = party_id;
- strcpy(p->name, sql_row[1]);
- p->exp = atoi(sql_row[2]);
- p->item = atoi(sql_row[3]);
- leader_id = atoi(sql_row[4]);
- } else {
- mysql_free_result(sql_res);
- // printf("- Cannot find party %d \n",party_id);
- return 0;
- }
-
- mysql_free_result(sql_res);
-
- // Load members
- sprintf(tmp_sql,"SELECT `account_id`, `name`,`base_level`,`last_map`,`online` FROM `%s` WHERE `party_id`='%d'",char_db, party_id); // TBR
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (select `party`)- %s\n", mysql_error(&mysql_handle) );
- return 0;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- int i;
- for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
- struct party_member *m = &p->member[i];
- m->account_id = atoi(sql_row[0]);
- if (m->account_id == leader_id) m->leader = 1; else m->leader = 0;
- strncpy(m->name,sql_row[1],sizeof(m->name));
- m->lv = atoi(sql_row[2]);
- strncpy(m->map,sql_row[3],sizeof(m->map));
- m->online = atoi(sql_row[4]);
- }
- // printf("- %d members found in party %d \n",i,party_id);
- }
- mysql_free_result(sql_res);
-
-
- printf("Party load success\n");
- return 0;
-
-}
-
-int inter_party_sql_init(){
- int i;
-
- //memory alloc
- printf("interserver party memory initialize.... (%d byte)\n",sizeof(struct party));
- party_pt = (struct party*)aCalloc(sizeof(struct party), 1);
-
- sprintf (tmp_sql , "SELECT count(*) FROM `%s`",party_db);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = mysql_fetch_row(sql_res);
- printf("total party data -> '%s'.......\n",sql_row[0]);
- i = atoi (sql_row[0]);
- mysql_free_result(sql_res);
-
- if (i > 0) {
- //set party_newid
- sprintf (tmp_sql , "SELECT max(`party_id`) FROM `%s`", party_db);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
-
- sql_res = mysql_store_result(&mysql_handle) ;
-
- sql_row = mysql_fetch_row(sql_res);
- party_newid = atoi (sql_row[0])+1;
- mysql_free_result(sql_res);
- }
-
- printf("set party_newid: %d.......\n",party_newid);
-
- return 0;
-}
-void inter_party_sql_final(){
- if (party_pt) aFree(party_pt);
- return;
-}
-
-
-// Search for the party according to its name
-struct party* search_partyname(char *str)
-{
- struct party *p=NULL;
- int leader_id = 0;
- char t_name[24];
-
- sprintf(tmp_sql,"SELECT `party_id`, `name`,`exp`,`item`,`leader_id` FROM `%s` WHERE `name`='%s'",party_db, jstrescapecpy(t_name,str));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (select `party`)- %s\n", mysql_error(&mysql_handle) );
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res==NULL || mysql_num_rows(sql_res)<=0) { mysql_free_result(sql_res); return p; }
- sql_row = mysql_fetch_row(sql_res);
- p = party_pt;
- p->party_id = atoi(sql_row[0]);
- strcpy(p->name, sql_row[1]);
- p->exp = atoi(sql_row[2]);
- p->item = atoi(sql_row[3]);
- leader_id = atoi(sql_row[4]);
- mysql_free_result(sql_res);
-
- // Load members
- sprintf(tmp_sql,"SELECT `account_id`, `name`,`base_level`,`last_map`,`online` FROM `%s` WHERE `party_id`='%d'",char_db, p->party_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (select `party`)- %s\n", mysql_error(&mysql_handle) );
- return 0;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- int i;
- for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
- struct party_member *m = &p->member[i];
- m->account_id = atoi(sql_row[0]);
- if (m->account_id == leader_id) m->leader = 1; else m->leader = 0;
- strncpy(m->name,sql_row[1],sizeof(m->name));
- m->lv = atoi(sql_row[2]);
- strncpy(m->map,sql_row[3],sizeof(m->map));
- m->online = atoi(sql_row[4]);
- }
- printf("- %d members found in party %d \n",i,p->party_id);
- }
- mysql_free_result(sql_res);
-
- return p;
-}
-
-// EXPŒö•½•ª”z‚Å‚«‚é‚©ƒ`ƒFƒbƒN
-int party_check_exp_share(struct party *p)
-{
- int i, dudes=0;
- int pl1=0,pl2=0,pl3=0;
- int maxlv=0,minlv=0x7fffffff;
- for(i=0;i<MAX_PARTY;i++){
- int lv=p->member[i].lv;
- if (!lv) continue;
- if( p->member[i].online ){
- if( lv < minlv ) minlv=lv;
- if( maxlv < lv ) maxlv=lv;
- if( lv >= 70 ) dudes+=1000;
- dudes++;
- }
- }
- if((dudes/1000 >= 2) && (dudes%1000 == 3) && (!strcmp(p->member[0].map,p->member[1].map)) && (!strcmp(p->member[1].map,p->member[2].map))) {
- pl1=char_nick2id(p->member[0].name);
- pl2=char_nick2id(p->member[1].name);
- pl3=char_nick2id(p->member[2].name);
- printf("PARTY: group of 3 Id1 %d lv %d name %s Id2 %d lv %d name %s Id3 %d lv %d name %s\n",pl1,p->member[0].lv,p->member[0].name,pl2,p->member[1].lv,p->member[1].name,pl3,p->member[2].lv,p->member[2].name);
- if (char_married(pl1,pl2) && char_child(pl1,pl3))
- return 1;
- if (char_married(pl1,pl3) && char_child(pl1,pl2))
- return 1;
- if (char_married(pl2,pl3) && char_child(pl2,pl1))
- return 1;
- }
- return (maxlv==0 || maxlv-minlv<=party_share_level);
-}
-// Is there any member in the party?
-int party_check_empty(struct party *p)
-{
- int i;
- if (p==NULL||p->party_id==0) return 1;
-// printf("party check empty %08X\n",(int)p);
- for(i=0;i<MAX_PARTY;i++){
-// printf("%d acc=%d\n",i,p->member[i].account_id);
- if(p->member[i].account_id>0){
- return 0;
- }
- }
- // If there is no member, then break the party
- mapif_party_broken(p->party_id,0);
- inter_party_tosql(p->party_id,p);
- return 1;
-}
-
-
-// Check if a member is in two party, not necessary :)
-int party_check_conflict(int party_id,int account_id,char *nick)
-{
- return 0;
-}
-
-//-------------------------------------------------------------------
-// map server‚Ö‚Ì’ÊM
-
-// ƒp[ƒeƒB쬉”Û
-int mapif_party_created(int fd,int account_id,struct party *p)
-{
- WFIFOW(fd,0)=0x3820;
- WFIFOL(fd,2)=account_id;
- if(p!=NULL){
- WFIFOB(fd,6)=0;
- WFIFOL(fd,7)=p->party_id;
- memcpy(WFIFOP(fd,11),p->name,24);
- printf("int_party: created! %d %s\n",p->party_id,p->name);
- }else{
- WFIFOB(fd,6)=1;
- WFIFOL(fd,7)=0;
- memcpy(WFIFOP(fd,11),"error",24);
- }
- WFIFOSET(fd,35);
- return 0;
-}
-
-// ƒp[ƒeƒBî•ñŒ©‚‚©‚炸
-int mapif_party_noinfo(int fd,int party_id)
-{
- WFIFOW(fd,0)=0x3821;
- WFIFOW(fd,2)=8;
- WFIFOL(fd,4)=party_id;
- WFIFOSET(fd,8);
- printf("int_party: info not found %d\n",party_id);
- return 0;
-}
-// ƒp[ƒeƒBî•ñ‚Ü‚Æ‚ß‘—‚è
-int mapif_party_info(int fd,struct party *p)
-{
- unsigned char buf[1024];
- WBUFW(buf,0)=0x3821;
- memcpy(buf+4,p,sizeof(struct party));
- WBUFW(buf,2)=4+sizeof(struct party);
- if(fd<0)
- mapif_sendall(buf,WBUFW(buf,2));
- else
- mapif_send(fd,buf,WBUFW(buf,2));
-// printf("int_party: info %d %s\n",p->party_id,p->name);
- return 0;
-}
-// ƒp[ƒeƒBƒƒ“ƒo’ljÁ‰Â”Û
-int mapif_party_memberadded(int fd,int party_id,int account_id,int flag)
-{
- WFIFOW(fd,0)=0x3822;
- WFIFOL(fd,2)=party_id;
- WFIFOL(fd,6)=account_id;
- WFIFOB(fd,10)=flag;
- WFIFOSET(fd,11);
- return 0;
-}
-// ƒp[ƒeƒBÝ’è•ÏX’Ê’m
-int mapif_party_optionchanged(int fd,struct party *p,int account_id,int flag)
-{
- unsigned char buf[16];
- WBUFW(buf,0)=0x3823;
- WBUFL(buf,2)=p->party_id;
- WBUFL(buf,6)=account_id;
- WBUFW(buf,10)=p->exp;
- WBUFW(buf,12)=p->item;
- WBUFB(buf,14)=flag;
- if(flag==0)
- mapif_sendall(buf,15);
- else
- mapif_send(fd,buf,15);
- //printf("int_party: option changed %d %d %d %d %d\n",p->party_id,account_id,p->exp,p->item,flag);
- return 0;
-}
-// ƒp[ƒeƒB’E‘Þ’Ê’m
-int mapif_party_leaved(int party_id,int account_id,char *name)
-{
- unsigned char buf[64];
- WBUFW(buf,0)=0x3824;
- WBUFL(buf,2)=party_id;
- WBUFL(buf,6)=account_id;
- memcpy(WBUFP(buf,10),name,24);
- mapif_sendall(buf,34);
- //printf("int_party: party leaved %d %d %s\n",party_id,account_id,name);
- return 0;
-}
-// ƒp[ƒeƒBƒ}ƒbƒvXV’Ê’m
-int mapif_party_membermoved(struct party *p,int idx)
-{
- unsigned char buf[32];
- WBUFW(buf,0)=0x3825;
- WBUFL(buf,2)=p->party_id;
- WBUFL(buf,6)=p->member[idx].account_id;
- memcpy(WBUFP(buf,10),p->member[idx].map,16);
- WBUFB(buf,26)=p->member[idx].online;
- WBUFW(buf,27)=p->member[idx].lv;
- mapif_sendall(buf,29);
- return 0;
-}
-// ƒp[ƒeƒB‰ðŽU’Ê’m
-int mapif_party_broken(int party_id,int flag)
-{
- unsigned char buf[16];
- WBUFW(buf,0)=0x3826;
- WBUFL(buf,2)=party_id;
- WBUFB(buf,6)=flag;
- mapif_sendall(buf,7);
- //printf("int_party: broken %d\n",party_id);
- return 0;
-}
-// ƒp[ƒeƒB“à”­Œ¾
-int mapif_party_message(int party_id,int account_id,char *mes,int len, int sfd)
-{
- unsigned char buf[512];
- WBUFW(buf,0)=0x3827;
- WBUFW(buf,2)=len+12;
- WBUFL(buf,4)=party_id;
- WBUFL(buf,8)=account_id;
- memcpy(WBUFP(buf,12),mes,len);
- mapif_sendallwos(sfd, buf,len+12);
- return 0;
-}
-
-//-------------------------------------------------------------------
-// map server‚©‚ç‚Ì’ÊM
-
-
-// Create Party
-int mapif_parse_CreateParty(int fd,int account_id,char *name,char *nick,char *map,int lv, int item, int item2)
-{
- struct party *p;
- if( (p=search_partyname(name))!=NULL){
-// printf("int_party: same name party exists [%s]\n",name);
- mapif_party_created(fd,account_id,NULL);
- return 0;
- }
- p=party_pt;
- if(p==NULL){
- printf("int_party: out of memory !\n");
- mapif_party_created(fd,account_id,NULL);
- return 0;
- }
- memset(p,0,sizeof(struct party));
- p->party_id=party_newid++;
- memcpy(p->name,name,24);
- p->exp=0;
- p->item=item;
- //<item1>ƒAƒCƒeƒ€?W•û–@B0‚ÅŒÂl•ÊA1‚Ńp?ƒeƒBŒö—L
- //<item2>ƒAƒCƒeƒ€•ª”z•û–@B0‚ÅŒÂl•ÊA1‚Ńp?ƒeƒB‚É‹Ï“™•ª”z
- //difference between "collection" and "distribution" is...? ^^;
- p->itemc = 0;
-
- p->member[0].account_id=account_id;
- memcpy(p->member[0].name,nick,24);
- memcpy(p->member[0].map,map,16);
- p->member[0].leader=1;
- p->member[0].online=1;
- p->member[0].lv=lv;
-
- inter_party_tosql(p->party_id,p);
-
- mapif_party_created(fd,account_id,p);
- mapif_party_info(fd,p);
-
- return 0;
-}
-// ƒp[ƒeƒBî•ñ—v‹
-int mapif_parse_PartyInfo(int fd,int party_id)
-{
- struct party *p = party_pt;
- if(p==NULL){
- printf("int_party: out of memory !\n");
- return 0;
- }
- inter_party_fromsql(party_id, p);
-
- if(p->party_id >= 0)
- mapif_party_info(fd,p);
- else
- mapif_party_noinfo(fd,party_id);
- return 0;
-}
-// ƒp[ƒeƒB’ljÁ—v‹
-int mapif_parse_PartyAddMember(int fd,int party_id,int account_id,char *nick,char *map,int lv)
-{
- struct party *p;
- int i;
-
- p = party_pt;
- if(p==NULL){
- printf("int_party: out of memory !\n");
- return 0;
- }
- inter_party_fromsql(party_id, p);
-
- if(p->party_id <= 0){
- mapif_party_memberadded(fd,party_id,account_id,1);
- return 0;
- }
-
- for(i=0;i<MAX_PARTY;i++){
- if(p->member[i].account_id==0){
- int flag=0;
-
- p->member[i].account_id=account_id;
- memcpy(p->member[i].name,nick,24);
- memcpy(p->member[i].map,map,16);
- p->member[i].leader=0;
- p->member[i].online=1;
- p->member[i].lv=lv;
- mapif_party_memberadded(fd,party_id,account_id,0);
- mapif_party_info(-1,p);
-
- if( p->exp>0 && !party_check_exp_share(p) ){
- p->exp=0;
- flag=0x01;
- }
- if(flag)
- mapif_party_optionchanged(fd,p,0,0);
-
- inter_party_tosql(party_id, p);
- return 0;
- }
- }
- mapif_party_memberadded(fd,party_id,account_id,1);
- //inter_party_tosql(party_id, p);
- return 0;
-}
-// ƒp[ƒeƒB[Ý’è•ÏX—v‹
-int mapif_parse_PartyChangeOption(int fd,int party_id,int account_id,int exp,int item)
-{
- struct party *p;
- int flag=0;
-
- p = party_pt;
- if(p==NULL){
- printf("int_party: out of memory !\n");
- return 0;
- }
-
- inter_party_fromsql(party_id, p);
-
- if(p->party_id <= 0){
- return 0;
- }
-
- p->exp=exp;
- if( exp>0 && !party_check_exp_share(p) ){
- flag|=0x01;
- p->exp=0;
- }
-
- p->item=item;
-
- mapif_party_optionchanged(fd,p,account_id,flag);
- inter_party_tosql(party_id, p);
- return 0;
-}
-// ƒp[ƒeƒB’E‘Þ—v‹
-int mapif_parse_PartyLeave(int fd,int party_id,int account_id)
-{
- char t_member[24];
- struct party *p = party_pt;
- if(p==NULL){
- printf("int_party: out of memory !\n");
- return 0;
- }
-
- inter_party_fromsql(party_id, p);
-
- if(p->party_id >= 0){
- int i,j;
- for(i=0;i<MAX_PARTY;i++){
-
- if(p->member[i].account_id==account_id){
- //printf("p->member[i].account_id = %d , account_id = %d \n",p->member[i].account_id,account_id);
- mapif_party_leaved(party_id,account_id,p->member[i].name);
-
-
-
- // Update char information, does the name need encoding?
- sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d' AND `name`='%s'",
- char_db, party_id, jstrescapecpy(t_member,p->member[i].name));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
- }
-// printf("Delete member %s from MySQL \n", p->member[i].name);
-
- if (p->member[i].leader==1){
- for(j=0;j<MAX_PARTY;j++)
- {
- //printf("j = %d , p->member[j].account_id = %d , p->member[j].account_id = %d \n",j,p->member[j].account_id,p->member[j].account_id);
- if(p->member[j].account_id>0&&j!=i){
- mapif_party_leaved(party_id,p->member[j].account_id,p->member[j].name);
- // Update char information, does the name need encoding?
- sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d' AND `name`='%s'",
- char_db, party_id, jstrescapecpy(t_member,p->member[i].name));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
- }
-// printf("Delete member %s from MySQL \n", p->member[j].name);
- }
- }
- // Delete the party, if has no member.
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `party_id`='%d'",party_db, party_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
-// printf("Leader breaks party %d \n",party_id);
- memset(p, 0, sizeof(struct party));
- }else memset(&p->member[i],0,sizeof(struct party_member));
-
- break;
-
- }
- }
- if( party_check_empty(p)==0 )
- mapif_party_info(-1,p);// ‚Ü‚¾l‚ª‚¢‚é‚̂Ńf[ƒ^‘—M
- /*
- else
- inter_party_tosql(party_id,p); // Break the party if no member
- */
- }else{
- sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d' AND `account_id`='%d' AND `online`='1'",
- char_db, party_id, account_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- return 0;
-}
-// When member goes to other map
-int mapif_parse_PartyChangeMap(int fd,int party_id,int account_id,char *map,int online,int lv)
-{
- struct party *p;
- int i;
-
- p = party_pt;
- if(p==NULL){
- printf("int_party: out of memory !\n");
- return 0;
- }
- inter_party_fromsql(party_id, p);
-
- if(p->party_id <= 0){
- return 0;
- }
- for(i=0;i<MAX_PARTY;i++){
- if(p->member[i].account_id==account_id){
- int flag=0;
-
- memcpy(p->member[i].map,map,16);
- p->member[i].online=online;
- p->member[i].lv=lv;
- mapif_party_membermoved(p,i);
-
- if( p->exp>0 && !party_check_exp_share(p) ){
- p->exp=0;
- flag=1;
- }
- if(flag)
- mapif_party_optionchanged(fd,p,0,0);
- break;
- }
- }
- inter_party_tosql(party_id, p);
- return 0;
-}
-// ƒp[ƒeƒB‰ðŽU—v‹
-int mapif_parse_BreakParty(int fd,int party_id)
-{
- struct party *p;
-
- p = party_pt;
- if(p==NULL){
- printf("int_party: out of memory !\n");
- return 0;
- }
-
- inter_party_fromsql(party_id, p);
-
- if(p->party_id <= 0){
- return 0;
- }
- inter_party_tosql(party_id,p);
-
- mapif_party_broken(fd,party_id);
- return 0;
-}
-// ƒp[ƒeƒBƒƒbƒZ[ƒW‘—M
-int mapif_parse_PartyMessage(int fd,int party_id,int account_id,char *mes,int len)
-{
- return mapif_party_message(party_id,account_id,mes,len, fd);
-}
-// ƒp[ƒeƒBƒ`ƒFƒbƒN—v‹
-int mapif_parse_PartyCheck(int fd,int party_id,int account_id,char *nick)
-{
- return party_check_conflict(party_id,account_id,nick);
-}
-
-// map server ‚©‚ç‚Ì’ÊM
-// E‚PƒpƒPƒbƒg‚̂݉ðÍ‚·‚邱‚Æ
-// EƒpƒPƒbƒg’·ƒf[ƒ^‚Íinter.c‚ɃZƒbƒg‚µ‚Ä‚¨‚­‚±‚Æ
-// EƒpƒPƒbƒg’·ƒ`ƒFƒbƒN‚âARFIFOSKIP‚͌ĂÑo‚µŒ³‚Ås‚í‚ê‚é‚Ì‚Ås‚Á‚Ä‚Í‚È‚ç‚È‚¢
-// EƒGƒ‰[‚È‚ç0(false)A‚»‚¤‚Å‚È‚¢‚È‚ç1(true)‚ð‚©‚¦‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢
-int inter_party_parse_frommap(int fd)
-{
- switch(RFIFOW(fd,0)){
- case 0x3020: mapif_parse_CreateParty(fd,RFIFOL(fd,2),(char*)RFIFOP(fd,6),(char*)RFIFOP(fd,30),(char*)RFIFOP(fd,54),RFIFOW(fd,70), RFIFOB(fd,72), RFIFOB(fd,73)); break;
- case 0x3021: mapif_parse_PartyInfo(fd,RFIFOL(fd,2)); break;
- case 0x3022: mapif_parse_PartyAddMember(fd,RFIFOL(fd,2),RFIFOL(fd,6),(char*)RFIFOP(fd,10),(char*)RFIFOP(fd,34),RFIFOW(fd,50)); break;
- case 0x3023: mapif_parse_PartyChangeOption(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOW(fd,10),RFIFOW(fd,12)); break;
- case 0x3024: mapif_parse_PartyLeave(fd,RFIFOL(fd,2),RFIFOL(fd,6)); break;
- case 0x3025: mapif_parse_PartyChangeMap(fd,RFIFOL(fd,2),RFIFOL(fd,6),(char*)RFIFOP(fd,10),RFIFOB(fd,26),RFIFOW(fd,27)); break;
- case 0x3026: mapif_parse_BreakParty(fd,RFIFOL(fd,2)); break;
- case 0x3027: mapif_parse_PartyMessage(fd,RFIFOL(fd,4),RFIFOL(fd,8),(char*)RFIFOP(fd,12),RFIFOW(fd,2)-12); break;
- case 0x3028: mapif_parse_PartyCheck(fd,RFIFOL(fd,2),RFIFOL(fd,6),(char*)RFIFOP(fd,10)); break;
- default:
- return 0;
- }
- return 1;
-}
-
-// ƒT[ƒo[‚©‚ç’E‘Þ—v‹iƒLƒƒƒ‰íœ—pj
-int inter_party_leave(int party_id,int account_id)
-{
- return mapif_parse_PartyLeave(-1,party_id,account_id);
-}
-
-
-
diff --git a/src/char_sql/int_party.h b/src/char_sql/int_party.h
deleted file mode 100644
index 686d70b04..000000000
--- a/src/char_sql/int_party.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef _INT_PARTY_H_
-#define _INT_PARTY_H_
-
-int inter_party_parse_frommap(int fd);
-int inter_party_sql_init();
-void inter_party_sql_final();
-int inter_party_leave(int party_id,int account_id);
-
-#endif
diff --git a/src/char_sql/int_pet.c b/src/char_sql/int_pet.c
deleted file mode 100644
index ea1fed67d..000000000
--- a/src/char_sql/int_pet.c
+++ /dev/null
@@ -1,329 +0,0 @@
-//
-// original code from athena
-// SQL conversion by Jioh L. Jung
-//
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "char.h"
-#include "../common/strlib.h"
-
-struct s_pet *pet_pt;
-static int pet_newid = 100;
-
-#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
-
-//---------------------------------------------------------
-int inter_pet_tosql(int pet_id, struct s_pet *p) {
- //`pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`)
- char t_name[100];
-
- printf("request save pet: %d.......\n",pet_id);
-
- jstrescapecpy(t_name, p->name);
-
- if(p->hungry < 0)
- p->hungry = 0;
- else if(p->hungry > 100)
- p->hungry = 100;
- if(p->intimate < 0)
- p->intimate = 0;
- else if(p->intimate > 1000)
- p->intimate = 1000;
- sprintf(tmp_sql,"SELECT * FROM `%s` WHERE `pet_id`='%d'",pet_db, pet_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0)
- //row reside -> updating
- sprintf(tmp_sql, "UPDATE `%s` SET `class`='%d',`name`='%s',`account_id`='%d',`char_id`='%d',`level`='%d',`egg_id`='%d',`equip`='%d',`intimate`='%d',`hungry`='%d',`rename_flag`='%d',`incuvate`='%d' WHERE `pet_id`='%d'",
- pet_db, p->class_, t_name, p->account_id, p->char_id, p->level, p->egg_id,
- p->equip, p->intimate, p->hungry, p->rename_flag, p->incuvate, p->pet_id);
- else //no row -> insert
- sprintf(tmp_sql,"INSERT INTO `%s` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) VALUES ('%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- pet_db, pet_id, p->class_, t_name, p->account_id, p->char_id, p->level, p->egg_id,
- p->equip, p->intimate, p->hungry, p->rename_flag, p->incuvate);
- mysql_free_result(sql_res) ; //resource free
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (inset/update `pet`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- printf("pet save success.......\n");
- return 0;
-}
-
-int inter_pet_fromsql(int pet_id, struct s_pet *p){
-
- printf("request load pet: %d.......\n",pet_id);
-
- memset(p, 0, sizeof(struct s_pet));
-
- //`pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`)
-
- sprintf(tmp_sql,"SELECT `pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate` FROM `%s` WHERE `pet_id`='%d'",pet_db, pet_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (select `pet`)- %s\n", mysql_error(&mysql_handle) );
- return 0;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- sql_row = mysql_fetch_row(sql_res);
-
- p->pet_id = pet_id;
- p->class_ = atoi(sql_row[1]);
- memcpy(p->name, sql_row[2],24);
- p->account_id = atoi(sql_row[3]);
- p->char_id = atoi(sql_row[4]);
- p->level = atoi(sql_row[5]);
- p->egg_id = atoi(sql_row[6]);
- p->equip = atoi(sql_row[7]);
- p->intimate = atoi(sql_row[8]);
- p->hungry = atoi(sql_row[9]);
- p->rename_flag = atoi(sql_row[10]);
- p->incuvate = atoi(sql_row[11]);
- }
- if(p->hungry < 0)
- p->hungry = 0;
- else if(p->hungry > 100)
- p->hungry = 100;
- if(p->intimate < 0)
- p->intimate = 0;
- else if(p->intimate > 1000)
- p->intimate = 1000;
-
- mysql_free_result(sql_res);
-
- printf("pet load success.......\n");
- return 0;
-}
-//----------------------------------------------
-
-int inter_pet_sql_init(){
- int i;
-
- //memory alloc
- printf("interserver pet memory initialize.... (%d byte)\n",sizeof(struct s_pet));
- pet_pt = (struct s_pet*)aCalloc(sizeof(struct s_pet), 1);
-
- sprintf (tmp_sql , "SELECT count(*) FROM `%s`", pet_db);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- exit(0);
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = mysql_fetch_row(sql_res);
- printf("total pet data -> '%s'.......\n",sql_row[0]);
- i = atoi (sql_row[0]);
- mysql_free_result(sql_res);
-
- if (i > 0) {
- //set pet_newid
- sprintf (tmp_sql , "SELECT max(`pet_id`) FROM `%s`",pet_db );
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
-
- sql_res = mysql_store_result(&mysql_handle) ;
-
- sql_row = mysql_fetch_row(sql_res);
- pet_newid = atoi (sql_row[0])+1; //should SET MAX existing PET ID + 1 [Lupus]
- mysql_free_result(sql_res);
- }
-
- printf("set pet_newid: %d.......\n",pet_newid);
-
- return 0;
-}
-void inter_pet_sql_final(){
- if (pet_pt) aFree(pet_pt);
- return;
-}
-//----------------------------------
-int inter_pet_delete(int pet_id){
- printf("request delete pet: %d.......\n",pet_id);
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `pet_id`='%d'",pet_db, pet_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- return 0;
-}
-//------------------------------------------------------
-int mapif_pet_created(int fd, int account_id, struct s_pet *p)
-{
- WFIFOW(fd, 0) =0x3880;
- WFIFOL(fd, 2) =account_id;
- if(p!=NULL){
- WFIFOB(fd, 6)=0;
- WFIFOL(fd, 7) =p->pet_id;
- printf("int_pet: created! %d %s\n", p->pet_id, p->name);
- }else{
- WFIFOB(fd, 6)=1;
- WFIFOL(fd, 7)=0;
- }
- WFIFOSET(fd, 11);
-
- return 0;
-}
-
-int mapif_pet_info(int fd, int account_id, struct s_pet *p){
- WFIFOW(fd, 0) =0x3881;
- WFIFOW(fd, 2) =sizeof(struct s_pet) + 9;
- WFIFOL(fd, 4) =account_id;
- WFIFOB(fd, 8)=0;
- memcpy(WFIFOP(fd, 9), p, sizeof(struct s_pet));
- WFIFOSET(fd, WFIFOW(fd, 2));
-
- return 0;
-}
-
-int mapif_pet_noinfo(int fd, int account_id){
- WFIFOW(fd, 0) =0x3881;
- WFIFOW(fd, 2) =sizeof(struct s_pet) + 9;
- WFIFOL(fd, 4) =account_id;
- WFIFOB(fd, 8)=1;
- memset(WFIFOP(fd, 9), 0, sizeof(struct s_pet));
- WFIFOSET(fd, WFIFOW(fd, 2));
-
- return 0;
-}
-
-int mapif_save_pet_ack(int fd, int account_id, int flag){
- WFIFOW(fd, 0) =0x3882;
- WFIFOL(fd, 2) =account_id;
- WFIFOB(fd, 6) =flag;
- WFIFOSET(fd, 7);
-
- return 0;
-}
-
-int mapif_delete_pet_ack(int fd, int flag){
- WFIFOW(fd, 0) =0x3883;
- WFIFOB(fd, 2) =flag;
- WFIFOSET(fd, 3);
-
- return 0;
-}
-
-int mapif_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 incuvate, char *pet_name){
-
- memset(pet_pt, 0, sizeof(struct s_pet));
- pet_pt->pet_id = pet_newid++;
- memcpy(pet_pt->name, pet_name, 24);
- if(incuvate == 1)
- pet_pt->account_id = pet_pt->char_id = 0;
- else {
- pet_pt->account_id = account_id;
- pet_pt->char_id = char_id;
- }
- pet_pt->class_ = pet_class;
- pet_pt->level = pet_lv;
- pet_pt->egg_id = pet_egg_id;
- pet_pt->equip = pet_equip;
- pet_pt->intimate = intimate;
- pet_pt->hungry = hungry;
- pet_pt->rename_flag = rename_flag;
- pet_pt->incuvate = incuvate;
-
- if(pet_pt->hungry < 0)
- pet_pt->hungry = 0;
- else if(pet_pt->hungry > 100)
- pet_pt->hungry = 100;
- if(pet_pt->intimate < 0)
- pet_pt->intimate = 0;
- else if(pet_pt->intimate > 1000)
- pet_pt->intimate = 1000;
-
- inter_pet_tosql(pet_pt->pet_id,pet_pt);
-
- mapif_pet_created(fd, account_id, pet_pt);
-
- return 0;
-}
-
-int mapif_load_pet(int fd, int account_id, int char_id, int pet_id){
- memset(pet_pt, 0, sizeof(struct s_pet));
-
- inter_pet_fromsql(pet_id, pet_pt);
-
- if(pet_pt!=NULL) {
- if(pet_pt->incuvate == 1) {
- pet_pt->account_id = pet_pt->char_id = 0;
- mapif_pet_info(fd, account_id, pet_pt);
- }
- else if(account_id == pet_pt->account_id && char_id == pet_pt->char_id)
- mapif_pet_info(fd, account_id, pet_pt);
- else
- mapif_pet_noinfo(fd, account_id);
- }
- else
- mapif_pet_noinfo(fd, account_id);
-
- return 0;
-}
-
-int mapif_save_pet(int fd, int account_id, struct s_pet *data) {
- //here process pet save request.
- int len=RFIFOW(fd, 2);
- if(sizeof(struct s_pet)!=len-8) {
- printf("inter pet: data size error %d %d\n", sizeof(struct s_pet), len-8);
- }
-
- else{
- if(data->hungry < 0)
- data->hungry = 0;
- else if(data->hungry > 100)
- data->hungry = 100;
- if(data->intimate < 0)
- data->intimate = 0;
- else if(data->intimate > 1000)
- data->intimate = 1000;
- inter_pet_tosql(data->pet_id,data);
- mapif_save_pet_ack(fd, account_id, 0);
- }
-
- return 0;
-}
-
-int mapif_delete_pet(int fd, int pet_id){
- mapif_delete_pet_ack(fd, inter_pet_delete(pet_id));
-
- return 0;
-}
-
-int mapif_parse_CreatePet(int fd){
- mapif_create_pet(fd, RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOW(fd, 10), RFIFOW(fd, 12), RFIFOW(fd, 14), RFIFOW(fd, 16), RFIFOL(fd, 18),
- RFIFOL(fd, 20), RFIFOB(fd, 22), RFIFOB(fd, 23), (char*)RFIFOP(fd, 24));
- return 0;
-}
-
-int mapif_parse_LoadPet(int fd){
- mapif_load_pet(fd, RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOL(fd, 10));
- return 0;
-}
-
-int mapif_parse_SavePet(int fd){
- mapif_save_pet(fd, RFIFOL(fd, 4), (struct s_pet *) RFIFOP(fd, 8));
- return 0;
-}
-
-int mapif_parse_DeletePet(int fd){
- mapif_delete_pet(fd, RFIFOL(fd, 2));
- return 0;
-}
-
-int inter_pet_parse_frommap(int fd){
- switch(RFIFOW(fd, 0)){
- case 0x3080: mapif_parse_CreatePet(fd); break;
- case 0x3081: mapif_parse_LoadPet(fd); break;
- case 0x3082: mapif_parse_SavePet(fd); break;
- case 0x3083: mapif_parse_DeletePet(fd); break;
- default:
- return 0;
- }
- return 1;
-}
-
diff --git a/src/char_sql/int_pet.h b/src/char_sql/int_pet.h
deleted file mode 100644
index 39f127262..000000000
--- a/src/char_sql/int_pet.h
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef _INT_PET_H_
-#define _INT_PET_H_
-
-int inter_pet_init();
-void inter_pet_sql_final();
-int inter_pet_save();
-int inter_pet_delete(int pet_id);
-
-int inter_pet_parse_frommap(int fd);
-int inter_pet_sql_init();
-//extern char pet_txt[256];
-
-#endif
diff --git a/src/char_sql/int_storage.c b/src/char_sql/int_storage.c
deleted file mode 100644
index c13c782a6..000000000
--- a/src/char_sql/int_storage.c
+++ /dev/null
@@ -1,339 +0,0 @@
-//
-// original code from athena
-// SQL conversion by Jioh L. Jung
-//
-#include <string.h>
-#include <stdlib.h>
-
-#include "char.h"
-#include "itemdb.h"
-
-#define STORAGE_MEMINC 16
-
-// reset by inter_config_read()
-struct storage *storage_pt=NULL;
-struct guild_storage *guild_storage_pt=NULL;
-
-#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
-
-// storage data -> DB conversion
-int storage_tosql(int account_id,struct storage *p){
- int i;
-// int eqcount=1;
-// int noteqcount=1;
- int count=0;
- struct itemtmp mapitem[MAX_GUILD_STORAGE];
- for(i=0;i<MAX_STORAGE;i++){
- if(p->storage_[i].nameid>0){
- mapitem[count].flag=0;
- mapitem[count].id = p->storage_[i].id;
- mapitem[count].nameid=p->storage_[i].nameid;
- mapitem[count].amount = p->storage_[i].amount;
- mapitem[count].equip = p->storage_[i].equip;
- mapitem[count].identify = p->storage_[i].identify;
- mapitem[count].refine = p->storage_[i].refine;
- mapitem[count].attribute = p->storage_[i].attribute;
- mapitem[count].card[0] = p->storage_[i].card[0];
- mapitem[count].card[1] = p->storage_[i].card[1];
- mapitem[count].card[2] = p->storage_[i].card[2];
- mapitem[count].card[3] = p->storage_[i].card[3];
- count++;
- }
- }
-
- memitemdata_to_sql(mapitem, count, account_id,TABLE_STORAGE);
-
- //printf ("storage dump to DB - id: %d (total: %d)\n", account_id, j);
- return 0;
-}
-
-// DB -> storage data conversion
-int storage_fromsql(int account_id, struct storage *p){
- int i=0;
-
- memset(p,0,sizeof(struct storage)); //clean up memory
- p->storage_amount = 0;
- p->account_id = account_id;
-
- // storage {`account_id`/`id`/`nameid`/`amount`/`equip`/`identify`/`refine`/`attribute`/`card0`/`card1`/`card2`/`card3`}
- sprintf(tmp_sql,"SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`,`card0`,`card1`,`card2`,`card3` FROM `%s` WHERE `account_id`='%d'",storage_db, account_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- sql_res = mysql_store_result(&mysql_handle) ;
-
- if (sql_res) {
- while((sql_row = mysql_fetch_row(sql_res))) { //start to fetch
- p->storage_[i].id= atoi(sql_row[0]);
- p->storage_[i].nameid= atoi(sql_row[1]);
- p->storage_[i].amount= atoi(sql_row[2]);
- p->storage_[i].equip= atoi(sql_row[3]);
- p->storage_[i].identify= atoi(sql_row[4]);
- p->storage_[i].refine= atoi(sql_row[5]);
- p->storage_[i].attribute= atoi(sql_row[6]);
- p->storage_[i].card[0]= atoi(sql_row[7]);
- p->storage_[i].card[1]= atoi(sql_row[8]);
- p->storage_[i].card[2]= atoi(sql_row[9]);
- p->storage_[i].card[3]= atoi(sql_row[10]);
- p->storage_amount = ++i;
- }
- mysql_free_result(sql_res);
- }
-
- printf ("storage load complete from DB - id: %d (total: %d)\n", account_id, p->storage_amount);
- return 1;
-}
-
-// Save guild_storage data to sql
-int guild_storage_tosql(int guild_id, struct guild_storage *p){
- int i;
-// int eqcount=1;
-// int noteqcount=1;
- int count=0;
- struct itemtmp mapitem[MAX_GUILD_STORAGE];
- for(i=0;i<MAX_GUILD_STORAGE;i++){
- if(p->storage_[i].nameid>0){
- mapitem[count].flag=0;
- mapitem[count].id = p->storage_[i].id;
- mapitem[count].nameid=p->storage_[i].nameid;
- mapitem[count].amount = p->storage_[i].amount;
- mapitem[count].equip = p->storage_[i].equip;
- mapitem[count].identify = p->storage_[i].identify;
- mapitem[count].refine = p->storage_[i].refine;
- mapitem[count].attribute = p->storage_[i].attribute;
- mapitem[count].card[0] = p->storage_[i].card[0];
- mapitem[count].card[1] = p->storage_[i].card[1];
- mapitem[count].card[2] = p->storage_[i].card[2];
- mapitem[count].card[3] = p->storage_[i].card[3];
- count++;
- }
- }
-
- memitemdata_to_sql(mapitem, count, guild_id,TABLE_GUILD_STORAGE);
-
- printf ("guild storage save to DB - id: %d (total: %d)\n", guild_id,i);
- return 0;
-}
-
-// Load guild_storage data to mem
-int guild_storage_fromsql(int guild_id, struct guild_storage *p){
- int i=0;
- struct guild_storage *gs=guild_storage_pt;
- p=gs;
-
- memset(p,0,sizeof(struct guild_storage)); //clean up memory
- p->storage_amount = 0;
- p->guild_id = guild_id;
-
- // storage {`guild_id`/`id`/`nameid`/`amount`/`equip`/`identify`/`refine`/`attribute`/`card0`/`card1`/`card2`/`card3`}
- sprintf(tmp_sql,"SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`,`card0`,`card1`,`card2`,`card3` FROM `%s` WHERE `guild_id`='%d'",guild_storage_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- sql_res = mysql_store_result(&mysql_handle) ;
-
- if (sql_res) {
- while((sql_row = mysql_fetch_row(sql_res))) { //start to fetch
- p->storage_[i].id= atoi(sql_row[0]);
- p->storage_[i].nameid= atoi(sql_row[1]);
- p->storage_[i].amount= atoi(sql_row[2]);
- p->storage_[i].equip= atoi(sql_row[3]);
- p->storage_[i].identify= atoi(sql_row[4]);
- p->storage_[i].refine= atoi(sql_row[5]);
- p->storage_[i].attribute= atoi(sql_row[6]);
- p->storage_[i].card[0]= atoi(sql_row[7]);
- p->storage_[i].card[1]= atoi(sql_row[8]);
- p->storage_[i].card[2]= atoi(sql_row[9]);
- p->storage_[i].card[3]= atoi(sql_row[10]);
- p->storage_amount = ++i;
- if (i >= MAX_GUILD_STORAGE)
- break;
- }
- mysql_free_result(sql_res);
- }
- printf ("guild storage load complete from DB - id: %d (total: %d)\n", guild_id, p->storage_amount);
- return 0;
-}
-
-//---------------------------------------------------------
-// storage data initialize
-int inter_storage_sql_init(){
-
- //memory alloc
- printf("interserver storage memory initialize....(%d byte)\n",sizeof(struct storage));
- storage_pt = (struct storage*)aCalloc(sizeof(struct storage), 1);
- guild_storage_pt = (struct guild_storage*)aCalloc(sizeof(struct guild_storage), 1);
- memset(storage_pt,0,sizeof(struct storage));
- memset(guild_storage_pt,0,sizeof(struct guild_storage));
-
- return 1;
-}
-// storage data finalize
-void inter_storage_sql_final()
-{
- if (storage_pt) aFree(storage_pt);
- if (guild_storage_pt) aFree(guild_storage_pt);
- return;
-}
-// q?f[^?
-int inter_storage_delete(int account_id)
-{
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `account_id`='%d'",storage_db, account_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `storage`)- %s\n", mysql_error(&mysql_handle) );
- }
- return 0;
-}
-int inter_guild_storage_delete(int guild_id)
-{
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_storage_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_storage`)- %s\n", mysql_error(&mysql_handle) );
- }
- return 0;
-}
-
-//---------------------------------------------------------
-// packet from map server
-
-// recive packet about storage data
-int mapif_load_storage(int fd,int account_id){
- //load from DB
- storage_fromsql(account_id, storage_pt);
- WFIFOW(fd,0)=0x3810;
- WFIFOW(fd,2)=sizeof(struct storage)+8;
- WFIFOL(fd,4)=account_id;
- memcpy(WFIFOP(fd,8),storage_pt,sizeof(struct storage));
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-// send ack to map server which is "storage data save ok."
-int mapif_save_storage_ack(int fd,int account_id){
- WFIFOW(fd,0)=0x3811;
- WFIFOL(fd,2)=account_id;
- WFIFOB(fd,6)=0;
- WFIFOSET(fd,7);
- return 0;
-}
-
-int mapif_load_guild_storage(int fd,int account_id,int guild_id)
-{
- int guild_exist=0;
- WFIFOW(fd,0)=0x3818;
-
- // Check if guild exists, I may write a function for this later, coz I use it several times.
- //printf("- Check if guild %d exists\n",g->guild_id);
- sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) );
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- sql_row = mysql_fetch_row(sql_res);
- guild_exist = atoi (sql_row[0]);
- //printf("- Check if guild %d exists : %s\n",g->guild_id,((guild_exist==0)?"No":"Yes"));
- }
- mysql_free_result(sql_res) ; //resource free
-
- if(guild_exist==1) {
- guild_storage_fromsql(guild_id,guild_storage_pt);
- WFIFOW(fd,2)=sizeof(struct guild_storage)+12;
- WFIFOL(fd,4)=account_id;
- WFIFOL(fd,8)=guild_id;
- memcpy(WFIFOP(fd,12),guild_storage_pt,sizeof(struct guild_storage));
- }
- else {
- WFIFOW(fd,2)=12;
- WFIFOL(fd,4)=account_id;
- WFIFOL(fd,8)=0;
- }
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-int mapif_save_guild_storage_ack(int fd,int account_id,int guild_id,int fail)
-{
- WFIFOW(fd,0)=0x3819;
- WFIFOL(fd,2)=account_id;
- WFIFOL(fd,6)=guild_id;
- WFIFOB(fd,10)=fail;
- WFIFOSET(fd,11);
- return 0;
-}
-
-//---------------------------------------------------------
-// packet from map server
-
-// recive request about storage data
-int mapif_parse_LoadStorage(int fd){
- mapif_load_storage(fd,RFIFOL(fd,2));
- return 0;
-}
-// storage data recive and save
-int mapif_parse_SaveStorage(int fd){
- int account_id=RFIFOL(fd,4);
- int len=RFIFOW(fd,2);
-
- if(sizeof(struct storage)!=len-8){
- printf("inter storage: data size error %d %d\n",sizeof(struct storage),len-8);
- }else{
- memcpy(&storage_pt[0],RFIFOP(fd,8),sizeof(struct storage));
- storage_tosql(account_id, storage_pt);
- mapif_save_storage_ack(fd,account_id);
- }
- return 0;
-}
-
-int mapif_parse_LoadGuildStorage(int fd)
-{
- mapif_load_guild_storage(fd,RFIFOL(fd,2),RFIFOL(fd,6));
- return 0;
-}
-
-int mapif_parse_SaveGuildStorage(int fd)
-{
- int guild_exist=0;
- int guild_id=RFIFOL(fd,8);
- int len=RFIFOW(fd,2);
- if(sizeof(struct guild_storage)!=len-12){
- printf("inter storage: data size error %d %d\n",sizeof(struct guild_storage),len-12);
- }
- else {
- // Check if guild exists, I may write a function for this later, coz I use it several times.
- //printf("- Check if guild %d exists\n",g->guild_id);
- sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) );
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- sql_row = mysql_fetch_row(sql_res);
- guild_exist = atoi (sql_row[0]);
- //printf("- Check if guild %d exists : %s\n",g->guild_id,((guild_exist==0)?"No":"Yes"));
- }
- mysql_free_result(sql_res) ; //resource free
-
- if(guild_exist==1) {
- memcpy(guild_storage_pt,RFIFOP(fd,12),sizeof(struct guild_storage));
- guild_storage_tosql(guild_id,guild_storage_pt);
- mapif_save_guild_storage_ack(fd,RFIFOL(fd,4),guild_id,0);
- }
- else
- mapif_save_guild_storage_ack(fd,RFIFOL(fd,4),guild_id,1);
- }
- return 0;
-}
-
-
-int inter_storage_parse_frommap(int fd){
- switch(RFIFOW(fd,0)){
- case 0x3010: mapif_parse_LoadStorage(fd); break;
- case 0x3011: mapif_parse_SaveStorage(fd); break;
- case 0x3018: mapif_parse_LoadGuildStorage(fd); break;
- case 0x3019: mapif_parse_SaveGuildStorage(fd); break;
- default:
- return 0;
- }
- return 1;
-}
-
diff --git a/src/char_sql/int_storage.h b/src/char_sql/int_storage.h
deleted file mode 100644
index 5541d1ed7..000000000
--- a/src/char_sql/int_storage.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef _INT_STORAGE_H_
-#define _INT_STORAGE_H_
-
-int inter_storage_sql_init();
-void inter_storage_sql_final();
-int inter_storage_delete(int account_id);
-int inter_guild_storage_delete(int guild_id);
-
-int inter_storage_parse_frommap(int fd);
-
-
-//extern char storage_txt[256];
-
-#endif
diff --git a/src/char_sql/inter.c b/src/char_sql/inter.c
deleted file mode 100644
index 83fcc967f..000000000
--- a/src/char_sql/inter.c
+++ /dev/null
@@ -1,625 +0,0 @@
-//
-// original code from athena
-// SQL conversion by Jioh L. Jung
-//
-
-#include <string.h>
-#include <stdlib.h>
-
-#include "char.h"
-#include "../common/strlib.h"
-#include "inter.h"
-#include "int_party.h"
-#include "int_guild.h"
-#include "int_storage.h"
-#include "int_pet.h"
-#include "lock.h"
-
-#define WISDATA_TTL (60*1000) // Wisƒf[ƒ^‚̶‘¶ŽžŠÔ(60•b)
-#define WISDELLIST_MAX 256 // Wisƒf[ƒ^휃ŠƒXƒg‚Ì—v‘f”
-
-
-struct accreg {
- int account_id,reg_num;
- struct global_reg reg[ACCOUNT_REG_NUM];
-};
-
-static struct accreg *accreg_pt;
-
-
-int party_share_level = 10;
-MYSQL mysql_handle;
-MYSQL_RES* sql_res ;
-MYSQL_ROW sql_row ;
-int sql_fields, sql_cnt;
-char tmp_sql[65535];
-
-MYSQL lmysql_handle;
-char tmp_lsql[65535];
-MYSQL_RES* lsql_res ;
-MYSQL_ROW lsql_row ;
-
-int char_server_port = 3306;
-char char_server_ip[32] = "127.0.0.1";
-char char_server_id[32] = "ragnarok";
-char char_server_pw[32] = "ragnarok";
-char char_server_db[32] = "ragnarok";
-
-int login_server_port = 3306;
-char login_server_ip[32] = "127.0.0.1";
-char login_server_id[32] = "ragnarok";
-char login_server_pw[32] = "ragnarok";
-char login_server_db[32] = "ragnarok";
-
-// sending packet list
-int inter_send_packet_length[]={
- -1,-1,27, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- -1, 7, 0, 0, 0, 0, 0, 0, -1,11, 0, 0, 0, 0, 0, 0,
- 35,-1,11,15, 34,29, 7,-1, 0, 0, 0, 0, 0, 0, 0, 0,
- 10,-1,15, 0, 79,19, 7,-1, 0,-1,-1,-1, 14,67,186,-1,
- 9, 9,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 11,-1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-// recv. packet list
-int inter_recv_packet_length[]={
- -1,-1, 7, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 6,-1, 0, 0, 0, 0, 0, 0, 10,-1, 0, 0, 0, 0, 0, 0,
- 74, 6,52,14, 10,29, 6,-1, 34, 0, 0, 0, 0, 0, 0, 0,
- -1, 6,-1, 0, 55,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1,
- 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 48,14,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-struct WisData {
- int id,fd,count,len;
- unsigned long tick;
- unsigned char src[24],dst[24],msg[512];
-};
-static struct dbt * wis_db = NULL;
-static int wis_dellist[WISDELLIST_MAX], wis_delnum;
-
-//--------------------------------------------------------
-// Save account_reg to sql (type=2)
-int inter_accreg_tosql(int account_id,struct accreg *reg){
-
- int j;
- char temp_str[32];
- if (account_id<=0) return 0;
- reg->account_id=account_id;
-
- //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`)
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `type`=2 AND `account_id`='%d'",reg_db, account_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `global_reg_value`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- if (reg->reg_num<=0) return 0;
-
- for(j=0;j<reg->reg_num;j++){
- if(reg->reg[j].str != NULL){
- sprintf(tmp_sql,"INSERT INTO `%s` (`type`, `account_id`, `str`, `value`) VALUES (2,'%d', '%s','%d')",
- reg_db, reg->account_id, jstrescapecpy(temp_str,reg->reg[j].str), reg->reg[j].value);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (insert `global_reg_value`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- }
- return 0;
-}
-
-// Load account_reg from sql (type=2)
-int inter_accreg_fromsql(int account_id,struct accreg *reg)
-{
- int j=0;
- if (reg==NULL) return 0;
- memset(reg, 0, sizeof(struct accreg));
- reg->account_id=account_id;
-
- //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`)
- sprintf (tmp_sql, "SELECT `str`, `value` FROM `%s` WHERE `type`=2 AND `account_id`='%d'",reg_db, reg->account_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (select `global_reg_value`)- %s\n", mysql_error(&mysql_handle) );
- }
- sql_res = mysql_store_result(&mysql_handle);
-
- if (sql_res) {
- for(j=0;(sql_row = mysql_fetch_row(sql_res));j++){
- memcpy(reg->reg[j].str, sql_row[0],32);
- reg->reg[j].value = atoi(sql_row[1]);
- }
- mysql_free_result(sql_res);
- }
- reg->reg_num=j;
- return 0;
-}
-
-// Initialize
-int inter_accreg_sql_init()
-{
- CREATE(accreg_pt, struct accreg, 1);
- return 0;
-
-}
-
-/*==========================================
- * read config file
- *------------------------------------------
- */
-int inter_config_read(const char *cfgName) {
- int i;
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- printf ("start reading interserver configuration: %s\n",cfgName);
-
- fp=fopen(cfgName,"r");
- if(fp==NULL){
- printf("file not found: %s\n", cfgName);
- return 1;
- }
- while(fgets(line, 1020, fp)){
- i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
- if(i!=2)
- continue;
-
- if(strcmpi(w1,"char_server_ip")==0){
- strcpy(char_server_ip, w2);
- printf ("set char_server_ip : %s\n",w2);
- }
- else if(strcmpi(w1,"char_server_port")==0){
- char_server_port=atoi(w2);
- printf ("set char_server_port : %s\n",w2);
- }
- else if(strcmpi(w1,"char_server_id")==0){
- strcpy(char_server_id, w2);
- printf ("set char_server_id : %s\n",w2);
- }
- else if(strcmpi(w1,"char_server_pw")==0){
- strcpy(char_server_pw, w2);
- printf ("set char_server_pw : %s\n",w2);
- }
- else if(strcmpi(w1,"char_server_db")==0){
- strcpy(char_server_db, w2);
- printf ("set char_server_db : %s\n",w2);
- }
- //Logins information to be read from the inter_athena.conf
- //for character deletion (checks email in the loginDB)
-
- else if(strcmpi(w1,"login_server_ip")==0){
- strcpy(login_server_ip, w2);
- printf ("set login_server_ip : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_port")==0){
- login_server_port=atoi(w2);
- printf ("set login_server_port : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_id")==0){
- strcpy(login_server_id, w2);
- printf ("set login_server_id : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_pw")==0){
- strcpy(login_server_pw, w2);
- printf ("set login_server_pw : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_db")==0){
- strcpy(login_server_db, w2);
- printf ("set login_server_db : %s\n",w2);
- }
- else if(strcmpi(w1,"party_share_level")==0){
- party_share_level=atoi(w2);
- if(party_share_level < 0) party_share_level = 0;
- }else if(strcmpi(w1,"import")==0){
- inter_config_read(w2);
- }
- else if(strcmpi(w1,"log_inter")==0){
- log_inter = atoi(w2);
- }
- else if(strcmpi(w1,"login_server_db")==0){
- strcpy(login_server_db, w2);
- printf ("set login_server_db : %s\n",w2);
- }
- }
- fclose(fp);
-
- printf ("success reading interserver configuration\n");
-
- return 0;
-}
-
-// Save interlog into sql
-int inter_log(char *fmt,...)
-{
- char str[255];
- char temp_str[255];
- va_list ap;
- va_start(ap,fmt);
-
- vsprintf(str,fmt,ap);
- sprintf(tmp_sql,"INSERT INTO `%s` (`time`, `log`) VALUES (NOW(), '%s')",interlog_db, jstrescapecpy(temp_str,str));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (insert `interlog`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- va_end(ap);
- return 0;
-}
-
-
-// initialize
-int inter_init(const char *file)
-{
- //int i;
-
- printf ("interserver initialize...\n");
- inter_config_read(file);
-
- //DB connection initialized
- mysql_init(&mysql_handle);
- printf("Connect Character DB server.... (Character Server)\n");
- if(!mysql_real_connect(&mysql_handle, char_server_ip, char_server_id, char_server_pw,
- char_server_db ,char_server_port, (char *)NULL, 0)) {
- //pointer check
- printf("%s\n",mysql_error(&mysql_handle));
- exit(1);
- }
- else {
- printf ("Connect Success! (Character Server)\n");
- }
-
- mysql_init(&lmysql_handle);
- printf("Connect Character DB server.... (login server)\n");
- if(!mysql_real_connect(&lmysql_handle, login_server_ip, login_server_id, login_server_pw,
- login_server_db ,login_server_port, (char *)NULL, 0)) {
- //pointer check
- printf("%s\n",mysql_error(&lmysql_handle));
- exit(1);
- }else {
- printf ("Connect Success! (Login Server)");
- }
- wis_db = numdb_init();
- inter_guild_sql_init();
- inter_storage_sql_init();
- inter_party_sql_init();
-
- inter_pet_sql_init();
- inter_accreg_sql_init();
-
- atexit(inter_final);
-
- //printf ("interserver timer initializing : %d sec...\n",autosave_interval);
- //i=add_timer_interval(gettick()+autosave_interval,inter_save_timer,0,0,autosave_interval);
-
- return 0;
-}
-
-// finalize
-int wis_db_final (void *k, void *data, va_list ap) {
- struct WisData *p = (struct WisData *) data;
- if (p) aFree(p);
- return 0;
-}
-void inter_final() {
- numdb_final(wis_db, wis_db_final);
-
- inter_guild_sql_final();
- inter_storage_sql_final();
- inter_party_sql_final();
- inter_pet_sql_final();
-
- if (accreg_pt) aFree(accreg_pt);
- return;
-}
-
-int inter_mapif_init(int fd) {
- inter_guild_mapif_init(fd);
-
- return 0;
-}
-
-
-//--------------------------------------------------------
-
-// GM message sending
-int mapif_GMmessage(unsigned char *mes, int len, int sfd) {
- unsigned char buf[len];
-
- WBUFW(buf, 0) = 0x3800;
- WBUFW(buf, 2) = len;
- memcpy(WBUFP(buf, 4), mes, len-4);
- mapif_sendallwos(sfd, buf, len);
- printf("\033[1;34m inter server: GM[len:%d] - '%s' \033[0m\n", len, mes);
- return 0;
-}
-
-// Wis sending
-int mapif_wis_message(struct WisData *wd) {
- unsigned char buf[56 + wd->len];
-
- WBUFW(buf, 0) = 0x3801;
- WBUFW(buf, 2) = 56 +wd->len;
- WBUFL(buf, 4) = wd->id;
- memcpy(WBUFP(buf, 8), wd->src, 24);
- memcpy(WBUFP(buf,32), wd->dst, 24);
- memcpy(WBUFP(buf,56), wd->msg, wd->len);
- wd->count = mapif_sendall(buf,WBUFW(buf,2));
-
- return 0;
-}
-// Wis sending result
-int mapif_wis_end(struct WisData *wd,int flag)
-{
- unsigned char buf[27];
-
- WBUFW(buf, 0)=0x3802;
- memcpy(WBUFP(buf, 2),wd->src,24);
- WBUFB(buf,26)=flag;
- mapif_send(wd->fd,buf,27);
-// printf("inter server wis_end %d\n",flag);
- return 0;
-}
-
-int mapif_account_reg(int fd,unsigned char *src)
-{
- unsigned char buf[WBUFW(src,2)];
- memcpy(WBUFP(buf,0),src,WBUFW(src,2));
- WBUFW(buf, 0)=0x3804;
- mapif_sendallwos(fd,buf,WBUFW(buf,2));
- return 0;
-}
-
-// Send the requested account_reg
-int mapif_account_reg_reply(int fd,int account_id)
-{
- struct accreg *reg=accreg_pt;
- inter_accreg_fromsql(account_id,reg);
-
- WFIFOW(fd,0)=0x3804;
- WFIFOL(fd,4)=account_id;
- if(reg->reg_num==0){
- WFIFOW(fd,2)=8;
- }else{
- int j,p;
- for(j=0,p=8;j<reg->reg_num;j++,p+=36){
- memcpy(WFIFOP(fd,p),reg->reg[j].str,32);
- WFIFOL(fd,p+32)=reg->reg[j].value;
- }
- WFIFOW(fd,2)=p;
- }
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-
-int mapif_send_gmaccounts()
-{
- int i, len = 4;
- unsigned char buf[32000];
-
- // forward the gm accounts to the map server
- len = 4;
- WBUFW(buf,0) = 0x2b15;
-
- for(i = 0; i < GM_num; i++) {
- WBUFL(buf, len) = gm_account[i].account_id;
- WBUFB(buf, len+4) = (unsigned char)gm_account[i].level;
- len += 5;
- }
- WBUFW(buf, 2) = len;
- mapif_sendall(buf, len);
-
- return 0;
-}
-
-
-//--------------------------------------------------------
-
-// Existence check of WISP data
-int check_ttl_wisdata_sub(void *key, void *data, va_list ap) {
- unsigned long tick;
- struct WisData *wd = (struct WisData *)data;
- tick = va_arg(ap, unsigned long);
-
- if (DIFF_TICK(tick, wd->tick) > WISDATA_TTL && wis_delnum < WISDELLIST_MAX)
- wis_dellist[wis_delnum++] = wd->id;
-
- return 0;
-}
-
-int check_ttl_wisdata() {
- unsigned long tick = gettick();
- int i;
-
- do {
- wis_delnum = 0;
- numdb_foreach(wis_db, check_ttl_wisdata_sub, tick);
- for(i = 0; i < wis_delnum; i++) {
- struct WisData *wd = (struct WisData*)numdb_search(wis_db, wis_dellist[i]);
- printf("inter: wis data id=%d time out : from %s to %s\n", wd->id, wd->src, wd->dst);
- // removed. not send information after a timeout. Just no answer for the player
- //mapif_wis_end(wd, 1); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- numdb_erase(wis_db, wd->id);
- aFree(wd);
- }
- } while(wis_delnum >= WISDELLIST_MAX);
-
- return 0;
-}
-
-//--------------------------------------------------------
-
-// GM message sending
-int mapif_parse_GMmessage(int fd)
-{
- mapif_GMmessage(RFIFOP(fd, 4), RFIFOW(fd, 2), fd);
- return 0;
-}
-
-
-// Wisp/page request to send
-int mapif_parse_WisRequest(int fd) {
- struct WisData* wd;
- static int wisid = 0;
- char t_name[32];
-
- if (RFIFOW(fd,2)-52 >= sizeof(wd->msg)) {
- printf("inter: Wis message size too long.\n");
- return 0;
- } else if (RFIFOW(fd,2)-52 <= 0) { // normaly, impossible, but who knows...
- printf("inter: Wis message doesn't exist.\n");
- return 0;
- }
- sprintf (tmp_sql, "SELECT `name` FROM `%s` WHERE `name`='%s'",
- char_db, jstrescapecpy(t_name, (char *)RFIFOP(fd,28)));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- sql_res = mysql_store_result(&mysql_handle);
-
- // search if character exists before to ask all map-servers
- if (!(sql_row = mysql_fetch_row(sql_res))) {
- unsigned char buf[27];
- WBUFW(buf, 0) = 0x3802;
- memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), 24);
- WBUFB(buf,26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- mapif_send(fd, buf, 27);
- // Character exists. So, ask all map-servers
- } else {
- // to be sure of the correct name, rewrite it
- memset(RFIFOP(fd,28), 0, 24);
- strncpy((char*)RFIFOP(fd,28), sql_row[0], 24);
- // if source is destination, don't ask other servers.
- if (strcmp((char*)RFIFOP(fd,4),(char*)RFIFOP(fd,28)) == 0) {
- unsigned char buf[27];
- WBUFW(buf, 0) = 0x3802;
- memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), 24);
- WBUFB(buf,26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- mapif_send(fd, buf, 27);
- } else {
-
- CREATE(wd, struct WisData, 1);
-
- // Whether the failure of previous wisp/page transmission (timeout)
- check_ttl_wisdata();
-
- wd->id = ++wisid;
- wd->fd = fd;
- wd->len= RFIFOW(fd,2)-52;
- memcpy(wd->src, RFIFOP(fd, 4), 24);
- memcpy(wd->dst, RFIFOP(fd,28), 24);
- memcpy(wd->msg, RFIFOP(fd,52), wd->len);
- wd->tick = gettick();
- numdb_insert(wis_db, wd->id, wd);
- mapif_wis_message(wd);
- }
- }
-
- //Freeing ... O.o
- if(sql_res){
- mysql_free_result(sql_res);
- }
-
- return 0;
-}
-
-
-// Wisp/page transmission result
-int mapif_parse_WisReply(int fd) {
- int id = RFIFOL(fd,2), flag = RFIFOB(fd,6);
- struct WisData *wd = (struct WisData*)numdb_search(wis_db, id);
-
- if (wd == NULL)
- return 0; // This wisp was probably suppress before, because it was timeout of because of target was found on another map-server
-
- if ((--wd->count) <= 0 || flag != 1) {
- mapif_wis_end(wd, flag); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- numdb_erase(wis_db, id);
- aFree(wd);
- }
-
- return 0;
-}
-
-
-// Save account_reg into sql (type=2)
-int mapif_parse_AccReg(int fd)
-{
- int j,p;
- struct accreg *reg=accreg_pt;
- int account_id = RFIFOL(fd,4);
- memset(accreg_pt,0,sizeof(struct accreg));
-
- for(j=0,p=8;j<ACCOUNT_REG_NUM && p<RFIFOW(fd,2);j++,p+=36){
- memcpy(reg->reg[j].str,RFIFOP(fd,p),32);
- reg->reg[j].value=RFIFOL(fd,p+32);
- }
- reg->reg_num=j;
-
- inter_accreg_tosql(account_id,reg);
- mapif_account_reg(fd,RFIFOP(fd,0)); // Send confirm message to map
- return 0;
-}
-
-// Request the value of account_reg
-int mapif_parse_AccRegRequest(int fd)
-{
-// printf("mapif: accreg request\n");
- return mapif_account_reg_reply(fd,RFIFOL(fd,2));
-}
-
-
-
-//--------------------------------------------------------
-int inter_parse_frommap(int fd)
-{
- int cmd=RFIFOW(fd,0);
- int len=0;
-
- // interŽIŠÇŠ‚©‚𒲂ׂé
- if(cmd<0x3000 || cmd>=0x3000+( sizeof(inter_recv_packet_length)/
- sizeof(inter_recv_packet_length[0]) ) )
- return 0;
-
- // ƒpƒPƒbƒg’·‚𒲂ׂé
- if( (len=inter_check_length(fd,inter_recv_packet_length[cmd-0x3000]))==0 )
- return 2;
-
- switch(cmd){
- case 0x3000: mapif_parse_GMmessage(fd); break;
- case 0x3001: mapif_parse_WisRequest(fd); break;
- case 0x3002: mapif_parse_WisReply(fd); break;
- case 0x3004: mapif_parse_AccReg(fd); break;
- case 0x3005: mapif_parse_AccRegRequest(fd); break;
- default:
- if( inter_party_parse_frommap(fd) )
- break;
- if( inter_guild_parse_frommap(fd) )
- break;
- if( inter_storage_parse_frommap(fd) )
- break;
- if( inter_pet_parse_frommap(fd) )
- break;
- return 0;
- }
- RFIFOSKIP(fd, len );
- return 1;
-}
-
-// RFIFO check
-int inter_check_length(int fd, int length)
-{
- if(length==-1){ // v-len packet
- if(RFIFOREST(fd)<4) // packet not yet
- return 0;
- length = RFIFOW(fd, 2);
- }
-
- if(RFIFOREST(fd)<length) // packet not yet
- return 0;
-
- return length;
-}
diff --git a/src/char_sql/inter.h b/src/char_sql/inter.h
deleted file mode 100644
index 9265a8d82..000000000
--- a/src/char_sql/inter.h
+++ /dev/null
@@ -1,47 +0,0 @@
-#ifndef _INTER_H_
-#define _INTER_H_
-
-int inter_init(const char *file);
-void inter_final();
-int inter_parse_frommap(int fd);
-int inter_mapif_init(int fd);
-int mapif_send_gmaccounts();
-
-int inter_check_length(int fd,int length);
-
-int inter_log(char *fmt,...);
-
-#define inter_cfgName "conf/inter_athena.conf"
-
-extern int party_share_level;
-extern char inter_log_filename[1024];
-
-//add include for DBMS(mysql)
-#include <mysql.h>
-
-extern MYSQL mysql_handle;
-extern char tmp_sql[65535];
-extern MYSQL_RES* sql_res ;
-extern MYSQL_ROW sql_row ;
-extern int sql_cnt;
-
-extern MYSQL lmysql_handle;
-extern char tmp_lsql[65535];
-extern MYSQL_RES* lsql_res ;
-extern MYSQL_ROW lsql_row ;
-
-extern int char_server_port;
-extern char char_server_ip[32];
-extern char char_server_id[32];
-extern char char_server_pw[32];
-extern char char_server_db[32];
-
-extern int login_db_server_port;
-extern char login_db_server_ip[32];
-extern char login_db_server_id[32];
-extern char login_db_server_pw[32];
-extern char login_db_server_db[32];
-
-extern int log_inter;
-
-#endif
diff --git a/src/char_sql/itemdb.c b/src/char_sql/itemdb.c
deleted file mode 100644
index bc3e8603e..000000000
--- a/src/char_sql/itemdb.c
+++ /dev/null
@@ -1,247 +0,0 @@
-// $Id: itemdb.c,v 1.1.1.1 2004/09/10 17:44:48 MagicalTux Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "itemdb.h"
-#include "db.h"
-#include "inter.h"
-#include "char.h"
-#include "utils.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-#define MAX_RANDITEM 2000
-
-// ** ITEMDB_OVERRIDE_NAME_VERBOSE **
-// ’è‹`‚·‚é‚ÆAitemdb.txt‚Ægrf‚Å–¼‘O‚ªˆÙ‚È‚éê‡A•\Ž¦‚µ‚Ü‚·.
-//#define ITEMDB_OVERRIDE_NAME_VERBOSE 1
-
-char item_db_db[256]="item_db"; // added to specify item_db sql table [Valaris]
-
-static struct dbt* item_db;
-
-/*==========================================
- * DB‚ÌŒŸõ
- *------------------------------------------
- */
-struct item_data* itemdb_search(int nameid)
-{
- struct item_data *id;
-
- id = (struct item_data*)numdb_search(item_db,nameid);
- if(id) return id;
-
- CREATE(id, struct item_data, 1);
-
- numdb_insert(item_db,nameid,id);
-
-
- if(nameid>500 && nameid<600)
- id->type=0; //heal item
- else if(nameid>600 && nameid<700)
- id->type=2; //use item
- else if((nameid>700 && nameid<1100) ||
- (nameid>7000 && nameid<8000))
- id->type=3; //correction
- else if(nameid>=1750 && nameid<1771)
- id->type=10; //arrow
- else if(nameid>1100 && nameid<2000)
- id->type=4; //weapon
- else if((nameid>2100 && nameid<3000) ||
- (nameid>5000 && nameid<6000))
- id->type=5; //armor
- else if(nameid>4000 && nameid<5000)
- id->type=6; //card
- else if(nameid>9000 && nameid<10000)
- id->type=7; //egg
- else if(nameid>10000)
- id->type=8; //petequip
-
- return id;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int itemdb_isequip(int nameid)
-{
- int type=itemdb_type(nameid);
- if(type==0 || type==2 || type==3 || type==6 || type==10)
- return 0;
- return 1;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int itemdb_isequip2(struct item_data *data)
-{
- if(data) {
- int type=data->type;
- if(type==0 || type==2 || type==3 || type==6 || type==10)
- return 0;
- else
- return 1;
- }
- return 0;
-}
-
-
-
-/*==========================================
- * ƒAƒCƒeƒ€ƒf[ƒ^ƒx[ƒX‚Ì“Ç‚Ýž‚Ý
- *------------------------------------------
- */
-static int itemdb_readdb(void)
-{
- FILE *fp;
- char line[1024];
- int ln=0;
- int nameid,j;
- char *str[32],*p,*np;
- struct item_data *id;
-
- fp=fopen("db/item_db.txt","r");
- if(fp==NULL){
- printf("can't read db/item_db.txt\n");
- exit(1);
- }
- while(fgets(line,1020,fp)){
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(str,0,sizeof(str));
- for(j=0,np=p=line;j<17 && p;j++){
- str[j]=p;
- p=strchr(p,',');
- if(p){ *p++=0; np=p; }
- }
- if(str[0]==NULL)
- continue;
-
- nameid=atoi(str[0]);
- if(nameid<=0 || nameid>=20000)
- continue;
- ln++;
-
- //ID,Name,Jname,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Gender,Loc,wLV,eLV,View
- id=itemdb_search(nameid);
- memcpy(id->name,str[1],24);
- memcpy(id->jname,str[2],24);
- id->type=atoi(str[3]);
-
- }
- fclose(fp);
- printf("read db/item_db.txt done (count=%d)\n",ln);
- return 0;
-}
-
-static int itemdb_read_sqldb(void) // sql item_db read, shortened version of map-server item_db read [Valaris]
-{
- unsigned int nameid; // Type should be "unsigned short int", but currently isn't for compatibility with numdb_insert()
- struct item_data *id;
-
- // ----------
-
- // Output query to retrieve all rows from the item database table
- sprintf(tmp_sql, "SELECT * FROM `%s`", item_db_db);
-
- // Execute the query; if the query execution fails, output an error
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("Database server error (executing query for %s): %s\n", item_db_db, mysql_error(&mysql_handle));
- }
-
- // Store the query result
- sql_res = mysql_store_result(&mysql_handle);
-
- // If the storage of the query result succeeded
- if (sql_res) {
- // Parse each row in the query result into sql_row
- while ((sql_row = mysql_fetch_row(sql_res))) {
- nameid = atoi(sql_row[0]);
-
- // If the identifier is not within the valid range, process the next row
- if (nameid == 0 || nameid >= 20000) { // Should ">= 20000" be "> 20000"?
- continue;
- }
-
- // ----------
-
- // Insert a new row into the item database
-/*
- id = aCalloc(sizeof(struct item_data), 1);
-
- if (id == NULL) {
- printf("out of memory : itemdb_read_sqldb\n");
- exit(1);
- }
-
- memset(id, 0, sizeof(struct item_data));
- numdb_insert(item_db, nameid, id);
-
- // ----------
-*/
- id=itemdb_search(nameid);
-
- memcpy(id->name, sql_row[1], 24);
- memcpy(id->jname, sql_row[2], 24);
-
- id->type = atoi(sql_row[3]);
- }
-
- // If the retrieval failed, output an error
- if (mysql_errno(&mysql_handle)) {
- printf("Database server error (retrieving rows from %s): %s\n", item_db_db, mysql_error(&mysql_handle));
- }
-
- printf("read %s done (count = %lu)\n", item_db_db, (unsigned long) mysql_num_rows(sql_res));
-
- // Free the query result
- mysql_free_result(sql_res);
- } else {
- printf("MySQL error (storing query result for %s): %s\n", item_db_db, mysql_error(&mysql_handle));
- }
-
- return 0;
-}
-
-static int itemdb_final(void *key,void *data,va_list ap)
-{
- struct item_data *id;
-
- id = (struct item_data*)data;
- if(id->use_script)
- aFree(id->use_script);
- if(id->equip_script)
- aFree(id->equip_script);
- aFree(id);
-
- return 0;
-}
-
-
-/*==========================================
- *
- *------------------------------------------
- */
-void do_final_itemdb(void)
-{
- if(item_db){
- numdb_final(item_db,itemdb_final);
- item_db=NULL;
- }
-}
-int do_init_itemdb(void)
-{
- item_db = numdb_init();
-
- if (db_use_sqldbs) // it db_use_sqldbs in inter config are yes, will read from item_db for char server display [Valaris]
- itemdb_read_sqldb();
- else
- itemdb_readdb();
- return 0;
-}
-
diff --git a/src/char_sql/itemdb.h b/src/char_sql/itemdb.h
deleted file mode 100644
index 762873c8e..000000000
--- a/src/char_sql/itemdb.h
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifndef _ITEMDB_H_
-#define _ITEMDB_H_
-
-struct item_data {
- int nameid;
- char name[24],jname[24];
- int value_buy,value_sell,value_notdc,value_notoc;
- int type;
- int class_;
- int sex;
- int equip;
- int weight;
- int atk;
- int def;
- int range;
- int slot;
- int look;
- int elv;
- int wlv;
- char *use_script; // ‰ñ•œ‚Æ‚©‚à‘S•”‚±‚Ì’†‚Å‚â‚낤‚©‚È‚Æ
- char *equip_script; // UŒ‚,–hŒä‚Ì‘®«Ý’è‚à‚±‚Ì’†‚ʼn”\‚©‚È?
- char available;
-};
-
-struct item_data* itemdb_search(int nameid);
-#define itemdb_type(n) itemdb_search(n)->type
-
-int itemdb_isequip(int);
-int itemdb_isequip2(struct item_data *);
-
-void do_final_itemdb(void);
-int do_init_itemdb(void);
-
-#endif
diff --git a/src/char_sql/make.sh b/src/char_sql/make.sh
deleted file mode 100644
index 6ee175f73..000000000
--- a/src/char_sql/make.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
- rsqlt=`rm -rf *.o`
- gcc -c char.c -I/usr/local/include/mysql/
- gcc -c int_guild.c -I/usr/local/include/mysql/
- gcc -c int_party.c -I/usr/local/include/mysql/
- gcc -c int_pet.c -I/usr/local/include/mysql/
- gcc -c int_storage.c -I/usr/local/include/mysql/
- gcc -c inter.c -I/usr/local/include/mysql/
- gcc -c itemdb.c -I../common/
- gcc -o ../char-server inter.o char.o int_pet.o int_storage.o int_guild.o int_party.o ../common/strlib.o itemdb.o ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o -L/usr/local/lib/mysql -lmysqlclient -lz
diff --git a/src/char_sql/readme.txt b/src/char_sql/readme.txt
deleted file mode 100644
index 41b114405..000000000
--- a/src/char_sql/readme.txt
+++ /dev/null
@@ -1,250 +0,0 @@
-//Encoded with UTF-8 (UNICODE)
-//---------------------------------------------
-// V.018 - Aarlex
-1. ADD Makefile & GNUmakefile
-2. fix guild_leave.
-3. fix char select windows HP & SP value error.
-
-// V.017 - Aarlex
-1. fix guild member view job update.(For mod-0728)
- inter.c
- int_guild.c
-
-// V.016 - by Aarlex
-1. Add e-mail check when you Delete char data.
-2. modify storage save func like 014.
-2. remove Lan_support func.
-
-// v.014 - by Aarlex
-I rewrite save function.
-besause myfriend find that Mysql will use more than 40% CPU.
-And log file is too big (4 days 22G ..= =+)
-(maybe he sets autosave_time less then 1 min.)
-but. i still rewrite save func.
-char server will delete all of user item(inventory & Cart) data then insert them again before.
-so i use two struct to save item data from map & database.
-then compare two struct to get different .
-AND add some debug message.but message maybe too much XD.
-
-
-1. ADDED itemdb.c itemdb.h
-2. modify mmo_char_tosql().
-3. ADDED memitemdata_to_sql().
-4. ADDED some debug message in memitemdata_to_sql().
-5. modify make.sh
-
-// v.013 - by Aarlex
-1. some SQL sentance fix in old version Mysql .
-
-2. in_guild.c mapif_guild_leaved()
- unsigned char buf[64] -> unsigned char buf[128]
-
-3. in_pet.c inter_pet_tosql()
- if (sql_res) - > if (mysql_num_rows(sql_res)!=0)
-
-4. in_char.c mmo_char_send006b()
-
- WFIFOW(fd, offset+(i*106)+42) = char_dat[0].hp -> WFIFOW(fd,offset+(i*106)+42) = (char_dat[j].hp > 0x7fff)? 0x7fff:char_dat[j].hp;
- WFIFOW(fd, offset+(i*106)+44) = char_dat[0].max_hp -> WFIFOW(fd,offset+(i*106)+44) = (char_dat[j].max_hp > 0x7fff)? 0x7fff:char_dat[j].max_hp;
- WFIFOW(fd, offset+(i*106)+46) = char_dat[0].sp -> WFIFOW(fd,offset+(i*106)+46) = (char_dat[j].sp > 0x7fff)? 0x7fff:char_dat[j].sp
- WFIFOW(fd, offset+(i*106)+48) = char_dat[0].max_sp -> WFIFOW(fd,offset+(i*106)+48) = (char_dat[j].max_sp > 0x7fff)? 0x7fff:char_dat[j].max_sp;
-
- in_char.c parse_char()
-
- WFIFOW(fd, offset+(i*106)+42) = char_dat[0].hp -> WFIFOW(fd,offset+(i*106)+42) = (char_dat[j].hp > 0x7fff)? 0x7fff:char_dat[j].hp;
- WFIFOW(fd, offset+(i*106)+44) = char_dat[0].max_hp -> WFIFOW(fd,offset+(i*106)+44) = (char_dat[j].max_hp > 0x7fff)? 0x7fff:char_dat[j].max_hp;
- WFIFOW(fd, offset+(i*106)+46) = char_dat[0].sp -> WFIFOW(fd,offset+(i*106)+46) = (char_dat[j].sp > 0x7fff)? 0x7fff:char_dat[j].sp
- WFIFOW(fd, offset+(i*106)+48) = char_dat[0].max_sp -> WFIFOW(fd,offset+(i*106)+48) = (char_dat[j].max_sp > 0x7fff)? 0x7fff:char_dat[j].max_sp;
-
-// v.012 - by Jazz
-1. 0627 official versionã«åˆã‚ã›ã¦ä¿®æ­£ã—ã¾ã—ãŸ.
-2. no more binary files are supplied.
-
-//---------------------------------------------
-// v.011 - by Mark
-1. Fixed a couple bugs which would cause segfaults under linux :)
-
-//---------------------------------------------
-// v.010 - by Jazz
-1. added some debug info - for reporting.
-
-//---------------------------------------------
-// v.009 - by Jazz
-1. code added for debug.
-2. some SQL sentance fix.
-
-//---------------------------------------------
-// v.009 - by Jazz
-1. fix crash bug. - pet db.
-
-//---------------------------------------------
-// v.008 - by Jazz
-1. DB table fix. - char.fix-from.007.to.008.sql
-
-既存㮠table 構造ã«ã¯çŸ¢ãŒè£…ç€è§£é™¤ã•ã‚Œã‚‹å ´åˆãŒã‚ã‚Šã¾ã™.
-
-item.equip㯠'unsigned short' å½¢å¼ã§ã™.
-ã“ã®ãŸã‚ã« SQL tableを修正ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“.
-
-修正コード㯠char.fix-from.007.to.008.sql ã§ã™.
-MySQLã§ä¸€åº¦è¡Œã£ã¦ãれれã°é©ç”¨ã•ã‚Œã¾ã™. 既存ã®ãƒ‡ãƒ¼ã‚¿ã¯å®‰å…¨ã§ã™.
-
-//---------------------------------------------
-// v.007 - by Jazz
-1. domain 解釈ã«å¯¾ã™ã‚‹å•é¡Œã‚’修正ã—ã¾ã—ãŸ.
-
-//---------------------------------------------
-// v.006 - by Jazz
-1. crash bug fix. - when your pet DB is empty
-
-//---------------------------------------------
-// v.005 - by Jazz
-1. 0590 official versionã«åˆã‚ã›ã¦ä¿®æ­£ã—ã¾ã—ãŸ.
-
-//---------------------------------------------
-// v.004 - by Jazz
-1. 0586 official versionã«åˆã‚ã›ã¦ä¿®æ­£ã—ã¾ã—ãŸ.
-
-//---------------------------------------------
-// v.003 - by Jazz
-1. officialã® guild.c 㨠party.c ファイルã§ã¾ãŸå†ä¿®æ­£ã—ã¾ã—ãŸ.
-
-//---------------------------------------------
-// v.002 - by Jazz
-1. aphostropy å•é¡Œã‚’解決ã—ã¾ã—ãŸ. ã“ã‚Œã¯ä¿å®‰ã¨é€£é–¢ãŒã‚ã‚‹å•é¡Œã§ã™.
-2. SQLã®æ§‹é€ ã‚’修正ã—ã¾ã—ãŸ.
-
-//---------------------------------------------
-// v.001 - by Jazz
-1. 一番目安定 versionã§ã™. alpha versionã«å•é¡Œç‚¹ã‚’多数修正ã—ã¾ã—ãŸ.
-
-//------------------------------------------------------------------------
-//For JAPANESE USER
-Athena Char-Server for MySQL. 005
-
-一応 guild㨠partyã¯ã‚ˆã呼ã³å‡ºã—ã•ã‚Œã‚‹éƒ¨åˆ†ãªã®ã§æ—¢å­˜ã® athena char-serverãŒä½¿ã£ã¦ã„ã‚‹ file 基盤ã®æ§‹é€ ã‚’æŒã£ã¦è¡Œãã¾ã™.
-ã“ã‚Œã¯, 一度ã«ãƒ¡ãƒ¢ãƒªãƒ¼ã§çš†èª­ã‚“ã§, ã‚‚ã†ä¸€åº¦ã«çš† fileã§ä½¿ã†æ–¹ãŒéƒ¨ä¸‹ãŒå°‘ãªãã‹ã‹ã‚‹ã¨æ€ã„ã¾ã™.
-ãã—㦠char データã«æ¯”ã¹ã¦, lostã«ãªã£ã¦ã‚‚å•é¡ŒãŒã‚‚ã£ã¨å°‘ãªã„ã¨åˆ¤æ–­ã—ã¦ãã†ã—ã¾ã—ãŸ.
-
-MySQLãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® compile㯠MySQL Clients LibraryãŒå¿…è¦ã§ã™. windows(cygwin) ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã‚³ãƒ³ãƒ‘イルã•ã‚ŒãŸ binaryを添付ã—ã¾ã—ãŸ.
-
-設置:
-ã¾ã  text->DBã® converterã¯ã¾ã¨ã‚‚ã«æ”¯æ´ã—ãªã„ã§ã™. 内部的ã«ã¡ã‚‡ã£ã¨ãƒã‚°ãŒç™ºè¦‹ã•ã‚Œã¦ãƒã‚°ã‚’修正中ã§ã™.
-ã§ãã‚‹ã ã‘æ—©ã uploadã‚’ã—ã¾ã™.
-
-1. char.sqlã‚’ MySQLã« dumpã—ã¾ã™.
-
-2. inter_athena.confã«æ¬¡ã‚’追加ã—ã¾ã™. ãã—ã¦è‡ªåˆ†ã® DBサーãƒãƒ¼ã®æƒ…å ±ã«åˆã‚ã›ã¦ãã‚Œã¾ã™.
-ã“ã“㧠windows(cygwin)ã®å ´åˆã«ã¯ localhostを使ã£ã¦ã¯ã„ã‘ãªã„ã§ã™. ipã§æ›¸ã„ã¦ãã‚Œãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“.
-localhostã§ä½¿ã†å ´åˆ UNIX domain socketãŒä½œå‹•ã™ã‚‹ã‹ã‚‰é€£çµãŒä¸å¯èƒ½ã«ãªã‚Šã¾ã™.
-
-//3306 is default
-db_server_port: 3306
-//DB ip
-db_server_ip: 127.0.0.1
-//DB id
-db_server_id: ragnarok
-//DB pass
-db_server_pw: ragnarok
-//DB name
-db_server_logindb: ragnarok
-
-3. MySQL ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯ 2個㮠MySQL connect sessionã‚’æŒã¡ã¾ã™.
-一ã¤ã¯ã‚­ãƒ£ãƒ©ã‚¯ã‚¿ãƒ¼ãƒ‡ãƒ¼ã‚¿ã‚’読んã§æ›¸ãã®ã«ä½¿ã‚ã‚Œã¦, 二番目㯠inter serverã®ãŸã‚ã«é€£çµã—ã¾ã™.
-
-開発ã¨ãƒ†ã‚¹ãƒˆç’°å¢ƒã¯ P4 2.4a/1024MB/WinXP pro(MediaCenter Edition 2K4 KR)/Cygwin GCC ã§ã™.
-本人ãŒéŸ“国人ã ã‹ã‚‰éŸ“国語開発者ã®é€£çµ¡ã‚‚æ­“è¿Žã—ã¾ã™.
-韓国語ã¨æ—¥æœ¬èªžã®ä¸Šæ‰‹ãªæ–¹ã¯é€£çµ¡ã‚’ãã ã•ã„. 日本語ã®ä½¿ç”¨ã«é›£ã—ã•ã‚’æ„Ÿã˜ã¦ã„ã¾ã™.
-
-ç¾åœ¨ DarkWeiss㌠login serverã« MySQLを支æ´ã—始ã‚ã¾ã—ãŸ.
-ã—ã‹ã— athenaã®ãれ㯠DarkWeiss よりもã£ã¨ã‚ˆã作動ã™ã‚‹ã¨æ€ã„ã¾ã™.
-
-contact : jazz@creper.com
-
-//------------------------------------------------------------------------
-//For KOREAN USER
-Athena Char-Server for MySQL. 005
-
-ì¼ë‹¨ guild와 party는 ìžì£¼ 호출ë˜ëŠ” 부분ì´ë¼ì„œ ê¸°ì¡´ì˜ athena char-serverê°€ 사용하고 있는 file ê¸°ë°˜ì˜ êµ¬ì¡°ë¥¼ 가지고 갑니다.
-ì´ ê²ƒì€, í•œë²ˆì— ë©”ëª¨ë¦¬ë¡œ ëª¨ë‘ ì½ê³ , 다시 í•œë²ˆì— ëª¨ë‘ fileë¡œ 쓰는 ìª½ì´ ë¶€í•˜ê°€ ì ê²Œ 걸린다고 ìƒê°í•©ë‹ˆë‹¤.
-그리고 char ë°ì´í„°ì— 비해, lostê°€ ë˜ë”ë¼ë„ 문제가 ë” ì ë‹¤ê³  íŒë‹¨í•´ì„œ 그렇게 하였습니다.
-
-MySQLë²„ì „ì˜ compileì€ MySQL Clients Libraryê°€ 필요합니다. windows(cygwin) 버전으로 컴파ì¼ëœ binary를 첨부하였습니다.
-
-설치:
-ì•„ì§ text->DBì˜ converter는 제대로 지ì›í•˜ì§€ 않습니다. 내부ì ìœ¼ë¡œ 약간 버그가 발견ë˜ì–´ 버그를 수정중입니다.
-ë˜ë„ë¡ ë¹¨ë¦¬ upload를 하겠습니다.
-
-1. char.sqlì„ MySQLì— dump합니다.
-
-2. inter_athena.confì— ë‹¤ìŒì„ 추가 합니다. 그리고 ìžì‹ ì˜ DBì„œë²„ì˜ ì •ë³´ì— ë§žì¶”ì–´ ì¤ë‹ˆë‹¤.
-여기ì—ì„œ windows(cygwin)ì˜ ê²½ìš°ì—는 localhost를 ì“°ë©´ 안ë©ë‹ˆë‹¤. ipë¡œ ì ì–´ì£¼ì–´ì•¼ 합니다.
-localhostë¡œ 사용하는 경우 UNIX domain socketì´ ìž‘ë™ í•˜ê¸° ë•Œë¬¸ì— ì—°ê²°ì´ ë¶ˆê°€ëŠ¥í•´ 집니다.
-
-//3306 is default
-db_server_port: 3306
-//DB ip
-db_server_ip: 127.0.0.1
-//DB id
-db_server_id: ragnarok
-//DB pass
-db_server_pw: ragnarok
-//DB name
-db_server_logindb: ragnarok
-
-3. MySQL ë²„ì „ì€ 2ê°œì˜ MySQL connect sessionì„ ê°€ì§‘ë‹ˆë‹¤.
-하나는 ìºë¦­í„° ë°ì´í„°ë¥¼ ì½ê³  ì“°ëŠ”ë° ì‚¬ìš©ë˜ë©°, ë‘번째는 inter server를 위해서 연결합니다.
-
-개발과 테스트 í™˜ê²½ì€ P4 2.4a/1024MB/WinXP pro(MediaCenter Edition 2K4 KR)/Cygwin GCC 입니다.
-본ì¸ì´ 한국ì¸ì´ê¸° ë•Œë¬¸ì— í•œêµ­ì–´ 개발ìžì˜ ì—°ë½ë„ 환ì˜í•©ë‹ˆë‹¤.
-한국어와 ì¼ë³¸ì–´ê°€ 능숙한 ë¶„ì€ ì—°ë½ì„ 주세요. ì¼ë³¸ì–´ì˜ ì‚¬ìš©ì— ì–´ë ¤ì›€ì„ ëŠë¼ê³  있습니다.
-
-현재 DarkWeissê°€ login serverì— MySQLì„ ì§€ì›í•˜ê¸° 시작했습니다.
-하지만 athenaì˜ ê·¸ê²ƒì€ DarkWeiss 보다 ë” ìž˜ ìž‘ë™í•œë‹¤ê³  ìƒê°í•©ë‹ˆë‹¤.
-
-contact : jazz@creper.com
-
-//------------------------------------------------------------------------
-//For ENGLISH USER
-Athena Char-Server for MySQL. alpha 005
-
-= hehe. My English is poor. and I have no time to write. :)
-
-anyway this version use guild and party data on text file base system.
-It accesses many times, so memory dumping is useful for less cpu consume.
-
-MySQL version need MySQL Clients Library to compile. This include Win32-binary compiled by cygwin-gcc.
-
-Install:
-not yet text->DB converter. I found some bug on it, so It's under debug progress.
-
-1. dump char.sql to MySQL.
-
-2. add below on inter_athena.conf. and set your own information.
-do not use 'localhost' as domain on cygwin. you must set as ip.
-if you use localhost on cygwin, cygwin tries to connect MySQL as UNIX domain socket.
-but, MySQL does not support UNIX domain socket on windows.
-
-//3306 is default
-db_server_port: 3306
-//DB ip
-db_server_ip: 127.0.0.1
-//DB id
-db_server_id: ragnarok
-//DB pass
-db_server_pw: ragnarok
-//DB name
-db_server_logindb: ragnarok
-
-3. MySQL version has 2 MySQL connect session.
-one is for char-server and the other one is for inter-server.
-
-developement enviroment)
- P4 2.4a/1024MB/WinXP pro(MediaCenter Edition 2K4 KR)/Cygwin GCC
-
-I'm korean, so contect if U're Korean developer.
-Please contact me, If U can use Korean & Japanese well.
-
-DarkWeiss starts to support MySQL version of login server, but Athena's one works better, I thnik.
-
-contact : jazz@creper.com
diff --git a/src/common/.svnignore b/src/common/.svnignore
deleted file mode 100644
index fbbf39b06..000000000
--- a/src/common/.svnignore
+++ /dev/null
@@ -1,2 +0,0 @@
-GNUmakefile
-obj
diff --git a/src/common/Makefile b/src/common/Makefile
deleted file mode 100644
index 7a00c5a3c..000000000
--- a/src/common/Makefile
+++ /dev/null
@@ -1,23 +0,0 @@
-txt sql all: obj common
-
-obj:
- mkdir obj
-
-common: obj/core.o obj/socket.o obj/timer.o obj/grfio.o obj/db.o obj/lock.o obj/nullpo.o obj/malloc.o obj/showmsg.o obj/strlib.o obj/utils.o
-
-obj/%.o: %.c
- $(COMPILE.c) $(OUTPUT_OPTION) $<
-
-obj/core.o: core.c core.h showmsg.h
-obj/socket.o: socket.c socket.h mmo.h showmsg.h dll.h
-obj/timer.o: timer.c timer.h showmsg.h
-obj/grfio.o: grfio.c grfio.h showmsg.h
-obj/db.o: db.c db.h showmsg.h
-obj/lock.o: lock.h showmsg.h
-obj/nullpo.o: nullpo.c nullpo.h showmsg.h
-obj/malloc.o: malloc.c malloc.h showmsg.h
-obj/showmsg.o: showmsg.c showmsg.h
-obj/strlib.o: strlib.c strlib.h utils.h
-
-clean:
- rm -rf *.o obj
diff --git a/src/common/buffer.h b/src/common/buffer.h
deleted file mode 100644
index ea94380ce..000000000
--- a/src/common/buffer.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef _BUFFER_H_
-#define _BUFFER_H_
-
-// Full credit for this goes to Shinomori [Ajarn]
-
-#ifdef __GNUC__ // GCC has variable length arrays
-
-#define CREATE_BUFFER(name, type, size) type name[size]
-#define DELETE_BUFFER(name)
-
-#else // others don't, so we emulate them
-
-#define CREATE_BUFFER(name, type, size) type *name=(type*)aCalloc(size,sizeof(type))
-#define DELETE_BUFFER(name) aFree(name);name=NULL
-
-#endif
-
-#endif
diff --git a/src/common/core.c b/src/common/core.c
deleted file mode 100644
index 0a9e76120..000000000
--- a/src/common/core.c
+++ /dev/null
@@ -1,327 +0,0 @@
-// $Id: core.c,v 1.1.1.1 2004/09/10 17:44:49 MagicalTux Exp $
-// original : core.c 2003/02/26 18:03:12 Rev 1.7
-
-#include <stdio.h>
-#include <stdlib.h>
-#ifndef _WIN32
-#include <unistd.h>
-#endif
-#include <signal.h>
-#include <string.h>
-#ifdef DUMPSTACK
- #ifndef CYGWIN // HAVE_EXECINFO_H
- #include <execinfo.h>
- #endif
-#endif
-
-#include "core.h"
-#include "../common/mmo.h"
-#include "../common/malloc.h"
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/version.h"
-#include "../common/showmsg.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-char *argp;
-int runflag = 1;
-char SERVER_TYPE = SERVER_NONE;
-unsigned long ticks = 0; // by MC Cameri
-char pid_file[256];
-static void (*term_func)(void)=NULL;
-
-/*======================================
- * CORE : Set function
- *--------------------------------------
- */
-void set_termfunc(void (*termfunc)(void))
-{
- term_func = termfunc;
-}
-
-// Added by Gabuzomeu
-//
-// This is an implementation of signal() using sigaction() for portability.
-// (sigaction() is POSIX; signal() is not.) Taken from Stevens' _Advanced
-// Programming in the UNIX Environment_.
-//
-#ifndef SIGPIPE
-#define SIGPIPE SIGINT
-#endif
-
-#ifndef POSIX
-#define compat_signal(signo, func) signal(signo, func)
-#else
-sigfunc *compat_signal(int signo, sigfunc *func)
-{
- struct sigaction sact, oact;
-
- sact.sa_handler = func;
- sigemptyset(&sact.sa_mask);
- sact.sa_flags = 0;
-#ifdef SA_INTERRUPT
- sact.sa_flags |= SA_INTERRUPT; /* SunOS */
-#endif
-
- if (sigaction(signo, &sact, &oact) < 0)
- return (SIG_ERR);
-
- return (oact.sa_handler);
-}
-#endif
-
-/*======================================
- * CORE : Signal Sub Function
- *--------------------------------------
- */
-// for handling certain signals ourselves, like SIGPIPE
-static void sig_ignore(int sn) {
- printf ("Broken pipe found... closing socket\n"); // set to eof in socket.c
- return; // does nothing here
-}
-static void sig_proc(int sn)
-{
- int i;
- static int is_called = 0;
-
- if(is_called++)
- return;
-
- switch(sn){
- case SIGINT:
- case SIGTERM:
- if(term_func)
- term_func();
- for(i=0;i<fd_max;i++){
- if(!session[i])
- continue;
- close(i);
- }
- exit(0);
- break;
- }
-}
-
-/*=========================================
- * Dumps the stack using glibc's backtrace
- *-----------------------------------------
- */
-#ifndef DUMPSTACK
- #define sig_dump SIG_DFL
-#else
- #ifdef CYGWIN
- #define FOPEN_ freopen
- extern void cygwin_stackdump();
- #else
- #define FOPEN_(fn,m,s) fopen(fn,m)
- #endif
-extern const char *strsignal(int);
-void sig_dump(int sn)
-{
- FILE *fp;
- char file[256];
- int no = 0;
-
- #ifndef CYGWIN
- void* array[20];
- char **stack;
- size_t size;
- #endif
-
- // search for a usable filename
- do {
- sprintf (file, "log/%s%04d.stackdump", argp, ++no);
- } while((fp = fopen(file,"r")) && (fclose(fp), no < 9999));
- // dump the trace into the file
-
- if ((fp = FOPEN_(file, "w", stderr)) != NULL) {
- printf ("Dumping stack... ");
- fprintf(fp, "Exception: %s \n", strsignal(sn));
- fflush (fp);
-
- #ifdef CYGWIN
- cygwin_stackdump ();
- #else
- fprintf(fp, "Stack trace:\n");
- size = backtrace (array, 20);
- stack = backtrace_symbols (array, size);
- for (no = 0; no < size; no++) {
- fprintf(fp, "%s\n", stack[no]);
- }
- fprintf(fp,"End of stack trace\n");
- aFree(stack);
- #endif
-
- printf ("Done.\n");
- fflush(stdout);
- fclose(fp);
- }
- // Pass the signal to the system's default handler
- compat_signal(sn, SIG_DFL);
- raise(sn);
-}
-#endif
-
-int get_svn_revision(char *svnentry) { // Warning: minor syntax checking
- char line[1024];
- int rev = 0;
- FILE *fp;
- if ((fp = fopen(svnentry, "r")) == NULL) {
- return 0;
- } else {
- while (fgets(line,1023,fp))
- if (strstr(line,"revision=")) break;
- fclose(fp);
- if (sscanf(line," %*[^\"]\"%d%*[^\n]",&rev) == 1)
- return rev;
- else
- return 0;
- }
-// return 0;
-}
-
-/*======================================
- * CORE : Display title
- *--------------------------------------
- */
-
-static void display_title(void)
-{
- int revision;
- // for help with the console colors look here:
- // http://www.edoceo.com/liberum/?doc=printf-with-color
- // some code explanation (used here):
- // \033[2J : clear screen and go up/left (0, 0 position)
- // \033[K : clear line from actual position to end of the line
- // \033[0m : reset color parameter
- // \033[1m : use bold for font
- printf("\033[2J"); // clear screen and go up/left (0, 0 position in text)
- printf("\033[37;44m (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)\033[K\033[0m\n"); // white writing (37) on blue background (44), \033[K clean until end of file
- printf("\033[0;44m (\033[1;33m (c)2005 eAthena Development Team presents \033[0;44m)\033[K\033[0m\n"); // yellow writing (33)
- printf("\033[0;44m (\033[1m ______ __ __ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf("\033[0;44m (\033[1m /\\ _ \\/\\ \\__/\\ \\ v%2d.%02d.%02d \033[0;44m)\033[K\033[0m\n", ATHENA_MAJOR_VERSION, ATHENA_MINOR_VERSION, ATHENA_REVISION); // 1: bold char, 0: normal char
- printf("\033[0;44m (\033[1m __\\ \\ \\_\\ \\ \\ ,_\\ \\ \\___ __ ___ __ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf("\033[0;44m (\033[1m /'__`\\ \\ __ \\ \\ \\/\\ \\ _ `\\ /'__`\\/' _ `\\ /'__`\\ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf("\033[0;44m (\033[1m /\\ __/\\ \\ \\/\\ \\ \\ \\_\\ \\ \\ \\ \\/\\ __//\\ \\/\\ \\/\\ \\_\\.\\_ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf("\033[0;44m (\033[1m \\ \\____\\\\ \\_\\ \\_\\ \\__\\\\ \\_\\ \\_\\ \\____\\ \\_\\ \\_\\ \\__/.\\_\\ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf("\033[0;44m (\033[1m \\/____/ \\/_/\\/_/\\/__/ \\/_/\\/_/\\/____/\\/_/\\/_/\\/__/\\/_/ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf("\033[0;44m (\033[1m _ _ _ _ _ _ _ _ _ _ _ _ _ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf("\033[0;44m (\033[1m / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf("\033[0;44m (\033[1m ( e | n | g | l | i | s | h ) ( A | t | h | e | n | a ) \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf("\033[0;44m (\033[1m \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf("\033[0;44m (\033[1m \033[0;44m)\033[K\033[0m\n"); // yellow writing (33)
- printf("\033[0;44m (\033[1;33m Advanced Fusion Maps (c) 2003-2005 The Fusion Project \033[0;44m)\033[K\033[0m\n"); // yellow writing (33)
- printf("\033[37;44m (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)\033[K\033[0m\n\n"); // reset color
-
- if ((revision = get_svn_revision(".svn\\entries"))>0) {
- snprintf(tmp_output,sizeof(tmp_output),"SVN Revision: '"CL_WHITE"%d"CL_RESET"'.\n",revision);
- ShowInfo(tmp_output);
- }
-}
-
-/*======================================
- * CORE : MAINROUTINE
- *--------------------------------------
- */
-
-void pid_delete(void) {
- unlink(pid_file);
-}
-
-void pid_create(const char* file) {
- FILE *fp;
- int len = strlen(file);
- strcpy(pid_file,file);
- if(len > 4 && pid_file[len - 4] == '.') {
- pid_file[len - 4] = 0;
- }
- strcat(pid_file,".pid");
- fp = fopen(pid_file,"w");
- if(fp) {
-#ifdef _WIN32
- fprintf(fp,"%d",GetCurrentProcessId());
-#else
- fprintf(fp,"%d",getpid());
-#endif
- fclose(fp);
- atexit(pid_delete);
- }
-}
-
-#define LOG_UPTIME 0
-void log_uptime(void)
-{
-#if LOG_UPTIME
- time_t curtime;
- char curtime2[24];
- FILE *fp;
- long seconds = 0, day = 24*60*60, hour = 60*60,
- minute = 60, days = 0, hours = 0, minutes = 0;
-
- fp = fopen("log/uptime.log","a");
- if (fp) {
- time(&curtime);
- strftime(curtime2, 24, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
-
- seconds = (gettick()-ticks)/CLOCKS_PER_SEC;
- days = seconds/day;
- seconds -= (seconds/day>0)?(seconds/day)*day:0;
- hours = seconds/hour;
- seconds -= (seconds/hour>0)?(seconds/hour)*hour:0;
- minutes = seconds/minute;
- seconds -= (seconds/minute>0)?(seconds/minute)*minute:0;
-
- fprintf(fp, "%s: %s uptime - %ld days, %ld hours, %ld minutes, %ld seconds.\n",
- curtime2, argp, days, hours, minutes, seconds);
- fclose(fp);
- }
-
- return;
-#endif
-}
-
-int main(int argc,char **argv)
-{
- int next;
-
- if ((argp = strstr(argv[0], "./")) != NULL)
- argp+=2;
- else argp = argv[0];
-
- display_title();
-
- do_init_memmgr(argp); // ˆê”Ôʼn‚ÉŽÀs‚·‚é•K—v‚ª‚ ‚é
- atexit(log_uptime);
- pid_create(argp);
- Net_Init();
- do_socket();
-
- compat_signal(SIGPIPE, sig_ignore);
- compat_signal(SIGTERM,sig_proc);
- compat_signal(SIGINT,sig_proc);
-
- // Signal to create coredumps by system when necessary (crash)
- compat_signal(SIGSEGV, sig_dump);
- compat_signal(SIGFPE, sig_dump);
- compat_signal(SIGILL, sig_dump);
- #ifndef _WIN32
- compat_signal(SIGBUS, sig_dump);
- compat_signal(SIGTRAP, SIG_DFL);
- #endif
-
- tick_ = time(0);
- ticks = gettick();
-
- do_init(argc,argv);
-
- while(runflag){
- next=do_timer(gettick_nocache());
- do_sendrecv(next);
- do_parsepacket();
- }
-
- return 0;
-}
diff --git a/src/common/core.h b/src/common/core.h
deleted file mode 100644
index e9b5c8227..000000000
--- a/src/common/core.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// original : core.h 2003/03/14 11:55:25 Rev 1.4
-
-#ifndef _CORE_H_
-#define _CORE_H_
-
-extern char *argp;
-extern int runflag;
-extern unsigned long ticks;
-extern char SERVER_TYPE;
-
-enum {
- SERVER_NONE,
- SERVER_LOGIN,
- SERVER_CHAR,
- SERVER_MAP,
-};
-
-int do_init(int,char**);
-void set_termfunc(void (*termfunc)(void));
-
-#endif // _CORE_H_
diff --git a/src/common/db.c b/src/common/db.c
deleted file mode 100644
index 377128e8f..000000000
--- a/src/common/db.c
+++ /dev/null
@@ -1,662 +0,0 @@
-// $Id: db.c,v 1.2 2004/09/23 14:43:06 MouseJstr Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "db.h"
-#include "mmo.h"
-#include "utils.h"
-#include "malloc.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-//#define MALLOC_DBN
-
-// Backup cleaning routine in case the core doesn't do so properly,
-// only enabled if malloc_dbn is not defined.
-// As a temporary solution the root of the problem should still be found and fixed
-struct dbn *head;
-struct dbn *tail;
-
-#ifdef MALLOC_DBN
-#define ROOT_SIZE 4096
-static struct dbn *dbn_root[512], *dbn_free;
-static int dbn_root_rest=0,dbn_root_num=0;
-
-static void * malloc_dbn(void)
-{
- struct dbn* ret;
-
- if(dbn_free==NULL){
- if(dbn_root_rest<=0){
- CREATE(dbn_root[dbn_root_num], struct dbn, ROOT_SIZE);
-
- dbn_root_rest=ROOT_SIZE;
- dbn_root_num++;
- }
- return &(dbn_root[dbn_root_num-1][--dbn_root_rest]);
- }
- ret=dbn_free;
- dbn_free = dbn_free->parent;
- return ret;
-}
-
-static void free_dbn(struct dbn* add_dbn)
-{
- add_dbn->parent = dbn_free;
- dbn_free = add_dbn;
-}
-
-void exit_dbn(void)
-{
- int i;
-
- for (i=0;i<dbn_root_num;i++)
- if (dbn_root[i])
- aFree(dbn_root[i]);
-
- dbn_root_rest=0;
- dbn_root_num=0;
-
- return;
-}
-#else
-void exit_dbn(void)
-{
- int i = 0;
- struct dbn *p = head, *p2;
- while (p) {
- p2 = p->next;
- aFree(p);
- p = p2;
- i++;
- }
- //printf ("freed %d stray dbn\n", i);
- return;
-}
-#endif
-
-// maybe change the void* to const char* ???
-static int strdb_cmp(struct dbt* table,void* a,void* b)
-{
- if(table->maxlen)
- return strncmp((const char*)a,(const char*)b,table->maxlen);
- return strcmp((const char*)a,(const char*)b);
-}
-
-// maybe change the void* to unsigned char* ???
-static unsigned int strdb_hash(struct dbt* table,void* a)
-{
- int i;
- unsigned int h;
- unsigned char *p = (unsigned char*)a;
-
- i=table->maxlen;
- if(i==0) i=0x7fffffff;
- for(h=0;*p && --i>=0;){
- h=(h*33 + *p++) ^ (h>>24);
- }
- return h;
-}
-
-struct dbt* strdb_init_(int maxlen,const char *file,int line)
-{
- int i;
- struct dbt* table;
-
- CREATE(table, struct dbt, 1);
-
- table->cmp=strdb_cmp;
- table->hash=strdb_hash;
- table->maxlen=maxlen;
- for(i=0;i<HASH_SIZE;i++)
- table->ht[i]=NULL;
- table->alloc_file = file;
- table->alloc_line = line;
- table->item_count = 0;
- return table;
-}
-
-static int numdb_cmp(struct dbt* table,void* a,void* b)
-{
- int ia,ib;
-
- ia=(int)a;
- ib=(int)b;
-
- if((ia^ib) & 0x80000000)
- return ia<0 ? -1 : 1;
-
- return ia-ib;
-}
-
-static unsigned int numdb_hash(struct dbt* table,void* a)
-{
- return (unsigned int)a;
-}
-
-struct dbt* numdb_init_(const char *file,int line)
-{
- int i;
- struct dbt* table;
-
- CREATE(table, struct dbt, 1);
-
- table->cmp=numdb_cmp;
- table->hash=numdb_hash;
- table->maxlen=sizeof(int);
- for(i=0;i<HASH_SIZE;i++)
- table->ht[i]=NULL;
- table->alloc_file = file;
- table->alloc_line = line;
- table->item_count = 0;
- return table;
-}
-
-void* db_search(struct dbt *table,void* key)
-{
- struct dbn *p;
-
- for(p=table->ht[table->hash(table,key) % HASH_SIZE];p;){
- int c=table->cmp(table,key,p->key);
- if(c==0)
- return p->data;
- if(c<0)
- p=p->left;
- else
- p=p->right;
- }
- return NULL;
-}
-
-void * db_search2(struct dbt *table, const char *key)
-{
- int i,sp;
- struct dbn *p,*pn,*stack[64];
- int slen = strlen(key);
-
- for(i=0;i<HASH_SIZE;i++){
- if((p=table->ht[i])==NULL)
- continue;
- sp=0;
- while(1){
- if (strnicmp(key, (const char*)p->key, slen) == 0)
- return p->data;
- if((pn=p->left)!=NULL){
- if(p->right){
- stack[sp++]=p->right;
- }
- p=pn;
- } else {
- if(p->right){
- p=p->right;
- } else {
- if(sp==0)
- break;
- p=stack[--sp];
- }
- }
- }
- }
- return 0;
-}
-
-static void db_rotate_left(struct dbn *p,struct dbn **root)
-{
- struct dbn * y = p->right;
- p->right = y->left;
- if (y->left !=0)
- y->left->parent = p;
- y->parent = p->parent;
-
- if (p == *root)
- *root = y;
- else if (p == p->parent->left)
- p->parent->left = y;
- else
- p->parent->right = y;
- y->left = p;
- p->parent = y;
-}
-
-static void db_rotate_right(struct dbn *p,struct dbn **root)
-{
- struct dbn * y = p->left;
- p->left = y->right;
- if (y->right != 0)
- y->right->parent = p;
- y->parent = p->parent;
-
- if (p == *root)
- *root = y;
- else if (p == p->parent->right)
- p->parent->right = y;
- else
- p->parent->left = y;
- y->right = p;
- p->parent = y;
-}
-
-static void db_rebalance(struct dbn *p,struct dbn **root)
-{
- p->color = RED;
- while(p!=*root && p->parent->color==RED){ // root‚Í•K‚¸•‚Åe‚ÍÔ‚¢‚Ì‚Åe‚Ìe‚Í•K‚¸‘¶Ý‚·‚é
- if (p->parent == p->parent->parent->left) {
- struct dbn *y = p->parent->parent->right;
- if (y && y->color == RED) {
- p->parent->color = BLACK;
- y->color = BLACK;
- p->parent->parent->color = RED;
- p = p->parent->parent;
- } else {
- if (p == p->parent->right) {
- p = p->parent;
- db_rotate_left(p, root);
- }
- p->parent->color = BLACK;
- p->parent->parent->color = RED;
- db_rotate_right(p->parent->parent, root);
- }
- } else {
- struct dbn* y = p->parent->parent->left;
- if (y && y->color == RED) {
- p->parent->color = BLACK;
- y->color = BLACK;
- p->parent->parent->color = RED;
- p = p->parent->parent;
- } else {
- if (p == p->parent->left) {
- p = p->parent;
- db_rotate_right(p, root);
- }
- p->parent->color = BLACK;
- p->parent->parent->color = RED;
- db_rotate_left(p->parent->parent, root);
- }
- }
- }
- (*root)->color=BLACK;
-}
-
-static void db_rebalance_erase(struct dbn *z,struct dbn **root)
-{
- struct dbn *y = z, *x = NULL, *x_parent = NULL;
-
- if (y->left == NULL)
- x = y->right;
- else if (y->right == NULL)
- x = y->left;
- else {
- y = y->right;
- while (y->left != NULL)
- y = y->left;
- x = y->right;
- }
- if (y != z) { // ¶‰E‚ª—¼•û–„‚Ü‚Á‚Ä‚¢‚½Žž y‚ðz‚̈ʒu‚ÉŽ‚Á‚Ä‚«‚Äz‚ð•‚‚©‚¹‚é
- z->left->parent = y;
- y->left = z->left;
- if (y != z->right) {
- x_parent = y->parent;
- if (x) x->parent = y->parent;
- y->parent->left = x;
- y->right = z->right;
- z->right->parent = y;
- } else
- x_parent = y;
- if (*root == z)
- *root = y;
- else if (z->parent->left == z)
- z->parent->left = y;
- else
- z->parent->right = y;
- y->parent = z->parent;
- { int tmp=y->color; y->color=z->color; z->color=tmp; }
- y = z;
- } else { // ‚Ç‚¿‚ç‚©‹ó‚¢‚Ä‚¢‚½ê‡ x‚ðz‚̈ʒu‚ÉŽ‚Á‚Ä‚«‚Äz‚ð•‚‚©‚¹‚é
- x_parent = y->parent;
- if (x) x->parent = y->parent;
- if (*root == z)
- *root = x;
- else if (z->parent->left == z)
- z->parent->left = x;
- else
- z->parent->right = x;
- }
- // ‚±‚±‚Ü‚ÅF‚̈ړ®‚Ìœ‚¢‚Ä’Êí‚Ì2•ª–Ø‚Æ“¯‚¶
- if (y->color != RED) { // Ô‚ªÁ‚¦‚镪‚ɂ͉e‹¿–³‚µ
- while (x != *root && (x == NULL || x->color == BLACK))
- if (x == x_parent->left) {
- struct dbn* w = x_parent->right;
- if (w->color == RED) {
- w->color = BLACK;
- x_parent->color = RED;
- db_rotate_left(x_parent, root);
- w = x_parent->right;
- }
- if ((w->left == NULL ||
- w->left->color == BLACK) &&
- (w->right == NULL ||
- w->right->color == BLACK)) {
- w->color = RED;
- x = x_parent;
- x_parent = x_parent->parent;
- } else {
- if (w->right == NULL ||
- w->right->color == BLACK) {
- if (w->left) w->left->color = BLACK;
- w->color = RED;
- db_rotate_right(w, root);
- w = x_parent->right;
- }
- w->color = x_parent->color;
- x_parent->color = BLACK;
- if (w->right) w->right->color = BLACK;
- db_rotate_left(x_parent, root);
- break;
- }
- } else { // same as above, with right <-> left.
- struct dbn* w = x_parent->left;
- if (w->color == RED) {
- w->color = BLACK;
- x_parent->color = RED;
- db_rotate_right(x_parent, root);
- w = x_parent->left;
- }
- if ((w->right == NULL ||
- w->right->color == BLACK) &&
- (w->left == NULL ||
- w->left->color == BLACK)) {
- w->color = RED;
- x = x_parent;
- x_parent = x_parent->parent;
- } else {
- if (w->left == NULL ||
- w->left->color == BLACK) {
- if (w->right) w->right->color = BLACK;
- w->color = RED;
- db_rotate_left(w, root);
- w = x_parent->left;
- }
- w->color = x_parent->color;
- x_parent->color = BLACK;
- if (w->left) w->left->color = BLACK;
- db_rotate_right(x_parent, root);
- break;
- }
- }
- if (x) x->color = BLACK;
- }
-}
-
-void db_free_lock(struct dbt *table) {
- table->free_lock++;
-}
-
-void db_free_unlock(struct dbt *table) {
- if(--table->free_lock == 0) {
- int i;
- for(i = 0; i < table->free_count ; i++) {
- db_rebalance_erase(table->free_list[i].z,table->free_list[i].root);
- if(table->cmp == strdb_cmp) {
- aFree(table->free_list[i].z->key);
- }
-#ifdef MALLOC_DBN
- free_dbn(table->free_list[i].z);
-#else
- aFree(table->free_list[i].z);
-#endif
- table->item_count--;
- }
- table->free_count = 0;
- }
-}
-
-struct dbn* db_insert(struct dbt *table,void* key,void* data)
-{
- struct dbn *p,*priv;
- int c,hash;
-
- hash = table->hash(table,key) % HASH_SIZE;
- for(c=0,priv=NULL ,p = table->ht[hash];p;){
- c=table->cmp(table,key,p->key);
- if(c==0){ // replace
- if (table->release)
- table->release(p, 3);
- if(p->deleted) {
- // 휂³‚ꂽƒf[ƒ^‚È‚Ì‚ÅAfree_list ã‚Ì휗\’è‚ðÁ‚·
- int i;
- for(i = 0; i < table->free_count ; i++) {
- if(table->free_list[i].z == p) {
- memmove(
- &table->free_list[i],
- &table->free_list[i+1],
- sizeof(struct db_free)*(table->free_count - i - 1)
- );
- break;
- }
- }
- if(i == table->free_count || table->free_count <= 0) {
- printf("db_insert: cannnot find deleted db node.\n");
- } else {
- table->free_count--;
- if(table->cmp == strdb_cmp) {
- aFree(p->key);
- }
- }
- }
- p->data=data;
- p->key=key;
- p->deleted = 0;
- return p;
- }
- priv=p;
- if(c<0){
- p=p->left;
- } else {
- p=p->right;
- }
- }
-#ifdef MALLOC_DBN
- p=malloc_dbn();
-#else
- CREATE(p, struct dbn, 1);
-#endif
- if(p==NULL){
- printf("out of memory : db_insert\n");
- return NULL;
- }
- p->parent= NULL;
- p->left = NULL;
- p->right = NULL;
- p->key = key;
- p->data = data;
- p->color = RED;
- p->deleted = 0;
- p->prev = NULL;
- p->next = NULL;
- if (head == NULL)
- head = tail = p;
- else {
- p->prev = tail;
- tail->next = p;
- tail = p;
- }
-
- if(c==0){ // hash entry is empty
- table->ht[hash] = p;
- p->color = BLACK;
- } else {
- if(c<0){ // left node
- priv->left = p;
- p->parent=priv;
- } else { // right node
- priv->right = p;
- p->parent=priv;
- }
- if(priv->color==RED){ // must rebalance
- db_rebalance(p,&table->ht[hash]);
- }
- }
- table->item_count++;
-
- return p;
-}
-
-void* db_erase(struct dbt *table,void* key)
-{
- void *data;
- struct dbn *p;
- int c,hash;
-
- hash = table->hash(table,key) % HASH_SIZE;
- for(c=0,p = table->ht[hash];p;){
- c=table->cmp(table,key,p->key);
- if(c==0)
- break;
- if(c<0)
- p=p->left;
- else
- p=p->right;
- }
- if(!p)
- return NULL;
- data=p->data;
- if(table->free_lock) {
- if(table->free_count == table->free_max) {
- table->free_max += 32;
- table->free_list = (struct db_free*)realloc(table->free_list,sizeof(struct db_free) * table->free_max);
- }
- table->free_list[table->free_count].z = p;
- table->free_list[table->free_count].root = &table->ht[hash];
- table->free_count++;
- p->deleted = 1;
- p->data = NULL;
- if(table->cmp == strdb_cmp) {
- if(table->maxlen) {
- char *key = (char*)malloc(table->maxlen);
- memcpy(key,p->key,table->maxlen);
- p->key = key;
- } else {
- p->key = strdup((const char*)p->key);
- }
- }
- } else {
- db_rebalance_erase(p,&table->ht[hash]);
- if (p->prev)
- p->prev->next = p->next;
- else
- head = p->next;
- if (p->next)
- p->next->prev = p->prev;
- else
- tail = p->prev;
-
- #ifdef MALLOC_DBN
- free_dbn(p);
- #else
- aFree(p);
- #endif
- table->item_count--;
- }
- return data;
-}
-
-void db_foreach(struct dbt *table,int (*func)(void*,void*,va_list),...)
-{
- int i,sp;
- int count = table->item_count;
- // red-black tree‚È‚Ì‚Å64ŒÂstack‚ª‚ ‚ê‚Î2^32ŒÂƒm[ƒh‚Ü‚Å‘åä•v
- struct dbn *p,*pn,*stack[64];
- va_list ap;
-
- va_start(ap,func);
- db_free_lock(table);
- for(i=0;i<HASH_SIZE;i++){
- if((p=table->ht[i])==NULL)
- continue;
- sp=0;
- while(1){
- //reverted it back. sorry that brought thios bug from Freya [Lupus]
- //if (!p->data) {
- // printf("Warning: no data for key %d in db_foreach (db.c) !\n",(int)p->key);
- //} else {
- if(!p->deleted)
- func(p->key, p->data, ap);
- count--;
- //}
- if((pn=p->left)!=NULL){
- if(p->right){
- stack[sp++]=p->right;
- }
- p=pn;
- } else {
- if(p->right){
- p=p->right;
- } else {
- if(sp==0)
- break;
- p=stack[--sp];
- }
- }
- }
- }
- db_free_unlock(table);
- if(count) {
- printf(
- "db_foreach : data lost %d item(s) allocated from %s line %d\n",
- count,table->alloc_file,table->alloc_line
- );
- }
- va_end(ap);
-}
-
-void db_final(struct dbt *table,int (*func)(void*,void*,va_list),...)
-{
- int i,sp;
- struct dbn *p,*pn,*stack[64];
- va_list ap;
-
- va_start(ap,func);
- db_free_lock(table);
- for(i=0;i<HASH_SIZE;i++){
- if((p=table->ht[i])==NULL)
- continue;
- sp=0;
- while(1){
- if(func && !p->deleted)
- func(p->key,p->data,ap);
- if((pn=p->left)!=NULL){
- if(p->right){
- stack[sp++]=p->right;
- }
- } else {
- if(p->right){
- pn=p->right;
- } else {
- if(sp==0)
- break;
- pn=stack[--sp];
- }
- }
- if (p->prev)
- p->prev->next = p->next;
- else
- head = p->next;
- if (p->next)
- p->next->prev = p->prev;
- else
- tail = p->prev;
-#ifdef MALLOC_DBN
- free_dbn(p);
-#else
- aFree(p);
-#endif
- p=pn;
- }
- }
- db_free_unlock(table);
- aFree(table->free_list);
- aFree(table);
- va_end(ap);
-}
diff --git a/src/common/db.h b/src/common/db.h
deleted file mode 100644
index 6980099cf..000000000
--- a/src/common/db.h
+++ /dev/null
@@ -1,68 +0,0 @@
-#ifndef _DB_H_
-#define _DB_H_
-
-#include <stdarg.h>
-
-#define HASH_SIZE (256+27)
-
-#define RED 0
-#define BLACK 1
-
-struct dbn {
- struct dbn *parent,*left,*right;
- int color;
- void *key;
- void *data;
- int deleted; // íœÏ‚݃tƒ‰ƒO(db_foreach)
- struct dbn *next;
- struct dbn *prev;
-};
-
-struct db_free {
- struct dbn *z;
- struct dbn **root;
-};
-
-struct dbt {
- int (*cmp)(struct dbt*,void*,void*);
- unsigned int (*hash)(struct dbt*,void*);
- // which 1 - key, 2 - data, 3 - both
- void (*release)(struct dbn*,int which);
- int maxlen;
- struct dbn *ht[HASH_SIZE];
- int item_count; // vf?
- const char* alloc_file; // DB?t@C
- int alloc_line; // DB?s
- // db_foreach “à•”‚Ådb_erase ‚³‚ê‚é‘Îô‚Æ‚µ‚ÄA
- // db_foreach ‚ªI‚í‚é‚܂ŃƒbƒN‚·‚邱‚Æ‚É‚·‚é
- struct db_free *free_list;
- int free_count;
- int free_max;
- int free_lock;
-};
-
-#define strdb_search(t,k) db_search((t),(void*)(k))
-#define strdb_insert(t,k,d) db_insert((t),(void*)(k),(void*)(d))
-#define strdb_erase(t,k) db_erase ((t),(void*)(k))
-#define strdb_foreach db_foreach
-#define strdb_final db_final
-#define numdb_search(t,k) db_search((t),(void*)(k))
-#define numdb_insert(t,k,d) db_insert((t),(void*)(k),(void*)(d))
-#define numdb_erase(t,k) db_erase ((t),(void*)(k))
-#define numdb_foreach db_foreach
-#define numdb_final db_final
-#define strdb_init(a) strdb_init_(a,__FILE__,__LINE__)
-#define numdb_init() numdb_init_(__FILE__,__LINE__)
-
-struct dbt* strdb_init_(int maxlen,const char *file,int line);
-struct dbt* numdb_init_(const char *file,int line);
-
-void* db_search(struct dbt *table,void* key);
-void* db_search2(struct dbt *table, const char *key); // [MouseJstr]
-struct dbn* db_insert(struct dbt *table,void* key,void* data);
-void* db_erase(struct dbt *table,void* key);
-void db_foreach(struct dbt*,int(*)(void*,void*,va_list),...);
-void db_final(struct dbt*,int(*)(void*,void*,va_list),...);
-void exit_dbn(void);
-
-#endif
diff --git a/src/common/dll.h b/src/common/dll.h
deleted file mode 100644
index 1ad49143c..000000000
--- a/src/common/dll.h
+++ /dev/null
@@ -1,25 +0,0 @@
-
-#ifndef _DLL_H_
-#define _DLL_H_
-
-#ifdef _WIN32
-
- #include <windows.h>
- #define DLL_OPEN(x) LoadLibrary(x)
- #define DLL_SYM(x,y,z) (FARPROC)(x) = GetProcAddress(y,z)
- #define DLL_CLOSE(x) FreeLibrary(x)
- #define DLL HINSTANCE
-
-#else
-
- #include <dlfcn.h>
- #define DLL_OPEN(x) dlopen(x,RTLD_NOW)
- #define DLL_SYM(x,y,z) (x) = (void *)dlsym(y,z)
- #define DLL_CLOSE(x) dlclose(x)
- #define DLL void *
-
-#endif
-
-#endif // _DLL_H_
-
-
diff --git a/src/common/grfio.c b/src/common/grfio.c
deleted file mode 100644
index 1a3829bf7..000000000
--- a/src/common/grfio.c
+++ /dev/null
@@ -1,1070 +0,0 @@
-/*********************************************************************
- *
- * Ragnarok Online Emulator : grfio.c -- grf file I/O Module
- *--------------------------------------------------------------------
- * special need library : zlib
- *********************************************************************
- * $Id: grfio.c,v 1.2 2004/09/29 17:31:49 kalaspuff Exp $
- *
- * 2002/12/18... the original edition
- * 2003/01/23 ... Code correction
- * 2003/02/01 ... An addition and decryption processing are improved for LocalFile and two or more GRF(s) check processing.
- * 2003/02/02 ... Even if there is no grf it does not stop -- as -- correction
- * 2003/02/02... grf reading specification can be added later -- as -- correction (grfio_add function addition)
- * 2003/02 / 03... at the time of grfio_resourcecheck processing the entry addition processing method -- correction
- * 2003/02/05... change of the processing in grfio_init
- * 2003/02/23... a local file check -- GRFIO_LOCAL -- switch (Defoe -- Function Off)
- * 2003/10/21 ... The data of alpha client was read.
- * 2003/11/10 ... Ready new grf format.
- * 2003/11/11 ... version check fix & bug fix
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <sys/stat.h>
-
-#include "grfio.h"
-#include "../common/utils.h"
-#include "../common/mmo.h"
-#include "../common/showmsg.h"
-#include "../common/malloc.h"
-
-#ifdef _WIN32
- #ifdef LOCALZLIB
- #include "zlib.h"
- #define zlib_inflateInit inflateInit
- #define zlib_inflate inflate
- #define zlib_inflateEnd inflateEnd
- #define zlib_deflateInit deflateInit
- #define zlib_deflate deflate
- #define zlib_deflateEnd deflateEnd
- #else
- #include "../lib/zlib_win32.h"
- #include "../common/dll.h"
- DLL zlib_dll;
- #define zlib_inflateInit(strm) zlib_inflateInit_((strm),ZLIB_VERSION, sizeof(z_stream))
- #define zlib_deflateInit(strm, level) zlib_deflateInit_((strm),(level),ZLIB_VERSION,sizeof(z_stream))
-
- int (WINAPI* zlib_inflateInit_) (z_streamp strm, const char *version, int stream_size);
- int (WINAPI* zlib_inflate) (z_streamp strm, int flush);
- int (WINAPI* zlib_inflateEnd) (z_streamp strm);
-
- int (WINAPI* zlib_deflateInit_) (z_streamp strm, int level, const char *version, int stream_size);
- int (WINAPI* zlib_deflate) (z_streamp strm, int flush);
- int (WINAPI* zlib_deflateEnd) (z_streamp strm);
- #endif
-#else
- #ifdef LOCALZLIB
- #include "zlib/zlib.h"
- #else
- #include <zlib.h>
- #endif
-
- #define zlib_inflateInit inflateInit
- #define zlib_inflate inflate
- #define zlib_inflateEnd inflateEnd
- #define zlib_deflateInit deflateInit
- #define zlib_deflate deflate
- #define zlib_deflateEnd deflateEnd
-#endif
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-typedef unsigned char BYTE;
-typedef unsigned short WORD;
-typedef unsigned long DWORD;
-
-static char data_file[1024] = ""; // "data.grf";
-static char sdata_file[1024] = ""; // "sdata.grf";
-static char adata_file[1024] = ""; // "adata.grf";
-static char data_dir[1024] = ""; // "../";
-
-// accessor to data_file,adata_file,sdata_file
-char *grfio_setdatafile(const char *str){ strcpy(data_file,str); return data_file; }
-char *grfio_setadatafile(const char *str){ strcpy(adata_file,str); return adata_file; }
-char *grfio_setsdatafile(const char *str){ strcpy(sdata_file,str); return sdata_file; }
-
-//----------------------------
-// file entry table struct
-//----------------------------
-typedef struct {
- int srclen; // compressed size
- int srclen_aligned; //
- int declen; // original size
- int srcpos;
- short next;
- char cycle;
- char type;
- char fn[128-4*5]; // file name
- char gentry; // read grf file select
-} FILELIST;
-//gentry ... 0 : It acquires from a local file.
-// It acquires from the resource file of 1>=:gentry_table[gentry-1].
-// 1<=: Check a local file.
-// If it is, after re-setting to 0, it acquires from a local file.
-// If there is nothing, mark reversal will be carried out, and it will re-set, and will acquire from a resource file as well as 1>=.
-
-//Since char defines *FILELIST.gentry, the maximum which can be added by grfio_add becomes by 127 pieces.
-
-#define GENTRY_LIMIT 127
-#define FILELIST_LIMIT 65536 // temporary maximum, and a theory top maximum are 2G.
-
-static FILELIST *filelist;
-static int filelist_entrys;
-static int filelist_maxentry;
-
-static char **gentry_table;
-static int gentry_entrys;
-static int gentry_maxentry;
-
-//----------------------------
-// file list hash table
-//----------------------------
-static int filelist_hash[256];
-
-//----------------------------
-// grf decode data table
-//----------------------------
-static unsigned char BitMaskTable[8] = {
- 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
-};
-
-static char BitSwapTable1[64] = {
- 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,
- 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,
- 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,
- 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7
-};
-static char BitSwapTable2[64] = {
- 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,
- 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29,
- 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27,
- 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25
-};
-static char BitSwapTable3[32] = {
- 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,
- 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25
-};
-
-static unsigned char NibbleData[4][64]={
- {
- 0xef, 0x03, 0x41, 0xfd, 0xd8, 0x74, 0x1e, 0x47, 0x26, 0xef, 0xfb, 0x22, 0xb3, 0xd8, 0x84, 0x1e,
- 0x39, 0xac, 0xa7, 0x60, 0x62, 0xc1, 0xcd, 0xba, 0x5c, 0x96, 0x90, 0x59, 0x05, 0x3b, 0x7a, 0x85,
- 0x40, 0xfd, 0x1e, 0xc8, 0xe7, 0x8a, 0x8b, 0x21, 0xda, 0x43, 0x64, 0x9f, 0x2d, 0x14, 0xb1, 0x72,
- 0xf5, 0x5b, 0xc8, 0xb6, 0x9c, 0x37, 0x76, 0xec, 0x39, 0xa0, 0xa3, 0x05, 0x52, 0x6e, 0x0f, 0xd9,
- }, {
- 0xa7, 0xdd, 0x0d, 0x78, 0x9e, 0x0b, 0xe3, 0x95, 0x60, 0x36, 0x36, 0x4f, 0xf9, 0x60, 0x5a, 0xa3,
- 0x11, 0x24, 0xd2, 0x87, 0xc8, 0x52, 0x75, 0xec, 0xbb, 0xc1, 0x4c, 0xba, 0x24, 0xfe, 0x8f, 0x19,
- 0xda, 0x13, 0x66, 0xaf, 0x49, 0xd0, 0x90, 0x06, 0x8c, 0x6a, 0xfb, 0x91, 0x37, 0x8d, 0x0d, 0x78,
- 0xbf, 0x49, 0x11, 0xf4, 0x23, 0xe5, 0xce, 0x3b, 0x55, 0xbc, 0xa2, 0x57, 0xe8, 0x22, 0x74, 0xce,
- }, {
- 0x2c, 0xea, 0xc1, 0xbf, 0x4a, 0x24, 0x1f, 0xc2, 0x79, 0x47, 0xa2, 0x7c, 0xb6, 0xd9, 0x68, 0x15,
- 0x80, 0x56, 0x5d, 0x01, 0x33, 0xfd, 0xf4, 0xae, 0xde, 0x30, 0x07, 0x9b, 0xe5, 0x83, 0x9b, 0x68,
- 0x49, 0xb4, 0x2e, 0x83, 0x1f, 0xc2, 0xb5, 0x7c, 0xa2, 0x19, 0xd8, 0xe5, 0x7c, 0x2f, 0x83, 0xda,
- 0xf7, 0x6b, 0x90, 0xfe, 0xc4, 0x01, 0x5a, 0x97, 0x61, 0xa6, 0x3d, 0x40, 0x0b, 0x58, 0xe6, 0x3d,
- }, {
- 0x4d, 0xd1, 0xb2, 0x0f, 0x28, 0xbd, 0xe4, 0x78, 0xf6, 0x4a, 0x0f, 0x93, 0x8b, 0x17, 0xd1, 0xa4,
- 0x3a, 0xec, 0xc9, 0x35, 0x93, 0x56, 0x7e, 0xcb, 0x55, 0x20, 0xa0, 0xfe, 0x6c, 0x89, 0x17, 0x62,
- 0x17, 0x62, 0x4b, 0xb1, 0xb4, 0xde, 0xd1, 0x87, 0xc9, 0x14, 0x3c, 0x4a, 0x7e, 0xa8, 0xe2, 0x7d,
- 0xa0, 0x9f, 0xf6, 0x5c, 0x6a, 0x09, 0x8d, 0xf0, 0x0f, 0xe3, 0x53, 0x25, 0x95, 0x36, 0x28, 0xcb,
- }
-};
-/*-----------------
- * long data get
- */
-static unsigned int getlong(unsigned char *p)
-{
-// return *p+p[1]*256+(p[2]+p[3]*256)*65536;
- return p[0]
- | p[1] << 0x08
- | p[2] << 0x10
- | p[3] << 0x18; // Shinomori
-}
-
-/*==========================================
- * Grf data decode : Subs
- *------------------------------------------
- */
-static void NibbleSwap(BYTE *Src, int len)
-{
- for(;0<len;len--,Src++) {
- *Src = (*Src>>4) | (*Src<<4);
- }
-}
-
-static void BitConvert(BYTE *Src,char *BitSwapTable)
-{
- int lop,prm;
- BYTE tmp[8];
-// *(DWORD*)tmp=*(DWORD*)(tmp+4)=0;
- memset(tmp,0,8);
- for(lop=0;lop!=64;lop++) {
- prm = BitSwapTable[lop]-1;
- if (Src[(prm >> 3) & 7] & BitMaskTable[prm & 7]) {
- tmp[(lop >> 3) & 7] |= BitMaskTable[lop & 7];
- }
- }
-// *(DWORD*)Src = *(DWORD*)tmp;
-// *(DWORD*)(Src+4) = *(DWORD*)(tmp+4);
- memcpy(Src,tmp,8);
-}
-
-static void BitConvert4(BYTE *Src)
-{
- int lop,prm;
- BYTE tmp[8];
- tmp[0] = ((Src[7]<<5) | (Src[4]>>3)) & 0x3f; // ..0 vutsr
- tmp[1] = ((Src[4]<<1) | (Src[5]>>7)) & 0x3f; // ..srqpo n
- tmp[2] = ((Src[4]<<5) | (Src[5]>>3)) & 0x3f; // ..o nmlkj
- tmp[3] = ((Src[5]<<1) | (Src[6]>>7)) & 0x3f; // ..kjihg f
- tmp[4] = ((Src[5]<<5) | (Src[6]>>3)) & 0x3f; // ..g fedcb
- tmp[5] = ((Src[6]<<1) | (Src[7]>>7)) & 0x3f; // ..cba98 7
- tmp[6] = ((Src[6]<<5) | (Src[7]>>3)) & 0x3f; // ..8 76543
- tmp[7] = ((Src[7]<<1) | (Src[4]>>7)) & 0x3f; // ..43210 v
-
- for(lop=0;lop!=4;lop++) {
- tmp[lop] = (NibbleData[lop][tmp[lop*2]] & 0xf0)
- | (NibbleData[lop][tmp[lop*2+1]] & 0x0f);
- }
-
- *(DWORD*)(tmp+4)=0;
- for(lop=0;lop!=32;lop++) {
- prm = BitSwapTable3[lop]-1;
- if (tmp[prm >> 3] & BitMaskTable[prm & 7]) {
- tmp[(lop >> 3) + 4] |= BitMaskTable[lop & 7];
- }
- }
-// *(DWORD*)Src ^= *(DWORD*)(tmp+4);
- Src[0] ^= tmp[4];
- Src[1] ^= tmp[5];
- Src[2] ^= tmp[6];
- Src[3] ^= tmp[7];
-}
-
-static void decode_des_etc(BYTE *buf,int len,int type,int cycle)
-{
- int lop,cnt=0;
- if(cycle<3) cycle=3;
- else if(cycle<5) cycle++;
- else if(cycle<7) cycle+=9;
- else cycle+=15;
-
- for(lop=0;lop*8<len;lop++,buf+=8) {
- if(lop<20 || (type==0 && lop%cycle==0)){ // des
- BitConvert(buf,BitSwapTable1);
- BitConvert4(buf);
- BitConvert(buf,BitSwapTable2);
- } else {
- if(cnt==7 && type==0){
- int a;
- BYTE tmp[8];
- *(DWORD*)tmp = *(DWORD*)buf;
- *(DWORD*)(tmp+4) = *(DWORD*)(buf+4);
- cnt=0;
- buf[0]=tmp[3];
- buf[1]=tmp[4];
- buf[2]=tmp[6];
- buf[3]=tmp[0];
- buf[4]=tmp[1];
- buf[5]=tmp[2];
- buf[6]=tmp[5];
- a=tmp[7];
- if(a==0x00) a=0x2b;
- else if(a==0x2b) a=0x00;
- else if(a==0x01) a=0x68;
- else if(a==0x68) a=0x01;
- else if(a==0x48) a=0x77;
- else if(a==0x77) a=0x48;
- else if(a==0x60) a=0xff;
- else if(a==0xff) a=0x60;
- else if(a==0x6c) a=0x80;
- else if(a==0x80) a=0x6c;
- else if(a==0xb9) a=0xc0;
- else if(a==0xc0) a=0xb9;
- else if(a==0xeb) a=0xfe;
- else if(a==0xfe) a=0xeb;
- buf[7]=a;
- }
- cnt++;
- }
- }
-}
-/*==========================================
- * Grf data decode sub : zip
- *------------------------------------------
- */
-int decode_zip(unsigned char *dest, unsigned long* destLen, const unsigned char* source, unsigned long sourceLen)
-{
- z_stream stream;
- int err;
-
- stream.next_in = (Bytef*)source;
- stream.avail_in = (uInt)sourceLen;
- /* Check for source > 64K on 16-bit machine: */
- if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
-
- stream.next_out = (Bytef*) dest;
- stream.avail_out = (uInt)*destLen;
- if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
-
- stream.zalloc = (alloc_func)0;
- stream.zfree = (free_func)0;
-
- err = zlib_inflateInit(&stream);
- if (err != Z_OK) return err;
-
- err = zlib_inflate(&stream, Z_FINISH);
- if (err != Z_STREAM_END) {
- zlib_inflateEnd(&stream);
- return err == Z_OK ? Z_BUF_ERROR : err;
- }
- *destLen = stream.total_out;
-
- err = zlib_inflateEnd(&stream);
- return err;
-}
-
-int encode_zip(unsigned char *dest, unsigned long* destLen, const unsigned char* source, unsigned long sourceLen) {
- z_stream stream;
- int err;
-
- stream.next_in = (Bytef*)source;
- stream.avail_in = (uInt)sourceLen;
- /* Check for source > 64K on 16-bit machine: */
- if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
-
- stream.next_out = (Bytef*) dest;
- stream.avail_out = (uInt)*destLen;
- if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
-
- stream.zalloc = (alloc_func)0;
- stream.zfree = (free_func)0;
-
- err = zlib_deflateInit(&stream,Z_DEFAULT_COMPRESSION);
- if (err != Z_OK) return err;
-
- err = zlib_deflate(&stream, Z_FINISH);
- if (err != Z_STREAM_END) {
- zlib_inflateEnd(&stream);
- return err == Z_OK ? Z_BUF_ERROR : err;
- }
- *destLen = stream.total_out;
-
- err = zlib_deflateEnd(&stream);
- return err;
-}
-
-/***********************************************************
- *** File List Sobroutines ***
- ***********************************************************/
-
-/*==========================================
- * File List : Hash make
- *------------------------------------------
- */
-static int filehash(unsigned char *fname)
-{
- unsigned int hash=0;
- while(*fname) {
- hash = ((hash<<1)+(hash>>7)*9+tolower(*fname));
- fname++;
- }
- return hash & 255;
-}
-
-/*==========================================
- * File List : Hash initalize
- *------------------------------------------
- */
-static void hashinit(void)
-{
- int lop;
- for(lop=0;lop<256;lop++)
- filelist_hash[lop]=-1;
-}
-
-/*==========================================
- * File List : File find
- *------------------------------------------
- */
-FILELIST *filelist_find(char *fname)
-{
- int hash;
-
- for(hash=filelist_hash[filehash((unsigned char *) fname)];hash>=0;hash=filelist[hash].next) {
- if(strcmpi(filelist[hash].fn,fname)==0)
- break;
- }
-
- return (hash>=0)? &filelist[hash] : NULL;
-}
-
-/*==========================================
- * File List : Filelist add
- *------------------------------------------
- */
-#define FILELIST_ADDS 1024 // number increment of file lists `
-
-static FILELIST* filelist_add(FILELIST *entry)
-{
- int hash;
-
- if (filelist_entrys>=FILELIST_LIMIT) {
- printf("filelist limit : filelist_add\n");
- exit(1);
- }
-
- if (filelist_entrys>=filelist_maxentry) {
- FILELIST *new_filelist = (FILELIST*)aRealloc(
- (void*)filelist, (filelist_maxentry+FILELIST_ADDS)*sizeof(FILELIST) );
- if (new_filelist != NULL) {
- filelist = new_filelist;
- memset(filelist + filelist_maxentry, '\0',
- FILELIST_ADDS * sizeof(FILELIST));
- filelist_maxentry += FILELIST_ADDS;
- } else {
- printf("out of memory : filelist_add\n");
- exit(1);
- }
- }
-
- memcpy( &filelist[filelist_entrys], entry, sizeof(FILELIST) );
-
- hash = filehash((unsigned char *) entry->fn);
- filelist[filelist_entrys].next = filelist_hash[hash];
- filelist_hash[hash] = filelist_entrys;
-
- filelist_entrys++;
-
- return &filelist[filelist_entrys-1];
-}
-
-static FILELIST* filelist_modify(FILELIST *entry)
-{
- FILELIST *fentry;
- if ((fentry=filelist_find(entry->fn))!=NULL) {
- int tmp = fentry->next;
- memcpy( fentry, entry, sizeof(FILELIST) );
- fentry->next = tmp;
- } else {
- fentry = filelist_add(entry);
- }
- return fentry;
-}
-
-/*==========================================
- * File List : filelist size adjust
- *------------------------------------------
- */
-static void filelist_adjust(void)
-{
- if (filelist!=NULL) {
- if (filelist_maxentry>filelist_entrys) {
- FILELIST *new_filelist = (FILELIST*)aRealloc(
- (void*)filelist,filelist_entrys*sizeof(FILELIST) );
- if (new_filelist != NULL) {
- filelist = new_filelist;
- filelist_maxentry = filelist_entrys;
- } else {
- printf("out of memory : filelist\n");
- exit(1);
- }
- }
- }
-}
-
-/***********************************************************
- *** Grfio Sobroutines ***
- ***********************************************************/
-/*==========================================
- * Grfio : Resnametable replace
- *------------------------------------------
- */
-char* grfio_resnametable(char* fname, char *lfname)
-{
- FILE *fp;
- char *p;
- char w1[256],w2[256],restable[256],line[512];
-
- sprintf(restable,"%sdata\\resnametable.txt",data_dir);
-
- for(p=&restable[0];*p!=0;p++) if (*p=='\\') *p = '/';
-
- fp = fopen(restable,"rb");
- if(fp==NULL) {
- printf("%s not found (grfio_resnametable)\n",restable);
- return NULL; // 1:not found error
- }
-
- while(fgets(line,508,fp)){
- if((sscanf(line,"%[^#]#%[^#]#",w1,w2)==2) && (sscanf(fname,"%*5s%s",lfname)==1) && (!strcmpi(w1,lfname))){
- sprintf(lfname,"data\\%s",w2);
- fclose(fp);
- return lfname;
- }
- }
- fclose(fp);
- return fname;
-
-}
-
-/*==========================================
- * Grfio : Resource file size get
- *------------------------------------------
- */
-int grfio_size(char *fname)
-{
- FILELIST *entry;
-
- entry = filelist_find(fname);
-
- if (entry==NULL || entry->gentry<0) { // LocalFileCheck
- char lfname[256],*rname,*p;
- FILELIST lentry;
- struct stat st;
-
- if(strcmp(data_dir, "") != 0 && (rname=grfio_resnametable(fname,lfname))!=NULL) {
- //printf("%s\t",fname);
- //sprintf(rname,"%s",grfio_resnametable(fname,lfname));
- //printf("%s\n",rname);
- sprintf(lfname,"%s%s",data_dir,rname);
- //printf("%s\n",lfname);
- }
-
- for(p=&lfname[0];*p!=0;p++) if (*p=='\\') *p = '/'; // * At the time of Unix
-
- if (stat(lfname,&st)==0) {
- strncpy(lentry.fn, fname, sizeof(lentry.fn)-1 );
- lentry.declen = st.st_size;
- lentry.gentry = 0; // 0:LocalFile
- entry = filelist_modify(&lentry);
- } else if (entry==NULL) {
- printf("%s not found (grfio_size)\n", fname);
- //exit(1);
- return -1;
- }
- }
- return entry->declen;
-}
-
-/*==========================================
- * Grfio : Resource file read & size get
- *------------------------------------------
- */
-void* grfio_reads(char *fname, int *size)
-{
- FILE *in = NULL;
- unsigned char *buf=NULL,*buf2=NULL;
- char *gfname;
- FILELIST *entry;
-
- entry = filelist_find(fname);
-
- if (entry==NULL || entry->gentry<=0) { // LocalFileCheck
- char lfname[256],*rname,*p;
- FILELIST lentry;
-
- strncpy(lfname,fname,255);
- // i hope this is the correct way =p [celest]
- if ((rname=grfio_resnametable(fname,lfname))!=NULL) {
- char tbuf[255];
- //sprintf(rname,"%s",grfio_resnametable(fname,lfname));
- sprintf(tbuf,"%s%s",data_dir,rname);
- strcpy(lfname, tbuf);
- //printf("%s\n",lfname);
- }
-
- for(p=&lfname[0];*p!=0;p++) if (*p=='\\') *p = '/'; // * At the time of Unix
-
- in = fopen(lfname,"rb");
- if(in!=NULL) {
- if (entry!=NULL && entry->gentry==0) {
- lentry.declen=entry->declen;
- } else {
- fseek(in,0,2); // SEEK_END
- lentry.declen = ftell(in);
- }
- fseek(in,0,0); // SEEK_SET
- buf2 = (unsigned char *)aCallocA(lentry.declen+1024, 1);
- if (buf2==NULL) {
- printf("file read memory allocate error : declen\n");
- goto errret;
- }
- fread(buf2,1,lentry.declen,in);
- fclose(in); in = NULL;
- strncpy( lentry.fn, fname, sizeof(lentry.fn)-1 );
- lentry.gentry = 0; // 0:LocalFile
- entry = filelist_modify(&lentry);
- } else {
- if (entry!=NULL && entry->gentry<0) {
- entry->gentry = -entry->gentry; // local file checked
- } else {
- printf("%s not found (grfio_reads)\n", fname);
- //goto errret;
- aFree(buf2);
- return NULL;
- }
- }
- }
- if (entry!=NULL && entry->gentry>0) { // Archive[GRF] File Read
- buf = (unsigned char *) aCallocA(entry->srclen_aligned+1024, 1);
- if (buf==NULL) {
- printf("file read memory allocate error : srclen_aligned\n");
- goto errret;
- }
- gfname = gentry_table[entry->gentry-1];
- in = fopen(gfname,"rb");
- if(in==NULL) {
- printf("%s not found (grfio_reads)\n",gfname);
- //goto errret;
- aFree(buf);
- return NULL;
- }
- fseek(in,entry->srcpos,0);
- fread(buf,1,entry->srclen_aligned,in);
- fclose(in);
- buf2 = (unsigned char *)aCallocA(entry->declen+1024, 1);
- if (buf2==NULL) {
- printf("file decode memory allocate error\n");
- goto errret;
- }
- if(entry->type==1 || entry->type==3 || entry->type==5) {
- uLongf len;
- if (entry->cycle>=0) {
- decode_des_etc(buf,entry->srclen_aligned,entry->cycle==0,entry->cycle);
- }
- len=entry->declen;
- decode_zip(buf2,&len,buf,entry->srclen);
- if(len!=entry->declen) {
- printf("decode_zip size miss match err: %d != %d\n",(int)len,entry->declen);
- goto errret;
- }
- } else {
- memcpy(buf2,buf,entry->declen);
- }
- aFree(buf);
- }
- if (size!=NULL && entry!=NULL)
- *size = entry->declen;
- return buf2;
-errret:
- if (buf!=NULL) aFree(buf);
- if (buf2!=NULL) aFree(buf2);
- if (in!=NULL) fclose(in);
- return NULL;
-}
-
-/*==========================================
- * Grfio : Resource file read
- *------------------------------------------
- */
-void* grfio_read(char *fname)
-{
- return grfio_reads(fname,NULL);
-}
-
-/*==========================================
- * Resource filename decode
- *------------------------------------------
- */
-static char * decode_filename(unsigned char *buf,int len)
-{
- int lop;
- for(lop=0;lop<len;lop+=8) {
- NibbleSwap(&buf[lop],8);
- BitConvert(&buf[lop],BitSwapTable1);
- BitConvert4(&buf[lop]);
- BitConvert(&buf[lop],BitSwapTable2);
- }
- return (char*)buf;
-}
-
-/*==========================================
- * Grfio : Entry table read
- *------------------------------------------
- */
-static int grfio_entryread(char *gfname,int gentry)
-{
- FILE *fp;
- int grf_size,list_size;
- unsigned char grf_header[0x2e];
- int lop,entry,entrys,ofs,grf_version;
- char *fname;
- unsigned char *grf_filelist;
-
- fp = fopen(gfname,"rb");
- if(fp==NULL) {
- sprintf(tmp_output,"GRF Data File not found: '"CL_WHITE"%s"CL_RESET"'.\n",gfname);
- ShowWarning(tmp_output);
- return 1; // 1:not found error
- }
-
- fseek(fp,0,2); // SEEK_END
- grf_size = ftell(fp);
- fseek(fp,0,0); // SEEK_SET
- fread(grf_header,1,0x2e,fp);
- if(strcmp((const char *) grf_header,"Master of Magic") || fseek(fp,getlong(grf_header+0x1e),1)){ // SEEK_CUR
- fclose(fp);
- printf("%s read error\n",gfname);
- return 2; // 2:file format error
- }
-
- grf_version = getlong(grf_header+0x2a) >> 8;
-
- if (grf_version==0x01) { //****** Grf version 01xx ******
- list_size = grf_size-ftell(fp);
- grf_filelist = (unsigned char *) aCallocA(list_size, 1);
- if(grf_filelist==NULL){
- fclose(fp);
- printf("out of memory : grf_filelist\n");
- return 3; // 3:memory alloc error
- }
- fread(grf_filelist,1,list_size,fp);
- fclose(fp);
-
- entrys = getlong(grf_header+0x26) - getlong(grf_header+0x22) - 7;
-
- // Get an entry
- for(entry=0,ofs=0;entry<entrys;entry++){
- int ofs2,srclen,srccount,type;
- char *period_ptr;
- FILELIST aentry;
-
- ofs2 = ofs+getlong(grf_filelist+ofs)+4;
- type = grf_filelist[ofs2+12];
- if( type!=0 ){ // Directory Index ... skip
- fname = decode_filename(grf_filelist+ofs+6,grf_filelist[ofs]-6);
- if(strlen(fname)>sizeof(aentry.fn)-1){
- printf("file name too long : %s\n",fname);
- aFree(grf_filelist);
- exit(1);
- }
- srclen=0;
- if((period_ptr=strrchr(fname,'.'))!=NULL){
- for(lop=0;lop<4;lop++) {
- if(strcmpi(period_ptr,".gnd\0.gat\0.act\0.str"+lop*5)==0)
- break;
- }
- srclen=getlong(grf_filelist+ofs2)-getlong(grf_filelist+ofs2+8)-715;
- if(lop==4) {
- for(lop=10,srccount=1;srclen>=lop;lop=lop*10,srccount++);
- } else {
- srccount=0;
- }
- } else {
- srccount=0;
- }
-
- aentry.srclen = srclen;
- aentry.srclen_aligned = getlong(grf_filelist+ofs2+4)-37579;
- aentry.declen = getlong(grf_filelist+ofs2+8);
- aentry.srcpos = getlong(grf_filelist+ofs2+13)+0x2e;
- aentry.cycle = srccount;
- aentry.type = type;
- strncpy(aentry.fn, fname,sizeof(aentry.fn)-1);
-#ifdef GRFIO_LOCAL
- aentry.gentry = -(gentry+1); // As Flag for making it a negative number carrying out the first time LocalFileCheck
-#else
- aentry.gentry = gentry+1; // With no first time LocalFileCheck
-#endif
- filelist_modify(&aentry);
- }
- ofs = ofs2 + 17;
- }
- aFree(grf_filelist);
-
- } else if (grf_version==0x02) { //****** Grf version 02xx ******
- unsigned char eheader[8];
- unsigned char *rBuf;
- uLongf rSize,eSize;
-
- fread(eheader,1,8,fp);
- rSize = getlong(eheader); // Read Size
- eSize = getlong(eheader+4); // Extend Size
-
- if (rSize > grf_size-ftell(fp)) {
- fclose(fp);
- printf("Illegal data format : grf compress entry size\n");
- return 4;
- }
-
- rBuf = (unsigned char *)aCallocA( rSize , 1); // Get a Read Size
- if (rBuf==NULL) {
- fclose(fp);
- printf("out of memory : grf compress entry table buffer\n");
- return 3;
- }
- grf_filelist = (unsigned char *)aCallocA( eSize , 1); // Get a Extend Size
- if (grf_filelist==NULL) {
- aFree(rBuf);
- fclose(fp);
- printf("out of memory : grf extract entry table buffer\n");
- return 3;
- }
- fread(rBuf,1,rSize,fp);
- fclose(fp);
- decode_zip(grf_filelist,&eSize,rBuf,rSize); // Decode function
- list_size = eSize;
- aFree(rBuf);
-
- entrys = getlong(grf_header+0x26) - 7;
-
- // Get an entry
- for(entry=0,ofs=0;entry<entrys;entry++){
- int ofs2,srclen,srccount,type;
- FILELIST aentry;
-
- fname = (char*)(grf_filelist+ofs);
- if (strlen(fname)>sizeof(aentry.fn)-1) {
- printf("grf : file name too long : %s\n",fname);
- aFree(grf_filelist);
- exit(1);
- }
- //ofs2 = ofs+strlen((char*)(grf_filelist+ofs))+1;
- ofs2 = ofs+strlen(fname)+1;
- type = grf_filelist[ofs2+12];
- if(type==1 || type==3 || type==5) {
- srclen=getlong(grf_filelist+ofs2);
- if (grf_filelist[ofs2+12]==3) {
- for(lop=10,srccount=1;srclen>=lop;lop=lop*10,srccount++);
- } else if (grf_filelist[ofs2+12]==5) {
- srccount = 0;
- } else { // if (grf_filelist[ofs2+12]==1) {
- srccount = -1;
- }
-
- aentry.srclen = srclen;
- aentry.srclen_aligned = getlong(grf_filelist+ofs2+4);
- aentry.declen = getlong(grf_filelist+ofs2+8);
- aentry.srcpos = getlong(grf_filelist+ofs2+13)+0x2e;
- aentry.cycle = srccount;
- aentry.type = type;
- strncpy(aentry.fn,fname,sizeof(aentry.fn)-1);
-#ifdef GRFIO_LOCAL
- aentry.gentry = -(gentry+1); // As Flag for making it a negative number carrying out the first time LocalFileCheck
-#else
- aentry.gentry = gentry+1; // With no first time LocalFileCheck
-#endif
- filelist_modify(&aentry);
- }
- ofs = ofs2 + 17;
- }
- aFree(grf_filelist);
-
- } else { //****** Grf Other version ******
- fclose(fp);
- printf("not support grf versions : %04x\n",getlong(grf_header+0x2a));
- return 4;
- }
-
- filelist_adjust(); // Unnecessary area release of filelist
-
- return 0; // 0:no error
-}
-
-/*==========================================
- * Grfio : Resource file check
- *------------------------------------------
- */
-static void grfio_resourcecheck()
-{
- int size;
- char *buf,*ptr;
- char w1[256],w2[256],src[256],dst[256];
- FILELIST *entry;
-
- buf = (char*)grfio_reads("data\\resnametable.txt",&size);
- buf[size] = 0;
-
- for(ptr=buf;ptr-buf<size;) {
- if(sscanf(ptr,"%[^#]#%[^#]#",w1,w2)==2){
- if(strstr(w2,"bmp")){
- sprintf(src,"data\\texture\\%s",w1);
- sprintf(dst,"data\\texture\\%s",w2);
- } else {
- sprintf(src,"data\\%s",w1);
- sprintf(dst,"data\\%s",w2);
- }
- entry = filelist_find(dst);
- if (entry!=NULL) {
- FILELIST fentry;
- memcpy( &fentry, entry, sizeof(FILELIST) );
- strncpy( fentry.fn ,src, sizeof(fentry.fn)-1 );
- filelist_modify(&fentry);
- } else {
- //printf("file not found in data.grf : %s < %s\n",dst,src);
- }
- }
- ptr = strchr(ptr,'\n'); // Next line
- if (!ptr) break;
- ptr++;
- }
- aFree(buf);
- filelist_adjust(); // Unnecessary area release of filelist
-}
-
-/*==========================================
- * Grfio : Resource add
- *------------------------------------------
- */
-#define GENTRY_ADDS 16 // The number increment of gentry_table entries
-
-int grfio_add(char *fname)
-{
- int len,result;
- char *buf;
-
- if (gentry_entrys>=GENTRY_LIMIT) {
- printf("gentrys limit : grfio_add\n");
- exit(1);
- }
-
-// sprintf(tmp_output,"Reading GRF File: '%s'.\n",fname);
-// ShowStatus(tmp_output);
-
- if (gentry_entrys>=gentry_maxentry) {
- char **new_gentry = (char**)aRealloc(
- (void*)gentry_table,(gentry_maxentry+GENTRY_ADDS)*sizeof(char*) );
- if (new_gentry!=NULL) {
- int lop;
- gentry_table = new_gentry;
- gentry_maxentry += GENTRY_ADDS;
- for(lop=gentry_entrys;lop<gentry_maxentry;lop++)
- gentry_table[lop] = NULL;
- } else {
- printf("out of memory : grfio_add\n");
- exit(1);
- }
- }
- len = strlen( fname );
- buf = (char*)aCallocA(len+1, 1);
- if (buf==NULL) {
- printf("out of memory : gentry\n");
- exit(1);
- }
- strcpy( buf, fname );
- gentry_table[gentry_entrys++] = buf;
-
- result = grfio_entryread(fname,gentry_entrys-1);
-
- if (result==0) {
- // Resource check
- grfio_resourcecheck();
- }
-
- return result;
-}
-
-/*==========================================
- * Grfio : Finalize
- *------------------------------------------
- */
-void grfio_final(void)
-{
- int lop;
-
- if (filelist!=NULL) aFree(filelist);
- filelist = NULL;
- filelist_entrys = filelist_maxentry = 0;
-
- if (gentry_table!=NULL) {
- for(lop=0;lop<gentry_entrys;lop++) {
- if (gentry_table[lop]!=NULL) {
- aFree(gentry_table[lop]);
- }
- }
- aFree(gentry_table);
- }
- gentry_table = NULL;
- gentry_entrys = gentry_maxentry = 0;
-
-#ifdef _WIN32
- #ifndef LOCALZLIB
- DLL_CLOSE(zlib_dll);
- zlib_inflateInit_ = NULL;
- zlib_inflate = NULL;
- zlib_inflateEnd = NULL;
- #endif
-#endif
-
-}
-
-/*==========================================
- * Grfio : Initialize
- *------------------------------------------
- */
-void grfio_init(char *fname)
-{
- FILE *data_conf;
- char line[1024], w1[1024], w2[1024];
- int result = 0, result2 = 0, result3 = 0, result4 = 0;
-
-#ifdef _WIN32
- #ifndef LOCALZLIB
- if(!zlib_dll) {
- zlib_dll = DLL_OPEN ("zlib.dll");
- DLL_SYM (zlib_inflateInit_, zlib_dll, "inflateInit_");
- DLL_SYM (zlib_inflate, zlib_dll, "inflate");
- DLL_SYM (zlib_inflateEnd, zlib_dll, "inflateEnd");
- DLL_SYM (zlib_deflateInit_, zlib_dll, "deflateInit_");
- DLL_SYM (zlib_deflate, zlib_dll, "deflate");
- DLL_SYM (zlib_deflateEnd, zlib_dll, "deflateEnd");
- if(zlib_dll == NULL) {
- MessageBox(NULL,"Can't load zlib.dll","grfio.c",MB_OK);
- exit(1);
- }
- }
- #endif
-#endif
-
- data_conf = fopen(fname, "r");
-
- // It will read, if there is grf-files.txt.
- if (data_conf) {
- while(fgets(line, 1020, data_conf)) {
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2) {
- if(strcmp(w1, "data") == 0)
- strcpy(data_file, w2);
- else if(strcmp(w1, "sdata") == 0)
- strcpy(sdata_file, w2);
- else if(strcmp(w1, "adata") == 0)
- strcpy(adata_file, w2);
- else if(strcmp(w1,"data_dir") == 0)
- strcpy(data_dir, w2);
- }
- }
-
- fclose(data_conf);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n",fname);
- ShowStatus(tmp_output);
- } // end of reading grf-files.txt
-
- hashinit(); // hash table initialization
-
- filelist = NULL; filelist_entrys = filelist_maxentry = 0;
- gentry_table = NULL; gentry_entrys = gentry_maxentry = 0;
- atexit(grfio_final); // End processing definition
-
- // Entry table reading
-
- if (strcmp(data_file, "") != 0) // If data directive exists in grf-files.txt (i.e. data_file is not equal to "")
- result = grfio_add(data_file); // Primary data file
-
- if (strcmp(sdata_file, "") != 0) // If sdata directive exists in grf-files.txt (i.e. sdata_file is not equal to "")
- result2 = grfio_add(sdata_file); // Sakray data file
-
- if (strcmp(adata_file, "") != 0) // If data directive exists in grf-files.txt (i.e. adata_file is not equal to "")
- result3 = grfio_add(adata_file); // Alpha version data file
-
- if (strcmp(data_dir, "") == 0) // Id data_dir doesn't exist
- result4 = 1; // Data directory
-/*
- if (result != 0 && result2 != 0 && result3 != 0 && result4 != 0) {
- printf("not grf file readed exit!!\n");
- exit(1); // It ends, if a resource cannot read one.
- }*/
-}
diff --git a/src/common/grfio.h b/src/common/grfio.h
deleted file mode 100644
index 3fa257e2f..000000000
--- a/src/common/grfio.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// $Id: grfio.h,v 1.1.1.1 2004/09/10 17:44:49 MagicalTux Exp $
-#ifndef _GRFIO_H_
-#define _GRFIO_H_
-
-void grfio_init(char*); // GRFIO Initialize
-int grfio_add(char*); // GRFIO Resource file add
-void* grfio_read(char*); // GRFIO data file read
-void* grfio_reads(char*,int*); // GRFIO data file read & size get
-int grfio_size(char*); // GRFIO data file size get
-
-int decode_zip(unsigned char *dest, unsigned long* destLen, const unsigned char* source, unsigned long sourceLen);
-int encode_zip(unsigned char *dest, unsigned long* destLen, const unsigned char* source, unsigned long sourceLen);
-
-// Accessor to GRF filenames
-char *grfio_setdatafile(const char *str);
-char *grfio_setadatafile(const char *str);
-char *grfio_setsdatafile(const char *str);
-
-#endif // _GRFIO_H_
diff --git a/src/common/lock.c b/src/common/lock.c
deleted file mode 100644
index 0258cbd2c..000000000
--- a/src/common/lock.c
+++ /dev/null
@@ -1,55 +0,0 @@
-
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#ifndef WIN32
-#include <unistd.h>
-#else
-#include <windows.h>
-#define F_OK 0x0
-#define R_OK 0x4
-#endif
-#include "lock.h"
-#include "showmsg.h"
-#define exists(filename) (!access(filename, F_OK))
-
-// ‘‚«ž‚݃tƒ@ƒCƒ‹‚̕ی숗
-// i‘‚«ž‚Ý‚ªI‚í‚é‚Ü‚ÅA‹Œƒtƒ@ƒCƒ‹‚ð•ÛŠÇ‚µ‚Ä‚¨‚­j
-
-// V‚µ‚¢ƒtƒ@ƒCƒ‹‚Ì‘‚«ž‚ÝŠJŽn
-FILE* lock_fopen (const char* filename, int *info) {
- char newfile[512];
- FILE *fp;
- int no = 0;
-
- // ˆÀ‘S‚ȃtƒ@ƒCƒ‹–¼‚𓾂éiŽè”²‚«j
- do {
- sprintf(newfile, "%s_%04d.tmp", filename, ++no);
- } while((fp = fopen(newfile,"r")) && (fclose(fp), no < 9999));
- *info = no;
- return fopen(newfile,"w");
-}
-
-// ‹Œƒtƒ@ƒCƒ‹‚ð휕Vƒtƒ@ƒCƒ‹‚ðƒŠƒl[ƒ€
-int lock_fclose (FILE *fp, const char* filename, int *info) {
- int ret = 1;
- char newfile[512];
- char oldfile[512];
- if (fp != NULL) {
- ret = fclose(fp);
- sprintf(newfile, "%s_%04d.tmp", filename, *info);
- sprintf(oldfile, "%s.bak", filename); // old backup file
-
- if (exists(oldfile)) remove(oldfile); // remove backup file if it already exists
- rename (filename, oldfile); // backup our older data instead of deleting it
-
- // ‚±‚̃^ƒCƒ~ƒ“ƒO‚Å—Ž‚¿‚é‚Æň«B
- if ((ret = rename(newfile,filename)) != 0) { // rename our temporary file to its correct name
- sprintf(tmp_output,"%s - '"CL_WHITE"%s"CL_RESET"'\n", strerror(errno), newfile);
- ShowError(tmp_output);
- }
- }
-
- return ret;
-}
-
diff --git a/src/common/lock.h b/src/common/lock.h
deleted file mode 100644
index 795bf8860..000000000
--- a/src/common/lock.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef _LOCK_H_
-#define _LOCK_H_
-
-FILE* lock_fopen(const char* filename,int *info);
-int lock_fclose(FILE *fp,const char* filename,int *info);
-
-#endif
-
diff --git a/src/common/malloc.c b/src/common/malloc.c
deleted file mode 100644
index b81c25ed5..000000000
--- a/src/common/malloc.c
+++ /dev/null
@@ -1,548 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "malloc.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-// “ÆŽ©ƒƒ‚ƒŠƒ}ƒl[ƒWƒƒ‚ðŽg—p‚·‚éê‡AŽŸ‚̃Rƒƒ“ƒg‚ðŠO‚µ‚Ä‚­‚¾‚³‚¢B
-//#define USE_MEMMGR
-
-#if !defined(DMALLOC) && !defined(GCOLLECT) && !defined(BCHECK) && !defined(USE_MEMMGR)
-
-void* aMalloc_( size_t size, const char *file, int line, const char *func )
-{
- void *ret;
-
-// printf("%s:%d: in func %s: malloc %d\n",file,line,func,size);
-#ifdef MEMWATCH
- ret=mwMalloc(size,file,line);
-#else
- ret=malloc(size);
-#endif
- if(ret==NULL){
- printf("%s:%d: in func %s: malloc error out of memory!\n",file,line,func);
- exit(1);
-
- }
- return ret;
-}
-void* aCalloc_( size_t num, size_t size, const char *file, int line, const char *func )
-{
- void *ret;
-
-// printf("%s:%d: in func %s: calloc %d %d\n",file,line,func,num,size);
-#ifdef MEMWATCH
- ret=mwCalloc(num,size,file,line);
-#else
- ret=calloc(num,size);
-#endif
- if(ret==NULL){
- printf("%s:%d: in func %s: calloc error out of memory!\n",file,line,func);
- exit(1);
-
- }
- return ret;
-}
-
-void* aRealloc_( void *p, size_t size, const char *file, int line, const char *func )
-{
- void *ret;
-
-// printf("%s:%d: in func %s: realloc %p %d\n",file,line,func,p,size);
-#ifdef MEMWATCH
- ret=mwRealloc(p,size,file,line);
-#else
- ret=realloc(p,size);
-#endif
- if(ret==NULL){
- printf("%s:%d: in func %s: realloc error out of memory!\n",file,line,func);
- exit(1);
-
- }
- return ret;
-}
-
-char* aStrdup_( const void *p, const char *file, int line, const char *func )
-{
- char *ret;
-
- // printf("%s:%d: in func %s: strdup %p\n",file,line,func,p);
-#ifdef MEMWATCH
- ret=mwStrdup(p,file,line);
-#else
- ret= strdup((char *) p);
-#endif
- if(ret==NULL){
- printf("%s:%d: in func %s: strdup error out of memory!\n",file,line,func);
- exit(1);
-
- }
- return ret;
-}
-
-void aFree_( void *p, const char *file, int line, const char *func )
-{
- // printf("%s:%d: in func %s: free %p\n",file,line,func,p);
-#ifdef MEMWATCH
- mwFree(p,file,line);
-#else
- free(p);
-#endif
-}
-
-#elif defined(GCOLLECT)
-
-void * _bcallocA(size_t size, size_t cnt) {
- void *ret = aMallocA(size * cnt);
- memset(ret, 0, size * cnt);
- return ret;
-}
-
-void * _bcalloc(size_t size, size_t cnt) {
- void *ret = aMalloc(size * cnt);
- memset(ret, 0, size * cnt);
- return ret;
-}
-
-char * _bstrdup(const char *chr) {
- int len = strlen(chr);
- char *ret = (char*)aMalloc(len + 1);
- strcpy(ret, chr);
- return ret;
-}
-
-#elif defined(USE_MEMMGR)
-
-/* USE_MEMMGR */
-
-/*
- * ƒƒ‚ƒŠƒ}ƒl[ƒWƒƒ
- * malloc , free ‚̈—‚ðŒø—¦“I‚Éo—ˆ‚é‚悤‚É‚µ‚½‚à‚ÌB
- * •¡ŽG‚Ȉ—‚ðs‚Á‚Ä‚¢‚é‚Ì‚ÅAŽáŠ±d‚­‚È‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB
- *
- * ƒf[ƒ^\‘¢‚È‚Çià–¾‰ºŽè‚Å‚·‚¢‚Ü‚¹‚ñ^^; j
- * Eƒƒ‚ƒŠ‚ð•¡”‚ÌuƒuƒƒbƒNv‚É•ª‚¯‚ÄA‚³‚ç‚ɃuƒƒbƒN‚ð•¡”‚Ìuƒ†ƒjƒbƒgv
- * ‚É•ª‚¯‚Ä‚¢‚Ü‚·Bƒ†ƒjƒbƒg‚̃TƒCƒY‚ÍA‚PƒuƒƒbƒN‚Ì—e—Ê‚ð•¡”ŒÂ‚É‹Ï“™”z•ª
- * ‚µ‚½‚à‚Ì‚Å‚·B‚½‚Æ‚¦‚ÎA‚Pƒ†ƒjƒbƒg32KB‚Ìê‡AƒuƒƒbƒN‚P‚‚Í32Byte‚̃†
- * ƒjƒbƒg‚ªA1024ŒÂW‚Ü‚Á‚Äo—ˆ‚Ä‚¢‚½‚èA64Byte‚̃†ƒjƒbƒg‚ª 512ŒÂW‚Ü‚Á‚Ä
- * o—ˆ‚Ä‚¢‚½‚肵‚Ü‚·Bipadding,unit_head ‚𜂭j
- *
- * Eƒ†ƒjƒbƒg“¯Žm‚̓Šƒ“ƒNƒŠƒXƒg(block_prev,block_next) ‚ł‚Ȃª‚èA“¯‚¶ƒTƒC
- * ƒY‚ðŽ‚ƒ†ƒjƒbƒg“¯Žm‚àƒŠƒ“ƒNƒŠƒXƒg(samesize_prev,samesize_nect) ‚ł‚È
- * ‚ª‚Á‚Ä‚¢‚Ü‚·B‚»‚ê‚É‚æ‚èA•s—v‚Æ‚È‚Á‚½ƒƒ‚ƒŠ‚ÌÄ—˜—p‚ªŒø—¦“I‚És‚¦‚Ü‚·B
- */
-
-/* ƒuƒƒbƒN‚É“ü‚éƒf[ƒ^—Ê */
-#define BLOCK_DATA_SIZE 80*1024
-
-/* ˆê“x‚ÉŠm•Û‚·‚éƒuƒƒbƒN‚Ì”B */
-#define BLOCK_ALLOC 32
-
-/* ƒuƒƒbƒN‚̃Aƒ‰ƒCƒƒ“ƒg */
-#define BLOCK_ALIGNMENT 64
-
-/* ƒuƒƒbƒN */
-struct block {
- int block_no; /* ƒuƒƒbƒN”Ô† */
- struct block* block_prev; /* ‘O‚ÉŠm•Û‚µ‚½—̈æ */
- struct block* block_next; /* ŽŸ‚ÉŠm•Û‚µ‚½—̈æ */
- int samesize_no; /* “¯‚¶ƒTƒCƒY‚̔Ԇ */
- struct block* samesize_prev; /* “¯‚¶ƒTƒCƒY‚Ì‘O‚̗̈æ */
- struct block* samesize_next; /* “¯‚¶ƒTƒCƒY‚ÌŽŸ‚̗̈æ */
- int unit_size; /* ƒ†ƒjƒbƒg‚̃oƒCƒg” 0=–¢Žg—p */
- int unit_hash; /* ƒ†ƒjƒbƒg‚̃nƒbƒVƒ… */
- int unit_count; /* ƒ†ƒjƒbƒg‚Ì” */
- int unit_used; /* Žg—pς݃†ƒjƒbƒg */
- char data[BLOCK_DATA_SIZE];
-};
-
-struct unit_head {
- struct block* block;
- int size;
- const char* file;
- int line;
-};
-
-static struct block* block_first = NULL;
-static struct block* block_last = NULL;
-static struct block* block_unused = NULL;
-
-/* ƒ†ƒjƒbƒg‚ւ̃nƒbƒVƒ…B80KB/64Byte = 1280ŒÂ */
-static struct block* unit_first[BLOCK_DATA_SIZE/BLOCK_ALIGNMENT]; /* ʼn */
-static struct block* unit_unfill[BLOCK_DATA_SIZE/BLOCK_ALIGNMENT]; /* –„‚Ü‚Á‚Ä‚È‚¢ */
-static struct block* unit_last[BLOCK_DATA_SIZE/BLOCK_ALIGNMENT]; /* ÅŒã */
-
-/* ƒƒ‚ƒŠ‚ðŽg‚¢‰ñ‚¹‚È‚¢—̈æ—p‚̃f[ƒ^ */
-struct unit_head_large {
- struct unit_head_large* prev;
- struct unit_head_large* next;
- struct unit_head unit_head;
-};
-static struct unit_head_large *unit_head_large_first = NULL;
-
-static struct block* block_malloc(void);
-static void block_free(struct block* p);
-static void memmgr_info(void);
-
-void* aMalloc_(size_t size, const char *file, int line, const char *func ) {
- int i;
- struct block *block;
- int size_hash = (size+BLOCK_ALIGNMENT-1) / BLOCK_ALIGNMENT;
- size = size_hash * BLOCK_ALIGNMENT; /* ƒAƒ‰ƒCƒƒ“ƒg‚Ì”{”‚ÉØ‚èã‚° */
-
- if(size == 0) {
- return NULL;
- }
-
- /* ƒuƒƒbƒN’·‚ð’´‚¦‚é—̈æ‚ÌŠm•Û‚É‚ÍAmalloc() ‚ð—p‚¢‚é */
- /* ‚»‚ÌÛAunit_head.block ‚É NULL ‚ð‘ã“ü‚µ‚Ä‹æ•Ê‚·‚é */
- if(size > BLOCK_DATA_SIZE - sizeof(struct unit_head)) {
-#ifdef MEMWATCH
- struct unit_head_large* p = (struct unit_head_large*)mwMalloc(sizeof(struct unit_head_large) + size,file,line);
-#else
- struct unit_head_large* p = (struct unit_head_large*)malloc(sizeof(struct unit_head_large) + size);
-#endif
- if(p != NULL) {
- p->unit_head.block = NULL;
- p->unit_head.size = size;
- p->unit_head.file = file;
- p->unit_head.line = line;
- if(unit_head_large_first == NULL) {
- unit_head_large_first = p;
- p->next = NULL;
- p->prev = NULL;
- } else {
- unit_head_large_first->prev = p;
- p->prev = NULL;
- p->next = unit_head_large_first;
- unit_head_large_first = p;
- }
- return (char *)p + sizeof(struct unit_head_large);
- } else {
- printf("MEMMGR::memmgr_alloc failed.\n");
- exit(1);
- }
- }
-
- /* “¯ˆêƒTƒCƒY‚̃uƒƒbƒN‚ªŠm•Û‚³‚ê‚Ä‚¢‚È‚¢ŽžAV‚½‚ÉŠm•Û‚·‚é */
- if(unit_unfill[size_hash] == NULL) {
- block = block_malloc();
- if(unit_first[size_hash] == NULL) {
- /* ‰‰ñŠm•Û */
- unit_first[size_hash] = block;
- unit_last[size_hash] = block;
- block->samesize_no = 0;
- block->samesize_prev = NULL;
- block->samesize_next = NULL;
- } else {
- /* ˜AŒ‹ì‹Æ */
- unit_last[size_hash]->samesize_next = block;
- block->samesize_no = unit_last[size_hash]->samesize_no + 1;
- block->samesize_prev = unit_last[size_hash];
- block->samesize_next = NULL;
- unit_last[size_hash] = block;
- }
- unit_unfill[size_hash] = block;
- block->unit_size = size + sizeof(struct unit_head);
- block->unit_count = BLOCK_DATA_SIZE / block->unit_size;
- block->unit_used = 0;
- block->unit_hash = size_hash;
- /* –¢Žg—pFlag‚𗧂Ăé */
- for(i=0;i<block->unit_count;i++) {
- ((struct unit_head*)(&block->data[block->unit_size * i]))->block = NULL;
- }
- }
- /* ƒ†ƒjƒbƒgŽg—pŒÂ”‰ÁŽZ */
- block = unit_unfill[size_hash];
- block->unit_used++;
-
- /* ƒ†ƒjƒbƒg“à‚ð‘S‚ÄŽg‚¢‰Ê‚½‚µ‚½ */
- if(block->unit_count == block->unit_used) {
- do {
- unit_unfill[size_hash] = unit_unfill[size_hash]->samesize_next;
- } while(
- unit_unfill[size_hash] != NULL &&
- unit_unfill[size_hash]->unit_count == unit_unfill[size_hash]->unit_used
- );
- }
-
- /* ƒuƒƒbƒN‚Ì’†‚̋󂫃†ƒjƒbƒg‘{õ */
- for(i=0;i<block->unit_count;i++) {
- struct unit_head *head = (struct unit_head*)(&block->data[block->unit_size * i]);
- if(head->block == NULL) {
- head->block = block;
- head->size = size;
- head->line = line;
- head->file = file;
- return (char *)head + sizeof(struct unit_head);
- }
- }
- // ‚±‚±‚É—ˆ‚Ä‚Í‚¢‚¯‚È‚¢B
- printf("MEMMGR::memmgr_malloc() serious error.\n");
- memmgr_info();
- exit(1);
- return NULL;
-};
-
-void* aCalloc_(size_t num, size_t size, const char *file, int line, const char *func ) {
- void *p = aMalloc_(num * size,file,line,func);
- memset(p,0,num * size);
- return p;
-}
-
-void* aRealloc_(void *memblock, size_t size, const char *file, int line, const char *func ) {
- size_t old_size;
- if(memblock == NULL) {
- return aMalloc_(size,file,line,func);
- }
-
- old_size = ((struct unit_head *)((char *)memblock - sizeof(struct unit_head)))->size;
- if(old_size > size) {
- // ƒTƒCƒYk¬ -> ‚»‚Ì‚Ü‚Ü•Ô‚·iŽè”²‚«j
- return memblock;
- } else {
- // ƒTƒCƒYŠg‘å
- void *p = aMalloc_(size,file,line,func);
- if(p != NULL) {
- memcpy(p,memblock,old_size);
- }
- aFree_(memblock,file,line,func);
- return p;
- }
-}
-
-char* aStrdup_(const void *p, const char *file, int line, const char *func ) {
- if(p == NULL) {
- return NULL;
- } else {
- int len = strlen(p);
- char *string = (char *)aMalloc_(len + 1,file,line,func);
- memcpy(string,p,len+1);
- return string;
- }
-}
-
-void aFree_(void *ptr, const char *file, int line, const char *func ) {
- struct unit_head *head = (struct unit_head *)((char *)ptr - sizeof(struct unit_head));
- if(ptr == NULL) {
- return;
- } else if(head->block == NULL && head->size > BLOCK_DATA_SIZE - sizeof(struct unit_head)) {
- /* malloc() ‚Å’¼‚ÉŠm•Û‚³‚ꂽ—̈æ */
- struct unit_head_large *head_large = (struct unit_head_large *)((char *)ptr - sizeof(struct unit_head_large));
- if(head_large->prev) {
- head_large->prev->next = head_large->next;
- } else {
- unit_head_large_first = head_large->next;
- }
- if(head_large->next) {
- head_large->next->prev = head_large->prev;
- }
- free(head_large);
- return;
- } else {
- /* ƒ†ƒjƒbƒg‰ð•ú */
- struct block *block = head->block;
- if(head->block == NULL) {
- printf("memmgr: args of aFree is freed pointer %s line %d\n",file,line);
- } else {
- head->block = NULL;
- if(--block->unit_used == 0) {
- /* ƒuƒƒbƒN‚̉ð•ú */
- if(unit_unfill[block->unit_hash] == block) {
- /* ‹ó‚«ƒ†ƒjƒbƒg‚ÉŽw’肳‚ê‚Ä‚¢‚é */
- do {
- unit_unfill[block->unit_hash] = unit_unfill[block->unit_hash]->samesize_next;
- } while(
- unit_unfill[block->unit_hash] != NULL &&
- unit_unfill[block->unit_hash]->unit_count == unit_unfill[block->unit_hash]->unit_used
- );
- }
- if(block->samesize_prev == NULL && block->samesize_next == NULL) {
- /* “Æ—§ƒuƒƒbƒN‚̉ð•ú */
- unit_first[block->unit_hash] = NULL;
- unit_last[block->unit_hash] = NULL;
- unit_unfill[block->unit_hash] = NULL;
- } else if(block->samesize_prev == NULL) {
- /* 擪ƒuƒƒbƒN‚̉ð•ú */
- unit_first[block->unit_hash] = block->samesize_next;
- (block->samesize_next)->samesize_prev = NULL;
- } else if(block->samesize_next == NULL) {
- /* ––’[ƒuƒƒbƒN‚̉ð•ú */
- unit_last[block->unit_hash] = block->samesize_prev;
- (block->samesize_prev)->samesize_next = NULL;
- } else {
- /* ’†ŠÔƒuƒƒbƒN‚̉ð•ú */
- (block->samesize_next)->samesize_prev = block->samesize_prev;
- (block->samesize_prev)->samesize_next = block->samesize_next;
- }
- block_free(block);
- } else {
- /* ‹ó‚«ƒ†ƒjƒbƒg‚ÌÄÝ’è */
- if(
- unit_unfill[block->unit_hash] == NULL ||
- unit_unfill[block->unit_hash]->samesize_no > block->samesize_no
- ) {
- unit_unfill[block->unit_hash] = block;
- }
- }
- }
- }
-}
-
-/* Œ»Ý‚Ì󋵂ð•\Ž¦‚·‚é */
-static void memmgr_info(void) {
- int i;
- struct block *p;
- printf("** Memory Maneger Information **\n");
- if(block_first == NULL) {
- printf("Uninitialized.\n");
- return;
- }
- printf(
- "Blocks: %04u , BlockSize: %06u Byte , Used: %08uKB\n",
- block_last->block_no+1,sizeof(struct block),
- (block_last->block_no+1) * sizeof(struct block) / 1024
- );
- p = block_first;
- for(i=0;i<=block_last->block_no;i++) {
- printf(" Block #%04u : ",p->block_no);
- if(p->unit_size == 0) {
- printf("unused.\n");
- } else {
- printf(
- "size: %05u byte. used: %04u/%04u prev:",
- p->unit_size - sizeof(struct unit_head),p->unit_used,p->unit_count
- );
- if(p->samesize_prev == NULL) {
- printf("NULL");
- } else {
- printf("%04u",(p->samesize_prev)->block_no);
- }
- printf(" next:");
- if(p->samesize_next == NULL) {
- printf("NULL");
- } else {
- printf("%04u",(p->samesize_next)->block_no);
- }
- printf("\n");
- }
- p = p->block_next;
- }
-}
-
-/* ƒuƒƒbƒN‚ðŠm•Û‚·‚é */
-static struct block* block_malloc(void) {
- if(block_unused != NULL) {
- /* ƒuƒƒbƒN—p‚̗̈æ‚ÍŠm•ÛÏ‚Ý */
- struct block* ret = block_unused;
- do {
- block_unused = block_unused->block_next;
- } while(block_unused != NULL && block_unused->unit_size != 0);
- return ret;
- } else {
- /* ƒuƒƒbƒN—p‚̗̈æ‚ðV‚½‚ÉŠm•Û‚·‚é */
- int i;
- int block_no;
- struct block* p = (struct block *)calloc(sizeof(struct block),BLOCK_ALLOC);
- if(p == NULL) {
- printf("MEMMGR::block_alloc failed.\n");
- exit(1);
- }
- if(block_first == NULL) {
- /* ‰‰ñŠm•Û */
- block_no = 0;
- block_first = p;
- } else {
- block_no = block_last->block_no + 1;
- block_last->block_next = p;
- p->block_prev = block_last;
- }
- block_last = &p[BLOCK_ALLOC - 1];
- /* ƒuƒƒbƒN‚ð˜AŒ‹‚³‚¹‚é */
- for(i=0;i<BLOCK_ALLOC;i++) {
- if(i != 0) {
- p[i].block_prev = &p[i-1];
- }
- if(i != BLOCK_ALLOC -1) {
- p[i].block_next = &p[i+1];
- }
- p[i].block_no = block_no + i;
- }
-
- /* –¢Žg—pƒuƒƒbƒN‚ւ̃|ƒCƒ“ƒ^‚ðXV */
- block_unused = &p[1];
- p->unit_size = 1;
- return p;
- }
-}
-
-static void block_free(struct block* p) {
- /* free() ‚¹‚¸‚ÉA–¢Žg—pƒtƒ‰ƒO‚ð•t‚¯‚邾‚¯ */
- p->unit_size = 0;
- /* –¢Žg—pƒ|ƒCƒ“ƒ^[‚ðXV‚·‚é */
- if(block_unused == NULL) {
- block_unused = p;
- } else if(block_unused->block_no > p->block_no) {
- block_unused = p;
- }
-}
-
-static char memmer_logfile[128];
-
-static FILE* memmgr_log(void) {
- FILE *fp = fopen(memmer_logfile,"w");
- if(!fp) { fp = stdout; }
- fprintf(fp,"memmgr: memory leaks found\n");
- return fp;
-}
-
-static void memmer_exit(void) {
- FILE *fp = NULL;
- int i;
- int count = 0;
- struct block *block = block_first;
- struct unit_head_large *large = unit_head_large_first;
- while(block) {
- if(block->unit_size) {
- if(!fp) { fp = memmgr_log(); }
- for(i=0;i<block->unit_count;i++) {
- struct unit_head *head = (struct unit_head*)(&block->data[block->unit_size * i]);
- if(head->block != NULL) {
- fprintf(
- fp,"%04d : %s line %d size %d\n",++count,
- head->file,head->line,head->size
- );
- }
- }
- }
- block = block->block_next;
- }
- while(large) {
- if(!fp) { fp = memmgr_log(); }
- fprintf(
- fp,"%04d : %s line %d size %d\n",++count,
- large->unit_head.file,
- large->unit_head.line,large->unit_head.size
- );
- large = large->next;
- }
- if(!fp) {
- printf("memmgr: no memory leaks found.\n");
- } else {
- printf("memmgr: memory leaks found.\n");
- fclose(fp);
- }
-}
-#endif
-
-int do_init_memmgr(const char* file) {
- #ifdef USE_MEMMGR
- sprintf(memmer_logfile,"%s.log",file);
- atexit(memmer_exit);
- printf("memmgr: initialised: %s\n",memmer_logfile);
- #endif
- return 0;
-}
diff --git a/src/common/malloc.h b/src/common/malloc.h
deleted file mode 100644
index c233adb8d..000000000
--- a/src/common/malloc.h
+++ /dev/null
@@ -1,77 +0,0 @@
-#ifndef _MALLOC_H_
-#define _MALLOC_H_
-
-#include <stdlib.h>
-
-#if defined(DMALLOC)
-
-# include "dmalloc.h"
-# define aMalloc(size) \
- dmalloc_malloc(__FILE__, __LINE__, (size), DMALLOC_FUNC_MALLOC, 0, 0)
-# define aMallocA(size) \
- dmalloc_malloc(__FILE__, __LINE__, (size), DMALLOC_FUNC_MALLOC, 0, 0)
-# define aCallocA(count,size) \
- dmalloc_malloc(__FILE__, __LINE__, (count)*(size), DMALLOC_FUNC_CALLOC, 0, 0)
-# define aCalloc(count,size) \
- dmalloc_malloc(__FILE__, __LINE__, (count)*(size), DMALLOC_FUNC_CALLOC, 0, 0)
-# define aRealloc(ptr,size) \
- dmalloc_realloc(__FILE__, __LINE__, (ptr), (size), DMALLOC_FUNC_REALLOC, 0)
-# define aFree(ptr) free(ptr)
-# define aStrdup(ptr) strdup(ptr)
-
-#elif defined(GCOLLECT)
-
-# include "gc.h"
-# define aMalloc(n) GC_MALLOC(n)
-# define aMallocA(n) GC_MALLOC_ATOMIC(n)
-# define aCallocA(m,n) _bcallocA(m,n)
-# define aCalloc(m,n) _bcalloc(m,n)
-# define aRealloc(p,n) GC_REALLOC(p,n)
-# define aFree(n) GC_FREE(n)
-# define aStrdup(n) _bstrdup(n)
-
- extern void * _bcalloc(size_t, size_t);
- extern void * _bcallocA(size_t, size_t);
- extern char * _bstrdup(const char *);
-
-#elif defined(BCHECK)
-
-# define aMalloc(n) malloc(n)
-# define aMallocA(n) malloc(n)
-# define aCalloc(m,n) calloc(m,n)
-# define aCallocA(m,n) calloc(m,n)
-# define aRealloc(p,n) realloc(p,n)
-# define aFree(n) free(n)
-# define aStrdup(n) strdup(n)
-
-#else
-
-#if __STDC_VERSION__ < 199901L
-# if __GNUC__ >= 2
-# define __func__ __FUNCTION__
-# else
-# define __func__ ""
-# endif
-#endif
-
-# define ALC_MARK __FILE__, __LINE__, __func__
-
- void* aMalloc_( size_t size, const char *file, int line, const char *func );
- void* aCalloc_( size_t num, size_t size, const char *file, int line, const char *func );
- void* aRealloc_( void *p, size_t size, const char *file, int line, const char *func );
- void aFree_( void *p, const char *file, int line, const char *func );
- char* aStrdup_( const void *p, const char *file, int line, const char *func );
-
-# define aMalloc(n) aMalloc_(n,ALC_MARK)
-# define aMallocA(n) aMalloc_(n,ALC_MARK)
-# define aCalloc(m,n) aCalloc_(m,n,ALC_MARK)
-# define aCallocA(m,n) aCalloc_(m,n,ALC_MARK)
-# define aRealloc(p,n) aRealloc_(p,n,ALC_MARK)
-# define aStrdup(p) aStrdup_(p,ALC_MARK)
-# define aFree(p) do { aFree_(p,ALC_MARK); if(p != NULL) { p = NULL; } } while(0)
-
-#endif
-
-int do_init_memmgr(const char* file);
-
-#endif
diff --git a/src/common/mmo.h b/src/common/mmo.h
deleted file mode 100644
index 1602c5655..000000000
--- a/src/common/mmo.h
+++ /dev/null
@@ -1,353 +0,0 @@
-// $Id: mmo.h,v 1.3 2004/09/25 20:12:25 PoW Exp $
-// Original : mmo.h 2003/03/14 12:07:02 Rev.1.7
-
-#ifndef _MMO_H_
-#define _MMO_H_
-
-#include <time.h>
-#include "utils.h" // _WIN32
-
-#if ! defined(Assert)
-#if defined(RELEASE)
-#define Assert(EX)
-#else
-// extern "C" {
-#include <assert.h>
-// }
-#if defined(_WIN32)
-#include <crtdbg.h>
-#endif
-#define Assert(EX) assert(EX)
-#endif
-#endif /* ! defined(Assert) */
-
-#ifdef CYGWIN
-// txt‚âlog‚È‚Ç‚Ì‘‚«o‚·ƒtƒ@ƒCƒ‹‚̉üsƒR[ƒh
-#define RETCODE "\r\n" // (CR/LFFWindowsŒn)
-#else
-#define RETCODE "\n" // (LFFUnixŒnj
-#endif
-
-#define RET RETCODE
-
-#define FIFOSIZE_SERVERLINK 128*1024
-
-// set to 0 to not check IP of player between each server.
-// set to another value if you want to check (1)
-#define CMP_AUTHFIFO_IP 1
-
-#define CMP_AUTHFIFO_LOGIN2 1
-
-#define MAX_MAP_PER_SERVER 512
-#define MAX_INVENTORY 100
-#define MAX_AMOUNT 30000
-#define MAX_ZENY 1000000000 // 1G zeny
-#define MAX_CART 100
-#define MAX_SKILL 650
-#define GLOBAL_REG_NUM 96
-#define ACCOUNT_REG_NUM 16
-#define ACCOUNT_REG2_NUM 16
-#define DEFAULT_WALK_SPEED 150
-#define MIN_WALK_SPEED 0
-#define MAX_WALK_SPEED 1000
-#define MAX_STORAGE 300
-#define MAX_GUILD_STORAGE 1000
-#define MAX_PARTY 12
-#define MAX_GUILD 16+10*6 // increased max guild members to accomodate for +6 increase for extension levels [Lupus]
-#define MAX_GUILDPOSITION 20 // increased max guild positions to accomodate for all members [Valaris] (removed) [PoW]
-#define MAX_GUILDEXPLUSION 32
-#define MAX_GUILDALLIANCE 16
-#define MAX_GUILDSKILL 15 // increased max guild skills because of new skills [Sara-chan]
-#define MAX_GUILDCASTLE 24 // increased to include novice castles [Valaris]
-#define MAX_GUILDLEVEL 50
-
-#define MIN_HAIR_STYLE battle_config.min_hair_style
-#define MAX_HAIR_STYLE battle_config.max_hair_style
-#define MIN_HAIR_COLOR battle_config.min_hair_color
-#define MAX_HAIR_COLOR battle_config.max_hair_color
-#define MIN_CLOTH_COLOR battle_config.min_cloth_color
-#define MAX_CLOTH_COLOR battle_config.max_cloth_color
-
-// for produce
-#define MIN_ATTRIBUTE 0
-#define MAX_ATTRIBUTE 4
-#define ATTRIBUTE_NORMAL 0
-#define MIN_STAR 0
-#define MAX_STAR 3
-
-#define MIN_PORTAL_MEMO 0
-#define MAX_PORTAL_MEMO 2
-
-#define MAX_STATUS_TYPE 5
-
-#define WEDDING_RING_M 2634
-#define WEDDING_RING_F 2635
-
-#define CHAR_CONF_NAME "conf/char_athena.conf"
-
-struct item {
- int id;
- short nameid;
- short amount;
- unsigned short equip;
- char identify;
- char refine;
- char attribute;
- short card[4];
-};
-
-struct point{
- char map[24];
- short x,y;
-};
-
-struct skill {
- unsigned short id,lv,flag;
-};
-
-struct global_reg {
- char str[32];
- int value;
-};
-
-struct s_pet {
- int account_id;
- int char_id;
- int pet_id;
- short class_;
- short level;
- short egg_id;//pet egg id
- short equip;//pet equip name_id
- short intimate;//pet friendly
- short hungry;//pet hungry
- char name[24];
- char rename_flag;
- char incuvate;
-};
-
-struct mmo_charstatus {
- int char_id;
- int account_id;
- int partner_id;
- int father;
- int mother;
- int child;
-
- int base_exp,job_exp,zeny;
-
- short class_;
- short status_point,skill_point;
- int hp,max_hp,sp,max_sp;
- short option,karma,manner;
- short hair,hair_color,clothes_color;
- int party_id,guild_id,pet_id;
-
- short weapon,shield;
- short head_top,head_mid,head_bottom;
-
- char name[24];
- unsigned int base_level,job_level;
- short str,agi,vit,int_,dex,luk;
- unsigned char char_num,sex;
-
- unsigned long mapip;
- unsigned int mapport;
-
- struct point last_point,save_point,memo_point[10];
- struct item inventory[MAX_INVENTORY],cart[MAX_CART];
- struct skill skill[MAX_SKILL];
- int global_reg_num;
- struct global_reg global_reg[GLOBAL_REG_NUM];
- int account_reg_num;
- struct global_reg account_reg[ACCOUNT_REG_NUM];
- int account_reg2_num;
- struct global_reg account_reg2[ACCOUNT_REG2_NUM];
-
- // Friends list vars
- int friend_id[20];
- char friend_name[20][24];
-};
-
-struct storage {
- int dirty;
- int account_id;
- short storage_status;
- short storage_amount;
- struct item storage_[MAX_STORAGE];
-};
-
-struct guild_storage {
- int guild_id;
- short storage_status;
- short storage_amount;
- struct item storage_[MAX_GUILD_STORAGE];
-};
-
-struct map_session_data;
-
-struct gm_account {
- int account_id;
- int level;
-};
-
-struct party_member {
- int account_id;
- char name[24],map[24];
- int leader,online,lv;
- struct map_session_data *sd;
-};
-
-struct party {
- int party_id;
- char name[24];
- int exp;
- int item, itemc;
- struct party_member member[MAX_PARTY];
-};
-
-struct guild_member {
- int account_id, char_id;
- short hair,hair_color,gender,class_,lv;
- int exp,exp_payper;
- short online,position;
- int rsv1,rsv2;
- char name[24];
- struct map_session_data *sd;
-};
-
-struct guild_position {
- char name[24];
- int mode;
- int exp_mode;
-};
-
-struct guild_alliance {
- int opposition;
- int guild_id;
- char name[24];
-};
-
-struct guild_explusion {
- char name[24];
- char mes[40];
- char acc[40];
- int account_id;
- int rsv1,rsv2,rsv3;
-};
-
-struct guild_skill {
- int id,lv;
-};
-
-struct guild {
- int guild_id;
- short guild_lv, connect_member, max_member, average_lv;
- int exp,next_exp,skill_point,castle_id;
- char name[24],master[24];
- struct guild_member member[MAX_GUILD];
- struct guild_position position[MAX_GUILDPOSITION];
- char mes1[60],mes2[120];
- int emblem_len,emblem_id;
- char emblem_data[2048];
- struct guild_alliance alliance[MAX_GUILDALLIANCE];
- struct guild_explusion explusion[MAX_GUILDEXPLUSION];
- struct guild_skill skill[MAX_GUILDSKILL];
-};
-
-struct guild_castle {
- int castle_id;
- char map_name[24];
- char castle_name[24];
- char castle_event[24];
- int guild_id;
- int economy;
- int defense;
- int triggerE;
- int triggerD;
- int nextTime;
- int payTime;
- int createTime;
- int visibleC;
- int visibleG0;
- int visibleG1;
- int visibleG2;
- int visibleG3;
- int visibleG4;
- int visibleG5;
- int visibleG6;
- int visibleG7;
- int Ghp0; // added Guardian HP [Valaris]
- int Ghp1;
- int Ghp2;
- int Ghp3;
- int Ghp4;
- int Ghp5;
- int Ghp6;
- int Ghp7;
- int GID0;
- int GID1;
- int GID2;
- int GID3;
- int GID4;
- int GID5;
- int GID6;
- int GID7; // end addition [Valaris]
-};
-struct square {
- int val1[5];
- int val2[5];
-};
-
-enum {
- GBI_EXP =1, // ƒMƒ‹ƒh‚ÌEXP
- GBI_GUILDLV =2, // ƒMƒ‹ƒh‚ÌLv
- GBI_SKILLPOINT =3, // ƒMƒ‹ƒh‚̃XƒLƒ‹ƒ|ƒCƒ“ƒg
- GBI_SKILLLV =4, // ƒMƒ‹ƒhƒXƒLƒ‹Lv
-
- GMI_POSITION =0, // ƒƒ“ƒo[‚Ì–ðE•ÏX
- GMI_EXP =1, // ƒƒ“ƒo[‚ÌEXP
-
-};
-
-enum {
- GD_SKILLBASE=10000,
- GD_APPROVAL=10000,
- GD_KAFRACONTACT=10001,
- GD_GUARDIANRESEARCH=10002,
- GD_CHARISMA=10003,
- 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,
-};
-
-#ifndef __WIN32
- #ifndef strcmpi
- #define strcmpi strcasecmp
- #endif
- #ifndef stricmp
- #define stricmp strcasecmp
- #endif
- #ifndef strncmpi
- #define strncmpi strncasecmp
- #endif
- #ifndef strnicmp
- #define strnicmp strncasecmp
- #endif
-#else
- #define snprintf _snprintf
- #define vsnprintf _vsnprintf
- #ifndef strncmpi
- #define strncmpi strnicmp
- #endif
-#endif
-
-#endif // _MMO_H_
diff --git a/src/common/nullpo.c b/src/common/nullpo.c
deleted file mode 100644
index 5fbf5fc1d..000000000
--- a/src/common/nullpo.c
+++ /dev/null
@@ -1,90 +0,0 @@
-#include <stdio.h>
-#include <stdarg.h>
-#include <string.h>
-#include "nullpo.h"
-// #include "logs.h" // •z΂µ‚Ä‚Ý‚é
-
-static void nullpo_info_core(const char *file, int line, const char *func,
- const char *fmt, va_list ap);
-
-/*======================================
- * Nullƒ`ƒFƒbƒN ‹y‚Ñ î•ño—Í
- *--------------------------------------
- */
-int nullpo_chk_f(const char *file, int line, const char *func, const void *target,
- const char *fmt, ...)
-{
- va_list ap;
-
- if (target != NULL)
- return 0;
-
- va_start(ap, fmt);
- nullpo_info_core(file, line, func, fmt, ap);
- va_end(ap);
- return 1;
-}
-
-int nullpo_chk(const char *file, int line, const char *func, const void *target)
-{
- if (target != NULL)
- return 0;
-
- nullpo_info_core(file, line, func, NULL, NULL);
- return 1;
-}
-
-
-/*======================================
- * nullpoî•ño—Í(ŠO•”ŒÄo‚µŒü‚¯ƒ‰ƒbƒp)
- *--------------------------------------
- */
-void nullpo_info_f(const char *file, int line, const char *func,
- const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- nullpo_info_core(file, line, func, fmt, ap);
- va_end(ap);
-}
-
-void nullpo_info(const char *file, int line, const char *func)
-{
- nullpo_info_core(file, line, func, NULL, NULL);
-}
-
-
-/*======================================
- * nullpoî•ño—Í(Main)
- *--------------------------------------
- */
-static void nullpo_info_core(const char *file, int line, const char *func,
- const char *fmt, va_list ap)
-{
- if (file == NULL)
- file = "??";
-
- func =
- func == NULL ? "unknown":
- func[0] == '\0' ? "unknown":
- func;
-
- printf("--- nullpo info --------------------------------------------\n");
- printf("%s:%d: in func `%s'\n", file, line, func);
- if (fmt != NULL)
- {
- if (fmt[0] != '\0')
- {
- vprintf(fmt, ap);
-
- // ÅŒã‚ɉüs‚µ‚½‚©Šm”F
- if (fmt[strlen(fmt)-1] != '\n')
- printf("\n");
- }
- }
- printf("--- end nullpo info ----------------------------------------\n");
-
- // ‚±‚±‚ç‚ÅnullpoƒƒO‚ðƒtƒ@ƒCƒ‹‚É‘‚«o‚¹‚½‚ç
- // ‚Ü‚Æ‚ß‚Ä’ño‚Å‚«‚é‚È‚ÆŽv‚Á‚Ä‚¢‚½‚èB
-}
diff --git a/src/common/nullpo.h b/src/common/nullpo.h
deleted file mode 100644
index 0b9a9f7a5..000000000
--- a/src/common/nullpo.h
+++ /dev/null
@@ -1,233 +0,0 @@
-#ifndef _NULLPO_H_
-#define _NULLPO_H_
-
-
-#define NULLPO_CHECK 1
- // ‘S‘̂̃XƒCƒbƒ`‚ð錾‚µ‚Ä‚¢‚éƒwƒbƒ_‚ª‚ ‚ê‚Î
- // ‚»‚±‚Ɉړ®‚µ‚Ä‚¢‚½‚¾‚¯‚é‚Æ
-
-
-#if __STDC_VERSION__ < 199901L
-# if __GNUC__ >= 2
-# define __func__ __FUNCTION__
-# else
-# define __func__ ""
-# endif
-#endif
-
-#ifdef _WIN32
-#define __attribute__(x) /* nothing */
-#endif
-
-
-#define NLP_MARK __FILE__, __LINE__, __func__
-
-/*----------------------------------------------------------------------------
- * Macros
- *----------------------------------------------------------------------------
- */
-/*======================================
- * Nullƒ`ƒFƒbƒN ‹y‚Ñ î•ño—ÍŒã return
- *E“WŠJ‚·‚é‚Æif‚Æ‚©return“™‚ªo‚é‚Ì‚Å
- * ˆês’P‘Ì‚ÅŽg‚Á‚Ä‚­‚¾‚³‚¢B
- *Enullpo_ret(x = func());
- * ‚̂悤‚ÈŽg—p–@‚à‘z’肵‚Ä‚¢‚Ü‚·B
- *--------------------------------------
- * nullpo_ret(t)
- * –ß‚è’l 0ŒÅ’è
- * [ˆø”]
- * t ƒ`ƒFƒbƒN‘ÎÛ
- *--------------------------------------
- * nullpo_retv(t)
- * –ß‚è’l ‚È‚µ
- * [ˆø”]
- * t ƒ`ƒFƒbƒN‘ÎÛ
- *--------------------------------------
- * nullpo_retr(ret, t)
- * –ß‚è’l Žw’è
- * [ˆø”]
- * ret return(ret);
- * t ƒ`ƒFƒbƒN‘ÎÛ
- *--------------------------------------
- * nullpo_ret_f(t, fmt, ...)
- * Ú×î•ño—Í—p
- * –ß‚è’l 0
- * [ˆø”]
- * t ƒ`ƒFƒbƒN‘ÎÛ
- * fmt ... vprintf‚É“n‚³‚ê‚é
- * ”õl‚âŠÖŒW•Ï”‚Ì‘‚«o‚µ‚È‚Ç‚É
- *--------------------------------------
- * nullpo_retv_f(t, fmt, ...)
- * Ú×î•ño—Í—p
- * –ß‚è’l ‚È‚µ
- * [ˆø”]
- * t ƒ`ƒFƒbƒN‘ÎÛ
- * fmt ... vprintf‚É“n‚³‚ê‚é
- * ”õl‚âŠÖŒW•Ï”‚Ì‘‚«o‚µ‚È‚Ç‚É
- *--------------------------------------
- * nullpo_retr_f(ret, t, fmt, ...)
- * Ú×î•ño—Í—p
- * –ß‚è’l Žw’è
- * [ˆø”]
- * ret return(ret);
- * t ƒ`ƒFƒbƒN‘ÎÛ
- * fmt ... vprintf‚É“n‚³‚ê‚é
- * ”õl‚âŠÖŒW•Ï”‚Ì‘‚«o‚µ‚È‚Ç‚É
- *--------------------------------------
- */
-
-#if NULLPO_CHECK
-
-#define nullpo_ret(t) \
- if (nullpo_chk(NLP_MARK, (void *)(t))) {return(0);}
-
-#define nullpo_retv(t) \
- if (nullpo_chk(NLP_MARK, (void *)(t))) {return;}
-
-#define nullpo_retr(ret, t) \
- if (nullpo_chk(NLP_MARK, (void *)(t))) {return(ret);}
-
-#define nullpo_retb(t) \
- if (nullpo_chk(NLP_MARK, (void *)(t))) {break;}
-
-// ‰Â•Ïˆø”ƒ}ƒNƒ‚ÉŠÖ‚·‚éðŒƒRƒ“ƒpƒCƒ‹
-#if __STDC_VERSION__ >= 199901L
-/* C99‚ɑΉž */
-#define nullpo_ret_f(t, fmt, ...) \
- if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return(0);}
-
-#define nullpo_retv_f(t, fmt, ...) \
- if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return;}
-
-#define nullpo_retr_f(ret, t, fmt, ...) \
- if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return(ret);}
-
-#define nullpo_retb_f(t, fmt, ...) \
- if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {break;}
-
-#elif __GNUC__ >= 2
-/* GCC—p */
-#define nullpo_ret_f(t, fmt, args...) \
- if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return(0);}
-
-#define nullpo_retv_f(t, fmt, args...) \
- if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return;}
-
-#define nullpo_retr_f(ret, t, fmt, args...) \
- if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return(ret);}
-
-#define nullpo_retb_f(t, fmt, args...) \
- if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {break;}
-
-#else
-
-/* ‚»‚Ì‘¼‚Ìê‡EEE orz */
-
-#endif
-
-#else /* NULLPO_CHECK */
-/* No Nullpo check */
-
-// if((t)){;}
-// —Ç‚¢•û–@‚ªŽv‚¢‚‚©‚È‚©‚Á‚½‚Ì‚ÅEEE‹ê“÷‚Ìô‚Å‚·B
-// ˆê‰žƒ[ƒjƒ“ƒO‚Ío‚È‚¢‚Í‚¸
-
-#define nullpo_ret(t) if((t)){;}
-#define nullpo_retv(t) if((t)){;}
-#define nullpo_retr(ret, t) if((t)){;}
-#define nullpo_retb(t) if((t)){;}
-
-// ‰Â•Ïˆø”ƒ}ƒNƒ‚ÉŠÖ‚·‚éðŒƒRƒ“ƒpƒCƒ‹
-#if __STDC_VERSION__ >= 199901L
-/* C99‚ɑΉž */
-#define nullpo_ret_f(t, fmt, ...) if((t)){;}
-#define nullpo_retv_f(t, fmt, ...) if((t)){;}
-#define nullpo_retr_f(ret, t, fmt, ...) if((t)){;}
-#define nullpo_retb_f(t, fmt, ...) if((t)){;}
-
-#elif __GNUC__ >= 2
-/* GCC—p */
-#define nullpo_ret_f(t, fmt, args...) if((t)){;}
-#define nullpo_retv_f(t, fmt, args...) if((t)){;}
-#define nullpo_retr_f(ret, t, fmt, args...) if((t)){;}
-#define nullpo_retb_f(t, fmt, args...) if((t)){;}
-
-#else
-/* ‚»‚Ì‘¼‚Ìê‡EEE orz */
-#endif
-
-#endif /* NULLPO_CHECK */
-
-/*----------------------------------------------------------------------------
- * Functions
- *----------------------------------------------------------------------------
- */
-/*======================================
- * nullpo_chk
- * Nullƒ`ƒFƒbƒN ‹y‚Ñ î•ño—Í
- * [ˆø”]
- * file __FILE__
- * line __LINE__
- * func __func__ (ŠÖ”–¼)
- * ‚±‚ê‚ç‚É‚Í NLP_MARK ‚ðŽg‚¤‚Æ‚æ‚¢
- * target ƒ`ƒFƒbƒN‘ÎÛ
- * [•Ô‚è’l]
- * 0 OK
- * 1 NULL
- *--------------------------------------
- */
-int nullpo_chk(const char *file, int line, const char *func, const void *target);
-
-
-/*======================================
- * nullpo_chk_f
- * Nullƒ`ƒFƒbƒN ‹y‚Ñ ÚׂÈî•ño—Í
- * [ˆø”]
- * file __FILE__
- * line __LINE__
- * func __func__ (ŠÖ”–¼)
- * ‚±‚ê‚ç‚É‚Í NLP_MARK ‚ðŽg‚¤‚Æ‚æ‚¢
- * target ƒ`ƒFƒbƒN‘ÎÛ
- * fmt ... vprintf‚É“n‚³‚ê‚é
- * ”õl‚âŠÖŒW•Ï”‚Ì‘‚«o‚µ‚È‚Ç‚É
- * [•Ô‚è’l]
- * 0 OK
- * 1 NULL
- *--------------------------------------
- */
-int nullpo_chk_f(const char *file, int line, const char *func, const void *target,
- const char *fmt, ...)
- __attribute__((format(printf,5,6)));
-
-
-/*======================================
- * nullpo_info
- * nullpoî•ño—Í
- * [ˆø”]
- * file __FILE__
- * line __LINE__
- * func __func__ (ŠÖ”–¼)
- * ‚±‚ê‚ç‚É‚Í NLP_MARK ‚ðŽg‚¤‚Æ‚æ‚¢
- *--------------------------------------
- */
-void nullpo_info(const char *file, int line, const char *func);
-
-
-/*======================================
- * nullpo_info_f
- * nullpoÚ×î•ño—Í
- * [ˆø”]
- * file __FILE__
- * line __LINE__
- * func __func__ (ŠÖ”–¼)
- * ‚±‚ê‚ç‚É‚Í NLP_MARK ‚ðŽg‚¤‚Æ‚æ‚¢
- * fmt ... vprintf‚É“n‚³‚ê‚é
- * ”õl‚âŠÖŒW•Ï”‚Ì‘‚«o‚µ‚È‚Ç‚É
- *--------------------------------------
- */
-void nullpo_info_f(const char *file, int line, const char *func,
- const char *fmt, ...)
- __attribute__((format(printf,4,5)));
-
-
-#endif
diff --git a/src/common/showmsg.c b/src/common/showmsg.c
deleted file mode 100644
index 24d51d2dc..000000000
--- a/src/common/showmsg.c
+++ /dev/null
@@ -1,140 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <stdarg.h>
-#include "showmsg.h"
-
-char tmp_output[1024] = {"\0"};
-
-// by MC Cameri
-int _vShowMessage(enum msg_type flag, const char *string, va_list ap)
-{
- // _ShowMessage MUST be used instead of printf as of 10/24/2004.
- // Return: 0 = Successful, 1 = Failed.
-// int ret = 0;
- char prefix[40];
-
- if (!string || strlen(string) <= 0) {
- printf("Empty string passed to _ShowMessage().\n");
- return 1;
- }
- switch (flag) {
- case MSG_NONE: // direct printf replacement
- break;
- case MSG_STATUS: //Bright Green (To inform about good things)
- strcpy(prefix,CL_GREEN"[Status]"CL_RESET":");
- break;
- case MSG_SQL: //Bright Violet (For dumping out anything related with SQL)
- strcpy(prefix,CL_MAGENTA"[SQL]"CL_RESET":");
- break;
- case MSG_INFORMATION: //Bright White (Variable information)
- strcpy(prefix,CL_WHITE"[Info]"CL_RESET":");
- break;
- case MSG_NOTICE: //Bright White (Less than a warning)
- strcpy(prefix,CL_WHITE"[Notice]"CL_RESET":");
- break;
- case MSG_WARNING: //Bright Yellow
- strcpy(prefix,CL_YELLOW"[Warning]"CL_RESET":");
- break;
- case MSG_DEBUG: //Bright Cyan, important stuff!
- strcpy(prefix,CL_CYAN"[Debug]"CL_RESET":");
- break;
- case MSG_ERROR: //Bright Red (Regular errors)
- strcpy(prefix,CL_RED"[Error]"CL_RESET":");
- break;
- case MSG_FATALERROR: //Bright Red (Fatal errors, abort(); if possible)
- strcpy(prefix,CL_RED"[Fatal Error]"CL_RESET":");
- break;
- default:
- printf("In function _ShowMessage() -> Invalid flag passed.\n");
- return 1;
- }
-
- if (!(flag == MSG_DEBUG && !SHOW_DEBUG_MSG)) {
- if (flag != MSG_NONE)
- printf ("%s ", prefix);
- vprintf (string, ap);
- fflush (stdout);
- }
-
- va_end(ap);
-/*
- if ((core_config.debug_output_level > -1) && (flag >= core_config.debug_output_level)) {
- FILE *fp;
- fp=fopen(OUTPUT_MESSAGES_LOG,"a");
- if (fp == NULL) {
- printf(CL_RED"[Error]"CL_RESET": Could not open '"CL_WHITE"%s"CL_RESET"', file not found.\n",OUTPUT_MESSAGES_LOG);
- fflush(stdout);
- return;
- }
- StripColor(output);
- strcpy(output,"\r");
- fwrite(output,strlen(output),1,fp);
- fclose(fp);
- }
-*/
- return 0;
-}
-
-int _ShowMessage(enum msg_type flag, const char *string, ...)
-{
- va_list ap;
-
- va_start(ap, string);
- return _vShowMessage(flag, string, ap);
-}
-
-// direct printf replacement
-int ShowMessage(const char *string, ...) {
- va_list ap;
-
- va_start(ap, string);
- return _vShowMessage(MSG_NONE, string, ap);
-}
-int ShowStatus(const char *string, ...) {
- va_list ap;
-
- va_start(ap, string);
- return _vShowMessage(MSG_STATUS, string, ap);
-}
-int ShowSQL(const char *string, ...) {
- va_list ap;
-
- va_start(ap, string);
- return _vShowMessage(MSG_SQL, string, ap);
-}
-int ShowInfo(const char *string, ...) {
- va_list ap;
-
- va_start(ap, string);
- return _vShowMessage(MSG_INFORMATION, string, ap);
-}
-int ShowNotice(const char *string, ...) {
- va_list ap;
-
- va_start(ap, string);
- return _vShowMessage(MSG_NOTICE, string, ap);
-}
-int ShowWarning(const char *string, ...) {
- va_list ap;
-
- va_start(ap, string);
- return _vShowMessage(MSG_WARNING, string, ap);
-}
-int ShowDebug(const char *string, ...) {
- va_list ap;
-
- va_start(ap, string);
- return _vShowMessage(MSG_DEBUG, string, ap);
-}
-int ShowError(const char *string, ...) {
- va_list ap;
-
- va_start(ap, string);
- return _vShowMessage(MSG_ERROR, string, ap);
-}
-int ShowFatalError(const char *string, ...) {
- va_list ap;
-
- va_start(ap, string);
- return _vShowMessage(MSG_FATALERROR, string, ap);
-}
diff --git a/src/common/showmsg.h b/src/common/showmsg.h
deleted file mode 100644
index b5f4d4bfd..000000000
--- a/src/common/showmsg.h
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef _SHOWMSG_H_
-#define _SHOWMSG_H_
-
-//davidsiaw, 'lookee' here!
-#define SHOW_DEBUG_MSG 1
-
-#ifdef _WIN32
-#define CL_RESET ""
-#define CL_NORMAL CL_RESET
-#define CL_NONE CL_RESET
-#define CL_WHITE ""
-#define CL_GRAY ""
-#define CL_RED ""
-#define CL_GREEN ""
-#define CL_YELLOW ""
-#define CL_BLUE ""
-#define CL_MAGENTA ""
-#define CL_CYAN ""
-#else
-#define CL_RESET "\033[0;0m"
-#define CL_NORMAL CL_RESET
-#define CL_NONE CL_RESET
-#define CL_WHITE "\033[1;29m"
-#define CL_GRAY "\033[1;30m"
-#define CL_RED "\033[1;31m"
-#define CL_GREEN "\033[1;32m"
-#define CL_YELLOW "\033[1;33m"
-#define CL_BLUE "\033[1;34m"
-#define CL_MAGENTA "\033[1;35m"
-#define CL_CYAN "\033[1;36m"
-#endif
-
-extern char tmp_output[1024];
-
-enum msg_type {
- MSG_NONE,
- MSG_STATUS,
- MSG_SQL,
- MSG_INFORMATION,
- MSG_NOTICE,
- MSG_WARNING,
- MSG_DEBUG,
- MSG_ERROR,
- MSG_FATALERROR
-};
-
-extern int ShowMessage(const char *, ...);
-extern int ShowStatus(const char *, ...);
-extern int ShowSQL(const char *, ...);
-extern int ShowInfo(const char *, ...);
-extern int ShowNotice(const char *, ...);
-extern int ShowWarning(const char *, ...);
-extern int ShowDebug(const char *, ...);
-extern int ShowError(const char *, ...);
-extern int ShowFatalError(const char *, ...);
-
-#endif
diff --git a/src/common/socket.c b/src/common/socket.c
deleted file mode 100644
index 64f660a11..000000000
--- a/src/common/socket.c
+++ /dev/null
@@ -1,1069 +0,0 @@
-// original : core.c 2003/02/26 18:03:12 Rev 1.7
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <errno.h>
-
-#ifdef _WIN32
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <winsock2.h>
-#include <io.h>
-typedef int socklen_t;
-#else
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <netinet/tcp.h>
-#include <net/if.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <sys/ioctl.h>
-
-#ifndef SIOCGIFCONF
-#include <sys/sockio.h> // SIOCGIFCONF on Solaris, maybe others? [Shinomori]
-#endif
-
-#endif
-
-#include <fcntl.h>
-#include <string.h>
-
-#include "socket.h"
-#include "../common/dll.h"
-#include "../common/mmo.h" // [Valaris] thanks to fov
-#include "../common/timer.h"
-#include "../common/utils.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-fd_set readfds;
-int fd_max;
-time_t tick_;
-time_t stall_time_ = 60;
-int ip_rules = 1;
-
-// #define UPNP
-
-#ifdef UPNP
-#if defined(CYGWIN) || defined(_WIN32)
-DLL upnp_dll;
-int (*upnp_init)();
-int (*upnp_final)();
-int (*firewall_addport)(char *desc, int port);
-int (*upnp_addport)(char *desc, char *ip, int port);
-extern char *argp;
-
-int release_mappings = 1;
-int close_ports = 1;
-#else
-#error This doesnt work with non-Windows yet
-#endif
-#endif
-
-int rfifo_size = 65536;
-int wfifo_size = 65536;
-
-#ifndef TCP_FRAME_LEN
-#define TCP_FRAME_LEN 1053
-#endif
-
-#define CONVIP(ip) ip&0xFF,(ip>>8)&0xFF,(ip>>16)&0xFF,ip>>24
-
-struct socket_data *session[FD_SETSIZE];
-
-static int null_parse(int fd);
-static int (*default_func_parse)(int) = null_parse;
-
-static int null_console_parse(char *buf);
-static int (*default_console_parse)(char*) = null_console_parse;
-static int connect_check(unsigned int ip);
-
-/*======================================
- * CORE : Set function
- *--------------------------------------
- */
-void set_defaultparse(int (*defaultparse)(int))
-{
- default_func_parse = defaultparse;
-}
-
-void set_nonblocking(int fd, int yes) {
- setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,(char *)&yes,sizeof yes);
-}
-
-static void setsocketopts(int fd)
-{
- int yes = 1; // reuse fix
-
- setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof yes);
-#ifdef SO_REUSEPORT
- setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,(char *)&yes,sizeof yes);
-#endif
- set_nonblocking(fd, yes);
-
- setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char *) &wfifo_size , sizeof(rfifo_size ));
- setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char *) &rfifo_size , sizeof(rfifo_size ));
-}
-
-/*======================================
- * CORE : Socket Sub Function
- *--------------------------------------
- */
-
-static int recv_to_fifo(int fd)
-{
- int len;
-
- //printf("recv_to_fifo : %d %d\n",fd,session[fd]->eof);
- if(session[fd]->eof)
- return -1;
-
-
-#ifdef _WIN32
- len=recv(fd,session[fd]->rdata+session[fd]->rdata_size, RFIFOSPACE(fd), 0);
-#else
- len=read(fd,session[fd]->rdata+session[fd]->rdata_size,RFIFOSPACE(fd));
-#endif
-
-// printf (":::RECEIVE:::\n");
-// dump(session[fd]->rdata, len); printf ("\n");
-
- //{ int i; printf("recv %d : ",fd); for(i=0;i<len;i++){ printf("%02x ",RFIFOB(fd,session[fd]->rdata_size+i)); } printf("\n");}
- if(len>0){
- session[fd]->rdata_size+=len;
- session[fd]->rdata_tick = tick_;
- } else if(len<=0){
- // value of connection is not necessary the same
-// printf("set eof : connection #%d\n", fd);
- session[fd]->eof=1;
- }
- return 0;
-}
-
-static int send_from_fifo(int fd)
-{
- int len;
-
- //printf("send_from_fifo : %d\n",fd);
- if(session[fd]->eof || session[fd]->wdata == 0)
- return -1;
- if (session[fd]->wdata_size == 0)
- return 0;
-
-#ifdef _WIN32
- len=send(fd, session[fd]->wdata,session[fd]->wdata_size, 0);
-#else
- len=write(fd,session[fd]->wdata,session[fd]->wdata_size);
-#endif
-
-// printf (":::SEND:::\n");
-// dump(session[fd]->wdata, len); printf ("\n");
-
- //{ int i; printf("send %d : ",fd); for(i=0;i<len;i++){ printf("%02x ",session[fd]->wdata[i]); } printf("\n");}
- if(len>0){
- if(len<session[fd]->wdata_size){
- memmove(session[fd]->wdata,session[fd]->wdata+len,session[fd]->wdata_size-len);
- session[fd]->wdata_size-=len;
- } else {
- session[fd]->wdata_size=0;
- }
- } else if (errno != EAGAIN) {
-// printf("set eof :%d\n",fd);
- session[fd]->eof=1;
- }
- return 0;
-}
-
-void flush_fifos()
-{
- int i;
- for(i=0;i<fd_max;i++)
- if(session[i] != NULL &&
- session[i]->func_send == send_from_fifo)
- send_from_fifo(i);
-}
-
-static int null_parse(int fd)
-{
- printf("null_parse : %d\n",fd);
- RFIFOSKIP(fd,RFIFOREST(fd));
- return 0;
-}
-
-/*======================================
- * CORE : Socket Function
- *--------------------------------------
- */
-
-static int connect_client(int listen_fd)
-{
- int fd;
- struct sockaddr_in client_address;
- int len;
-#ifndef _WIN32
- int result;
-#endif
-
- //printf("connect_client : %d\n",listen_fd);
-
- len=sizeof(client_address);
-
- fd = accept(listen_fd,(struct sockaddr*)&client_address,(socklen_t*)&len);
- if(fd_max<=fd) fd_max=fd+1;
-
- setsocketopts(fd);
-
- if(fd==-1) {
- perror("accept");
- return -1;
- } else if (ip_rules && !connect_check(*(unsigned int*)(&client_address.sin_addr))) {
- close(fd);
- return -1;
- } else
- FD_SET(fd,&readfds);
-
-#ifdef _WIN32
- {
- unsigned long val = 1;
- ioctlsocket(fd, FIONBIO, &val);
- }
-#else
- result = fcntl(fd, F_SETFL, O_NONBLOCK);
-#endif
-
- CREATE(session[fd], struct socket_data, 1);
- CREATE_A(session[fd]->rdata, unsigned char, rfifo_size);
- CREATE_A(session[fd]->wdata, unsigned char, wfifo_size);
-
- session[fd]->max_rdata = rfifo_size;
- session[fd]->max_wdata = wfifo_size;
- session[fd]->func_recv = recv_to_fifo;
- session[fd]->func_send = send_from_fifo;
- session[fd]->func_parse = default_func_parse;
- session[fd]->client_addr = client_address;
- session[fd]->rdata_tick = tick_;
-
- //printf("new_session : %d %d\n",fd,session[fd]->eof);
- return fd;
-}
-
-int make_listen_port(int port)
-{
- struct sockaddr_in server_address;
- int fd;
- int result;
-
- fd = socket( AF_INET, SOCK_STREAM, 0 );
- if(fd_max<=fd) fd_max=fd+1;
-
-#ifdef _WIN32
- {
- unsigned long val = 1;
- ioctlsocket(fd, FIONBIO, &val);
- }
-#else
- result = fcntl(fd, F_SETFL, O_NONBLOCK);
-#endif
-
- setsocketopts(fd);
-
- server_address.sin_family = AF_INET;
- server_address.sin_addr.s_addr = htonl( INADDR_ANY );
- server_address.sin_port = htons((unsigned short)port);
-
- result = bind(fd, (struct sockaddr*)&server_address, sizeof(server_address));
- if( result == -1 ) {
- perror("bind");
- exit(1);
- }
- result = listen( fd, 5 );
- if( result == -1 ) { /* error */
- perror("listen");
- exit(1);
- }
-
- FD_SET(fd, &readfds );
-
- CREATE(session[fd], struct socket_data, 1);
-
- if(session[fd]==NULL){
- printf("out of memory : make_listen_port\n");
- exit(1);
- }
- memset(session[fd],0,sizeof(*session[fd]));
- session[fd]->func_recv = connect_client;
-
- return fd;
-}
-
-int make_listen_bind(long ip,int port)
-{
- struct sockaddr_in server_address;
- int fd;
- int result;
-
- fd = socket( AF_INET, SOCK_STREAM, 0 );
- if(fd_max<=fd) fd_max=fd+1;
-
-#ifdef _WIN32
- {
- unsigned long val = 1;
- ioctlsocket(fd, FIONBIO, &val);
- }
-#else
- result = fcntl(fd, F_SETFL, O_NONBLOCK);
-#endif
-
- setsocketopts(fd);
-
- server_address.sin_family = AF_INET;
- server_address.sin_addr.s_addr = ip;
- server_address.sin_port = htons((unsigned short)port);
-
-#ifdef UPNP
- if (upnp_dll) {
- int localaddr = ntohl(addr_[0]);
- unsigned char *natip = (unsigned char *)&localaddr;
- char buf[16];
- sprintf(buf, "%d.%d.%d.%d", natip[0], natip[1], natip[2], natip[3]);
- //printf("natip=%d.%d.%d.%d\n", natip[0], natip[1], natip[2], natip[3]);
- if (firewall_addport(argp, port))
- printf ("Firewall port %d successfully opened\n", port);
- if (natip[0] == 192 && natip[1] == 168) {
- if (upnp_addport(argp, natip, port))
- printf ("Upnp mappings successfull\n");
- else printf ("Upnp mapping failed\n");
- }
- }
-#endif
-
- result = bind(fd, (struct sockaddr*)&server_address, sizeof(server_address));
- if( result == -1 ) {
- perror("bind");
- exit(1);
- }
- result = listen( fd, 5 );
- if( result == -1 ) { /* error */
- perror("listen");
- exit(1);
- }
-
- FD_SET(fd, &readfds );
-
- CREATE(session[fd], struct socket_data, 1);
-
- if(session[fd]==NULL){
- printf("out of memory : make_listen_bind\n");
- exit(1);
- }
- memset(session[fd],0,sizeof(*session[fd]));
- session[fd]->func_recv = connect_client;
-
- return fd;
-}
-
-// Console Reciever [Wizputer]
-int console_recieve(int i) {
- int n;
- char *buf;
-
- CREATE_A(buf, char , 64);
-
- memset(buf,0,sizeof(64));
-
- n = read(0, buf , 64);
-
- if ( n < 0 )
- printf("Console input read error\n");
- else
- session[0]->func_console(buf);
- return 0;
-}
-
-void set_defaultconsoleparse(int (*defaultparse)(char*))
-{
- default_console_parse = defaultparse;
-}
-
-static int null_console_parse(char *buf)
-{
- printf("null_console_parse : %s\n",buf);
- return 0;
-}
-
-// Console Input [Wizputer]
-int start_console(void) {
- FD_SET(0,&readfds);
-
- CREATE(session[0], struct socket_data, 1);
- if(session[0]==NULL){
- printf("out of memory : start_console\n");
- exit(1);
- }
-
- memset(session[0],0,sizeof(*session[0]));
-
- session[0]->func_recv = console_recieve;
- session[0]->func_console = default_console_parse;
-
- return 0;
-}
-
-int make_connection(long ip,int port)
-{
- struct sockaddr_in server_address;
- int fd;
- int result;
-
- fd = socket( AF_INET, SOCK_STREAM, 0 );
- if(fd_max<=fd)
- fd_max=fd+1;
-
- setsocketopts(fd);
-
- server_address.sin_family = AF_INET;
- server_address.sin_addr.s_addr = ip;
- server_address.sin_port = htons((unsigned short)port);
-
-#ifdef _WIN32
- {
- unsigned long val = 1;
- ioctlsocket(fd, FIONBIO, &val);
- }
-#else
- result = fcntl(fd, F_SETFL, O_NONBLOCK);
-#endif
-
- result = connect(fd, (struct sockaddr *)(&server_address),sizeof(struct sockaddr_in));
-
- FD_SET(fd,&readfds);
-
- CREATE(session[fd], struct socket_data, 1);
- CREATE_A(session[fd]->rdata, unsigned char, rfifo_size);
- CREATE_A(session[fd]->wdata, unsigned char, wfifo_size);
-
- session[fd]->max_rdata = rfifo_size;
- session[fd]->max_wdata = wfifo_size;
- session[fd]->func_recv = recv_to_fifo;
- session[fd]->func_send = send_from_fifo;
- session[fd]->func_parse = default_func_parse;
- session[fd]->rdata_tick = tick_;
-
- return fd;
-}
-
-int delete_session(int fd)
-{
- if(fd<=0 || fd>=FD_SETSIZE)
- return -1;
- FD_CLR(fd,&readfds);
- if(session[fd]){
- if(session[fd]->rdata)
- aFree(session[fd]->rdata);
- if(session[fd]->wdata)
- aFree(session[fd]->wdata);
- if(session[fd]->session_data)
- aFree(session[fd]->session_data);
- aFree(session[fd]);
- }
- session[fd]=NULL;
- //printf("delete_session:%d\n",fd);
- return 0;
-}
-
-int realloc_fifo(int fd,int rfifo_size,int wfifo_size)
-{
- struct socket_data *s;
-
- if (fd <= 0) return 0;
- s = session[fd];
- if( s->max_rdata != rfifo_size && s->rdata_size < rfifo_size){
- RECREATE(s->rdata, unsigned char, rfifo_size);
- s->max_rdata = rfifo_size;
- }
- if( s->max_wdata != wfifo_size && s->wdata_size < wfifo_size){
- RECREATE(s->wdata, unsigned char, wfifo_size);
- s->max_wdata = wfifo_size;
- }
- return 0;
-}
-
-int WFIFOSET(int fd,int len)
-{
- struct socket_data *s;
-
- if (fd <= 0) return 0;
- s = session[fd];
- if (s == NULL || s->wdata == NULL)
- return 0;
- if( s->wdata_size+len+16384 > s->max_wdata ){
- unsigned char *sin_addr = (unsigned char *)&s->client_addr.sin_addr;
- realloc_fifo(fd,s->max_rdata, s->max_wdata <<1 );
- printf("socket: %d (%d.%d.%d.%d) wdata expanded to %d bytes.\n",fd, sin_addr[0], sin_addr[1], sin_addr[2], sin_addr[3], s->max_wdata);
- }
- s->wdata_size=(s->wdata_size+(len)+2048 < s->max_wdata) ?
- s->wdata_size+len : (printf("socket: %d wdata lost !!\n",fd),s->wdata_size);
- if (s->wdata_size > (TCP_FRAME_LEN))
- send_from_fifo(fd);
- return 0;
-}
-
-int do_sendrecv(int next)
-{
- fd_set rfd,wfd;
- struct timeval timeout;
- int ret,i;
-
- tick_ = time(0);
-
- memcpy(&rfd, &readfds, sizeof(rfd));
-
- FD_ZERO(&wfd);
- for(i=0;i<fd_max;i++){
- if(!session[i] && FD_ISSET(i,&readfds)){
- printf("force clr fds %d\n",i);
- FD_CLR(i,&readfds);
- continue;
- }
- if(!session[i])
- continue;
- if(session[i]->wdata_size)
- FD_SET(i,&wfd);
- }
- timeout.tv_sec = next/1000;
- timeout.tv_usec = next%1000*1000;
- ret = select(fd_max,&rfd,&wfd,NULL,&timeout);
- if(ret<=0)
- return 0;
- for(i=0;i<fd_max;i++){
- if(!session[i])
- continue;
- if(FD_ISSET(i,&wfd)){
- //printf("write:%d\n",i);
- if(session[i]->func_send)
- session[i]->func_send(i);
- }
- if(FD_ISSET(i,&rfd)){
- //printf("read:%d\n",i);
- if(session[i]->func_recv)
- session[i]->func_recv(i);
- }
- }
- return 0;
-}
-
-int do_parsepacket(void)
-{
- int i;
- for(i=0;i<fd_max;i++){
- if(!session[i])
- continue;
- if ((session[i]->rdata_tick != 0) && ((tick_ - session[i]->rdata_tick) > stall_time_))
- session[i]->eof = 1;
- if(session[i]->rdata_size==0 && session[i]->eof==0)
- continue;
- if(session[i]->func_parse){
- session[i]->func_parse(i);
- if(!session[i])
- continue;
- }
- RFIFOFLUSH(i);
- }
- return 0;
-}
-
-/* DDoS UŒ‚‘Îô */
-
-enum {
- ACO_DENY_ALLOW=0,
- ACO_ALLOW_DENY,
- ACO_MUTUAL_FAILTURE,
-};
-
-struct _access_control {
- unsigned int ip;
- unsigned int mask;
-};
-
-static struct _access_control *access_allow;
-static struct _access_control *access_deny;
-static int access_order=ACO_DENY_ALLOW;
-static int access_allownum=0;
-static int access_denynum=0;
-static int access_debug=0;
-static int ddos_count = 10;
-static int ddos_interval = 3000;
-static int ddos_autoreset = 600*1000;
-
-struct _connect_history {
- struct _connect_history *next;
- struct _connect_history *prev;
- int status;
- int count;
- unsigned int ip;
- unsigned int tick;
-};
-static struct _connect_history *connect_history[0x10000];
-static int connect_check_(unsigned int ip);
-
-// Ú‘±‚Å‚«‚é‚©‚Ç‚¤‚©‚ÌŠm”F
-// false : Ú‘±OK
-// true : Ú‘±NG
-static int connect_check(unsigned int ip) {
- int result = connect_check_(ip);
- if(access_debug) {
- printf("connect_check: Connection from %d.%d.%d.%d %s\n",
- CONVIP(ip),result ? "allowed." : "denied!");
- }
- return result;
-}
-
-static int connect_check_(unsigned int ip) {
- struct _connect_history *hist = connect_history[ip & 0xFFFF];
- struct _connect_history *hist_new;
- int i,is_allowip = 0,is_denyip = 0,connect_ok = 0;
-
- // allow , deny ƒŠƒXƒg‚É“ü‚Á‚Ä‚¢‚é‚©Šm”F
- for(i = 0;i < access_allownum; i++) {
- if((ip & access_allow[i].mask) == (access_allow[i].ip & access_allow[i].mask)) {
- if(access_debug) {
- printf("connect_check: Found match from allow list:%d.%d.%d.%d IP:%d.%d.%d.%d Mask:%d.%d.%d.%d\n",
- CONVIP(ip),
- CONVIP(access_allow[i].ip),
- CONVIP(access_allow[i].mask));
- }
- is_allowip = 1;
- break;
- }
- }
- for(i = 0;i < access_denynum; i++) {
- if((ip & access_deny[i].mask) == (access_deny[i].ip & access_deny[i].mask)) {
- if(access_debug) {
- printf("connect_check: Found match from deny list:%d.%d.%d.%d IP:%d.%d.%d.%d Mask:%d.%d.%d.%d\n",
- CONVIP(ip),
- CONVIP(access_deny[i].ip),
- CONVIP(access_deny[i].mask));
- }
- is_denyip = 1;
- break;
- }
- }
- // ƒRƒlƒNƒgo—ˆ‚é‚©‚Ç‚¤‚©Šm”F
- // connect_ok
- // 0 : –³ðŒ‚É‹‘”Û
- // 1 : “c‘ã–Cƒ`ƒFƒbƒN‚ÌŒ‹‰ÊŽŸ‘æ
- // 2 : –³ðŒ‚É‹–‰Â
- switch(access_order) {
- case ACO_DENY_ALLOW:
- default:
- if(is_allowip) {
- connect_ok = 2;
- } else if(is_denyip) {
- connect_ok = 0;
- } else {
- connect_ok = 1;
- }
- break;
- case ACO_ALLOW_DENY:
- if(is_denyip) {
- connect_ok = 0;
- } else if(is_allowip) {
- connect_ok = 2;
- } else {
- connect_ok = 1;
- }
- break;
- case ACO_MUTUAL_FAILTURE:
- if(is_allowip) {
- connect_ok = 2;
- } else {
- connect_ok = 0;
- }
- break;
- }
-
- // Ú‘±—š—ð‚𒲂ׂé
- while(hist) {
- if(ip == hist->ip) {
- // “¯‚¶IP”­Œ©
- if(hist->status) {
- // ban ƒtƒ‰ƒO‚ª—§‚Á‚Ä‚é
- return (connect_ok == 2 ? 1 : 0);
- } else if(DIFF_TICK(gettick(),hist->tick) < ddos_interval) {
- // ddos_interval•bˆÈ“à‚ɃŠƒNƒGƒXƒg—L‚è
- hist->tick = gettick();
- if(hist->count++ >= ddos_count) {
- // ddos UŒ‚‚ðŒŸo
- hist->status = 1;
- printf("connect_check: DDOS Attack detected from %d.%d.%d.%d!\n",
- CONVIP(ip));
- return (connect_ok == 2 ? 1 : 0);
- } else {
- return connect_ok;
- }
- } else {
- // ddos_interval•bˆÈ“à‚ɃŠƒNƒGƒXƒg–³‚¢‚̂Ń^ƒCƒ}[ƒNƒŠƒA
- hist->tick = gettick();
- hist->count = 0;
- return connect_ok;
- }
- }
- hist = hist->next;
- }
- // IPƒŠƒXƒg‚É–³‚¢‚Ì‚ÅV‹Kì¬
- hist_new = (struct _connect_history *) aCalloc(1,sizeof(struct _connect_history));
- hist_new->ip = ip;
- hist_new->tick = gettick();
- if(connect_history[ip & 0xFFFF] != NULL) {
- hist = connect_history[ip & 0xFFFF];
- hist->prev = hist_new;
- hist_new->next = hist;
- }
- connect_history[ip & 0xFFFF] = hist_new;
- return connect_ok;
-}
-
-static int connect_check_clear(int tid,unsigned int tick,int id,int data) {
- int i;
- int clear = 0;
- int list = 0;
- struct _connect_history *hist , *hist2;
- for(i = 0;i < 0x10000 ; i++) {
- hist = connect_history[i];
- while(hist) {
- if(
- (DIFF_TICK(tick,hist->tick) > ddos_interval * 3 && !hist->status) ||
- (DIFF_TICK(tick,hist->tick) > ddos_autoreset && hist->status)
- ) {
- // clear data
- hist2 = hist->next;
- if(hist->prev) {
- hist->prev->next = hist->next;
- } else {
- connect_history[i] = hist->next;
- }
- if(hist->next) {
- hist->next->prev = hist->prev;
- }
- aFree(hist);
- hist = hist2;
- clear++;
- } else {
- hist = hist->next;
- list++;
- }
- }
- }
- if(access_debug) {
- printf("connect_check_clear: Cleared %d of %d from IP list.\n", clear, clear+list);
- }
- return list;
-}
-
-// IPƒ}ƒXƒNƒ`ƒFƒbƒN
-int access_ipmask(const char *str,struct _access_control* acc)
-{
- unsigned int mask=0,i=0,m,ip, a0,a1,a2,a3;
- if( !strcmp(str,"all") ) {
- ip = 0;
- mask = 0;
- } else {
- if( sscanf(str,"%d.%d.%d.%d%n",&a0,&a1,&a2,&a3,&i)!=4 || i==0) {
- printf("access_ipmask: Unknown format %s!\n",str);
- return 0;
- }
- ip = (a3 << 24) | (a2 << 16) | (a1 << 8) | a0;
-
- if(sscanf(str+i,"/%d.%d.%d.%d",&a0,&a1,&a2,&a3)==4 ){
- mask = (a3 << 24) | (a2 << 16) | (a1 << 8) | a0;
- } else if(sscanf(str+i,"/%d",&m) == 1) {
- for(i=0;i<m;i++) {
- mask = (mask >> 1) | 0x80000000;
- }
- mask = ntohl(mask);
- } else {
- mask = 0xFFFFFFFF;
- }
- }
- if(access_debug) {
- printf("access_ipmask: Loaded IP:%d.%d.%d.%d mask:%d.%d.%d.%d\n",
- CONVIP(ip), CONVIP(mask));
- }
- acc->ip = ip;
- acc->mask = mask;
- return 1;
-}
-
-int socket_config_read(const char *cfgName) {
- int i;
- char line[1024],w1[1024],w2[1024];
- FILE *fp;
-
- fp=fopen(cfgName, "r");
- if(fp==NULL){
- printf("File not found: %s\n", cfgName);
- return 1;
- }
- while(fgets(line,1020,fp)){
- if(line[0] == '/' && line[1] == '/')
- continue;
- i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
- if(i!=2)
- continue;
- if(strcmpi(w1,"stall_time")==0){
- stall_time_ = atoi(w2);
- } else if(strcmpi(w1,"enable_ip_rules")==0){
- if(strcmpi(w2,"yes")==0)
- ip_rules = 1;
- else if(strcmpi(w2,"no")==0)
- ip_rules = 0;
- else ip_rules = atoi(w2);
- } else if(strcmpi(w1,"order")==0){
- access_order=atoi(w2);
- if(strcmpi(w2,"deny,allow")==0) access_order=ACO_DENY_ALLOW;
- if(strcmpi(w2,"allow,deny")==0) access_order=ACO_ALLOW_DENY;
- if(strcmpi(w2,"mutual-failure")==0) access_order=ACO_MUTUAL_FAILTURE;
- } else if(strcmpi(w1,"allow")==0){
- access_allow = (struct _access_control *) aRealloc(access_allow,(access_allownum+1)*sizeof(struct _access_control));
- if(access_ipmask(w2,&access_allow[access_allownum])) {
- access_allownum++;
- }
- } else if(strcmpi(w1,"deny")==0){
- access_deny = (struct _access_control *) aRealloc(access_deny,(access_denynum+1)*sizeof(struct _access_control));
- if(access_ipmask(w2,&access_deny[access_denynum])) {
- access_denynum++;
- }
- } else if(!strcmpi(w1,"ddos_interval")){
- ddos_interval = atoi(w2);
- } else if(!strcmpi(w1,"ddos_count")){
- ddos_count = atoi(w2);
- } else if(!strcmpi(w1,"ddos_autoreset")){
- ddos_autoreset = atoi(w2);
- } else if(!strcmpi(w1,"debug")){
- if(strcmpi(w2,"yes")==0)
- access_debug = 1;
- else if(strcmpi(w2,"no")==0)
- access_debug = 0;
- else access_debug = atoi(w2);
- #ifdef UPNP
- } else if(!strcmpi(w1,"release_mappings")){
- if(strcmpi(w2,"yes")==0)
- release_mappings = 1;
- else if(strcmpi(w2,"no")==0)
- release_mappings = 0;
- else release_mappings = atoi(w2);
- } else if(!strcmpi(w1,"close_ports")){
- if(strcmpi(w2,"yes")==0)
- close_ports = 1;
- else if(strcmpi(w2,"no")==0)
- close_ports = 0;
- else close_ports = atoi(w2);
- #endif
- } else if (strcmpi(w1, "import") == 0)
- socket_config_read(w2);
- }
- fclose(fp);
- return 0;
-}
-
-int RFIFOSKIP(int fd,int len)
-{
- struct socket_data *s;
-
- if (fd <= 0) return 0;
- s = session[fd];
-
- if (s->rdata_size-s->rdata_pos-len<0) {
- fprintf(stderr,"too many skip\n");
- exit(1);
- }
-
- s->rdata_pos = s->rdata_pos+len;
-
- return 0;
-}
-
-
-unsigned int addr_[16]; // ip addresses of local host (host byte order)
-unsigned int naddr_ = 0; // # of ip addresses
-
-int Net_Init(void)
-{
-#ifdef _WIN32
- char** a;
- unsigned int i;
- char fullhost[255];
- struct hostent* hent;
-
- /* Start up the windows networking */
- WSADATA wsaData;
-
- if ( WSAStartup(WINSOCK_VERSION, &wsaData) != 0 ) {
- printf("SYSERR: WinSock not available!\n");
- exit(1);
- }
-
- if(gethostname(fullhost, sizeof(fullhost)) == SOCKET_ERROR) {
- printf("Ugg.. no hostname defined!\n");
- return 0;
- }
-
- // XXX This should look up the local IP addresses in the registry
- // instead of calling gethostbyname. However, the way IP addresses
- // are stored in the registry is annoyingly complex, so I'll leave
- // this as T.B.D.
- hent = gethostbyname(fullhost);
- if (hent == NULL) {
- printf("Cannot resolve our own hostname to a IP address");
- return 0;
- }
-
- a = hent->h_addr_list;
- for(i = 0; a[i] != 0 && i < 16; ++i) {
- unsigned long addr1 = ntohl(*(unsigned long*) a[i]);
- addr_[i] = addr1;
- }
- naddr_ = i;
-#else
- int pos;
- int fdes = socket(AF_INET, SOCK_STREAM, 0);
- char buf[16 * sizeof(struct ifreq)];
- struct ifconf ic;
-
- // The ioctl call will fail with Invalid Argument if there are more
- // interfaces than will fit in the buffer
- ic.ifc_len = sizeof(buf);
- ic.ifc_buf = buf;
- if(ioctl(fdes, SIOCGIFCONF, &ic) == -1) {
- printf("SIOCGIFCONF failed!\n");
- return 0;
- }
-
- for(pos = 0; pos < ic.ifc_len;)
- {
- struct ifreq * ir = (struct ifreq *) (ic.ifc_buf + pos);
-
- struct sockaddr_in * a = (struct sockaddr_in *) &(ir->ifr_addr);
-
- if(a->sin_family == AF_INET) {
- u_long ad = ntohl(a->sin_addr.s_addr);
- if(ad != INADDR_LOOPBACK) {
- addr_[naddr_ ++] = ad;
- if(naddr_ == 16)
- break;
- }
- }
-
-#if defined(_AIX) || defined(__APPLE__)
- pos += ir->ifr_addr.sa_len; // For when we port athena to run on Mac's :)
- pos += sizeof(ir->ifr_name);
-#else
- pos += sizeof(struct ifreq);
-#endif
- }
-
-#endif
-
- return(0);
-}
-
-#ifdef UPNP
-// not implemented yet ^^;
-void do_init_upnp(void)
-{
- int *_release_mappings;
- int *_close_ports;
-
- upnp_dll = DLL_OPEN ("upnp.dll");
- if (!upnp_dll) {
- printf ("Cannot open upnp.dll: %s\n", dlerror());
- return;
- }
- DLL_SYM (upnp_init, upnp_dll, "do_init");
- DLL_SYM (upnp_final, upnp_dll, "do_final");
- DLL_SYM (firewall_addport, upnp_dll, "Firewall_AddPort");
- DLL_SYM (upnp_addport, upnp_dll, "UPNP_AddPort");
- if (!upnp_init || !upnp_final || !firewall_addport || !upnp_addport) {
- printf ("Cannot load symbol: %s\n", dlerror());
- DLL_CLOSE (upnp_dll);
- upnp_dll = NULL;
- return;
- }
-
- DLL_SYM (_release_mappings, upnp_dll, "release_mappings");
- DLL_SYM (_close_ports, upnp_dll, "close_ports");
- if (release_mappings && _release_mappings)
- *_release_mappings = release_mappings;
- if (close_ports && _close_ports)
- *_close_ports = close_ports;
-
- if (upnp_init() == 0) {
- printf ("Error initialising upnp.dll, unloading...\n");
- DLL_CLOSE (upnp_dll);
- upnp_dll = NULL;
- }
- return;
-}
-#endif
-
-void do_final_socket(void)
-{
- int i;
- struct _connect_history *hist , *hist2;
- for(i=0; i<fd_max; i++) {
- if(session[i]) {
- delete_session(i);
- }
- }
- for(i=0; i<0x10000; i++) {
- hist = connect_history[i];
- while(hist) {
- hist2 = hist->next;
- aFree(hist);
- hist = hist2;
- }
- }
- if (access_allow)
- aFree(access_allow);
- if (access_deny)
- aFree(access_deny);
-
- // session[0] ‚̃_ƒ~[ƒf[ƒ^‚ðíœ
- aFree(session[0]->rdata);
- aFree(session[0]->wdata);
- aFree(session[0]);
-
-#ifdef UPNP
- if (upnp_dll) {
- upnp_final();
- DLL_CLOSE(upnp_dll);
- }
-#endif
-}
-
-void do_socket(void)
-{
- char *SOCKET_CONF_FILENAME = "conf/packet_athena.conf";
-
- FD_ZERO(&readfds);
-
- atexit(do_final_socket);
- socket_config_read(SOCKET_CONF_FILENAME);
-
- // session[0] ‚Ƀ_ƒ~[ƒf[ƒ^‚ðŠm•Û‚·‚é
- CREATE(session[0], struct socket_data, 1);
- CREATE_A(session[0]->rdata, unsigned char, rfifo_size);
- CREATE_A(session[0]->wdata, unsigned char, wfifo_size);
- session[0]->max_rdata = rfifo_size;
- session[0]->max_wdata = wfifo_size;
-
- // ‚Æ‚è‚ ‚¦‚¸‚T•ª‚²‚Æ‚É•s—v‚ȃf[ƒ^‚ð휂·‚é
- add_timer_interval(gettick()+1000,connect_check_clear,0,0,300*1000);
-
-#ifdef UPNP
- do_init_upnp();
-#endif
-}
diff --git a/src/common/socket.h b/src/common/socket.h
deleted file mode 100644
index 37d41203e..000000000
--- a/src/common/socket.h
+++ /dev/null
@@ -1,116 +0,0 @@
-// original : core.h 2003/03/14 11:55:25 Rev 1.4
-
-#ifndef _SOCKET_H_
-#define _SOCKET_H_
-
-#include <stdio.h>
-
-#ifdef __WIN32
-#include <winsock.h>
-#else
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#endif
-#include <time.h>
-#include "malloc.h"
-
-extern time_t tick_;
-extern time_t stall_time_;
-
-// define declaration
-
-#define RFIFOSPACE(fd) (session[fd]->max_rdata-session[fd]->rdata_size)
-#define RFIFOP(fd,pos) (session[fd]->rdata+session[fd]->rdata_pos+(pos))
-// use function instead of macro.
-#define RFIFOB(fd,pos) (*(unsigned char*)RFIFOP(fd,pos))
-#define RFIFOW(fd,pos) (*(unsigned short*)RFIFOP(fd,pos))
-#define RFIFOL(fd,pos) (*(unsigned int*)RFIFOP(fd,pos))
-#define RFIFOREST(fd) (session[fd]->rdata_size-session[fd]->rdata_pos)
-#define RFIFOFLUSH(fd) (memmove(session[fd]->rdata,RFIFOP(fd,0),RFIFOREST(fd)),session[fd]->rdata_size=RFIFOREST(fd),session[fd]->rdata_pos=0)
-//#define RFIFOSKIP(fd,len) ((session[fd]->rdata_size-session[fd]->rdata_pos-(len)<0) ? (fprintf(stderr,"too many skip\n"),exit(1)) : (session[fd]->rdata_pos+=(len)))
-
-#define RBUFP(p,pos) (((unsigned char*)(p))+(pos))
-#define RBUFB(p,pos) (*(unsigned char*)RBUFP((p),(pos)))
-#define RBUFW(p,pos) (*(unsigned short*)RBUFP((p),(pos)))
-#define RBUFL(p,pos) (*(unsigned int*)RBUFP((p),(pos)))
-
-#define WFIFOSPACE(fd) (session[fd]->max_wdata-session[fd]->wdata_size)
-#define WFIFOP(fd,pos) (session[fd]->wdata+session[fd]->wdata_size+(pos))
-#define WFIFOB(fd,pos) (*(unsigned char*)WFIFOP(fd,pos))
-#define WFIFOW(fd,pos) (*(unsigned short*)WFIFOP(fd,pos))
-#define WFIFOL(fd,pos) (*(unsigned int*)WFIFOP(fd,pos))
-// use function instead of macro.
-//#define WFIFOSET(fd,len) (session[fd]->wdata_size = (session[fd]->wdata_size+(len)+2048 < session[fd]->max_wdata) ? session[fd]->wdata_size+len : session[fd]->wdata_size)
-#define WBUFP(p,pos) (((unsigned char*)(p))+(pos))
-#define WBUFB(p,pos) (*(unsigned char*)WBUFP((p),(pos)))
-#define WBUFW(p,pos) (*(unsigned short*)WBUFP((p),(pos)))
-#define WBUFL(p,pos) (*(unsigned int*)WBUFP((p),(pos)))
-
-#ifdef __INTERIX
-#define FD_SETSIZE 4096
-#endif // __INTERIX
-
-
-/* Removed Cygwin FD_SETSIZE declarations, now are directly passed on to the compiler through Makefile [Valaris] */
-
-// Struct declaration
-
-struct socket_data{
- int eof;
- unsigned char *rdata,*wdata;
- int max_rdata,max_wdata;
- int rdata_size,wdata_size;
- time_t rdata_tick;
- int rdata_pos;
- struct sockaddr_in client_addr;
- int (*func_recv)(int);
- int (*func_send)(int);
- int (*func_parse)(int);
- int (*func_console)(char*);
- void* session_data;
-};
-
-// Data prototype declaration
-
-#ifdef _WIN32
-
- #undef FD_SETSIZE
- #define FD_SETSIZE 4096
-
-#endif
-
-extern struct socket_data *session[FD_SETSIZE];
-
-extern int rfifo_size,wfifo_size;
-extern int fd_max;
-
-// Function prototype declaration
-
-int make_listen_port(int);
-int make_listen_bind(long,int);
-int make_connection(long,int);
-int delete_session(int);
-int realloc_fifo(int fd,int rfifo_size,int wfifo_size);
-int WFIFOSET(int fd,int len);
-int RFIFOSKIP(int fd,int len);
-
-int do_sendrecv(int next);
-int do_parsepacket(void);
-void do_socket(void);
-
-extern void flush_fifos();
-extern void set_nonblocking(int fd, int yes);
-
-int start_console(void);
-
-void set_defaultparse(int (*defaultparse)(int));
-void set_defaultconsoleparse(int (*defaultparse)(char*));
-
-int Net_Init(void);
-
-extern unsigned int addr_[16]; // ip addresses of local host (host byte order)
-extern unsigned int naddr_; // # of ip addresses
-
-
-#endif // _SOCKET_H_
diff --git a/src/common/strlib.c b/src/common/strlib.c
deleted file mode 100644
index 2b130e76d..000000000
--- a/src/common/strlib.c
+++ /dev/null
@@ -1,98 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "strlib.h"
-#include "utils.h"
-#include "malloc.h"
-
-//-----------------------------------------------
-// string lib.
-char* jstrescape (char* pt) {
- //copy from here
- char *ptr;
- int i =0, j=0;
-
- //copy string to temporary
- CREATE_A(ptr, char, J_MAX_MALLOC_SIZE);
- strcpy(ptr,pt);
-
- while (ptr[i] != '\0') {
- switch (ptr[i]) {
- case '\'':
- pt[j++] = '\\';
- pt[j++] = ptr[i++];
- break;
- case '\\':
- pt[j++] = '\\';
- pt[j++] = ptr[i++];
- break;
- default:
- pt[j++] = ptr[i++];
- }
- }
- pt[j++] = '\0';
- aFree (ptr);
- return &pt[0];
-}
-
-char* jstrescapecpy (char* pt,char* spt) {
- //copy from here
- int i =0, j=0;
-
- while (spt[i] != '\0') {
- switch (spt[i]) {
- case '\'':
- pt[j++] = '\\';
- pt[j++] = spt[i++];
- break;
- case '\\':
- pt[j++] = '\\';
- pt[j++] = spt[i++];
- break;
- default:
- pt[j++] = spt[i++];
- }
- }
- pt[j++] = '\0';
- return &pt[0];
-}
-int jmemescapecpy (char* pt,char* spt, int size) {
- //copy from here
- int i =0, j=0;
-
- while (i < size) {
- switch (spt[i]) {
- case '\'':
- pt[j++] = '\\';
- pt[j++] = spt[i++];
- break;
- case '\\':
- pt[j++] = '\\';
- pt[j++] = spt[i++];
- break;
- default:
- pt[j++] = spt[i++];
- }
- }
- // copy size is 0 ~ (j-1)
- return j;
-}
-
-//-----------------------------------------------------
-// Function to suppress control characters in a string.
-//-----------------------------------------------------
-//int remove_control_chars(char *str) {
-int remove_control_chars(unsigned char *str) {
- int i;
- int change = 0;
-
- for(i = 0; str[i]; i++) {
- if (str[i] < 32) {
- str[i] = '_';
- change = 1;
- }
- }
-
- return change;
-}
diff --git a/src/common/strlib.h b/src/common/strlib.h
deleted file mode 100644
index 55920f823..000000000
--- a/src/common/strlib.h
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef _J_STR_LIB_H_
-#define _J_STR_LIB_H_
-#define J_MAX_MALLOC_SIZE 65535
-// String function library.
-// code by Jioh L. Jung (ziozzang@4wish.net)
-// This code is under license "BSD"
-char* jstrescape (char* pt);
-char* jstrescapecpy (char* pt,char* spt);
-int jmemescapecpy (char* pt,char* spt, int size);
-
-// custom functions
-int remove_control_chars(unsigned char *);
-#endif
diff --git a/src/common/timer.c b/src/common/timer.c
deleted file mode 100644
index 6a740d47a..000000000
--- a/src/common/timer.c
+++ /dev/null
@@ -1,315 +0,0 @@
-// $Id: timer.c,v 1.1.1.1 2004/09/10 17:44:49 Yor Exp $
-// original : core.c 2003/02/26 18:03:12 Rev 1.7
-
-//#include <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-
-#ifdef __WIN32
-#define __USE_W32_SOCKETS
-#include <windows.h>
-#else
-#include <sys/socket.h>
-#include <sys/time.h>
-#endif
-
-#include "timer.h"
-#include "malloc.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-static struct TimerData* timer_data;
-static int timer_data_max, timer_data_num;
-static int* free_timer_list;
-static int free_timer_list_max, free_timer_list_pos;
-
-static int timer_heap_num = 0, timer_heap_max = 0;
-static int* timer_heap = NULL;
-
-// for debug
-struct timer_func_list {
- int (*func)(int,unsigned int,int,int);
- struct timer_func_list* next;
- char* name;
-};
-static struct timer_func_list* tfl_root;
-
-#ifdef __WIN32
-/* Modified struct timezone to void - we pass NULL anyway */
-void gettimeofday(struct timeval *t, void *dummy) {
- DWORD millisec = GetTickCount();
-
- t->tv_sec = (int) (millisec / 1000);
- t->tv_usec = (millisec % 1000) * 1000;
-}
-#endif
-
-//
-int add_timer_func_list(int (*func)(int,unsigned int,int,int), char* name) {
- struct timer_func_list* tfl;
-
- //CALLOC(tfl, struct timer_func_list, 1);
- tfl = (struct timer_func_list*) aCalloc( sizeof(struct timer_func_list) , 1);
- //MALLOC(tfl->name, char, strlen(name) + 1);
- tfl->name = (char *) aMalloc( strlen(name) + 1 );
-
- tfl->next = tfl_root;
- tfl->func = func;
- strcpy(tfl->name, name);
- tfl_root = tfl;
-
- return 0;
-}
-
-char* search_timer_func_list(int (*func)(int,unsigned int,int,int)) {
- struct timer_func_list* tfl;
-
- for(tfl = tfl_root; tfl; tfl = tfl->next) {
- if (func == tfl->func)
- return tfl->name;
- }
- return "???";
-}
-
-/*----------------------------
- * Get tick time
- *----------------------------*/
-static unsigned int gettick_cache;
-static int gettick_count;
-
-unsigned int gettick_nocache(void) {
- struct timeval tval;
-
- gettimeofday(&tval, NULL);
- gettick_count = 256;
-
- return gettick_cache = tval.tv_sec * 1000 + tval.tv_usec / 1000;
-}
-
-unsigned int gettick(void) {
- gettick_count--;
- if (gettick_count < 0)
- return gettick_nocache();
-
- return gettick_cache;
-}
-
-/*======================================
- * CORE : Timer Heap
- *--------------------------------------
- */
-static void push_timer_heap(int index) {
- int i, j;
- int min, max, pivot; // for sorting
-
- // check number of element
- if (timer_heap_num >= timer_heap_max) {
- if (timer_heap_max == 0) {
- timer_heap_max = 256;
- //CALLOC(timer_heap, int, 256);
- timer_heap = (int *) aCalloc( sizeof(int) , 256);
- } else {
- timer_heap_max += 256;
- //REALLOC(timer_heap, int, timer_heap_max);
- timer_heap = (int *) aRealloc( timer_heap, sizeof(int) * timer_heap_max);
- memset(timer_heap + (timer_heap_max - 256), 0, sizeof(int) * 256);
- }
- }
-
- // do a sorting from higher to lower
- j = timer_data[index].tick; // speed up
- // with less than 4 values, it's speeder to use simple loop
- if (timer_heap_num < 4) {
- for(i = timer_heap_num; i > 0; i--)
- if (j < timer_data[timer_heap[i - 1]].tick)
- break;
- else
- timer_heap[i] = timer_heap[i - 1];
- timer_heap[i] = index;
- // searching by dichotomie
- } else {
- // if lower actual item is higher than new
- if (j < timer_data[timer_heap[timer_heap_num - 1]].tick)
- timer_heap[timer_heap_num] = index;
- else {
- // searching position
- min = 0;
- max = timer_heap_num - 1;
- while (min < max) {
- pivot = (min + max) / 2;
- if (j < timer_data[timer_heap[pivot]].tick)
- min = pivot + 1;
- else
- max = pivot;
- }
- // move elements - do loop if there are a little number of elements to move
- if (timer_heap_num - min < 5) {
- for(i = timer_heap_num; i > min; i--)
- timer_heap[i] = timer_heap[i - 1];
- // move elements - else use memmove (speeder for a lot of elements)
- } else
- memmove(&timer_heap[min + 1], &timer_heap[min], sizeof(int) * (timer_heap_num - min));
- // save new element
- timer_heap[min] = index;
- }
- }
-
- timer_heap_num++;
-}
-
-int add_timer(unsigned int tick,int (*func)(int,unsigned int,int,int),int id,int data) {
- struct TimerData* td;
- int i;
-
- if (free_timer_list_pos) {
- do {
- i = free_timer_list[--free_timer_list_pos];
- } while(i >= timer_data_num && free_timer_list_pos > 0);
- } else
- i = timer_data_num;
- if (i >= timer_data_num)
- for (i = timer_data_num; i < timer_data_max && timer_data[i].type; i++);
- if (i >= timer_data_num && i >= timer_data_max) {
- if (timer_data_max == 0) {
- timer_data_max = 256;
- //CALLOC(timer_data, struct TimerData, timer_data_max);
- timer_data = (struct TimerData*) aCalloc( sizeof(struct TimerData) , timer_data_max);
- } else {
- timer_data_max += 256;
- //REALLOC(timer_data, struct TimerData, timer_data_max);
- timer_data = (struct TimerData *) aRealloc( timer_data, sizeof(struct TimerData) * timer_data_max);
- memset(timer_data + (timer_data_max - 256), 0, sizeof(struct TimerData) * 256);
- }
- }
- td = &timer_data[i];
- td->tick = tick;
- td->func = func;
- td->id = id;
- td->data = data;
- td->type = TIMER_ONCE_AUTODEL;
- td->interval = 1000;
- push_timer_heap(i);
- if (i >= timer_data_num)
- timer_data_num = i + 1;
-
- return i;
-}
-
-int add_timer_interval(unsigned int tick,int (*func)(int,unsigned int,int,int),int id,int data,int interval) {
- int tid;
-
- tid = add_timer(tick,func,id,data);
- timer_data[tid].type = TIMER_INTERVAL;
- timer_data[tid].interval = interval;
-
- return tid;
-}
-
-int delete_timer(int id,int (*func)(int,unsigned int,int,int)) {
- if (id <= 0 || id >= timer_data_num) {
- printf("delete_timer error : no such timer %d\n", id);
- return -1;
- }
- if (timer_data[id].func != func) {
- printf("delete_timer error : function dismatch %08x(%s) != %08x(%s)\n",
- (int)timer_data[id].func, search_timer_func_list(timer_data[id].func),
- (int)func, search_timer_func_list(func));
- return -2;
- }
- // ‚»‚Ì‚¤‚¿Á‚¦‚é‚É‚Ü‚©‚¹‚é
- timer_data[id].func = NULL;
- timer_data[id].type = TIMER_ONCE_AUTODEL;
-// timer_data[id].tick -= 60 * 60 * 1000;
-
- return 0;
-}
-
-int addtick_timer(int tid,unsigned int tick) {
- return timer_data[tid].tick += tick;
-}
-
-struct TimerData* get_timer(int tid) {
- return &timer_data[tid];
-}
-
-int do_timer(unsigned int tick) {
- int i, nextmin = 1000;
-
- while(timer_heap_num) {
- i = timer_heap[timer_heap_num - 1]; // next shorter element
- if (DIFF_TICK(timer_data[i].tick, tick) > 0) {
- nextmin = DIFF_TICK(timer_data[i].tick, tick);
- break;
- }
- if (timer_heap_num > 0) // suppress the actual element from the table
- timer_heap_num--;
- timer_data[i].type |= TIMER_REMOVE_HEAP;
- if (timer_data[i].func) {
- if (DIFF_TICK(timer_data[i].tick, tick) < -1000) {
- // 1•bˆÈã‚Ì‘å•‚È’x‰„‚ª”­¶‚µ‚Ä‚¢‚é‚Ì‚ÅA
- // timerˆ—ƒ^ƒCƒ~ƒ“ƒO‚ðŒ»Ý’l‚Æ‚·‚鎖‚Å
- // ŒÄ‚Ño‚µŽžƒ^ƒCƒ~ƒ“ƒO(ˆø”‚Ìtick)‘Š‘΂ň—‚µ‚Ä‚é
- // timerŠÖ”‚ÌŽŸ‰ñˆ—ƒ^ƒCƒ~ƒ“ƒO‚ð’x‚点‚é
- timer_data[i].func(i, tick, timer_data[i].id, timer_data[i].data);
- } else {
- timer_data[i].func(i, timer_data[i].tick, timer_data[i].id, timer_data[i].data);
- }
- }
- if (timer_data[i].type & TIMER_REMOVE_HEAP) {
- switch(timer_data[i].type & ~TIMER_REMOVE_HEAP) {
- case TIMER_ONCE_AUTODEL:
- timer_data[i].type = 0;
- if (free_timer_list_pos >= free_timer_list_max) {
- free_timer_list_max += 256;
- //REALLOC(free_timer_list, int, free_timer_list_max);
- free_timer_list = (int *) aRealloc(free_timer_list, sizeof(int) * free_timer_list_max);
- memset(free_timer_list + (free_timer_list_max - 256), 0, 256 * sizeof(int));
- }
- free_timer_list[free_timer_list_pos++] = i;
- break;
- case TIMER_INTERVAL:
- if (DIFF_TICK(timer_data[i].tick , tick) < -1000) {
- timer_data[i].tick = tick + timer_data[i].interval;
- } else {
- timer_data[i].tick += timer_data[i].interval;
- }
- timer_data[i].type &= ~TIMER_REMOVE_HEAP;
- push_timer_heap(i);
- break;
- }
- }
- }
-
- if (nextmin < 10)
- nextmin = 10;
-
- return nextmin;
-}
-
-void timer_final() {
- struct timer_func_list* tfl = tfl_root, *tfl2;
-
-// while (tfl) {
-// tfl2 = tfl;
-// aFree(tfl->name);
-// aFree(tfl);
-// tfl = tfl2->next; // access on already freed memory
-// }
-
- while (tfl) {
- tfl2 = tfl->next; // copy next pointer
- aFree(tfl->name); // free structures
- aFree(tfl);
- tfl = tfl2; // use copied pointer for next cycle
- }
-
- if (timer_data) aFree(timer_data);
- if (timer_heap) aFree(timer_heap);
- if (free_timer_list) aFree(free_timer_list);
-}
-
diff --git a/src/common/timer.h b/src/common/timer.h
deleted file mode 100644
index 81086cb70..000000000
--- a/src/common/timer.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// original : core.h 2003/03/14 11:55:25 Rev 1.4
-
-#ifndef _TIMER_H_
-#define _TIMER_H_
-
-#ifdef __WIN32
-/* We need winsock lib to have timeval struct - windows is weirdo */
-#define __USE_W32_SOCKETS
-#include <windows.h>
-#endif
-
-#define BASE_TICK 5
-
-#define TIMER_ONCE_AUTODEL 1
-#define TIMER_INTERVAL 2
-#define TIMER_REMOVE_HEAP 16
-
-#define DIFF_TICK(a,b) ((int)((a)-(b)))
-
-// Struct declaration
-
-struct TimerData {
- unsigned int tick;
- int (*func)(int,unsigned int,int,int);
- int id;
- int data;
- int type;
- int interval;
- int heap_pos;
-};
-
-// Function prototype declaration
-
-#ifdef __WIN32
-void gettimeofday(struct timeval *t, void *dummy);
-#endif
-
-unsigned int gettick_nocache(void);
-unsigned int gettick(void);
-
-int add_timer(unsigned int,int (*)(int,unsigned int,int,int),int,int);
-int add_timer_interval(unsigned int,int (*)(int,unsigned int,int,int),int,int,int);
-int delete_timer(int,int (*)(int,unsigned int,int,int));
-
-int addtick_timer(int tid,unsigned int tick);
-struct TimerData *get_timer(int tid);
-
-int do_timer(unsigned int tick);
-
-int add_timer_func_list(int (*)(int,unsigned int,int,int),char*);
-char* search_timer_func_list(int (*)(int,unsigned int,int,int));
-
-void timer_final();
-
-#endif // _TIMER_H_
diff --git a/src/common/utils.c b/src/common/utils.c
deleted file mode 100644
index 732b1d366..000000000
--- a/src/common/utils.c
+++ /dev/null
@@ -1,189 +0,0 @@
-#include <string.h>
-#include "utils.h"
-#include <stdio.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include "malloc.h"
-#include "mmo.h"
-
-void dump(unsigned char *buffer, int num)
-{
- int icnt,jcnt;
-
- printf(" Hex ASCII\n");
- printf(" ----------------------------------------------- ----------------");
-
- for (icnt=0;icnt<num;icnt+=16) {
- printf("\n%p ",&buffer[icnt]);
- for (jcnt=icnt;jcnt<icnt+16;++jcnt) {
- if (jcnt < num) {
- printf("%02hX ",buffer[jcnt]);
- } else
- printf(" ");
- }
-
- printf(" | ");
-
- for (jcnt=icnt;jcnt<icnt+16;++jcnt) {
- if (jcnt < num) {
- if (buffer[jcnt] > 31 && buffer[jcnt] < 127)
- printf("%c",buffer[jcnt]);
- else
- printf(".");
- } else
- printf(" ");
- }
- }
- printf("\n");
-}
-
-
-#ifdef _WIN32
-char *rindex(char *str, char c)
-{
- char *sptr;
-
- sptr = str;
- while(*sptr)
- ++sptr;
- if (c == '\0')
- return(sptr);
- while(str != sptr)
- if (*sptr-- == c)
- return(++sptr);
- return(NULL);
-}
-
-int strcasecmp(const char *arg1, const char *arg2)
-{
- int chk, i;
-
- if (arg1 == NULL || arg2 == NULL) {
- printf("SYSERR: str_cmp() passed a NULL pointer, %p or %p.\n", arg1, arg2);
- return (0);
- }
-
- for (i = 0; arg1[i] || arg2[i]; i++)
- if ((chk = LOWER(arg1[i]) - LOWER(arg2[i])) != 0)
- return (chk); /* not equal */
-
- return (0);
-}
-
-int strncasecmp(const char *arg1, const char *arg2, int n)
-{
- int chk, i;
-
- if (arg1 == NULL || arg2 == NULL) {
- printf("SYSERR: strn_cmp() passed a NULL pointer, %p or %p.\n", arg1, arg2);
- return (0);
- }
-
- for (i = 0; (arg1[i] || arg2[i]) && (n > 0); i++, n--)
- if ((chk = LOWER(arg1[i]) - LOWER(arg2[i])) != 0)
- return (chk); /* not equal */
-
- return (0);
-}
-
-void str_upper(char *name)
-{
-
- int len = strlen(name);
- while (len--) {
- if (*name >= 'a' && *name <= 'z')
- *name -= ('a' - 'A');
- name++;
- }
-}
-
-void str_lower(char *name)
-{
- int len = strlen(name);
-
- while (len--) {
- if (*name >= 'A' && *name <= 'Z')
- *name += ('a' - 'A');
- name++;
- }
-}
-
-#endif
-
-// Allocate a StringBuf [MouseJstr]
-struct StringBuf * StringBuf_Malloc()
-{
- struct StringBuf * ret = (struct StringBuf *) aMallocA(sizeof(struct StringBuf));
- StringBuf_Init(ret);
- return ret;
-}
-
-// Initialize a previously allocated StringBuf [MouseJstr]
-void StringBuf_Init(struct StringBuf * sbuf) {
- sbuf->max_ = 1024;
- sbuf->ptr_ = sbuf->buf_ = (char *) aMallocA(sbuf->max_ + 1);
-}
-
-// printf into a StringBuf, moving the pointer [MouseJstr]
-int StringBuf_Printf(struct StringBuf *sbuf,const char *fmt,...)
-{
- va_list ap;
- int n, size, off;
-
- while (1) {
- /* Try to print in the allocated space. */
- va_start(ap, fmt);
- size = sbuf->max_ - (sbuf->ptr_ - sbuf->buf_);
- n = vsnprintf (sbuf->ptr_, size, fmt, ap);
- va_end(ap);
- /* If that worked, return the length. */
- if (n > -1 && n < size) {
- sbuf->ptr_ += n;
- return sbuf->ptr_ - sbuf->buf_;
- }
- /* Else try again with more space. */
- sbuf->max_ *= 2; // twice the old size
- off = sbuf->ptr_ - sbuf->buf_;
- sbuf->buf_ = (char *) aRealloc(sbuf->buf_, sbuf->max_ + 1);
- sbuf->ptr_ = sbuf->buf_ + off;
- }
-}
-
-// Append buf2 onto the end of buf1 [MouseJstr]
-int StringBuf_Append(struct StringBuf *buf1,const struct StringBuf *buf2)
-{
- int buf1_avail = buf1->max_ - (buf1->ptr_ - buf1->buf_);
- int size2 = buf2->ptr_ - buf2->buf_;
-
- if (size2 >= buf1_avail) {
- int off = buf1->ptr_ - buf1->buf_;
- buf1->max_ += size2;
- buf1->buf_ = (char *) aRealloc(buf1->buf_, buf1->max_ + 1);
- buf1->ptr_ = buf1->buf_ + off;
- }
-
- memcpy(buf1->ptr_, buf2->buf_, size2);
- buf1->ptr_ += size2;
- return buf1->ptr_ - buf1->buf_;
-}
-
-// Destroy a StringBuf [MouseJstr]
-void StringBuf_Destroy(struct StringBuf *sbuf)
-{
- aFree(sbuf->buf_);
- sbuf->ptr_ = sbuf->buf_ = 0;
-}
-
-// Free a StringBuf returned by StringBuf_Malloc [MouseJstr]
-void StringBuf_Free(struct StringBuf *sbuf)
-{
- StringBuf_Destroy(sbuf);
- aFree(sbuf);
-}
-
-// Return the built string from the StringBuf [MouseJstr]
-char * StringBuf_Value(struct StringBuf *sbuf)
-{
- *sbuf->ptr_ = '\0';
- return sbuf->buf_;
-}
diff --git a/src/common/utils.h b/src/common/utils.h
deleted file mode 100644
index 63c3f21ec..000000000
--- a/src/common/utils.h
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef COMMON_UTILS_H
-#define COMMON_UTILS_H
-
-
-#ifndef NULL
-#define NULL (void *)0
-#endif
-
-#define LOWER(c) (((c)>='A' && (c) <= 'Z') ? ((c)+('a'-'A')) : (c))
-#define UPPER(c) (((c)>='a' && (c) <= 'z') ? ((c)+('A'-'a')) : (c) )
-
-/* strcasecmp -> stricmp -> str_cmp */
-
-
-#ifdef _WIN32
- int strcasecmp(const char *arg1, const char *arg2);
- int strncasecmp(const char *arg1, const char *arg2, int n);
- void str_upper(char *name);
- void str_lower(char *name);
- char *rindex(char *str, char c);
-#endif
-
-
- void dump(unsigned char *buffer, int num);
-
-
-#define CREATE(result, type, number) do {\
- if ((number) * sizeof(type) <= 0) \
- printf("SYSERR: Zero bytes or less requested at %s:%d.\n", __FILE__, __LINE__); \
- if (!((result) = (type *) aCalloc ((number), sizeof(type)))) \
- { perror("SYSERR: malloc failure"); abort(); } } while(0)
-
-#define CREATE_A(result, type, number) do {\
- if ((number) * sizeof(type) <= 0) \
- printf("SYSERR: Zero bytes or less requested at %s:%d.\n", __FILE__, __LINE__); \
- if (!((result) = (type *) aCallocA ((number), sizeof(type)))) \
- { perror("SYSERR: malloc failure"); abort(); } } while(0)
-
-#define RECREATE(result,type,number) do {\
- if (!((result) = (type *) aRealloc ((result), sizeof(type) * (number))))\
- { printf("SYSERR: realloc failure"); abort(); } } while(0)
-
-struct StringBuf {
- char *buf_;
- char *ptr_;
- unsigned int max_;
-};
-
-extern struct StringBuf * StringBuf_Malloc();
-extern void StringBuf_Init(struct StringBuf *);
-extern int StringBuf_Printf(struct StringBuf *,const char *,...);
-extern int StringBuf_Append(struct StringBuf *,const struct StringBuf *);
-extern char * StringBuf_Value(struct StringBuf *);
-extern void StringBuf_Destroy(struct StringBuf *);
-extern void StringBuf_Free(struct StringBuf *);
-
-#endif
diff --git a/src/common/version.h b/src/common/version.h
deleted file mode 100644
index e33e2b305..000000000
--- a/src/common/version.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// $Id: version.h,v 1.2 2004/09/22 09:49:06 PoW Exp $
-#ifndef _VERSION_H_
-#define _VERSION_H_
-
-#define ATHENA_MAJOR_VERSION 1 // Major Version
-#define ATHENA_MINOR_VERSION 0 // Minor Version
-#define ATHENA_REVISION 0 // Revision
-
-#define ATHENA_RELEASE_FLAG 1 // 1=Develop,0=Stable
-#define ATHENA_OFFICIAL_FLAG 1 // 1=Mod,0=Official
-
-#define ATHENA_SERVER_LOGIN 1 // login server
-#define ATHENA_SERVER_CHAR 2 // char server
-#define ATHENA_SERVER_INTER 4 // inter server
-#define ATHENA_SERVER_MAP 8 // map server
-
-// ATHENA_MOD_VERSION‚̓pƒbƒ`”Ô†‚Å‚·B
-// ‚±‚ê‚Í–³—‚É•Ï‚¦‚È‚­‚Ä‚à‹C‚ªŒü‚¢‚½‚ç•Ï‚¦‚é’ö“x‚̈µ‚¢‚ÅB
-// i–ˆ‰ñƒAƒbƒvƒ[ƒh‚Ì“x‚É•ÏX‚·‚é‚Ì‚à–Ê“|‚ÆŽv‚í‚ê‚邵A‚»‚à‚»‚à
-// @‚±‚Ì€–Ú‚ðŽQÆ‚·‚él‚ª‚¢‚é‚©‚Ç‚¤‚©‚Å‹^–₾‚©‚çBj
-// ‚»‚Ì’ö“x‚̈µ‚¢‚È‚Ì‚ÅAƒT[ƒo[‚É–â‚¢‡‚킹‚鑤‚àA‚ ‚­‚Ü‚Å–ÚˆÀ’ö“x‚̈µ‚¢‚Å
-// ‚ ‚ñ‚Ü‚èM—p‚µ‚È‚¢‚±‚ÆB
-// ŽIsnapshot‚ÌŽž‚âA‘å‚«‚È•ÏX‚ª‚ ‚Á‚½ê‡‚Íݒ肵‚Ä‚Ù‚µ‚¢‚Å‚·B
-// CŒ¾Œê‚ÌŽd—lãAʼn‚É0‚ð•t‚¯‚é‚Æ8i”‚É‚È‚é‚̂ŊԈႦ‚È‚¢‚ʼnº‚³‚¢B
-#define ATHENA_MOD_VERSION 1052 // mod version (patch No.)
-
-#endif
diff --git a/src/ladmin/Makefile b/src/ladmin/Makefile
deleted file mode 100644
index 20722350b..000000000
--- a/src/ladmin/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-all: ladmin
-txt: ladmin
-sql: ladmin
-
-COMMON_OBJ = ../common/obj/core.o ../common/obj/socket.o ../common/obj/timer.o ../common/obj/db.o ../common/obj/malloc.o ../common/obj/showmsg.o ../common/obj/strlib.o
-COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/db.h ../common/malloc.h ../common/showmsg.h ../common/strlib.h
-
-ladmin: ladmin.o md5calc.o $(COMMON_OBJ)
- $(CC) -o ../../$@ ladmin.o md5calc.o $(COMMON_OBJ) $(LIB_S)
-ladmin.o: ladmin.c ladmin.h md5calc.h $(COMMON_H)
-md5calc.o: md5calc.c md5calc.h
-
-clean:
- rm -f *.o ../../ladmin
diff --git a/src/ladmin/ladmin.c b/src/ladmin/ladmin.c
deleted file mode 100644
index 432a78a95..000000000
--- a/src/ladmin/ladmin.c
+++ /dev/null
@@ -1,4383 +0,0 @@
-// $Id: ladmin.c,v 1.1.1.1 2004/09/10 17:26:52 MagicalTux Exp $
-///////////////////////////////////////////////////////////////////////////
-// EAthena login-server remote administration tool
-// Ladamin in C by [Yor]
-// if you modify this software, modify ladmin in tool too.
-///////////////////////////////////////////////////////////////////////////
-
-#include <sys/types.h>
-#include <time.h>
-#ifdef WIN32
-#define WIN32_LEAN_AND_MEAN
-#include <winsock2.h>
-void Gettimeofday(struct timeval *timenow)
-{
- time_t t;
- t = clock();
- timenow->tv_usec = t;
- timenow->tv_sec = t / CLK_TCK;
- return;
-}
-#define gettimeofday(timenow, dummy) Gettimeofday(timenow)
-#else
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <sys/time.h> // gettimeofday
-#include <sys/ioctl.h>
-#include <unistd.h> // close
-#include <arpa/inet.h> // inet_addr
-#include <netdb.h> // gethostbyname
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h> // str*
-#include <stdarg.h> // valist
-#include <ctype.h> // tolower
-
-#include "../common/strlib.h"
-#include "../common/core.h"
-#include "../common/socket.h"
-#include "ladmin.h"
-#include "../common/version.h"
-#include "../common/mmo.h"
-
-#ifdef PASSWORDENC
-#include "md5calc.h"
-#endif
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-//-------------------------------INSTRUCTIONS------------------------------
-// Set the variables below:
-// IP of the login server.
-// Port where the login-server listens incoming packets.
-// Password of administration (same of config_athena.conf).
-// Displayed language of the sofware (if not correct, english is used).
-// IMPORTANT:
-// Be sure that you authorize remote administration in login-server
-// (see login_athena.conf, 'admin_state' parameter)
-//-------------------------------------------------------------------------
-char loginserverip[16] = "127.0.0.1"; // IP of login-server
-int loginserverport = 6900; // Port of login-server
-char loginserveradminpassword[24] = "admin"; // Administration password
-#ifdef PASSWORDENC
-int passenc = 2; // Encoding type of the password
-#else
-int passenc = 0; // Encoding type of the password
-#endif
-char defaultlanguage = 'E'; // Default language (F: Français/E: English)
- // (if it's not 'F', default is English)
-char ladmin_log_filename[1024] = "log/ladmin.log";
-char date_format[32] = "%Y-%m-%d %H:%M:%S";
-//-------------------------------------------------------------------------
-// LIST of COMMANDs that you can type at the prompt:
-// To use these commands you can only type only the first letters.
-// You must type a minimum of letters (you can not type 'a',
-// because ladmin doesn't know if it's for 'aide' or for 'add')
-// <Example> q <= quit, li <= list, pass <= passwd, etc.
-//
-// Note: every time you must give a account_name, you can use "" or '' (spaces can be included)
-//
-// aide/help/?
-// Display the description of the commands
-// aide/help/? [command]
-// Display the description of the specified command
-//
-// add <account_name> <sex> <password>
-// Create an account with the default email (a@a.com).
-// Concerning the sex, only the first letter is used (F or M).
-// The e-mail is set to a@a.com (default e-mail). It's like to have no e-mail.
-// When the password is omitted, the input is done without displaying of the pressed keys.
-// <example> add testname Male testpass
-//
-// ban/banish yyyy/mm/dd hh:mm:ss <account name>
-// Changes the final date of a banishment of an account.
-// Like banset, but <account name> is at end.
-//
-// banadd <account_name> <modifier>
-// Adds or substracts time from the final date of a banishment of an account.
-// Modifier is done as follows:
-// Adjustment value (-1, 1, +1, etc...)
-// Modified element:
-// a or y: year
-// m: month
-// j or d: day
-// h: hour
-// mn: minute
-// s: second
-// <example> banadd testname +1m-2mn1s-6y
-// this example adds 1 month and 1 second, and substracts 2 minutes and 6 years at the same time.
-// NOTE: If you modify the final date of a non-banished account,
-// you fix the final date to (actual time +- adjustments)
-//
-// banset <account_name> yyyy/mm/dd [hh:mm:ss]
-// Changes the final date of a banishment of an account.
-// Default time [hh:mm:ss]: 23:59:59.
-// banset <account_name> 0
-// Set a non-banished account (0 = unbanished).
-//
-// block <account name>
-// Set state 5 (You have been blocked by the GM Team) to an account.
-// Like state <account name> 5.
-//
-// check <account_name> <password>
-// Check the validity of a password for an account
-// NOTE: Server will never sends back a password.
-// It's the only method you have to know if a password is correct.
-// The other method is to have a ('physical') access to the accounts file.
-//
-// create <account_name> <sex> <email> <password>
-// Like the 'add' command, but with e-mail moreover.
-// <example> create testname Male my@mail.com testpass
-//
-// del <account name>
-// Remove an account.
-// This order requires confirmation. After confirmation, the account is deleted.
-//
-// email <account_name> <email>
-// Modify the e-mail of an account.
-//
-// getcount
-// Give the number of players online on all char-servers.
-//
-// gm <account_name> [GM_level]
-// Modify the GM level of an account.
-// Default value remove GM level (GM level = 0).
-// <example> gm testname 80
-//
-// id <account name>
-// Give the id of an account.
-//
-// info <account_id>
-// Display complete information of an account.
-//
-// kami <message>
-// Sends a broadcast message on all map-server (in yellow).
-// kamib <message>
-// Sends a broadcast message on all map-server (in blue).
-//
-// language <language>
-// Change the language of displaying.
-//
-// list/ls [start_id [end_id]]
-// Display a list of accounts.
-// 'start_id', 'end_id': indicate end and start identifiers.
-// Research by name is not possible with this command.
-// <example> list 10 9999999
-//
-// listBan/lsBan [start_id [end_id]]
-// Like list/ls, but only for accounts with state or banished
-//
-// listGM/lsGM [start_id [end_id]]
-// Like list/ls, but only for GM accounts
-//
-// listOK/lsOK [start_id [end_id]]
-// Like list/ls, but only for accounts without state and not banished
-//
-// memo <account_name> <memo>
-// Modify the memo of an account.
-// 'memo': it can have until 253 characters (with spaces or not).
-//
-// name <account_id>
-// Give the name of an account.
-//
-// passwd <account_name> <new_password>
-// Change the password of an account.
-// When new password is omitted, the input is done without displaying of the pressed keys.
-//
-// quit/end/exit
-// End of the program of administration
-//
-// reloadGM
-// Reload GM configuration file
-//
-// search <expression>
-// Seek accounts.
-// Displays the accounts whose names correspond.
-// search -r/-e/--expr/--regex <expression>
-// Seek accounts by regular expression.
-// Displays the accounts whose names correspond.
-//
-// sex <account_name> <sex>
-// Modify the sex of an account.
-// <example> sex testname Male
-//
-// state <account_name> <new_state> <error_message_#7>
-// Change the state of an account.
-// 'new_state': state is the state of the packet 0x006a + 1. The possibilities are:
-// 0 = Account ok 6 = Your Game's EXE file is not the latest version
-// 1 = Unregistered ID 7 = You are Prohibited to log in until %s
-// 2 = Incorrect Password 8 = Server is jammed due to over populated
-// 3 = This ID is expired 9 = No MSG
-// 4 = Rejected from Server 100 = This ID has been totally erased
-// 5 = You have been blocked by the GM Team
-// all other values are 'No MSG', then use state 9 please.
-// 'error_message_#7': message of the code error 6 = Your are Prohibited to log in until %s (packet 0x006a)
-//
-// timeadd <account_name> <modifier>
-// Adds or substracts time from the validity limit of an account.
-// Modifier is done as follows:
-// Adjustment value (-1, 1, +1, etc...)
-// Modified element:
-// a or y: year
-// m: month
-// j or d: day
-// h: hour
-// mn: minute
-// s: second
-// <example> timeadd testname +1m-2mn1s-6y
-// this example adds 1 month and 1 second, and substracts 2 minutes and 6 years at the same time.
-// NOTE: You can not modify a unlimited validity limit.
-// If you want modify it, you want probably create a limited validity limit.
-// So, at first, you must set the validity limit to a date/time.
-//
-// timeset <account_name> yyyy/mm/dd [hh:mm:ss]
-// Changes the validity limit of an account.
-// Default time [hh:mm:ss]: 23:59:59.
-// timeset <account_name> 0
-// Gives an unlimited validity limit (0 = unlimited).
-//
-// unban/unbanish <account name>
-// Unban an account.
-// Like banset <account name> 0.
-//
-// unblock <account name>
-// Set state 0 (Account ok) to an account.
-// Like state <account name> 0.
-//
-// version
-// Display the version of the login-server.
-//
-// who <account name>
-// Displays complete information of an account.
-//
-//-------------------------------------------------------------------------
-int login_fd;
-int login_ip;
-int bytes_to_read = 0; // flag to know if we waiting bytes from login-server
-char command[1024];
-char parameters[1024];
-int list_first, list_last, list_type, list_count; // parameter to display a list of accounts
-int already_exit_function = 0; // sometimes, the exit function is called twice... so, don't log twice the message
-
-//------------------------------
-// Writing function of logs file
-//------------------------------
-int ladmin_log(char *fmt, ...) {
- FILE *logfp;
- va_list ap;
- struct timeval tv;
- char tmpstr[2048];
-
- va_start(ap, fmt);
-
- logfp = fopen(ladmin_log_filename, "a");
- if (logfp) {
- if (fmt[0] == '\0') // jump a line if no message
- fprintf(logfp, RETCODE);
- else {
- gettimeofday(&tv, NULL);
- strftime(tmpstr, 24, date_format, localtime((const time_t*)&(tv.tv_sec)));
- sprintf(tmpstr + strlen(tmpstr), ".%03d: %s", (int)tv.tv_usec / 1000, fmt);
- vfprintf(logfp, tmpstr, ap);
- }
- fclose(logfp);
- }
-
- va_end(ap);
- return 0;
-}
-
-//---------------------------------------------
-// Function to return ordonal text of a number.
-//---------------------------------------------
-char* makeordinal(int number) {
- if (defaultlanguage == 'F') {
- if (number == 0)
- return "";
- else if (number == 1)
- return "er";
- else
- return "ème";
- } else {
- if ((number % 10) < 4 && (number % 10) != 0 && (number < 10 || number > 20)) {
- if ((number % 10) == 1)
- return "st";
- else if ((number % 10) == 2)
- return "nd";
- else
- return "rd";
- } else {
- return "th";
- }
- }
- return "";
-}
-
-//-----------------------------------------------------------------------------------------
-// Function to test of the validity of an account name (return 0 if incorrect, and 1 if ok)
-//-----------------------------------------------------------------------------------------
-int verify_accountname(char* account_name) {
- int i;
-
- for(i = 0; account_name[i]; i++) {
- if (account_name[i] < 32) {
- if (defaultlanguage == 'F') {
- printf("Caractère interdit trouvé dans le nom du compte (%d%s caractère).\n", i+1, makeordinal(i+1));
- ladmin_log("Caractère interdit trouvé dans le nom du compte (%d%s caractère)." RETCODE, i+1, makeordinal(i+1));
- } else {
- printf("Illegal character found in the account name (%d%s character).\n", i+1, makeordinal(i+1));
- ladmin_log("Illegal character found in the account name (%d%s character)." RETCODE, i+1, makeordinal(i+1));
- }
- return 0;
- }
- }
-
- if (strlen(account_name) < 4) {
- if (defaultlanguage == 'F') {
- printf("Nom du compte trop court. Entrez un nom de compte de 4-23 caractères.\n");
- ladmin_log("Nom du compte trop court. Entrez un nom de compte de 4-23 caractères." RETCODE);
- } else {
- printf("Account name is too short. Please input an account name of 4-23 bytes.\n");
- ladmin_log("Account name is too short. Please input an account name of 4-23 bytes." RETCODE);
- }
- return 0;
- }
-
- if (strlen(account_name) > 23) {
- if (defaultlanguage == 'F') {
- printf("Nom du compte trop long. Entrez un nom de compte de 4-23 caractères.\n");
- ladmin_log("Nom du compte trop long. Entrez un nom de compte de 4-23 caractères." RETCODE);
- } else {
- printf("Account name is too long. Please input an account name of 4-23 bytes.\n");
- ladmin_log("Account name is too long. Please input an account name of 4-23 bytes." RETCODE);
- }
- return 0;
- }
-
- return 1;
-}
-
-//---------------------------------------------------
-// E-mail check: return 0 (not correct) or 1 (valid).
-//---------------------------------------------------
-int e_mail_check(char *email) {
- char ch;
- char* last_arobas;
-
- // athena limits
- if (strlen(email) < 3 || strlen(email) > 39)
- return 0;
-
- // part of RFC limits (official reference of e-mail description)
- if (strchr(email, '@') == NULL || email[strlen(email)-1] == '@')
- return 0;
-
- if (email[strlen(email)-1] == '.')
- return 0;
-
- last_arobas = strrchr(email, '@');
-
- if (strstr(last_arobas, "@.") != NULL ||
- strstr(last_arobas, "..") != NULL)
- return 0;
-
- for(ch = 1; ch < 32; ch++) {
- if (strchr(last_arobas, ch) != NULL) {
- return 0;
- break;
- }
- }
-
- if (strchr(last_arobas, ' ') != NULL ||
- strchr(last_arobas, ';') != NULL)
- return 0;
-
- // all correct
- return 1;
-}
-
-//----------------------------------
-// Sub-function: Input of a password
-//----------------------------------
-int typepasswd(char * password) {
- char password1[1023], password2[1023];
- int letter;
- int i;
-
- if (defaultlanguage == 'F') {
- ladmin_log("Aucun mot de passe n'a été donné. Demande d'un mot de passe." RETCODE);
- } else {
- ladmin_log("No password was given. Request to obtain a password." RETCODE);
- }
-
- memset(password1, '\0', sizeof(password1));
- memset(password2, '\0', sizeof(password2));
- if (defaultlanguage == 'F')
- printf("\033[1;36m Entrez le mot de passe > \033[0;32;42m");
- else
- printf("\033[1;36m Type the password > \033[0;32;42m");
- i = 0;
- while ((letter = getchar()) != '\n')
- password1[i++] = letter;
- if (defaultlanguage == 'F')
- printf("\033[0m\033[1;36m Ré-entrez le mot de passe > \033[0;32;42m");
- else
- printf("\033[0m\033[1;36m Verify the password > \033[0;32;42m");
- i = 0;
- while ((letter = getchar()) != '\n')
- password2[i++] = letter;
-
- printf("\033[0m");
- fflush(stdout);
- fflush(stdin);
-
- if (strcmp(password1, password2) != 0) {
- if (defaultlanguage == 'F') {
- printf("Erreur de vérification du mot de passe: Saisissez le même mot de passe svp.\n");
- ladmin_log("Erreur de vérification du mot de passe: Saisissez le même mot de passe svp." RETCODE);
- ladmin_log(" Premier mot de passe: %s, second mot de passe: %s." RETCODE, password1, password2);
- } else {
- printf("Password verification failed. Please input same password.\n");
- ladmin_log("Password verification failed. Please input same password." RETCODE);
- ladmin_log(" First password: %s, second password: %s." RETCODE, password1, password2);
- }
- return 0;
- }
- if (defaultlanguage == 'F') {
- ladmin_log("Mot de passe saisi: %s." RETCODE, password1);
- } else {
- ladmin_log("Typed password: %s." RETCODE, password1);
- }
- strcpy(password, password1);
- return 1;
-}
-
-//------------------------------------------------------------------------------------
-// Sub-function: Test of the validity of password (return 0 if incorrect, and 1 if ok)
-//------------------------------------------------------------------------------------
-int verify_password(char * password) {
- int i;
-
- for(i = 0; password[i]; i++) {
- if (password[i] < 32) {
- if (defaultlanguage == 'F') {
- printf("Caractère interdit trouvé dans le mot de passe (%d%s caractère).\n", i+1, makeordinal(i+1));
- ladmin_log("Caractère interdit trouvé dans le nom du compte (%d%s caractère)." RETCODE, i+1, makeordinal(i+1));
- } else {
- printf("Illegal character found in the password (%d%s character).\n", i+1, makeordinal(i+1));
- ladmin_log("Illegal character found in the password (%d%s character)." RETCODE, i+1, makeordinal(i+1));
- }
- return 0;
- }
- }
-
- if (strlen(password) < 4) {
- if (defaultlanguage == 'F') {
- printf("Nom du compte trop court. Entrez un nom de compte de 4-23 caractères.\n");
- ladmin_log("Nom du compte trop court. Entrez un nom de compte de 4-23 caractères." RETCODE);
- } else {
- printf("Account name is too short. Please input an account name of 4-23 bytes.\n");
- ladmin_log("Account name is too short. Please input an account name of 4-23 bytes." RETCODE);
- }
- return 0;
- }
-
- if (strlen(password) > 23) {
- if (defaultlanguage == 'F') {
- printf("Mot de passe trop long. Entrez un mot de passe de 4-23 caractères.\n");
- ladmin_log("Mot de passe trop long. Entrez un mot de passe de 4-23 caractères." RETCODE);
- } else {
- printf("Password is too long. Please input a password of 4-23 bytes.\n");
- ladmin_log("Password is too long. Please input a password of 4-23 bytes." RETCODE);
- }
- return 0;
- }
-
- return 1;
-}
-
-//------------------------------------------------------------------
-// Sub-function: Check the name of a command (return complete name)
-//-----------------------------------------------------------------
-int check_command(char * command) {
-// help
- if (strncmp(command, "aide", 2) == 0 && strncmp(command, "aide", strlen(command)) == 0) // not 1 letter command: 'aide' or 'add'?
- strcpy(command, "aide");
- else if (strncmp(command, "help", 1) == 0 && strncmp(command, "help", strlen(command)) == 0)
- strcpy(command, "help");
-// general commands
- else if (strncmp(command, "add", 2) == 0 && strncmp(command, "add", strlen(command)) == 0) // not 1 letter command: 'aide' or 'add'?
- strcpy(command, "add");
- else if ((strncmp(command, "ban", 3) == 0 && strncmp(command, "ban", strlen(command)) == 0) ||
- (strncmp(command, "banish", 4) == 0 && strncmp(command, "banish", strlen(command)) == 0))
- strcpy(command, "ban");
- else if ((strncmp(command, "banadd", 4) == 0 && strncmp(command, "banadd", strlen(command)) == 0) || // not 1 letter command: 'ba' or 'bs'? 'banadd' or 'banset' ?
- strcmp(command, "ba") == 0)
- strcpy(command, "banadd");
- else if ((strncmp(command, "banset", 4) == 0 && strncmp(command, "banset", strlen(command)) == 0) || // not 1 letter command: 'ba' or 'bs'? 'banadd' or 'banset' ?
- strcmp(command, "bs") == 0)
- strcpy(command, "banset");
- else if (strncmp(command, "block", 2) == 0 && strncmp(command, "block", strlen(command)) == 0)
- strcpy(command, "block");
- else if (strncmp(command, "check", 2) == 0 && strncmp(command, "check", strlen(command)) == 0) // not 1 letter command: 'check' or 'create'?
- strcpy(command, "check");
- else if (strncmp(command, "create", 2) == 0 && strncmp(command, "create", strlen(command)) == 0) // not 1 letter command: 'check' or 'create'?
- strcpy(command, "create");
- else if (strncmp(command, "delete", 1) == 0 && strncmp(command, "delete", strlen(command)) == 0)
- strcpy(command, "delete");
- else if ((strncmp(command, "email", 2) == 0 && strncmp(command, "email", strlen(command)) == 0) || // not 1 letter command: 'email', 'end' or 'exit'?
- (strncmp(command, "e-mail", 2) == 0 && strncmp(command, "e-mail", strlen(command)) == 0))
- strcpy(command, "email");
- else if (strncmp(command, "getcount", 2) == 0 && strncmp(command, "getcount", strlen(command)) == 0) // not 1 letter command: 'getcount' or 'gm'?
- strcpy(command, "getcount");
-// else if (strncmp(command, "gm", 2) == 0 && strncmp(command, "gm", strlen(command)) == 0) // not 1 letter command: 'getcount' or 'gm'?
-// strcpy(command, "gm");
-// else if (strncmp(command, "id", 2) == 0 && strncmp(command, "id", strlen(command)) == 0) // not 1 letter command: 'id' or 'info'?
-// strcpy(command, "id");
- else if (strncmp(command, "info", 2) == 0 && strncmp(command, "info", strlen(command)) == 0) // not 1 letter command: 'id' or 'info'?
- strcpy(command, "info");
-// else if (strncmp(command, "kami", 4) == 0 && strncmp(command, "kami", strlen(command)) == 0) // only all letters command: 'kami' or 'kamib'?
-// strcpy(command, "kami");
-// else if (strncmp(command, "kamib", 5) == 0 && strncmp(command, "kamib", strlen(command)) == 0) // only all letters command: 'kami' or 'kamib'?
-// strcpy(command, "kamib");
- else if ((strncmp(command, "language", 2) == 0 && strncmp(command, "language", strlen(command)) == 0)) // not 1 letter command: 'language' or 'list'?
- strcpy(command, "language");
- else if ((strncmp(command, "list", 2) == 0 && strncmp(command, "list", strlen(command)) == 0) || // 'list' is default list command // not 1 letter command: 'language' or 'list'?
- strcmp(command, "ls") == 0)
- strcpy(command, "list");
- else if ((strncmp(command, "listban", 5) == 0 && strncmp(command, "listban", strlen(command)) == 0) ||
- (strncmp(command, "lsban", 3) == 0 && strncmp(command, "lsban", strlen(command)) == 0) ||
- strcmp(command, "lb") == 0)
- strcpy(command, "listban");
- else if ((strncmp(command, "listgm", 5) == 0 && strncmp(command, "listgm", strlen(command)) == 0) ||
- (strncmp(command, "lsgm", 3) == 0 && strncmp(command, "lsgm", strlen(command)) == 0) ||
- strcmp(command, "lg") == 0)
- strcpy(command, "listgm");
- else if ((strncmp(command, "listok", 5) == 0 && strncmp(command, "listok", strlen(command)) == 0) ||
- (strncmp(command, "lsok", 3) == 0 && strncmp(command, "lsok", strlen(command)) == 0) ||
- strcmp(command, "lo") == 0)
- strcpy(command, "listok");
- else if (strncmp(command, "memo", 1) == 0 && strncmp(command, "memo", strlen(command)) == 0)
- strcpy(command, "memo");
- else if (strncmp(command, "name", 1) == 0 && strncmp(command, "name", strlen(command)) == 0)
- strcpy(command, "name");
- else if ((strncmp(command, "password", 1) == 0 && strncmp(command, "password", strlen(command)) == 0) ||
- strcmp(command, "passwd") == 0)
- strcpy(command, "password");
- else if (strncmp(command, "reloadgm", 1) == 0 && strncmp(command, "reloadgm", strlen(command)) == 0)
- strcpy(command, "reloadgm");
- else if (strncmp(command, "search", 3) == 0 && strncmp(command, "search", strlen(command)) == 0) // not 1 letter command: 'search', 'state' or 'sex'?
- strcpy(command, "search"); // not 2 letters command: 'search' or 'sex'?
-// else if (strncmp(command, "sex", 3) == 0 && strncmp(command, "sex", strlen(command)) == 0) // not 1 letter command: 'search', 'state' or 'sex'?
-// strcpy(command, "sex"); // not 2 letters command: 'search' or 'sex'?
- else if (strncmp(command, "state", 2) == 0 && strncmp(command, "state", strlen(command)) == 0) // not 1 letter command: 'search', 'state' or 'sex'?
- strcpy(command, "state");
- else if ((strncmp(command, "timeadd", 5) == 0 && strncmp(command, "timeadd", strlen(command)) == 0) || // not 1 letter command: 'ta' or 'ts'? 'timeadd' or 'timeset'?
- strcmp(command, "ta") == 0)
- strcpy(command, "timeadd");
- else if ((strncmp(command, "timeset", 5) == 0 && strncmp(command, "timeset", strlen(command)) == 0) || // not 1 letter command: 'ta' or 'ts'? 'timeadd' or 'timeset'?
- strcmp(command, "ts") == 0)
- strcpy(command, "timeset");
- else if ((strncmp(command, "unban", 5) == 0 && strncmp(command, "unban", strlen(command)) == 0) ||
- (strncmp(command, "unbanish", 4) == 0 && strncmp(command, "unbanish", strlen(command)) == 0))
- strcpy(command, "unban");
- else if (strncmp(command, "unblock", 4) == 0 && strncmp(command, "unblock", strlen(command)) == 0)
- strcpy(command, "unblock");
- else if (strncmp(command, "version", 1) == 0 && strncmp(command, "version", strlen(command)) == 0)
- strcpy(command, "version");
- else if (strncmp(command, "who", 1) == 0 && strncmp(command, "who", strlen(command)) == 0)
- strcpy(command, "who");
-// quit
- else if (strncmp(command, "quit", 1) == 0 && strncmp(command, "quit", strlen(command)) == 0)
- strcpy(command, "quit");
- else if (strncmp(command, "exit", 2) == 0 && strncmp(command, "exit", strlen(command)) == 0) // not 1 letter command: 'email', 'end' or 'exit'?
- strcpy(command, "exit");
- else if (strncmp(command, "end", 2) == 0 && strncmp(command, "end", strlen(command)) == 0) // not 1 letter command: 'email', 'end' or 'exit'?
- strcpy(command, "end");
-
- return 0;
-}
-
-//-----------------------------------------
-// Sub-function: Display commands of ladmin
-//-----------------------------------------
-void display_help(char* param, int language) {
- char command[1023];
- int i;
-
- memset(command, '\0', sizeof(command));
-
- if (sscanf(param, "%s ", command) < 1 || strlen(command) == 0)
- strcpy(command, ""); // any value that is not a command
-
- if (command[0] == '?') {
- if (defaultlanguage == 'F')
- strcpy(command, "aide");
- else
- strcpy(command, "help");
- }
-
- // lowercase for command
- for (i = 0; command[i]; i++)
- command[i] = tolower(command[i]);
-
- // Analyse of the command
- check_command(command); // give complete name to the command
-
- if (defaultlanguage == 'F') {
- ladmin_log("Affichage des commandes ou d'une commande." RETCODE);
- } else {
- ladmin_log("Displaying of the commands or a command." RETCODE);
- }
-
- if (language == 1) {
- if (strcmp(command, "aide") == 0) {
- printf("aide/help/?\n");
- printf(" Affiche la description des commandes\n");
- printf("aide/help/? [commande]\n");
- printf(" Affiche la description de la commande specifiée\n");
- } else if (strcmp(command, "help") == 0 ) {
- printf("aide/help/?\n");
- printf(" Display the description of the commands\n");
- printf("aide/help/? [command]\n");
- printf(" Display the description of the specified command\n");
-// general commands
- } else if (strcmp(command, "add") == 0) {
- printf("add <nomcompte> <sexe> <motdepasse>\n");
- printf(" Crée un compte avec l'email par défaut (a@a.com).\n");
- printf(" Concernant le sexe, seule la première lettre compte (F ou M).\n");
- printf(" L'e-mail est a@a.com (e-mail par défaut). C'est comme n'avoir aucun e-mail.\n");
- printf(" Lorsque motdepasse est omis, la saisie se fait sans que la frappe se voit.\n");
- printf(" <exemple> add testname Male testpass\n");
- } else if (strcmp(command, "ban") == 0) {
- printf("ban/banish aaaa/mm/jj hh:mm:ss <nom compte>\n");
- printf(" Change la date de fin de bannissement d'un compte.\n");
- printf(" Comme banset, mais <nom compte> est à la fin.\n");
- } else if (strcmp(command, "banadd") == 0) {
- printf("banadd <nomcompte> <Modificateur>\n");
- printf(" Ajoute ou soustrait du temps à la date de banissement d'un compte.\n");
- printf(" Les modificateurs sont construits comme suit:\n");
- printf(" Valeur d'ajustement (-1, 1, +1, etc...)\n");
- printf(" Elément modifié:\n");
- printf(" a ou y: année\n");
- printf(" m: mois\n");
- printf(" j ou d: jour\n");
- printf(" h: heure\n");
- printf(" mn: minute\n");
- printf(" s: seconde\n");
- printf(" <exemple> banadd testname +1m-2mn1s-6a\n");
- printf(" Cette exemple ajoute 1 mois et une seconde, et soustrait 2 minutes\n");
- printf(" et 6 ans dans le même temps.\n");
- printf("NOTE: Si vous modifez la date de banissement d'un compte non bani,\n");
- printf(" vous indiquez comme date (le moment actuel +- les ajustements)\n");
- } else if (strcmp(command, "banset") == 0) {
- printf("banset <nomcompte> aaaa/mm/jj [hh:mm:ss]\n");
- printf(" Change la date de fin de bannissement d'un compte.\n");
- printf(" Heure par défaut [hh:mm:ss]: 23:59:59.\n");
- printf("banset <nomcompte> 0\n");
- printf(" Débanni un compte (0 = de-banni).\n");
- } else if (strcmp(command, "block") == 0) {
- printf("block <nom compte>\n");
- printf(" Place le status d'un compte à 5 (You have been blocked by the GM Team).\n");
- printf(" La commande est l'équivalent de state <nom_compte> 5.\n");
- } else if (strcmp(command, "check") == 0) {
- printf("check <nomcompte> <motdepasse>\n");
- printf(" Vérifie la validité d'un mot de passe pour un compte\n");
- printf(" NOTE: Le serveur n'enverra jamais un mot de passe.\n");
- printf(" C'est la seule méthode que vous possédez pour savoir\n");
- printf(" si un mot de passe est le bon. L'autre méthode est\n");
- printf(" d'avoir un accès ('physique') au fichier des comptes.\n");
- } else if (strcmp(command, "create") == 0) {
- printf("create <nomcompte> <sexe> <email> <motdepasse>\n");
- printf(" Comme la commande add, mais avec l'e-mail en plus.\n");
- printf(" <exemple> create testname Male mon@mail.com testpass\n");
- } else if (strcmp(command, "delete") == 0) {
- printf("del <nom compte>\n");
- printf(" Supprime un compte.\n");
- printf(" La commande demande confirmation. Après confirmation, le compte est détruit.\n");
- } else if (strcmp(command, "email") == 0) {
- printf("email <nomcompte> <email>\n");
- printf(" Modifie l'e-mail d'un compte.\n");
- } else if (strcmp(command, "getcount") == 0) {
- printf("getcount\n");
- printf(" Donne le nombre de joueurs en ligne par serveur de char.\n");
- } else if (strcmp(command, "gm") == 0) {
- printf("gm <nomcompte> [Niveau_GM]\n");
- printf(" Modifie le niveau de GM d'un compte.\n");
- printf(" Valeur par défaut: 0 (suppression du niveau de GM).\n");
- printf(" <exemple> gm nomtest 80\n");
- } else if (strcmp(command, "id") == 0) {
- printf("id <nom compte>\n");
- printf(" Donne l'id d'un compte.\n");
- } else if (strcmp(command, "info") == 0) {
- printf("info <idcompte>\n");
- printf(" Affiche les informations sur un compte.\n");
- } else if (strcmp(command, "kami") == 0) {
- printf("kami <message>\n");
- printf(" Envoi un message général sur tous les serveurs de map (en jaune).\n");
- } else if (strcmp(command, "kamib") == 0) {
- printf("kamib <message>\n");
- printf(" Envoi un message général sur tous les serveurs de map (en bleu).\n");
- } else if (strcmp(command, "language") == 0) {
- printf("language <langue>\n");
- printf(" Change la langue d'affichage.\n");
- printf(" Langues possibles: 'Français' ou 'English'.\n");
- } else if (strcmp(command, "list") == 0) {
- printf("list/ls [Premier_id [Dernier_id]]\n");
- printf(" Affiche une liste de comptes.\n");
- printf(" 'Premier_id', 'Dernier_id': indique les identifiants de départ et de fin.\n");
- printf(" La recherche par nom n'est pas possible avec cette commande.\n");
- printf(" <example> list 10 9999999\n");
- } else if (strcmp(command, "listban") == 0) {
- printf("listBan/lsBan [Premier_id [Dernier_id]]\n");
- printf(" Comme list/ls, mais seulement pour les comptes avec statut ou bannis.\n");
- } else if (strcmp(command, "listgm") == 0) {
- printf("listGM/lsGM [Premier_id [Dernier_id]]\n");
- printf(" Comme list/ls, mais seulement pour les comptes GM.\n");
- } else if (strcmp(command, "listok") == 0) {
- printf("listOK/lsOK [Premier_id [Dernier_id]]\n");
- printf(" Comme list/ls, mais seulement pour les comptes sans statut et non bannis.\n");
- } else if (strcmp(command, "memo") == 0) {
- printf("memo <nomcompte> <memo>\n");
- printf(" Modifie le mémo d'un compte.\n");
- printf(" 'memo': Il peut avoir jusqu'à 253 caractères (avec des espaces ou non).\n");
- } else if (strcmp(command, "name") == 0) {
- printf("name <idcompte>\n");
- printf(" Donne le nom d'un compte.\n");
- } else if (strcmp(command, "password") == 0) {
- printf("passwd <nomcompte> <nouveaumotdepasse>\n");
- printf(" Change le mot de passe d'un compte.\n");
- printf(" Lorsque nouveaumotdepasse est omis,\n");
- printf(" la saisie se fait sans que la frappe ne se voit.\n");
- } else if (strcmp(command, "reloadgm") == 0) {
- printf("reloadGM\n");
- printf(" Reload GM configuration file\n");
- } else if (strcmp(command, "search") == 0) {
- printf("search <expression>\n");
- printf(" Cherche des comptes.\n");
- printf(" Affiche les comptes dont les noms correspondent.\n");
-// printf("search -r/-e/--expr/--regex <expression>\n");
-// printf(" Cherche des comptes par expression regulière.\n");
-// printf(" Affiche les comptes dont les noms correspondent.\n");
- } else if (strcmp(command, "sex") == 0) {
- printf("sex <nomcompte> <sexe>\n");
- printf(" Modifie le sexe d'un compte.\n");
- printf(" <exemple> sex testname Male\n");
- } else if (strcmp(command, "state") == 0) {
- printf("state <nomcompte> <nouveaustatut> <message_erreur_7>\n");
- printf(" Change le statut d'un compte.\n");
- printf(" 'nouveaustatut': Le statut est le même que celui du packet 0x006a + 1.\n");
- printf(" les possibilités sont:\n");
- printf(" 0 = Compte ok\n");
- printf(" 1 = Unregistered ID\n");
- printf(" 2 = Incorrect Password\n");
- printf(" 3 = This ID is expired\n");
- printf(" 4 = Rejected from Server\n");
- printf(" 5 = You have been blocked by the GM Team\n");
- printf(" 6 = Your Game's EXE file is not the latest version\n");
- printf(" 7 = You are Prohibited to log in until...\n");
- printf(" 8 = Server is jammed due to over populated\n");
- printf(" 9 = No MSG\n");
- printf(" 100 = This ID has been totally erased\n");
- printf(" all other values are 'No MSG', then use state 9 please.\n");
- printf(" 'message_erreur_7': message du code erreur 6 =\n");
- printf(" = Your are Prohibited to log in until... (packet 0x006a)\n");
- } else if (strcmp(command, "timeadd") == 0) {
- printf("timeadd <nomcompte> <modificateur>\n");
- printf(" Ajoute/soustrait du temps à la limite de validité d'un compte.\n");
- printf(" Le modificateur est composé comme suit:\n");
- printf(" Valeur modificatrice (-1, 1, +1, etc...)\n");
- printf(" Elément modifié:\n");
- printf(" a ou y: année\n");
- printf(" m: mois\n");
- printf(" j ou d: jour\n");
- printf(" h: heure\n");
- printf(" mn: minute\n");
- printf(" s: seconde\n");
- printf(" <exemple> timeadd testname +1m-2mn1s-6a\n");
- printf(" Cette exemple ajoute 1 mois et une seconde, et soustrait 2 minutes\n");
- printf(" et 6 ans dans le même temps.\n");
- printf("NOTE: Vous ne pouvez pas modifier une limite de validité illimitée. Si vous\n");
- printf(" désirez le faire, c'est que vous voulez probablement créer un limite de\n");
- printf(" validité limitée. Donc, en premier, fixé une limite de valitidé.\n");
- } else if (strcmp(command, "timeadd") == 0) {
- printf("timeset <nomcompte> aaaa/mm/jj [hh:mm:ss]\n");
- printf(" Change la limite de validité d'un compte.\n");
- printf(" Heure par défaut [hh:mm:ss]: 23:59:59.\n");
- printf("timeset <nomcompte> 0\n");
- printf(" Donne une limite de validité illimitée (0 = illimitée).\n");
- } else if (strcmp(command, "unban") == 0) {
- printf("unban/unbanish <nom compte>\n");
- printf(" Ote le banissement d'un compte.\n");
- printf(" La commande est l'équivalent de banset <nom_compte> 0.\n");
- } else if (strcmp(command, "unblock") == 0) {
- printf("unblock <nom compte>\n");
- printf(" Place le status d'un compte à 0 (Compte ok).\n");
- printf(" La commande est l'équivalent de state <nom_compte> 0.\n");
- } else if (strcmp(command, "version") == 0) {
- printf("version\n");
- printf(" Affiche la version du login-serveur.\n");
- } else if (strcmp(command, "who") == 0) {
- printf("who <nom compte>\n");
- printf(" Affiche les informations sur un compte.\n");
-// quit
- } else if (strcmp(command, "quit") == 0 ||
- strcmp(command, "exit") == 0 ||
- strcmp(command, "end") == 0) {
- printf("quit/end/exit\n");
- printf(" Fin du programme d'administration.\n");
-// unknown command
- } else {
- if (strlen(command) > 0)
- printf("Commande inconnue [%s] pour l'aide. Affichage de toutes les commandes.\n", command);
- printf(" aide/help/? -- Affiche cet aide\n");
- printf(" aide/help/? [commande] -- Affiche l'aide de la commande\n");
- printf(" add <nomcompte> <sexe> <motdepasse> -- Crée un compte (sans email)\n");
- printf(" ban/banish aaaa/mm/jj hh:mm:ss <nom compte> -- Fixe la date finale de banismnt\n");
- printf(" banadd/ba <nomcompte> <modificateur> -- Ajout/soustrait du temps à la\n");
- printf(" exemple: ba moncompte +1m-2mn1s-2y date finale de banissement\n");
- printf(" banset/bs <nomcompte> aaaa/mm/jj [hh:mm:ss] -- Change la date fin de banisemnt\n");
- printf(" banset/bs <nomcompte> 0 -- Dé-banis un compte.\n");
- printf(" block <nom compte> -- Mets le status d'un compte à 5 (blocked by the GM Team)\n");
- printf(" check <nomcompte> <motdepasse> -- Vérifie un mot de passe d'un compte\n");
- printf(" create <nomcompte> <sexe> <email> <motdepasse> -- Crée un compte (avec email)\n");
- printf(" del <nom compte> -- Supprime un compte\n");
- printf(" email <nomcompte> <email> -- Modifie l'e-mail d'un compte\n");
- printf(" getcount -- Donne le nb de joueurs en ligne\n");
- printf(" gm <nomcompte> [Niveau_GM] -- Modifie le niveau de GM d'un compte\n");
- printf(" id <nom compte> -- Donne l'id d'un compte\n");
- printf(" info <idcompte> -- Affiche les infos sur un compte\n");
- printf(" kami <message> -- Envoi un message général (en jaune)\n");
- printf(" kamib <message> -- Envoi un message général (en bleu)\n");
- printf(" language <langue> -- Change la langue d'affichage.\n");
- printf(" list/ls [Premier_id [Dernier_id] ] -- Affiche une liste de comptes\n");
- printf(" listBan/lsBan [Premier_id [Dernier_id] ] -- Affiche une liste de comptes\n");
- printf(" avec un statut ou bannis\n");
- printf(" listGM/lsGM [Premier_id [Dernier_id] ] -- Affiche une liste de comptes GM\n");
- printf(" listOK/lsOK [Premier_id [Dernier_id] ] -- Affiche une liste de comptes\n");
- printf(" sans status et non bannis\n");
- printf(" memo <nomcompte> <memo> -- Modifie le memo d'un compte\n");
- printf(" name <idcompte> -- Donne le nom d'un compte\n");
- printf(" passwd <nomcompte> <nouveaumotdepasse> -- Change le mot de passe d'un compte\n");
- printf(" quit/end/exit -- Fin du programme d'administation\n");
- printf(" reloadGM -- Recharger le fichier de config des GM\n");
- printf(" search <expression> -- Cherche des comptes\n");
-// printf(" search -e/-r/--expr/--regex <expression> -- Cherche des comptes par REGEX\n");
- printf(" sex <nomcompte> <sexe> -- Modifie le sexe d'un compte\n");
- printf(" state <nomcompte> <nouveaustatut> <messageerr7> -- Change le statut d'1 compte\n");
- printf(" timeadd/ta <nomcompte> <modificateur> -- Ajout/soustrait du temps à la\n");
- printf(" exemple: ta moncompte +1m-2mn1s-2y limite de validité\n");
- printf(" timeset/ts <nomcompte> aaaa/mm/jj [hh:mm:ss] -- Change la limite de validité\n");
- printf(" timeset/ts <nomcompte> 0 -- limite de validité = illimitée\n");
- printf(" unban/unbanish <nom compte> -- Ote le banissement d'un compte\n");
- printf(" unblock <nom compte> -- Mets le status d'un compte à 0 (Compte ok)\n");
- printf(" version -- Donne la version du login-serveur\n");
- printf(" who <nom compte> -- Affiche les infos sur un compte\n");
- printf(" Note: Pour les noms de compte avec des espaces, tapez \"<nom compte>\" (ou ').\n");
- }
- } else {
- if (strcmp(command, "aide") == 0) {
- printf("aide/help/?\n");
- printf(" Display the description of the commands\n");
- printf("aide/help/? [command]\n");
- printf(" Display the description of the specified command\n");
- } else if (strcmp(command, "help") == 0 ) {
- printf("aide/help/?\n");
- printf(" Display the description of the commands\n");
- printf("aide/help/? [command]\n");
- printf(" Display the description of the specified command\n");
-// general commands
- } else if (strcmp(command, "add") == 0) {
- printf("add <account_name> <sex> <password>\n");
- printf(" Create an account with the default email (a@a.com).\n");
- printf(" Concerning the sex, only the first letter is used (F or M).\n");
- printf(" The e-mail is set to a@a.com (default e-mail). It's like to have no e-mail.\n");
- printf(" When the password is omitted,\n");
- printf(" the input is done without displaying of the pressed keys.\n");
- printf(" <example> add testname Male testpass\n");
- } else if (strcmp(command, "ban") == 0) {
- printf("ban/banish yyyy/mm/dd hh:mm:ss <account name>\n");
- printf(" Changes the final date of a banishment of an account.\n");
- printf(" Like banset, but <account name> is at end.\n");
- } else if (strcmp(command, "banadd") == 0) {
- printf("banadd <account_name> <modifier>\n");
- printf(" Adds or substracts time from the final date of a banishment of an account.\n");
- printf(" Modifier is done as follows:\n");
- printf(" Adjustment value (-1, 1, +1, etc...)\n");
- printf(" Modified element:\n");
- printf(" a or y: year\n");
- printf(" m: month\n");
- printf(" j or d: day\n");
- printf(" h: hour\n");
- printf(" mn: minute\n");
- printf(" s: second\n");
- printf(" <example> banadd testname +1m-2mn1s-6y\n");
- printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n");
- printf(" and 6 years at the same time.\n");
- printf("NOTE: If you modify the final date of a non-banished account,\n");
- printf(" you fix the final date to (actual time +- adjustments)\n");
- } else if (strcmp(command, "banset") == 0) {
- printf("banset <account_name> yyyy/mm/dd [hh:mm:ss]\n");
- printf(" Changes the final date of a banishment of an account.\n");
- printf(" Default time [hh:mm:ss]: 23:59:59.\n");
- printf("banset <account_name> 0\n");
- printf(" Set a non-banished account (0 = unbanished).\n");
- } else if (strcmp(command, "block") == 0) {
- printf("block <account name>\n");
- printf(" Set state 5 (You have been blocked by the GM Team) to an account.\n");
- printf(" This command works like state <account_name> 5.\n");
- } else if (strcmp(command, "check") == 0) {
- printf("check <account_name> <password>\n");
- printf(" Check the validity of a password for an account.\n");
- printf(" NOTE: Server will never sends back a password.\n");
- printf(" It's the only method you have to know if a password is correct.\n");
- printf(" The other method is to have a ('physical') access to the accounts file.\n");
- } else if (strcmp(command, "create") == 0) {
- printf("create <account_name> <sex> <email> <password>\n");
- printf(" Like the 'add' command, but with e-mail moreover.\n");
- printf(" <example> create testname Male my@mail.com testpass\n");
- } else if (strcmp(command, "delete") == 0) {
- printf("del <account name>\n");
- printf(" Remove an account.\n");
- printf(" This order requires confirmation. After confirmation, the account is deleted.\n");
- } else if (strcmp(command, "email") == 0) {
- printf("email <account_name> <email>\n");
- printf(" Modify the e-mail of an account.\n");
- } else if (strcmp(command, "getcount") == 0) {
- printf("getcount\n");
- printf(" Give the number of players online on all char-servers.\n");
- } else if (strcmp(command, "gm") == 0) {
- printf("gm <account_name> [GM_level]\n");
- printf(" Modify the GM level of an account.\n");
- printf(" Default value remove GM level (GM level = 0).\n");
- printf(" <example> gm testname 80\n");
- } else if (strcmp(command, "id") == 0) {
- printf("id <account name>\n");
- printf(" Give the id of an account.\n");
- } else if (strcmp(command, "info") == 0) {
- printf("info <account_id>\n");
- printf(" Display complete information of an account.\n");
- } else if (strcmp(command, "kami") == 0) {
- printf("kami <message>\n");
- printf(" Sends a broadcast message on all map-server (in yellow).\n");
- } else if (strcmp(command, "kamib") == 0) {
- printf("kamib <message>\n");
- printf(" Sends a broadcast message on all map-server (in blue).\n");
- } else if (strcmp(command, "language") == 0) {
- printf("language <language>\n");
- printf(" Change the language of displaying.\n");
- printf(" Possible languages: Français or English.\n");
- } else if (strcmp(command, "list") == 0) {
- printf("list/ls [start_id [end_id]]\n");
- printf(" Display a list of accounts.\n");
- printf(" 'start_id', 'end_id': indicate end and start identifiers.\n");
- printf(" Research by name is not possible with this command.\n");
- printf(" <example> list 10 9999999\n");
- } else if (strcmp(command, "listban") == 0) {
- printf("listBan/lsBan [start_id [end_id]]\n");
- printf(" Like list/ls, but only for accounts with state or banished.\n");
- } else if (strcmp(command, "listgm") == 0) {
- printf("listGM/lsGM [start_id [end_id]]\n");
- printf(" Like list/ls, but only for GM accounts.\n");
- } else if (strcmp(command, "listok") == 0) {
- printf("listOK/lsOK [start_id [end_id]]\n");
- printf(" Like list/ls, but only for accounts without state and not banished.\n");
- } else if (strcmp(command, "memo") == 0) {
- printf("memo <account_name> <memo>\n");
- printf(" Modify the memo of an account.\n");
- printf(" 'memo': it can have until 253 characters (with spaces or not).\n");
- } else if (strcmp(command, "name") == 0) {
- printf("name <account_id>\n");
- printf(" Give the name of an account.\n");
- } else if (strcmp(command, "password") == 0) {
- printf("passwd <account_name> <new_password>\n");
- printf(" Change the password of an account.\n");
- printf(" When new password is omitted,\n");
- printf(" the input is done without displaying of the pressed keys.\n");
- } else if (strcmp(command, "reloadgm") == 0) {
- printf("reloadGM\n");
- printf(" Reload GM configuration file\n");
- } else if (strcmp(command, "search") == 0) {
- printf("search <expression>\n");
- printf(" Seek accounts.\n");
- printf(" Displays the accounts whose names correspond.\n");
-// printf("search -r/-e/--expr/--regex <expression>\n");
-// printf(" Seek accounts by regular expression.\n");
-// printf(" Displays the accounts whose names correspond.\n");
- } else if (strcmp(command, "sex") == 0) {
- printf("sex <account_name> <sex>\n");
- printf(" Modify the sex of an account.\n");
- printf(" <example> sex testname Male\n");
- } else if (strcmp(command, "state") == 0) {
- printf("state <account_name> <new_state> <error_message_#7>\n");
- printf(" Change the state of an account.\n");
- printf(" 'new_state': state is the state of the packet 0x006a + 1.\n");
- printf(" The possibilities are:\n");
- printf(" 0 = Account ok\n");
- printf(" 1 = Unregistered ID\n");
- printf(" 2 = Incorrect Password\n");
- printf(" 3 = This ID is expired\n");
- printf(" 4 = Rejected from Server\n");
- printf(" 5 = You have been blocked by the GM Team\n");
- printf(" 6 = Your Game's EXE file is not the latest version\n");
- printf(" 7 = You are Prohibited to log in until...\n");
- printf(" 8 = Server is jammed due to over populated\n");
- printf(" 9 = No MSG\n");
- printf(" 100 = This ID has been totally erased\n");
- printf(" all other values are 'No MSG', then use state 9 please.\n");
- printf(" 'error_message_#7': message of the code error 6\n");
- printf(" = Your are Prohibited to log in until... (packet 0x006a)\n");
- } else if (strcmp(command, "timeadd") == 0) {
- printf("timeadd <account_name> <modifier>\n");
- printf(" Adds or substracts time from the validity limit of an account.\n");
- printf(" Modifier is done as follows:\n");
- printf(" Adjustment value (-1, 1, +1, etc...)\n");
- printf(" Modified element:\n");
- printf(" a or y: year\n");
- printf(" m: month\n");
- printf(" j or d: day\n");
- printf(" h: hour\n");
- printf(" mn: minute\n");
- printf(" s: second\n");
- printf(" <example> timeadd testname +1m-2mn1s-6y\n");
- printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n");
- printf(" and 6 years at the same time.\n");
- printf("NOTE: You can not modify a unlimited validity limit.\n");
- printf(" If you want modify it, you want probably create a limited validity limit.\n");
- printf(" So, at first, you must set the validity limit to a date/time.\n");
- } else if (strcmp(command, "timeadd") == 0) {
- printf("timeset <account_name> yyyy/mm/dd [hh:mm:ss]\n");
- printf(" Changes the validity limit of an account.\n");
- printf(" Default time [hh:mm:ss]: 23:59:59.\n");
- printf("timeset <account_name> 0\n");
- printf(" Gives an unlimited validity limit (0 = unlimited).\n");
- } else if (strcmp(command, "unban") == 0) {
- printf("unban/unbanish <account name>\n");
- printf(" Remove the banishment of an account.\n");
- printf(" This command works like banset <account_name> 0.\n");
- } else if (strcmp(command, "unblock") == 0) {
- printf("unblock <account name>\n");
- printf(" Set state 0 (Account ok) to an account.\n");
- printf(" This command works like state <account_name> 0.\n");
- } else if (strcmp(command, "version") == 0) {
- printf("version\n");
- printf(" Display the version of the login-server.\n");
- } else if (strcmp(command, "who") == 0) {
- printf("who <account name>\n");
- printf(" Displays complete information of an account.\n");
-// quit
- } else if (strcmp(command, "quit") == 0 ||
- strcmp(command, "exit") == 0 ||
- strcmp(command, "end") == 0) {
- printf("quit/end/exit\n");
- printf(" End of the program of administration.\n");
-// unknown command
- } else {
- if (strlen(command) > 0)
- printf("Unknown command [%s] for help. Displaying of all commands.\n", command);
- printf(" aide/help/? -- Display this help\n");
- printf(" aide/help/? [command] -- Display the help of the command\n");
- printf(" add <account_name> <sex> <password> -- Create an account with default email\n");
- printf(" ban/banish yyyy/mm/dd hh:mm:ss <account name> -- Change final date of a ban\n");
- printf(" banadd/ba <account_name> <modifier> -- Add or substract time from the final\n");
- printf(" example: ba apple +1m-2mn1s-2y date of a banishment of an account\n");
- printf(" banset/bs <account_name> yyyy/mm/dd [hh:mm:ss] -- Change final date of a ban\n");
- printf(" banset/bs <account_name> 0 -- Un-banish an account\n");
- printf(" block <account name> -- Set state 5 (blocked by the GM Team) to an account\n");
- printf(" check <account_name> <password> -- Check the validity of a password\n");
- printf(" create <account_name> <sex> <email> <passwrd> -- Create an account with email\n");
- printf(" del <account name> -- Remove an account\n");
- printf(" email <account_name> <email> -- Modify an email of an account\n");
- printf(" getcount -- Give the number of players online\n");
- printf(" gm <account_name> [GM_level] -- Modify the GM level of an account\n");
- printf(" id <account name> -- Give the id of an account\n");
- printf(" info <account_id> -- Display all information of an account\n");
- printf(" kami <message> -- Sends a broadcast message (in yellow)\n");
- printf(" kamib <message> -- Sends a broadcast message (in blue)\n");
- printf(" language <language> -- Change the language of displaying.\n");
- printf(" list/ls [First_id [Last_id]] -- Display a list of accounts\n");
- printf(" listBan/lsBan [First_id [Last_id] ] -- Display a list of accounts\n");
- printf(" with state or banished\n");
- printf(" listGM/lsGM [First_id [Last_id]] -- Display a list of GM accounts\n");
- printf(" listOK/lsOK [First_id [Last_id] ] -- Display a list of accounts\n");
- printf(" without state and not banished\n");
- printf(" memo <account_name> <memo> -- Modify the memo of an account\n");
- printf(" name <account_id> -- Give the name of an account\n");
- printf(" passwd <account_name> <new_password> -- Change the password of an account\n");
- printf(" quit/end/exit -- End of the program of administation\n");
- printf(" reloadGM -- Reload GM configuration file\n");
- printf(" search <expression> -- Seek accounts\n");
-// printf(" search -e/-r/--expr/--regex <expressn> -- Seek accounts by regular-expression\n");
- printf(" sex <nomcompte> <sexe> -- Modify the sex of an account\n");
- printf(" state <account_name> <new_state> <error_message_#7> -- Change the state\n");
- printf(" timeadd/ta <account_name> <modifier> -- Add or substract time from the\n");
- printf(" example: ta apple +1m-2mn1s-2y validity limit of an account\n");
- printf(" timeset/ts <account_name> yyyy/mm/dd [hh:mm:ss] -- Change the validify limit\n");
- printf(" timeset/ts <account_name> 0 -- Give a unlimited validity limit\n");
- printf(" unban/unbanish <account name> -- Remove the banishment of an account\n");
- printf(" unblock <account name> -- Set state 0 (Account ok) to an account\n");
- printf(" version -- Gives the version of the login-server\n");
- printf(" who <account name> -- Display all information of an account\n");
- printf(" who <account name> -- Display all information of an account\n");
- printf(" Note: To use spaces in an account name, type \"<account name>\" (or ').\n");
- }
- }
-}
-
-//-----------------------------
-// Sub-function: add an account
-//-----------------------------
-int addaccount(char* param, int emailflag) {
- char name[1023], sex[1023], email[1023], password[1023];
-// int i;
-
- memset(name, '\0', sizeof(name));
- memset(sex, '\0', sizeof(sex));
- memset(email, '\0', sizeof(email));
- memset(password, '\0', sizeof(password));
-
- if (emailflag == 0) { // add command
- if (sscanf(param, "\"%[^\"]\" %s %[^\r\n]", name, sex, password) < 2 && // password can be void
- sscanf(param, "'%[^']' %s %[^\r\n]", name, sex, password) < 2 && // password can be void
- sscanf(param, "%s %s %[^\r\n]", name, sex, password) < 2) { // password can be void
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte, un sexe et un mot de passe svp.\n");
- printf("<exemple> add nomtest Male motdepassetest\n");
- ladmin_log("Nombre incorrect de paramètres pour créer un compte (commande 'add')." RETCODE);
- } else {
- printf("Please input an account name, a sex and a password.\n");
- printf("<example> add testname Male testpass\n");
- ladmin_log("Incomplete parameters to create an account ('add' command)." RETCODE);
- }
- return 136;
- }
- strcpy(email, "a@a.com"); // default email
- } else { // 1: create command
- if (sscanf(param, "\"%[^\"]\" %s %s %[^\r\n]", name, sex, email, password) < 3 && // password can be void
- sscanf(param, "'%[^']' %s %s %[^\r\n]", name, sex, email, password) < 3 && // password can be void
- sscanf(param, "%s %s %s %[^\r\n]", name, sex, email, password) < 3) { // password can be void
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte, un sexe et un mot de passe svp.\n");
- printf("<exemple> create nomtest Male mo@mail.com motdepassetest\n");
- ladmin_log("Nombre incorrect de paramètres pour créer un compte (commande 'create')." RETCODE);
- } else {
- printf("Please input an account name, a sex and a password.\n");
- printf("<example> create testname Male my@mail.com testpass\n");
- ladmin_log("Incomplete parameters to create an account ('create' command)." RETCODE);
- }
- return 136;
- }
- }
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
-/* for(i = 0; name[i]; i++) {
- if (strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_", name[i]) == NULL) {
- if (defaultlanguage == 'F') {
- printf("Caractère interdit (%c) trouvé dans le nom du compte (%d%s caractère).\n", name[i], i+1, makeordinal(i+1));
- ladmin_log("Caractère interdit (%c) trouvé dans le nom du compte (%d%s caractère)." RETCODE, name[i], i+1, makeordinal(i+1));
- } else {
- printf("Illegal character (%c) found in the account name (%d%s character).\n", name[i], i+1, makeordinal(i+1));
- ladmin_log("Illegal character (%c) found in the account name (%d%s character)." RETCODE, name[i], i+1, makeordinal(i+1));
- }
- return 101;
- }
- }*/
-
- sex[0] = toupper(sex[0]);
- if (strchr("MF", sex[0]) == NULL) {
- if (defaultlanguage == 'F') {
- printf("Sexe incorrect [%s]. Entrez M ou F svp.\n", sex);
- ladmin_log("Sexe incorrect [%s]. Entrez M ou F svp." RETCODE, sex);
- } else {
- printf("Illegal gender [%s]. Please input M or F.\n", sex);
- ladmin_log("Illegal gender [%s]. Please input M or F." RETCODE, sex);
- }
- return 103;
- }
-
- if (strlen(email) < 3) {
- if (defaultlanguage == 'F') {
- printf("Email trop courte [%s]. Entrez une e-mail valide svp.\n", email);
- ladmin_log("Email trop courte [%s]. Entrez une e-mail valide svp." RETCODE, email);
- } else {
- printf("Email is too short [%s]. Please input a valid e-mail.\n", email);
- ladmin_log("Email is too short [%s]. Please input a valid e-mail." RETCODE, email);
- }
- return 109;
- }
- if (strlen(email) > 39) {
- if (defaultlanguage == 'F') {
- printf("Email trop longue [%s]. Entrez une e-mail de 39 caractères maximum svp.\n", email);
- ladmin_log("Email trop longue [%s]. Entrez une e-mail de 39 caractères maximum svp." RETCODE, email);
- } else {
- printf("Email is too long [%s]. Please input an e-mail with 39 bytes at the most.\n", email);
- ladmin_log("Email is too long [%s]. Please input an e-mail with 39 bytes at the most." RETCODE, email);
- }
- return 109;
- }
- if (e_mail_check(email) == 0) {
- if (defaultlanguage == 'F') {
- printf("Email incorrecte [%s]. Entrez une e-mail valide svp.\n", email);
- ladmin_log("Email incorrecte [%s]. Entrez une e-mail valide svp." RETCODE, email);
- } else {
- printf("Invalid email [%s]. Please input a valid e-mail.\n", email);
- ladmin_log("Invalid email [%s]. Please input a valid e-mail." RETCODE, email);
- }
- return 109;
- }
-
- if (strlen(password) == 0) {
- if (typepasswd(password) == 0)
- return 108;
- }
- if (verify_password(password) == 0)
- return 104;
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour créer un compte." RETCODE);
- } else {
- ladmin_log("Request to login-server to create an account." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7930;
- memcpy(WFIFOP(login_fd,2), name, 24);
- memcpy(WFIFOP(login_fd,26), password, 24);
- WFIFOB(login_fd,50) = sex[0];
- memcpy(WFIFOP(login_fd,51), email, 40);
- WFIFOSET(login_fd,91);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//---------------------------------------------------------------------------------
-// Sub-function: Add/substract time to the final date of a banishment of an account
-//---------------------------------------------------------------------------------
-int banaddaccount(char* param) {
- char name[1023], modif[1023];
- int year, month, day, hour, minute, second;
- char * p_modif;
- int value, i;
-
- memset(name, '\0', sizeof(name));
- memset(modif, '\0', sizeof(modif));
- year = month = day = hour = minute = second = 0;
-
- if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, modif) < 2 &&
- sscanf(param, "'%[^']' %[^\r\n]", name, modif) < 2 &&
- sscanf(param, "%s %[^\r\n]", name, modif) < 2) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte et un modificateur svp.\n");
- printf(" <exemple> banadd nomtest +1m-2mn1s-6y\n");
- printf(" Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n");
- printf(" et 6 ans dans le même temps.\n");
- ladmin_log("Nombre incorrect de paramètres pour modifier la fin de ban d'un compte (commande 'banadd')." RETCODE);
- } else {
- printf("Please input an account name and a modifier.\n");
- printf(" <example>: banadd testname +1m-2mn1s-6y\n");
- printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n");
- printf(" and 6 years at the same time.\n");
- ladmin_log("Incomplete parameters to modify the ban date/time of an account ('banadd' command)." RETCODE);
- }
- return 136;
- }
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- // lowercase for modif
- for (i = 0; modif[i]; i++)
- modif[i] = tolower(modif[i]);
- p_modif = modif;
- while (strlen(p_modif) > 0) {
- value = atoi(p_modif);
- if (value == 0) {
- p_modif++;
- } else {
- if (p_modif[0] == '-' || p_modif[0] == '+')
- p_modif++;
- while (strlen(p_modif) > 0 && p_modif[0] >= '0' && p_modif[0] <= '9') {
- p_modif++;
- }
- if (p_modif[0] == 's') {
- second = value;
- p_modif++;
- } else if (p_modif[0] == 'm' && p_modif[1] == 'n') {
- minute = value;
- p_modif += 2;
- } else if (p_modif[0] == 'h') {
- hour = value;
- p_modif++;
- } else if (p_modif[0] == 'd' || p_modif[0] == 'j') {
- day = value;
- p_modif += 2;
- } else if (p_modif[0] == 'm') {
- month = value;
- p_modif++;
- } else if (p_modif[0] == 'y' || p_modif[0] == 'a') {
- year = value;
- p_modif++;
- } else {
- p_modif++;
- }
- }
- }
-
- if (defaultlanguage == 'F') {
- printf(" année: %d\n", year);
- printf(" mois: %d\n", month);
- printf(" jour: %d\n", day);
- printf(" heure: %d\n", hour);
- printf(" minute: %d\n", minute);
- printf(" seconde: %d\n", second);
- } else {
- printf(" year: %d\n", year);
- printf(" month: %d\n", month);
- printf(" day: %d\n", day);
- printf(" hour: %d\n", hour);
- printf(" minute: %d\n", minute);
- printf(" second: %d\n", second);
- }
-
- if (year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 && second == 0) {
- if (defaultlanguage == 'F') {
- printf("Vous devez entrer un ajustement avec cette commande, svp:\n");
- printf(" Valeur d'ajustement (-1, 1, +1, etc...)\n");
- printf(" Element modifié:\n");
- printf(" a ou y: année\n");
- printf(" m: mois\n");
- printf(" j ou d: jour\n");
- printf(" h: heure\n");
- printf(" mn: minute\n");
- printf(" s: seconde\n");
- printf(" <exemple> banadd nomtest +1m-2mn1s-6y\n");
- printf(" Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n");
- printf(" et 6 ans dans le même temps.\n");
- ladmin_log("Aucun ajustement n'est pas un ajustement (commande 'banadd')." RETCODE);
- } else {
- printf("Please give an adjustment with this command:\n");
- printf(" Adjustment value (-1, 1, +1, etc...)\n");
- printf(" Modified element:\n");
- printf(" a or y: year\n");
- printf(" m: month\n");
- printf(" j or d: day\n");
- printf(" h: hour\n");
- printf(" mn: minute\n");
- printf(" s: second\n");
- printf(" <example> banadd testname +1m-2mn1s-6y\n");
- printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n");
- printf(" and 6 years at the same time.\n");
- ladmin_log("No adjustment isn't an adjustment ('banadd' command)." RETCODE);
- }
- return 137;
- }
- if (year > 127 || year < -127) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement d'années correct (de -127 à 127), svp.\n");
- ladmin_log("Ajustement de l'année hors norme (commande 'banadd')." RETCODE);
- } else {
- printf("Please give a correct adjustment for the years (from -127 to 127).\n");
- ladmin_log("Abnormal adjustement for the year ('banadd' command)." RETCODE);
- }
- return 137;
- }
- if (month > 255 || month < -255) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement de mois correct (de -255 à 255), svp.\n");
- ladmin_log("Ajustement du mois hors norme (commande 'banadd')." RETCODE);
- } else {
- printf("Please give a correct adjustment for the months (from -255 to 255).\n");
- ladmin_log("Abnormal adjustement for the month ('banadd' command)." RETCODE);
- }
- return 137;
- }
- if (day > 32767 || day < -32767) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement de jours correct (de -32767 à 32767), svp.\n");
- ladmin_log("Ajustement des jours hors norme (commande 'banadd')." RETCODE);
- } else {
- printf("Please give a correct adjustment for the days (from -32767 to 32767).\n");
- ladmin_log("Abnormal adjustement for the days ('banadd' command)." RETCODE);
- }
- return 137;
- }
- if (hour > 32767 || hour < -32767) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement d'heures correct (de -32767 à 32767), svp.\n");
- ladmin_log("Ajustement des heures hors norme (commande 'banadd')." RETCODE);
- } else {
- printf("Please give a correct adjustment for the hours (from -32767 to 32767).\n");
- ladmin_log("Abnormal adjustement for the hours ('banadd' command)." RETCODE);
- }
- return 137;
- }
- if (minute > 32767 || minute < -32767) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement de minutes correct (de -32767 à 32767), svp.\n");
- ladmin_log("Ajustement des minutes hors norme (commande 'banadd')." RETCODE);
- } else {
- printf("Please give a correct adjustment for the minutes (from -32767 to 32767).\n");
- ladmin_log("Abnormal adjustement for the minutes ('banadd' command)." RETCODE);
- }
- return 137;
- }
- if (second > 32767 || second < -32767) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement de secondes correct (de -32767 à 32767), svp.\n");
- ladmin_log("Ajustement des secondes hors norme (commande 'banadd')." RETCODE);
- } else {
- printf("Please give a correct adjustment for the seconds (from -32767 to 32767).\n");
- ladmin_log("Abnormal adjustement for the seconds ('banadd' command)." RETCODE);
- }
- return 137;
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour modifier la date d'un bannissement." RETCODE);
- } else {
- ladmin_log("Request to login-server to modify a ban date/time." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x794c;
- memcpy(WFIFOP(login_fd,2), name, 24);
- WFIFOW(login_fd,26) = (short)year;
- WFIFOW(login_fd,28) = (short)month;
- WFIFOW(login_fd,30) = (short)day;
- WFIFOW(login_fd,32) = (short)hour;
- WFIFOW(login_fd,34) = (short)minute;
- WFIFOW(login_fd,36) = (short)second;
- WFIFOSET(login_fd,38);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//-----------------------------------------------------------------------
-// Sub-function of sub-function banaccount, unbanaccount or bansetaccount
-// Set the final date of a banishment of an account
-//-----------------------------------------------------------------------
-int bansetaccountsub(char* name, char* date, char* time) {
- int year, month, day, hour, minute, second;
- time_t ban_until_time; // # of seconds 1/1/1970 (timestamp): ban time limit of the account (0 = no ban)
- struct tm *tmtime;
-
- year = month = day = hour = minute = second = 0;
- ban_until_time = 0;
- tmtime = localtime(&ban_until_time); // initialize
-
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- if (atoi(date) != 0 &&
- ((sscanf(date, "%d/%d/%d", &year, &month, &day) < 3 &&
- sscanf(date, "%d-%d-%d", &year, &month, &day) < 3 &&
- sscanf(date, "%d.%d.%d", &year, &month, &day) < 3) ||
- sscanf(time, "%d:%d:%d", &hour, &minute, &second) < 3)) {
- if (defaultlanguage == 'F') {
- printf("Entrez une date et une heure svp (format: aaaa/mm/jj hh:mm:ss).\n");
- printf("Vous pouvez aussi mettre 0 à la place si vous utilisez la commande 'banset'.\n");
- ladmin_log("Format incorrect pour la date/heure (commande'banset' ou 'ban')." RETCODE);
- } else {
- printf("Please input a date and a time (format: yyyy/mm/dd hh:mm:ss).\n");
- printf("You can imput 0 instead of if you use 'banset' command.\n");
- ladmin_log("Invalid format for the date/time ('banset' or 'ban' command)." RETCODE);
- }
- return 102;
- }
-
- if (atoi(date) == 0) {
- ban_until_time = 0;
- } else {
- if (year < 70) {
- year = year + 100;
- }
- if (year >= 1900) {
- year = year - 1900;
- }
- if (month < 1 || month > 12) {
- if (defaultlanguage == 'F') {
- printf("Entrez un mois correct svp (entre 1 et 12).\n");
- ladmin_log("Mois incorrect pour la date (command 'banset' ou 'ban')." RETCODE);
- } else {
- printf("Please give a correct value for the month (from 1 to 12).\n");
- ladmin_log("Invalid month for the date ('banset' or 'ban' command)." RETCODE);
- }
- return 102;
- }
- month = month - 1;
- if (day < 1 || day > 31) {
- if (defaultlanguage == 'F') {
- printf("Entrez un jour correct svp (entre 1 et 31).\n");
- ladmin_log("Jour incorrect pour la date (command 'banset' ou 'ban')." RETCODE);
- } else {
- printf("Please give a correct value for the day (from 1 to 31).\n");
- ladmin_log("Invalid day for the date ('banset' or 'ban' command)." RETCODE);
- }
- return 102;
- }
- if (((month == 3 || month == 5 || month == 8 || month == 10) && day > 30) ||
- (month == 1 && day > 29)) {
- if (defaultlanguage == 'F') {
- printf("Entrez un jour correct en fonction du mois (%d) svp.\n", month);
- ladmin_log("Jour incorrect pour ce mois correspondant (command 'banset' ou 'ban')." RETCODE);
- } else {
- printf("Please give a correct value for a day of this month (%d).\n", month);
- ladmin_log("Invalid day for this month ('banset' or 'ban' command)." RETCODE);
- }
- return 102;
- }
- if (hour < 0 || hour > 23) {
- if (defaultlanguage == 'F') {
- printf("Entrez une heure correcte svp (entre 0 et 23).\n");
- ladmin_log("Heure incorrecte pour l'heure (command 'banset' ou 'ban')." RETCODE);
- } else {
- printf("Please give a correct value for the hour (from 0 to 23).\n");
- ladmin_log("Invalid hour for the time ('banset' or 'ban' command)." RETCODE);
- }
- return 102;
- }
- if (minute < 0 || minute > 59) {
- if (defaultlanguage == 'F') {
- printf("Entrez des minutes correctes svp (entre 0 et 59).\n");
- ladmin_log("Minute incorrecte pour l'heure (command 'banset' ou 'ban')." RETCODE);
- } else {
- printf("Please give a correct value for the minutes (from 0 to 59).\n");
- ladmin_log("Invalid minute for the time ('banset' or 'ban' command)." RETCODE);
- }
- return 102;
- }
- if (second < 0 || second > 59) {
- if (defaultlanguage == 'F') {
- printf("Entrez des secondes correctes svp (entre 0 et 59).\n");
- ladmin_log("Seconde incorrecte pour l'heure (command 'banset' ou 'ban')." RETCODE);
- } else {
- printf("Please give a correct value for the seconds (from 0 to 59).\n");
- ladmin_log("Invalid second for the time ('banset' or 'ban' command)." RETCODE);
- }
- return 102;
- }
- tmtime->tm_year = year;
- tmtime->tm_mon = month;
- tmtime->tm_mday = day;
- tmtime->tm_hour = hour;
- tmtime->tm_min = minute;
- tmtime->tm_sec = second;
- tmtime->tm_isdst = -1; // -1: no winter/summer time modification
- ban_until_time = mktime(tmtime);
- if (ban_until_time == -1) {
- if (defaultlanguage == 'F') {
- printf("Date incorrecte.\n");
- printf("Entrez une date et une heure svp (format: aaaa/mm/jj hh:mm:ss).\n");
- printf("Vous pouvez aussi mettre 0 à la place si vous utilisez la commande 'banset'.\n");
- ladmin_log("Date incorrecte. (command 'banset' ou 'ban')." RETCODE);
- } else {
- printf("Invalid date.\n");
- printf("Please input a date and a time (format: yyyy/mm/dd hh:mm:ss).\n");
- printf("You can imput 0 instead of if you use 'banset' command.\n");
- ladmin_log("Invalid date. ('banset' or 'ban' command)." RETCODE);
- }
- return 102;
- }
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour fixer un ban." RETCODE);
- } else {
- ladmin_log("Request to login-server to set a ban." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x794a;
- memcpy(WFIFOP(login_fd,2), name, 24);
- WFIFOL(login_fd,26) = (int)ban_until_time;
- WFIFOSET(login_fd,30);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//---------------------------------------------------------------------
-// Sub-function: Set the final date of a banishment of an account (ban)
-//---------------------------------------------------------------------
-int banaccount(char* param) {
- char name[1023], date[1023], time[1023];
-
- memset(name, '\0', sizeof(name));
- memset(date, '\0', sizeof(date));
- memset(time, '\0', sizeof(time));
-
- if (sscanf(param, "%s %s \"%[^\"]\"", date, time, name) < 3 &&
- sscanf(param, "%s %s '%[^']'", date, time, name) < 3 &&
- sscanf(param, "%s %s %[^\r\n]", date, time, name) < 3) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte, une date et une heure svp.\n");
- printf("<exemple>: banset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n");
- printf(" banset <nom_du_compte> 0 (0 = dé-bani)\n");
- printf(" ban/banish aaaa/mm/jj hh:mm:ss <nom du compte>\n");
- printf(" unban/unbanish <nom du compte>\n");
- printf(" Heure par défaut [hh:mm:ss]: 23:59:59.\n");
- ladmin_log("Nombre incorrect de paramètres pour fixer un ban (commande 'banset' ou 'ban')." RETCODE);
- } else {
- printf("Please input an account name, a date and a hour.\n");
- printf("<example>: banset <account_name> yyyy/mm/dd [hh:mm:ss]\n");
- printf(" banset <account_name> 0 (0 = un-banished)\n");
- printf(" ban/banish yyyy/mm/dd hh:mm:ss <account name>\n");
- printf(" unban/unbanish <account name>\n");
- printf(" Default time [hh:mm:ss]: 23:59:59.\n");
- ladmin_log("Incomplete parameters to set a ban ('banset' or 'ban' command)." RETCODE);
- }
- return 136;
- }
-
- return bansetaccountsub(name, date, time);
-}
-
-//------------------------------------------------------------------------
-// Sub-function: Set the final date of a banishment of an account (banset)
-//------------------------------------------------------------------------
-int bansetaccount(char* param) {
- char name[1023], date[1023], time[1023];
-
- memset(name, '\0', sizeof(name));
- memset(date, '\0', sizeof(date));
- memset(time, '\0', sizeof(time));
-
- if (sscanf(param, "\"%[^\"]\" %s %[^\r\n]", name, date, time) < 2 && // if date = 0, time can be void
- sscanf(param, "'%[^']' %s %[^\r\n]", name, date, time) < 2 && // if date = 0, time can be void
- sscanf(param, "%s %s %[^\r\n]", name, date, time) < 2) { // if date = 0, time can be void
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte, une date et une heure svp.\n");
- printf("<exemple>: banset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n");
- printf(" banset <nom_du_compte> 0 (0 = dé-bani)\n");
- printf(" ban/banish aaaa/mm/jj hh:mm:ss <nom du compte>\n");
- printf(" unban/unbanish <nom du compte>\n");
- printf(" Heure par défaut [hh:mm:ss]: 23:59:59.\n");
- ladmin_log("Nombre incorrect de paramètres pour fixer un ban (commande 'banset' ou 'ban')." RETCODE);
- } else {
- printf("Please input an account name, a date and a hour.\n");
- printf("<example>: banset <account_name> yyyy/mm/dd [hh:mm:ss]\n");
- printf(" banset <account_name> 0 (0 = un-banished)\n");
- printf(" ban/banish yyyy/mm/dd hh:mm:ss <account name>\n");
- printf(" unban/unbanish <account name>\n");
- printf(" Default time [hh:mm:ss]: 23:59:59.\n");
- ladmin_log("Incomplete parameters to set a ban ('banset' or 'ban' command)." RETCODE);
- }
- return 136;
- }
-
- if (time[0] == '\0')
- strcpy(time, "23:59:59");
-
- return bansetaccountsub(name, date, time);
-}
-
-//-------------------------------------------------
-// Sub-function: unbanishment of an account (unban)
-//-------------------------------------------------
-int unbanaccount(char* param) {
- char name[1023];
-
- memset(name, '\0', sizeof(name));
-
- if (strlen(param) == 0 ||
- (sscanf(param, "\"%[^\"]\"", name) < 1 &&
- sscanf(param, "'%[^']'", name) < 1 &&
- sscanf(param, "%[^\r\n]", name) < 1) ||
- strlen(name) == 0) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte svp.\n");
- printf("<exemple>: banset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n");
- printf(" banset <nom_du_compte> 0 (0 = dé-bani)\n");
- printf(" ban/banish aaaa/mm/jj hh:mm:ss <nom du compte>\n");
- printf(" unban/unbanish <nom du compte>\n");
- printf(" Heure par défaut [hh:mm:ss]: 23:59:59.\n");
- ladmin_log("Nombre incorrect de paramètres pour fixer un ban (commande 'unban')." RETCODE);
- } else {
- printf("Please input an account name.\n");
- printf("<example>: banset <account_name> yyyy/mm/dd [hh:mm:ss]\n");
- printf(" banset <account_name> 0 (0 = un-banished)\n");
- printf(" ban/banish yyyy/mm/dd hh:mm:ss <account name>\n");
- printf(" unban/unbanish <account name>\n");
- printf(" Default time [hh:mm:ss]: 23:59:59.\n");
- ladmin_log("Incomplete parameters to set a ban ('unban' command)." RETCODE);
- }
- return 136;
- }
-
- return bansetaccountsub(name, "0", "");
-}
-
-//---------------------------------------------------------
-// Sub-function: Asking to check the validity of a password
-// (Note: never send back a password with login-server!! security of passwords)
-//---------------------------------------------------------
-int checkaccount(char* param) {
- char name[1023], password[1023];
-
- memset(name, '\0', sizeof(name));
- memset(password, '\0', sizeof(password));
-
- if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, password) < 1 && // password can be void
- sscanf(param, "'%[^']' %[^\r\n]", name, password) < 1 && // password can be void
- sscanf(param, "%s %[^\r\n]", name, password) < 1) { // password can be void
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte svp.\n");
- printf("<exemple> check testname motdepasse\n");
- ladmin_log("Nombre incorrect de paramètres pour tester le mot d'un passe d'un compte (commande 'check')." RETCODE);
- } else {
- printf("Please input an account name.\n");
- printf("<example> check testname password\n");
- ladmin_log("Incomplete parameters to check the password of an account ('check' command)." RETCODE);
- }
- return 136;
- }
-
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- if (strlen(password) == 0) {
- if (typepasswd(password) == 0)
- return 134;
- }
- if (verify_password(password) == 0)
- return 131;
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour test un mot de passe." RETCODE);
- } else {
- ladmin_log("Request to login-server to check a password." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x793a;
- memcpy(WFIFOP(login_fd,2), name, 24);
- memcpy(WFIFOP(login_fd,26), password, 24);
- WFIFOSET(login_fd,50);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//------------------------------------------------
-// Sub-function: Asking for deletion of an account
-//------------------------------------------------
-int delaccount(char* param) {
- char name[1023];
- char letter;
- char confirm[1023];
- int i;
-
- memset(name, '\0', sizeof(name));
-
- if (strlen(param) == 0 ||
- (sscanf(param, "\"%[^\"]\"", name) < 1 &&
- sscanf(param, "'%[^']'", name) < 1 &&
- sscanf(param, "%[^\r\n]", name) < 1) ||
- strlen(name) == 0) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte svp.\n");
- printf("<exemple> del nomtestasupprimer\n");
- ladmin_log("Aucun nom donné pour supprimer un compte (commande 'delete')." RETCODE);
- } else {
- printf("Please input an account name.\n");
- printf("<example> del testnametodelete\n");
- ladmin_log("No name given to delete an account ('delete' command)." RETCODE);
- }
- return 136;
- }
-
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- memset(confirm, '\0', sizeof(confirm));
- while ((confirm[0] != 'o' || defaultlanguage != 'F') && confirm[0] != 'n' && (confirm[0] != 'y' || defaultlanguage == 'F')) {
- if (defaultlanguage == 'F')
- printf("\033[1;36m ** Etes-vous vraiment sûr de vouloir SUPPRIMER le compte [$userid]? (o/n) > \033[0m");
- else
- printf("\033[1;36m ** Are you really sure to DELETE account [$userid]? (y/n) > \033[0m");
- fflush(stdout);
- memset(confirm, '\0', sizeof(confirm));
- i = 0;
- while ((letter = getchar()) != '\n')
- confirm[i++] = letter;
- }
-
- if (confirm[0] == 'n') {
- if (defaultlanguage == 'F') {
- printf("Suppression annulée.\n");
- ladmin_log("Suppression annulée par l'utilisateur (commande 'delete')." RETCODE);
- } else {
- printf("Deletion canceled.\n");
- ladmin_log("Deletion canceled by user ('delete' command)." RETCODE);
- }
- return 121;
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour détruire un compte." RETCODE);
- } else {
- ladmin_log("Request to login-server to delete an acount." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7932;
- memcpy(WFIFOP(login_fd,2), name, 24);
- WFIFOSET(login_fd,26);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//----------------------------------------------------------
-// Sub-function: Asking to modification of an account e-mail
-//----------------------------------------------------------
-int changeemail(char* param) {
- char name[1023], email[1023];
-
- memset(name, '\0', sizeof(name));
- memset(email, '\0', sizeof(email));
-
- if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, email) < 2 &&
- sscanf(param, "'%[^']' %[^\r\n]", name, email) < 2 &&
- sscanf(param, "%s %[^\r\n]", name, email) < 2) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte et une email svp.\n");
- printf("<exemple> email testname nouveauemail\n");
- ladmin_log("Nombre incorrect de paramètres pour changer l'email d'un compte (commande 'email')." RETCODE);
- } else {
- printf("Please input an account name and an email.\n");
- printf("<example> email testname newemail\n");
- ladmin_log("Incomplete parameters to change the email of an account ('email' command)." RETCODE);
- }
- return 136;
- }
-
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- if (strlen(email) < 3) {
- if (defaultlanguage == 'F') {
- printf("Email trop courte [%s]. Entrez une e-mail valide svp.\n", email);
- ladmin_log("Email trop courte [%s]. Entrez une e-mail valide svp." RETCODE, email);
- } else {
- printf("Email is too short [%s]. Please input a valid e-mail.\n", email);
- ladmin_log("Email is too short [%s]. Please input a valid e-mail." RETCODE, email);
- }
- return 109;
- }
- if (strlen(email) > 39) {
- if (defaultlanguage == 'F') {
- printf("Email trop longue [%s]. Entrez une e-mail de 39 caractères maximum svp.\n", email);
- ladmin_log("Email trop longue [%s]. Entrez une e-mail de 39 caractères maximum svp." RETCODE, email);
- } else {
- printf("Email is too long [%s]. Please input an e-mail with 39 bytes at the most.\n", email);
- ladmin_log("Email is too long [%s]. Please input an e-mail with 39 bytes at the most." RETCODE, email);
- }
- return 109;
- }
- if (e_mail_check(email) == 0) {
- if (defaultlanguage == 'F') {
- printf("Email incorrecte [%s]. Entrez une e-mail valide svp.\n", email);
- ladmin_log("Email incorrecte [%s]. Entrez une e-mail valide svp." RETCODE, email);
- } else {
- printf("Invalid email [%s]. Please input a valid e-mail.\n", email);
- ladmin_log("Invalid email [%s]. Please input a valid e-mail." RETCODE, email);
- }
- return 109;
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour changer une email." RETCODE);
- } else {
- ladmin_log("Request to login-server to change an email." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7940;
- memcpy(WFIFOP(login_fd,2), name, 24);
- memcpy(WFIFOP(login_fd,26), email, 40);
- WFIFOSET(login_fd,66);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//-----------------------------------------------------
-// Sub-function: Asking of the number of online players
-//-----------------------------------------------------
-int getlogincount() {
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour obtenir le nombre de joueurs en jeu." RETCODE);
- } else {
- ladmin_log("Request to login-server to obtain the # of online players." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7938;
- WFIFOSET(login_fd,2);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//----------------------------------------------------------
-// Sub-function: Asking to modify the GM level of an account
-//----------------------------------------------------------
-int changegmlevel(char* param) {
- char name[1023];
- int GM_level;
-
- memset(name, '\0', sizeof(name));
- GM_level = 0;
-
- if (sscanf(param, "\"%[^\"]\" %d", name, &GM_level) < 1 &&
- sscanf(param, "'%[^']' %d", name, &GM_level) < 1 &&
- sscanf(param, "%s %d", name, &GM_level) < 1) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte et un niveau de GM svp.\n");
- printf("<exemple> gm nomtest 80\n");
- ladmin_log("Nombre incorrect de paramètres pour changer le Niveau de GM d'un compte (commande 'gm')." RETCODE);
- } else {
- printf("Please input an account name and a GM level.\n");
- printf("<example> gm testname 80\n");
- ladmin_log("Incomplete parameters to change the GM level of an account ('gm' command)." RETCODE);
- }
- return 136;
- }
-
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- if (GM_level < 0 || GM_level > 99) {
- if (defaultlanguage == 'F') {
- printf("Niveau de GM incorrect [%d]. Entrez une valeur de 0 à 99 svp.\n", GM_level);
- ladmin_log("Niveau de GM incorrect [%d]. La valeur peut être de 0 à 99." RETCODE, GM_level);
- } else {
- printf("Illegal GM level [%d]. Please input a value from 0 to 99.\n", GM_level);
- ladmin_log("Illegal GM level [%d]. The value can be from 0 to 99." RETCODE, GM_level);
- }
- return 103;
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour changer un niveau de GM." RETCODE);
- } else {
- ladmin_log("Request to login-server to change a GM level." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x793e;
- memcpy(WFIFOP(login_fd,2), name, 24);
- WFIFOB(login_fd,26) = GM_level;
- WFIFOSET(login_fd,27);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//---------------------------------------------
-// Sub-function: Asking to obtain an account id
-//---------------------------------------------
-int idaccount(char* param) {
- char name[1023];
-
- memset(name, '\0', sizeof(name));
-
- if (strlen(param) == 0 ||
- (sscanf(param, "\"%[^\"]\"", name) < 1 &&
- sscanf(param, "'%[^']'", name) < 1 &&
- sscanf(param, "%[^\r\n]", name) < 1) ||
- strlen(name) == 0) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte svp.\n");
- printf("<exemple> id nomtest\n");
- ladmin_log("Aucun nom donné pour rechecher l'id d'un compte (commande 'id')." RETCODE);
- } else {
- printf("Please input an account name.\n");
- printf("<example> id testname\n");
- ladmin_log("No name given to search an account id ('id' command)." RETCODE);
- }
- return 136;
- }
-
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour connaître l'id d'un compte." RETCODE);
- } else {
- ladmin_log("Request to login-server to know an account id." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7944;
- memcpy(WFIFOP(login_fd,2), name, 24);
- WFIFOSET(login_fd,26);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//----------------------------------------------------------------------------
-// Sub-function: Asking to displaying information about an account (by its id)
-//----------------------------------------------------------------------------
-int infoaccount(int account_id) {
- if (account_id < 0) {
- if (defaultlanguage == 'F') {
- printf("Entrez un id ayant une valeur positive svp.\n");
- ladmin_log("Une valeur négative a été donné pour trouver le compte." RETCODE);
- } else {
- printf("Please input a positive value for the id.\n");
- ladmin_log("Negative value was given to found the account." RETCODE);
- }
- return 136;
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour obtenir le information d'un compte (par l'id)." RETCODE);
- } else {
- ladmin_log("Request to login-server to obtain information about an account (by its id)." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7954;
- WFIFOL(login_fd,2) = account_id;
- WFIFOSET(login_fd,6);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//---------------------------------------
-// Sub-function: Send a broadcast message
-//---------------------------------------
-int sendbroadcast(short type, char* message) {
- if (strlen(message) == 0) {
- if (defaultlanguage == 'F') {
- printf("Entrez un message svp.\n");
- if (type == 0) {
- printf("<exemple> kami un message\n");
- } else {
- printf("<exemple> kamib un message\n");
- }
- ladmin_log("Le message est vide (commande 'kami(b)')." RETCODE);
- } else {
- printf("Please input a message.\n");
- if (type == 0) {
- printf("<example> kami a message\n");
- } else {
- printf("<example> kamib a message\n");
- }
- ladmin_log("The message is void ('kami(b)' command)." RETCODE);
- }
- return 136;
- }
-
- WFIFOW(login_fd,0) = 0x794e;
- WFIFOW(login_fd,2) = type;
- WFIFOL(login_fd,4) = strlen(message)+1;
- memcpy(WFIFOP(login_fd,8), message, strlen(message)+1);
- WFIFOSET(login_fd,8+strlen(message)+1);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//--------------------------------------------
-// Sub-function: Change language of displaying
-//--------------------------------------------
-int changelanguage(char* language) {
- if (strlen(language) == 0) {
- if (defaultlanguage == 'F') {
- printf("Entrez une langue svp.\n");
- printf("<exemple> language english\n");
- printf(" language français\n");
- ladmin_log("La langue est vide (commande 'language')." RETCODE);
- } else {
- printf("Please input a language.\n");
- printf("<example> language english\n");
- printf(" language français\n");
- ladmin_log("The language is void ('language' command)." RETCODE);
- }
- return 136;
- }
-
- language[0] = toupper(language[0]);
- if (language[0] == 'F' || language[0] == 'E') {
- defaultlanguage = language[0];
- if (defaultlanguage == 'F') {
- printf("Changement de la langue d'affichage en Français.\n");
- ladmin_log("Changement de la langue d'affichage en Français." RETCODE);
- } else {
- printf("Displaying language changed to English.\n");
- ladmin_log("Displaying language changed to English." RETCODE);
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Langue non paramétrée (langues possibles: 'Français' ou 'English').\n");
- ladmin_log("Langue non paramétrée (Français ou English nécessaire)." RETCODE);
- } else {
- printf("Undefined language (possible languages: Français or English).\n");
- ladmin_log("Undefined language (must be Français or English)." RETCODE);
- }
- }
-
- return 0;
-}
-
-//--------------------------------------------------------
-// Sub-function: Asking to Displaying of the accounts list
-//--------------------------------------------------------
-int listaccount(char* param, int type) {
-//int list_first, list_last, list_type; // parameter to display a list of accounts
- int i;
-
- list_type = type;
-
- // set default values
- list_first = 0;
- list_last = 0;
-
- if (list_type == 1) { // if listgm
- // get all accounts = use default
- } else if (list_type == 2) { // if search
- for (i = 0; param[i]; i++)
- param[i] = tolower(param[i]);
- // get all accounts = use default
- } else if (list_type == 3) { // if listban
- // get all accounts = use default
- } else if (list_type == 4) { // if listok
- // get all accounts = use default
- } else { // if list (list_type == 0)
- switch(sscanf(param, "%d %d", &list_first, &list_last)) {
- case 0:
- // get all accounts = use default
- break;
- case 1:
- list_last = 0;
- // use tests of the following value
- default:
- if (list_first < 0)
- list_first = 0;
- if (list_last < list_first || list_last < 0)
- list_last = 0;
- break;
- }
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour obtenir la liste des comptes de %d à %d." RETCODE, list_first, list_last);
- } else {
- ladmin_log("Request to login-server to obtain the list of accounts from %d to %d." RETCODE, list_first, list_last);
- }
-
- WFIFOW(login_fd,0) = 0x7920;
- WFIFOL(login_fd,2) = list_first;
- WFIFOL(login_fd,6) = list_last;
- WFIFOSET(login_fd,10);
- bytes_to_read = 1;
-
- // 0123456789 01 01234567890123456789012301234 012345 0123456789012345678901234567
- if (defaultlanguage == 'F') {
- printf(" id_compte GM nom_utilisateur sexe count statut\n");
- } else {
- printf("account_id GM user_name sex count state\n");
- }
- printf("-------------------------------------------------------------------------------\n");
- list_count = 0;
-
- return 0;
-}
-
-//--------------------------------------------
-// Sub-function: Asking to modify a memo field
-//--------------------------------------------
-int changememo(char* param) {
- char name[1023], memo[1023];
-
- memset(name, '\0', sizeof(name));
- memset(memo, '\0', sizeof(memo));
-
- if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, memo) < 1 && // memo can be void
- sscanf(param, "'%[^']' %[^\r\n]", name, memo) < 1 && // memo can be void
- sscanf(param, "%s %[^\r\n]", name, memo) < 1) { // memo can be void
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte et un mémo svp.\n");
- printf("<exemple> memo nomtest nouveau memo\n");
- ladmin_log("Nombre incorrect de paramètres pour changer le mémo d'un compte (commande 'email')." RETCODE);
- } else {
- printf("Please input an account name and a memo.\n");
- printf("<example> memo testname new memo\n");
- ladmin_log("Incomplete parameters to change the memo of an account ('email' command)." RETCODE);
- }
- return 136;
- }
-
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- if (strlen(memo) > 254) {
- if (defaultlanguage == 'F') {
- printf("Mémo trop long (%d caractères).\n", strlen(memo));
- printf("Entrez un mémo de 254 caractères maximum svp.\n");
- ladmin_log("Mémo trop long (%d caractères). Entrez un mémo de 254 caractères maximum svp." RETCODE, strlen(memo));
- } else {
- printf("Memo is too long (%d characters).\n", strlen(memo));
- printf("Please input a memo of 254 bytes at the maximum.\n");
- ladmin_log("Email is too long (%d characters). Please input a memo of 254 bytes at the maximum." RETCODE, strlen(memo));
- }
- return 102;
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour changer un mémo." RETCODE);
- } else {
- ladmin_log("Request to login-server to change a memo." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7942;
- memcpy(WFIFOP(login_fd,2), name, 24);
- WFIFOW(login_fd,26) = strlen(memo);
- if (strlen(memo) > 0)
- memcpy(WFIFOP(login_fd,28), memo, strlen(memo));
- WFIFOSET(login_fd,28+strlen(memo));
- bytes_to_read = 1;
-
- return 0;
-}
-
-//-----------------------------------------------
-// Sub-function: Asking to obtain an account name
-//-----------------------------------------------
-int nameaccount(int id) {
- if (id < 0) {
- if (defaultlanguage == 'F') {
- printf("Entrez un id ayant une valeur positive svp.\n");
- ladmin_log("Id négatif donné pour rechecher le nom d'un compte (commande 'name')." RETCODE);
- } else {
- printf("Please input a positive value for the id.\n");
- ladmin_log("Negativ id given to search an account name ('name' command)." RETCODE);
- }
- return 136;
- }
-
- if (defaultlanguage == 'F')
- ladmin_log("Envoi d'un requête au serveur de logins pour connaître le nom d'un compte." RETCODE);
- else
- ladmin_log("Request to login-server to know an account name." RETCODE);
-
- WFIFOW(login_fd,0) = 0x7946;
- WFIFOL(login_fd,2) = id;
- WFIFOSET(login_fd,6);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//------------------------------------------
-// Sub-function: Asking to modify a password
-// (Note: never send back a password with login-server!! security of passwords)
-//------------------------------------------
-int changepasswd(char* param) {
- char name[1023], password[1023];
-
- memset(name, '\0', sizeof(name));
- memset(password, '\0', sizeof(password));
-
- if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, password) < 1 &&
- sscanf(param, "'%[^']' %[^\r\n]", name, password) < 1 &&
- sscanf(param, "%s %[^\r\n]", name, password) < 1) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte svp.\n");
- printf("<exemple> passwd nomtest nouveaumotdepasse\n");
- ladmin_log("Nombre incorrect de paramètres pour changer le mot d'un passe d'un compte (commande 'password')." RETCODE);
- } else {
- printf("Please input an account name.\n");
- printf("<example> passwd testname newpassword\n");
- ladmin_log("Incomplete parameters to change the password of an account ('password' command)." RETCODE);
- }
- return 136;
- }
-
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- if (strlen(password) == 0) {
- if (typepasswd(password) == 0)
- return 134;
- }
- if (verify_password(password) == 0)
- return 131;
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour changer un mot de passe." RETCODE);
- } else {
- ladmin_log("Request to login-server to change a password." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7934;
- memcpy(WFIFOP(login_fd,2), name, 24);
- memcpy(WFIFOP(login_fd,26), password, 24);
- WFIFOSET(login_fd,50);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//----------------------------------------------------------------------
-// Sub-function: Request to login-server to reload GM configuration file
-// this function have no answer
-//----------------------------------------------------------------------
-int reloadGM() {
- WFIFOW(login_fd,0) = 0x7955;
- WFIFOSET(login_fd,2);
- bytes_to_read = 0;
-
- if (defaultlanguage == 'F') {
- ladmin_log("Demande de recharger le fichier de configuration des GM envoyée." RETCODE);
- printf("Demande de recharger le fichier de configuration des GM envoyée.\n");
- printf("Vérifiez les comptes GM actuels (après rechargement):\n");
- } else {
- ladmin_log("Request to reload the GM configuration file sended." RETCODE);
- printf("Request to reload the GM configuration file sended.\n");
- printf("Check the actual GM accounts (after reloading):\n");
- }
- listaccount(parameters, 1); // 1: to list only GM
-
- return 180;
-}
-
-//-----------------------------------------------------
-// Sub-function: Asking to modify the sex of an account
-//-----------------------------------------------------
-int changesex(char* param) {
- char name[1023], sex[1023];
-
- memset(name, '\0', sizeof(name));
- memset(sex, '\0', sizeof(sex));
-
- if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, sex) < 2 &&
- sscanf(param, "'%[^']' %[^\r\n]", name, sex) < 2 &&
- sscanf(param, "%s %[^\r\n]", name, sex) < 2) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte et un sexe svp.\n");
- printf("<exemple> sex nomtest Male\n");
- ladmin_log("Nombre incorrect de paramètres pour changer le sexe d'un compte (commande 'sex')." RETCODE);
- } else {
- printf("Please input an account name and a sex.\n");
- printf("<example> sex testname Male\n");
- ladmin_log("Incomplete parameters to change the sex of an account ('sex' command)." RETCODE);
- }
- return 136;
- }
-
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- sex[0] = toupper(sex[0]);
- if (strchr("MF", sex[0]) == NULL) {
- if (defaultlanguage == 'F') {
- printf("Sexe incorrect [%s]. Entrez M ou F svp.\n", sex);
- ladmin_log("Sexe incorrect [%s]. Entrez M ou F svp." RETCODE, sex);
- } else {
- printf("Illegal gender [%s]. Please input M or F.\n", sex);
- ladmin_log("Illegal gender [%s]. Please input M or F." RETCODE, sex);
- }
- return 103;
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour changer un sexe." RETCODE);
- } else {
- ladmin_log("Request to login-server to change a sex." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x793c;
- memcpy(WFIFOP(login_fd,2), name, 24);
- WFIFOB(login_fd,26) = sex[0];
- WFIFOSET(login_fd,27);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//-------------------------------------------------------------------------
-// Sub-function of sub-function changestate, blockaccount or unblockaccount
-// Asking to modify the state of an account
-//-------------------------------------------------------------------------
-int changestatesub(char* name, int state, char* error_message7) {
- char error_message[1023]; // need to use, because we can modify error_message7
-
- memset(error_message, '\0', sizeof(error_message));
- strncpy(error_message, error_message7, sizeof(error_message)-1);
-
- if ((state < 0 || state > 9) && state != 100) { // Valid values: 0: ok, or value of the 0x006a packet + 1
- if (defaultlanguage == 'F') {
- printf("Entrez une des statuts suivantes svp:\n");
- printf(" 0 = Compte ok 6 = Your Game's EXE file is not the latest version\n");
- } else {
- printf("Please input one of these states:\n");
- printf(" 0 = Account ok 6 = Your Game's EXE file is not the latest version\n");
- }
- printf(" 1 = Unregistered ID 7 = You are Prohibited to log in until + message\n");
- printf(" 2 = Incorrect Password 8 = Server is jammed due to over populated\n");
- printf(" 3 = This ID is expired 9 = No MSG\n");
- printf(" 4 = Rejected from Server 100 = This ID has been totally erased\n");
- printf(" 5 = You have been blocked by the GM Team\n");
- if (defaultlanguage == 'F') {
- printf("<exemples> state nomtest 5\n");
- printf(" state nomtest 7 fin de votre ban\n");
- printf(" block <nom compte>\n");
- printf(" unblock <nom compte>\n");
- ladmin_log("Valeur incorrecte pour le statut d'un compte (commande 'state', 'block' ou 'unblock')." RETCODE);
- } else {
- printf("<examples> state testname 5\n");
- printf(" state testname 7 end of your ban\n");
- printf(" block <account name>\n");
- printf(" unblock <account name>\n");
- ladmin_log("Invalid value for the state of an account ('state', 'block' or 'unblock' command)." RETCODE);
- }
- return 151;
- }
-
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- if (state != 7) {
- strcpy(error_message, "-");
- } else {
- if (strlen(error_message) < 1) {
- if (defaultlanguage == 'F') {
- printf("Message d'erreur trop court. Entrez un message de 1-19 caractères.\n");
- ladmin_log("Message d'erreur trop court. Entrez un message de 1-19 caractères." RETCODE);
- } else {
- printf("Error message is too short. Please input a message of 1-19 bytes.\n");
- ladmin_log("Error message is too short. Please input a message of 1-19 bytes." RETCODE);
- }
- return 102;
- }
- if (strlen(error_message) > 19) {
- if (defaultlanguage == 'F') {
- printf("Message d'erreur trop long. Entrez un message de 1-19 caractères.\n");
- ladmin_log("Message d'erreur trop long. Entrez un message de 1-19 caractères." RETCODE);
- } else {
- printf("Error message is too long. Please input a message of 1-19 bytes.\n");
- ladmin_log("Error message is too long. Please input a message of 1-19 bytes." RETCODE);
- }
- return 102;
- }
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour changer un statut." RETCODE);
- } else {
- ladmin_log("Request to login-server to change a state." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7936;
- memcpy(WFIFOP(login_fd,2), name, 24);
- WFIFOL(login_fd,26) = state;
- memcpy(WFIFOP(login_fd,30), error_message, 20);
- WFIFOSET(login_fd,50);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//-------------------------------------------------------
-// Sub-function: Asking to modify the state of an account
-//-------------------------------------------------------
-int changestate(char* param) {
- char name[1023], error_message[1023];
- int state;
-
- memset(name, '\0', sizeof(name));
- memset(error_message, '\0', sizeof(error_message));
-
- if (sscanf(param, "\"%[^\"]\" %d %[^\r\n]", name, &state, error_message) < 2 &&
- sscanf(param, "'%[^']' %d %[^\r\n]", name, &state, error_message) < 2 &&
- sscanf(param, "%s %d %[^\r\n]", name, &state, error_message) < 2) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte et un statut svp.\n");
- printf("<exemples> state nomtest 5\n");
- printf(" state nomtest 7 fin de votre ban\n");
- printf(" block <nom compte>\n");
- printf(" unblock <nom compte>\n");
- ladmin_log("Nombre incorrect de paramètres pour changer le statut d'un compte (commande 'state')." RETCODE);
- } else {
- printf("Please input an account name and a state.\n");
- printf("<examples> state testname 5\n");
- printf(" state testname 7 end of your ban\n");
- printf(" block <account name>\n");
- printf(" unblock <account name>\n");
- ladmin_log("Incomplete parameters to change the state of an account ('state' command)." RETCODE);
- }
- return 136;
- }
-
- return changestatesub(name, state, error_message);
-}
-
-//-------------------------------------------
-// Sub-function: Asking to unblock an account
-//-------------------------------------------
-int unblockaccount(char* param) {
- char name[1023];
-
- memset(name, '\0', sizeof(name));
-
- if (strlen(param) == 0 ||
- (sscanf(param, "\"%[^\"]\"", name) < 1 &&
- sscanf(param, "'%[^']'", name) < 1 &&
- sscanf(param, "%[^\r\n]", name) < 1) ||
- strlen(name) == 0) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte svp.\n");
- printf("<exemples> state nomtest 5\n");
- printf(" state nomtest 7 fin de votre ban\n");
- printf(" block <nom compte>\n");
- printf(" unblock <nom compte>\n");
- ladmin_log("Nombre incorrect de paramètres pour changer le statut d'un compte (commande 'unblock')." RETCODE);
- } else {
- printf("Please input an account name.\n");
- printf("<examples> state testname 5\n");
- printf(" state testname 7 end of your ban\n");
- printf(" block <account name>\n");
- printf(" unblock <account name>\n");
- ladmin_log("Incomplete parameters to change the state of an account ('unblock' command)." RETCODE);
- }
- return 136;
- }
-
- return changestatesub(name, 0, "-"); // state 0, no error message
-}
-
-//-------------------------------------------
-// Sub-function: Asking to unblock an account
-//-------------------------------------------
-int blockaccount(char* param) {
- char name[1023];
-
- memset(name, '\0', sizeof(name));
-
- if (strlen(param) == 0 ||
- (sscanf(param, "\"%[^\"]\"", name) < 1 &&
- sscanf(param, "'%[^']'", name) < 1 &&
- sscanf(param, "%[^\r\n]", name) < 1) ||
- strlen(name) == 0) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte svp.\n");
- printf("<exemples> state nomtest 5\n");
- printf(" state nomtest 7 fin de votre ban\n");
- printf(" block <nom compte>\n");
- printf(" unblock <nom compte>\n");
- ladmin_log("Nombre incorrect de paramètres pour changer le statut d'un compte (commande 'block')." RETCODE);
- } else {
- printf("Please input an account name.\n");
- printf("<examples> state testname 5\n");
- printf(" state testname 7 end of your ban\n");
- printf(" block <account name>\n");
- printf(" unblock <account name>\n");
- ladmin_log("Incomplete parameters to change the state of an account ('block' command)." RETCODE);
- }
- return 136;
- }
-
- return changestatesub(name, 5, "-"); // state 5, no error message
-}
-
-//---------------------------------------------------------------------
-// Sub-function: Add/substract time to the validity limit of an account
-//---------------------------------------------------------------------
-int timeaddaccount(char* param) {
- char name[1023], modif[1023];
- int year, month, day, hour, minute, second;
- char * p_modif;
- int value, i;
-
- memset(name, '\0', sizeof(name));
- memset(modif, '\0', sizeof(modif));
- year = month = day = hour = minute = second = 0;
-
- if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, modif) < 2 &&
- sscanf(param, "'%[^']' %[^\r\n]", name, modif) < 2 &&
- sscanf(param, "%s %[^\r\n]", name, modif) < 2) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte et un modificateur svp.\n");
- printf(" <exemple> timeadd nomtest +1m-2mn1s-6y\n");
- printf(" Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n");
- printf(" et 6 ans dans le même temps.\n");
- ladmin_log("Nombre incorrect de paramètres pour modifier une date limite d'utilisation (commande 'timeadd')." RETCODE);
- } else {
- printf("Please input an account name and a modifier.\n");
- printf(" <example>: timeadd testname +1m-2mn1s-6y\n");
- printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n");
- printf(" and 6 years at the same time.\n");
- ladmin_log("Incomplete parameters to modify a limit time ('timeadd' command)." RETCODE);
- }
- return 136;
- }
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- // lowercase for modif
- for (i = 0; modif[i]; i++)
- modif[i] = tolower(modif[i]);
- p_modif = modif;
- while (strlen(p_modif) > 0) {
- value = atoi(p_modif);
- if (value == 0) {
- p_modif++;
- } else {
- if (p_modif[0] == '-' || p_modif[0] == '+')
- p_modif++;
- while (strlen(p_modif) > 0 && p_modif[0] >= '0' && p_modif[0] <= '9') {
- p_modif++;
- }
- if (p_modif[0] == 's') {
- second = value;
- p_modif++;
- } else if (p_modif[0] == 'm' && p_modif[1] == 'n') {
- minute = value;
- p_modif += 2;
- } else if (p_modif[0] == 'h') {
- hour = value;
- p_modif++;
- } else if (p_modif[0] == 'd' || p_modif[0] == 'j') {
- day = value;
- p_modif += 2;
- } else if (p_modif[0] == 'm') {
- month = value;
- p_modif++;
- } else if (p_modif[0] == 'y' || p_modif[0] == 'a') {
- year = value;
- p_modif++;
- } else {
- p_modif++;
- }
- }
- }
-
- if (defaultlanguage == 'F') {
- printf(" année: %d\n", year);
- printf(" mois: %d\n", month);
- printf(" jour: %d\n", day);
- printf(" heure: %d\n", hour);
- printf(" minute: %d\n", minute);
- printf(" seconde: %d\n", second);
- } else {
- printf(" year: %d\n", year);
- printf(" month: %d\n", month);
- printf(" day: %d\n", day);
- printf(" hour: %d\n", hour);
- printf(" minute: %d\n", minute);
- printf(" second: %d\n", second);
- }
-
- if (year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 && second == 0) {
- if (defaultlanguage == 'F') {
- printf("Vous devez entrer un ajustement avec cette commande, svp:\n");
- printf(" Valeur d'ajustement (-1, 1, +1, etc...)\n");
- printf(" Elément modifié:\n");
- printf(" a ou y: année\n");
- printf(" m: mois\n");
- printf(" j ou d: jour\n");
- printf(" h: heure\n");
- printf(" mn: minute\n");
- printf(" s: seconde\n");
- printf(" <exemple> timeadd nomtest +1m-2mn1s-6y\n");
- printf(" Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n");
- printf(" et 6 ans dans le même temps.\n");
- ladmin_log("Aucun ajustement n'est pas un ajustement (commande 'timeadd')." RETCODE);
- } else {
- printf("Please give an adjustment with this command:\n");
- printf(" Adjustment value (-1, 1, +1, etc...)\n");
- printf(" Modified element:\n");
- printf(" a or y: year\n");
- printf(" m: month\n");
- printf(" j or d: day\n");
- printf(" h: hour\n");
- printf(" mn: minute\n");
- printf(" s: second\n");
- printf(" <example> timeadd testname +1m-2mn1s-6y\n");
- printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n");
- printf(" and 6 years at the same time.\n");
- ladmin_log("No adjustment isn't an adjustment ('timeadd' command)." RETCODE);
- }
- return 137;
- }
- if (year > 127 || year < -127) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement d'années correct (de -127 à 127), svp.\n");
- ladmin_log("Ajustement de l'année hors norme ('timeadd' command)." RETCODE);
- } else {
- printf("Please give a correct adjustment for the years (from -127 to 127).\n");
- ladmin_log("Abnormal adjustement for the year ('timeadd' command)." RETCODE);
- }
- return 137;
- }
- if (month > 255 || month < -255) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement de mois correct (de -255 à 255), svp.\n");
- ladmin_log("Ajustement du mois hors norme ('timeadd' command)." RETCODE);
- } else {
- printf("Please give a correct adjustment for the months (from -255 to 255).\n");
- ladmin_log("Abnormal adjustement for the month ('timeadd' command)." RETCODE);
- }
- return 137;
- }
- if (day > 32767 || day < -32767) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement de jours correct (de -32767 à 32767), svp.\n");
- ladmin_log("Ajustement des jours hors norme ('timeadd' command)." RETCODE);
- } else {
- printf("Please give a correct adjustment for the days (from -32767 to 32767).\n");
- ladmin_log("Abnormal adjustement for the days ('timeadd' command)." RETCODE);
- }
- return 137;
- }
- if (hour > 32767 || hour < -32767) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement d'heures correct (de -32767 à 32767), svp.\n");
- ladmin_log("Ajustement des heures hors norme ('timeadd' command)." RETCODE);
- } else {
- printf("Please give a correct adjustment for the hours (from -32767 to 32767).\n");
- ladmin_log("Abnormal adjustement for the hours ('timeadd' command)." RETCODE);
- }
- return 137;
- }
- if (minute > 32767 || minute < -32767) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement de minutes correct (de -32767 à 32767), svp.\n");
- ladmin_log("Ajustement des minutes hors norme ('timeadd' command)." RETCODE);
- } else {
- printf("Please give a correct adjustment for the minutes (from -32767 to 32767).\n");
- ladmin_log("Abnormal adjustement for the minutes ('timeadd' command)." RETCODE);
- }
- return 137;
- }
- if (second > 32767 || second < -32767) {
- if (defaultlanguage == 'F') {
- printf("Entrez un ajustement de secondes correct (de -32767 à 32767), svp.\n");
- ladmin_log("Ajustement des secondes hors norme ('timeadd' command)." RETCODE);
- } else {
- printf("Please give a correct adjustment for the seconds (from -32767 to 32767).\n");
- ladmin_log("Abnormal adjustement for the seconds ('timeadd' command)." RETCODE);
- }
- return 137;
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour modifier une date limite d'utilisation." RETCODE);
- } else {
- ladmin_log("Request to login-server to modify a time limit." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7950;
- memcpy(WFIFOP(login_fd,2), name, 24);
- WFIFOW(login_fd,26) = (short)year;
- WFIFOW(login_fd,28) = (short)month;
- WFIFOW(login_fd,30) = (short)day;
- WFIFOW(login_fd,32) = (short)hour;
- WFIFOW(login_fd,34) = (short)minute;
- WFIFOW(login_fd,36) = (short)second;
- WFIFOSET(login_fd,38);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//-------------------------------------------------
-// Sub-function: Set a validity limit of an account
-//-------------------------------------------------
-int timesetaccount(char* param) {
- char name[1023], date[1023], time[1023];
- int year, month, day, hour, minute, second;
- time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
- struct tm *tmtime;
-
- memset(name, '\0', sizeof(name));
- memset(date, '\0', sizeof(date));
- memset(time, '\0', sizeof(time));
- year = month = day = hour = minute = second = 0;
- connect_until_time = 0;
- tmtime = localtime(&connect_until_time); // initialize
-
- if (sscanf(param, "\"%[^\"]\" %s %[^\r\n]", name, date, time) < 2 && // if date = 0, time can be void
- sscanf(param, "'%[^']' %s %[^\r\n]", name, date, time) < 2 && // if date = 0, time can be void
- sscanf(param, "%s %s %[^\r\n]", name, date, time) < 2) { // if date = 0, time can be void
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte, une date et une heure svp.\n");
- printf("<exemple>: timeset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n");
- printf(" timeset <nom_du_compte> 0 (0 = illimité)\n");
- printf(" Heure par défaut [hh:mm:ss]: 23:59:59.\n");
- ladmin_log("Nombre incorrect de paramètres pour fixer une date limite d'utilisation (commande 'timeset')." RETCODE);
- } else {
- printf("Please input an account name, a date and a hour.\n");
- printf("<example>: timeset <account_name> yyyy/mm/dd [hh:mm:ss]\n");
- printf(" timeset <account_name> 0 (0 = unlimited)\n");
- printf(" Default time [hh:mm:ss]: 23:59:59.\n");
- ladmin_log("Incomplete parameters to set a limit time ('timeset' command)." RETCODE);
- }
- return 136;
- }
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- if (time[0] == '\0')
- strcpy(time, "23:59:59");
-
- if (atoi(date) != 0 &&
- ((sscanf(date, "%d/%d/%d", &year, &month, &day) < 3 &&
- sscanf(date, "%d-%d-%d", &year, &month, &day) < 3 &&
- sscanf(date, "%d.%d.%d", &year, &month, &day) < 3 &&
- sscanf(date, "%d'%d'%d", &year, &month, &day) < 3) ||
- sscanf(time, "%d:%d:%d", &hour, &minute, &second) < 3)) {
- if (defaultlanguage == 'F') {
- printf("Entrez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n");
- ladmin_log("Format incorrect pour la date/heure ('timeset' command)." RETCODE);
- } else {
- printf("Please input 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n");
- ladmin_log("Invalid format for the date/time ('timeset' command)." RETCODE);
- }
- return 102;
- }
-
- if (atoi(date) == 0) {
- connect_until_time = 0;
- } else {
- if (year < 70) {
- year = year + 100;
- }
- if (year >= 1900) {
- year = year - 1900;
- }
- if (month < 1 || month > 12) {
- if (defaultlanguage == 'F') {
- printf("Entrez un mois correct svp (entre 1 et 12).\n");
- ladmin_log("Mois incorrect pour la date ('timeset' command)." RETCODE);
- } else {
- printf("Please give a correct value for the month (from 1 to 12).\n");
- ladmin_log("Invalid month for the date ('timeset' command)." RETCODE);
- }
- return 102;
- }
- month = month - 1;
- if (day < 1 || day > 31) {
- if (defaultlanguage == 'F') {
- printf("Entrez un jour correct svp (entre 1 et 31).\n");
- ladmin_log("Jour incorrect pour la date ('timeset' command)." RETCODE);
- } else {
- printf("Please give a correct value for the day (from 1 to 31).\n");
- ladmin_log("Invalid day for the date ('timeset' command)." RETCODE);
- }
- return 102;
- }
- if (((month == 3 || month == 5 || month == 8 || month == 10) && day > 30) ||
- (month == 1 && day > 29)) {
- if (defaultlanguage == 'F') {
- printf("Entrez un jour correct en fonction du mois (%d) svp.\n", month);
- ladmin_log("Jour incorrect pour ce mois correspondant ('timeset' command)." RETCODE);
- } else {
- printf("Please give a correct value for a day of this month (%d).\n", month);
- ladmin_log("Invalid day for this month ('timeset' command)." RETCODE);
- }
- return 102;
- }
- if (hour < 0 || hour > 23) {
- if (defaultlanguage == 'F') {
- printf("Entrez une heure correcte svp (entre 0 et 23).\n");
- ladmin_log("Heure incorrecte pour l'heure ('timeset' command)." RETCODE);
- } else {
- printf("Please give a correct value for the hour (from 0 to 23).\n");
- ladmin_log("Invalid hour for the time ('timeset' command)." RETCODE);
- }
- return 102;
- }
- if (minute < 0 || minute > 59) {
- if (defaultlanguage == 'F') {
- printf("Entrez des minutes correctes svp (entre 0 et 59).\n");
- ladmin_log("Minute incorrecte pour l'heure ('timeset' command)." RETCODE);
- } else {
- printf("Please give a correct value for the minutes (from 0 to 59).\n");
- ladmin_log("Invalid minute for the time ('timeset' command)." RETCODE);
- }
- return 102;
- }
- if (second < 0 || second > 59) {
- if (defaultlanguage == 'F') {
- printf("Entrez des secondes correctes svp (entre 0 et 59).\n");
- ladmin_log("Seconde incorrecte pour l'heure ('timeset' command)." RETCODE);
- } else {
- printf("Please give a correct value for the seconds (from 0 to 59).\n");
- ladmin_log("Invalid second for the time ('timeset' command)." RETCODE);
- }
- return 102;
- }
- tmtime->tm_year = year;
- tmtime->tm_mon = month;
- tmtime->tm_mday = day;
- tmtime->tm_hour = hour;
- tmtime->tm_min = minute;
- tmtime->tm_sec = second;
- tmtime->tm_isdst = -1; // -1: no winter/summer time modification
- connect_until_time = mktime(tmtime);
- if (connect_until_time == -1) {
- if (defaultlanguage == 'F') {
- printf("Date incorrecte.\n");
- printf("Ajoutez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n");
- ladmin_log("Date incorrecte. ('timeset' command)." RETCODE);
- } else {
- printf("Invalid date.\n");
- printf("Please add 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n");
- ladmin_log("Invalid date. ('timeset' command)." RETCODE);
- }
- return 102;
- }
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour fixer une date limite d'utilisation." RETCODE);
- } else {
- ladmin_log("Request to login-server to set a time limit." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7948;
- memcpy(WFIFOP(login_fd,2), name, 24);
- WFIFOL(login_fd,26) = (int)connect_until_time;
- WFIFOSET(login_fd,30);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//------------------------------------------------------------------------------
-// Sub-function: Asking to displaying information about an account (by its name)
-//------------------------------------------------------------------------------
-int whoaccount(char* param) {
- char name[1023];
-
- memset(name, '\0', sizeof(name));
-
- if (strlen(param) == 0 ||
- (sscanf(param, "\"%[^\"]\"", name) < 1 &&
- sscanf(param, "'%[^']'", name) < 1 &&
- sscanf(param, "%[^\r\n]", name) < 1) ||
- strlen(name) == 0) {
- if (defaultlanguage == 'F') {
- printf("Entrez un nom de compte svp.\n");
- printf("<exemple> who nomtest\n");
- ladmin_log("Aucun nom n'a été donné pour trouver le compte." RETCODE);
- } else {
- printf("Please input an account name.\n");
- printf("<example> who testname\n");
- ladmin_log("No name was given to found the account." RETCODE);
- }
- return 136;
- }
- if (verify_accountname(name) == 0) {
- return 102;
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Envoi d'un requête au serveur de logins pour obtenir le information d'un compte (par le nom)." RETCODE);
- } else {
- ladmin_log("Request to login-server to obtain information about an account (by its name)." RETCODE);
- }
-
- WFIFOW(login_fd,0) = 0x7952;
- memcpy(WFIFOP(login_fd,2), name, 24);
- WFIFOSET(login_fd,26);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//--------------------------------------------------------
-// Sub-function: Asking of the version of the login-server
-//--------------------------------------------------------
-int checkloginversion() {
- if (defaultlanguage == 'F')
- ladmin_log("Envoi d'un requête au serveur de logins pour obtenir sa version." RETCODE);
- else
- ladmin_log("Request to login-server to obtain its version." RETCODE);
-
- WFIFOW(login_fd,0) = 0x7530;
- WFIFOSET(login_fd,2);
- bytes_to_read = 1;
-
- return 0;
-}
-
-//---------------------------------------------
-// Prompt function
-// this function wait until user type a command
-// and analyse the command.
-//---------------------------------------------
-int prompt() {
- int i, j;
- char buf[1024];
- char *p;
-
- // while we don't wait new packets
- while (bytes_to_read == 0) {
- // for help with the console colors look here:
- // http://www.edoceo.com/liberum/?doc=printf-with-color
- // some code explanation (used here):
- // \033[2J : clear screen and go up/left (0, 0 position)
- // \033[K : clear line from actual position to end of the line
- // \033[0m : reset color parameter
- // \033[1m : use bold for font
- printf("\n");
- if (defaultlanguage == 'F')
- printf("\033[32mPour afficher les commandes, tapez 'Entrée'.\033[0m\n");
- else
- printf("\033[32mTo list the commands, type 'enter'.\033[0m\n");
- printf("\033[0;36mLadmin-> \033[0m");
- printf("\033[1m");
- fflush(stdout);
-
- // get command and parameter
- memset(buf, '\0', sizeof(buf));
- fflush(stdin);
- fgets(buf, 1023, stdin);
- buf[1023] = '\0';
-
- printf("\033[0m");
- fflush(stdout);
-
- // remove final \n
- if((p = strrchr(buf, '\n')) != NULL)
- p[0] = '\0';
- // remove all control char
- for (i = 0; buf[i]; i++)
- if (buf[i] < 32) {
- // remove cursor control.
- if (buf[i] == 27 && buf[i+1] == '[' &&
- (buf[i+2] == 'H' || // home position (cursor)
- buf[i+2] == 'J' || // clear screen
- buf[i+2] == 'A' || // up 1 line
- buf[i+2] == 'B' || // down 1 line
- buf[i+2] == 'C' || // right 1 position
- buf[i+2] == 'D' || // left 1 position
- buf[i+2] == 'G')) { // center cursor (windows)
- for (j = i; buf[j]; j++)
- buf[j] = buf[j+3];
- } else if (buf[i] == 27 && buf[i+1] == '[' && buf[i+2] == '2' && buf[i+3] == 'J') { // clear screen
- for (j = i; buf[j]; j++)
- buf[j] = buf[j+4];
- } else if (buf[i] == 27 && buf[i+1] == '[' && buf[i+3] == '~' &&
- (buf[i+2] == '1' || // home (windows)
- buf[i+2] == '2' || // insert (windows)
- buf[i+2] == '3' || // del (windows)
- buf[i+2] == '4' || // end (windows)
- buf[i+2] == '5' || // pgup (windows)
- buf[i+2] == '6')) { // pgdown (windows)
- for (j = i; buf[j]; j++)
- buf[j] = buf[j+4];
- } else {
- // remove other control char.
- for (j = i; buf[j]; j++)
- buf[j] = buf[j+1];
- }
- i--;
- }
-
- // extract command name and parameters
- memset(command, '\0', sizeof(command));
- memset(parameters, '\0', sizeof(parameters));
- sscanf(buf, "%1023s %[^\n]", command, parameters);
- command[1023] = '\0';
- parameters[1023] = '\0';
-
- // lowercase for command line
- for (i = 0; command[i]; i++)
- command[i] = tolower(command[i]);
-
- if (command[0] == '?' || strlen(command) == 0) {
- if (defaultlanguage == 'F') {
- strcpy(buf, "aide");
- strcpy(command, "aide");
- } else {
- strcpy(buf, "help");
- strcpy(command, "help");
- }
- }
-
- // Analyse of the command
- check_command(command); // give complete name to the command
-
- if (strlen(parameters) == 0) {
- if (defaultlanguage == 'F') {
- ladmin_log("Commande: '%s' (sans paramètre)" RETCODE, command, parameters);
- } else {
- ladmin_log("Command: '%s' (without parameters)" RETCODE, command, parameters);
- }
- } else {
- if (defaultlanguage == 'F') {
- ladmin_log("Commande: '%s', paramètres: '%s'" RETCODE, command, parameters);
- } else {
- ladmin_log("Command: '%s', parameters: '%s'" RETCODE, command, parameters);
- }
- }
-
- // Analyse of the command
-// help
- if (strcmp(command, "aide") == 0) {
- display_help(parameters, 1); // 1: french
- } else if (strcmp(command, "help") == 0 ) {
- display_help(parameters, 0); // 0: english
-// general commands
- } else if (strcmp(command, "add") == 0) {
- addaccount(parameters, 0); // 0: no email
- } else if (strcmp(command, "ban") == 0) {
- banaccount(parameters);
- } else if (strcmp(command, "banadd") == 0) {
- banaddaccount(parameters);
- } else if (strcmp(command, "banset") == 0) {
- bansetaccount(parameters);
- } else if (strcmp(command, "block") == 0) {
- blockaccount(parameters);
- } else if (strcmp(command, "check") == 0) {
- checkaccount(parameters);
- } else if (strcmp(command, "create") == 0) {
- addaccount(parameters, 1); // 1: with email
- } else if (strcmp(command, "delete") == 0) {
- delaccount(parameters);
- } else if (strcmp(command, "email") == 0) {
- changeemail(parameters);
- } else if (strcmp(command, "getcount") == 0) {
- getlogincount();
- } else if (strcmp(command, "gm") == 0) {
- changegmlevel(parameters);
- } else if (strcmp(command, "id") == 0) {
- idaccount(parameters);
- } else if (strcmp(command, "info") == 0) {
- infoaccount(atoi(parameters));
- } else if (strcmp(command, "kami") == 0) {
- sendbroadcast(0, parameters); // flag for normal
- } else if (strcmp(command, "kamib") == 0) {
- sendbroadcast(0x10, parameters); // flag for blue
- } else if (strcmp(command, "language") == 0) {
- changelanguage(parameters);
- } else if (strcmp(command, "list") == 0) {
- listaccount(parameters, 0); // 0: to list all
- } else if (strcmp(command, "listban") == 0) {
- listaccount(parameters, 3); // 3: to list only accounts with state or bannished
- } else if (strcmp(command, "listgm") == 0) {
- listaccount(parameters, 1); // 1: to list only GM
- } else if (strcmp(command, "listok") == 0) {
- listaccount(parameters, 4); // 4: to list only accounts without state and not bannished
- } else if (strcmp(command, "memo") == 0) {
- changememo(parameters);
- } else if (strcmp(command, "name") == 0) {
- nameaccount(atoi(parameters));
- } else if (strcmp(command, "password") == 0) {
- changepasswd(parameters);
- } else if (strcmp(command, "reloadgm") == 0) {
- reloadGM();
- } else if (strcmp(command, "search") == 0) { // no regex in C version
- listaccount(parameters, 2); // 2: to list with pattern
- } else if (strcmp(command, "sex") == 0) {
- changesex(parameters);
- } else if (strcmp(command, "state") == 0) {
- changestate(parameters);
- } else if (strcmp(command, "timeadd") == 0) {
- timeaddaccount(parameters);
- } else if (strcmp(command, "timeset") == 0) {
- timesetaccount(parameters);
- } else if (strcmp(command, "unban") == 0) {
- unbanaccount(parameters);
- } else if (strcmp(command, "unblock") == 0) {
- unblockaccount(parameters);
- } else if (strcmp(command, "version") == 0) {
- checkloginversion();
- } else if (strcmp(command, "who") == 0) {
- whoaccount(parameters);
-// quit
- } else if (strcmp(command, "quit") == 0 ||
- strcmp(command, "exit") == 0 ||
- strcmp(command, "end") == 0) {
- if (defaultlanguage == 'F') {
- printf("Au revoir.\n");
- } else {
- printf("Bye.\n");
- }
- exit(0);
-// unknown command
- } else {
- if (defaultlanguage == 'F') {
- printf("Commande inconnue [%s].\n", buf);
- ladmin_log("Commande inconnue [%s]." RETCODE, buf);
- } else {
- printf("Unknown command [%s].\n", buf);
- ladmin_log("Unknown command [%s]." RETCODE, buf);
- }
- }
- }
-
- return 0;
-}
-
-//-------------------------------------------------------------
-// Function: Parse receiving informations from the login-server
-//-------------------------------------------------------------
-int parse_fromlogin(int fd) {
- struct char_session_data *sd;
-
- if (session[fd]->eof) {
- if (defaultlanguage == 'F') {
- printf("Impossible de se connecter au serveur de login [%s:%d] !\n", loginserverip, loginserverport);
- ladmin_log("Impossible de se connecter au serveur de login [%s:%d] !" RETCODE, loginserverip, loginserverport);
- } else {
- printf("Impossible to have a connection with the login-server [%s:%d] !\n", loginserverip, loginserverport);
- ladmin_log("Impossible to have a connection with the login-server [%s:%d] !" RETCODE, loginserverip, loginserverport);
- }
- close(fd);
- delete_session(fd);
- exit (0);
- }
-
-// printf("parse_fromlogin : %d %d %d\n", fd, RFIFOREST(fd), RFIFOW(fd,0));
- sd = (struct char_session_data*)session[fd]->session_data;
-
- while(RFIFOREST(fd) >= 2) {
- switch(RFIFOW(fd,0)) {
- case 0x7919: // answer of a connection request
- if (RFIFOREST(fd) < 3)
- return 0;
- if (RFIFOB(fd,2) != 0) {
- if (defaultlanguage == 'F') {
- printf("Erreur de login:\n");
- printf(" - mot de passe incorrect,\n");
- printf(" - système d'administration non activé, ou\n");
- printf(" - IP non autorisée.\n");
- ladmin_log("Erreur de login: mot de passe incorrect, système d'administration non activé, ou IP non autorisée." RETCODE);
- } else {
- printf("Error at login:\n");
- printf(" - incorrect password,\n");
- printf(" - administration system not activated, or\n");
- printf(" - unauthorised IP.\n");
- ladmin_log("Error at login: incorrect password, administration system not activated, or unauthorised IP." RETCODE);
- }
- session[fd]->eof = 1;
- //bytes_to_read = 1; // not stop at prompt
- } else {
- if (defaultlanguage == 'F') {
- printf("Connexion établie.\n");
- ladmin_log("Connexion établie." RETCODE);
- printf("Lecture de la version du serveur de login...\n");
- ladmin_log("Lecture de la version du serveur de login..." RETCODE);
- } else {
- printf("Established connection.\n");
- ladmin_log("Established connection." RETCODE);
- printf("Reading of the version of the login-server...\n");
- ladmin_log("Reading of the version of the login-server..." RETCODE);
- }
- //bytes_to_read = 1; // unchanged
- checkloginversion();
- }
- RFIFOSKIP(fd,3);
- break;
-
-#ifdef PASSWORDENC
- case 0x01dc: // answer of a coding key request
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- char md5str[64] = "", md5bin[32], md5key[RFIFOW(fd,2) - 4 + 1];
- memcpy(md5key, RFIFOP(fd,4), RFIFOW(fd,2) - 4);
- md5key[sizeof(md5key)-1] = '0';
- if (passenc == 1) {
- strncpy(md5str, (const char*)RFIFOP(fd,4), RFIFOW(fd,2) - 4);
- strcat(md5str, loginserveradminpassword);
- } else if (passenc == 2) {
- strncpy(md5str, loginserveradminpassword, sizeof(loginserveradminpassword));
- strcat(md5str, (const char*)RFIFOP(fd,4));
- }
- MD5_String2binary(md5str, md5bin);
- WFIFOW(login_fd,0) = 0x7918; // Request for administation login (encrypted password)
- WFIFOW(login_fd,2) = passenc; // Encrypted type
- memcpy(WFIFOP(login_fd,4), md5bin, 16);
- WFIFOSET(login_fd,20);
- if (defaultlanguage == 'F') {
- printf("Réception de la clef MD5.\n");
- ladmin_log("Réception de la clef MD5." RETCODE);
- printf("Envoi du mot de passe crypté...\n");
- ladmin_log("Envoi du mot de passe crypté..." RETCODE);
- } else {
- printf("Receiving of the MD5 key.\n");
- ladmin_log("Receiving of the MD5 key." RETCODE);
- printf("Sending of the encrypted password...\n");
- ladmin_log("Sending of the encrypted password..." RETCODE);
- }
- }
- bytes_to_read = 1;
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
-#endif
-
- case 0x7531: // Displaying of the version of the login-server
- if (RFIFOREST(fd) < 10)
- return 0;
- printf(" Login-Server [%s:%d]\n", loginserverip, loginserverport);
- if (((int)RFIFOB(login_fd,5)) == 0) {
- printf(" eAthena version stable-%d.%d", (int)RFIFOB(login_fd,2), (int)RFIFOB(login_fd,3));
- } else {
- printf(" eAthena version dev-%d.%d", (int)RFIFOB(login_fd,2), (int)RFIFOB(login_fd,3));
- }
- if (((int)RFIFOB(login_fd,4)) == 0)
- printf(" revision %d", (int)RFIFOB(login_fd,4));
- if (((int)RFIFOB(login_fd,6)) == 0)
- printf("%d.\n", RFIFOW(login_fd,8));
- else
- printf("-mod%d.\n", RFIFOW(login_fd,8));
- bytes_to_read = 0;
- RFIFOSKIP(fd,10);
- break;
-
- case 0x7921: // Displaying of the list of accounts
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- if (RFIFOW(fd,2) < 5) {
- if (defaultlanguage == 'F') {
- ladmin_log(" Réception d'une liste des comptes vide." RETCODE);
- if (list_count == 0)
- printf("Aucun compte trouvé.\n");
- else if (list_count == 1)
- printf("1 compte trouvé.\n");
- else
- printf("%d comptes trouvés.\n", list_count);
- } else {
- ladmin_log(" Receiving of a void accounts list." RETCODE);
- if (list_count == 0)
- printf("No account found.\n");
- else if (list_count == 1)
- printf("1 account found.\n");
- else
- printf("%d accounts found.\n", list_count);
- }
- bytes_to_read = 0;
- } else {
- int i;
- if (defaultlanguage == 'F')
- ladmin_log(" Réception d'une liste des comptes." RETCODE);
- else
- ladmin_log(" Receiving of a accounts list." RETCODE);
- for(i = 4; i < RFIFOW(fd,2); i += 38) {
- int j;
- char userid[24];
- char lower_userid[24];
- memcpy(userid, RFIFOP(fd,i + 5), sizeof(userid));
- userid[sizeof(userid)-1] = '\0';
- memset(lower_userid, '\0', sizeof(lower_userid));
- for (j = 0; userid[j]; j++)
- lower_userid[j] = tolower(userid[j]);
- list_first = RFIFOL(fd,i) + 1;
- // here are checks...
- if (list_type == 0 ||
- (list_type == 1 && RFIFOB(fd,i+4) > 0) ||
- (list_type == 2 && strstr(lower_userid, parameters) != NULL) ||
- (list_type == 3 && RFIFOL(fd,i+34) != 0) ||
- (list_type == 4 && RFIFOL(fd,i+34) == 0)) {
- printf("%10d ", RFIFOL(fd,i));
- if (RFIFOB(fd,i+4) == 0)
- printf(" ");
- else
- printf("%2d ", (int)RFIFOB(fd,i+4));
- printf("%-24s", userid);
- if (defaultlanguage == 'F') {
- if (RFIFOB(fd,i+29) == 0)
- printf("%-5s ", "Femme");
- else if (RFIFOB(fd,i+29) == 1)
- printf("%-5s ", "Male");
- else
- printf("%-5s ", "Servr");
- } else {
- if (RFIFOB(fd,i+29) == 0)
- printf("%-5s ", "Femal");
- else if (RFIFOB(fd,i+29) == 1)
- printf("%-5s ", "Male");
- else
- printf("%-5s ", "Servr");
- }
- printf("%6d ", RFIFOL(fd,i+30));
- switch(RFIFOL(fd,i+34)) {
- case 0:
- if (defaultlanguage == 'F')
- printf("%-27s\n", "Compte Ok");
- else
- printf("%-27s\n", "Account OK");
- break;
- case 1:
- printf("%-27s\n", "Unregistered ID");
- break;
- case 2:
- printf("%-27s\n", "Incorrect Password");
- break;
- case 3:
- printf("%-27s\n", "This ID is expired");
- break;
- case 4:
- printf("%-27s\n", "Rejected from Server");
- break;
- case 5:
- printf("%-27s\n", "Blocked by the GM Team"); // You have been blocked by the GM Team
- break;
- case 6:
- printf("%-27s\n", "Your EXE file is too old"); // Your Game's EXE file is not the latest version
- break;
- case 7:
- printf("%-27s\n", "Banishement or");
- printf(" Prohibited to login until...\n"); // You are Prohibited to log in until %s
- break;
- case 8:
- printf("%-27s\n", "Server is over populated");
- break;
- case 9:
- printf("%-27s\n", "No MSG");
- break;
- default: // 100
- printf("%-27s\n", "This ID is totally erased"); // This ID has been totally erased
- break;
- }
- list_count++;
- }
- }
- // asking of the following acounts
- if (defaultlanguage == 'F')
- ladmin_log("Envoi d'un requête au serveur de logins pour obtenir la liste des comptes de %d à %d (complément)." RETCODE, list_first, list_last);
- else
- ladmin_log("Request to login-server to obtain the list of accounts from %d to %d (complement)." RETCODE, list_first, list_last);
- WFIFOW(login_fd,0) = 0x7920;
- WFIFOL(login_fd,2) = list_first;
- WFIFOL(login_fd,6) = list_last;
- WFIFOSET(login_fd,10);
- bytes_to_read = 1;
- }
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
-
- case 0x7931: // Answer of login-server about an account creation
- if (RFIFOREST(fd) < 30)
- return 0;
- if (RFIFOL(fd,2) == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec à la création du compte [%s]. Un compte identique existe déjà.\n", RFIFOP(fd,6));
- ladmin_log("Echec à la création du compte [%s]. Un compte identique existe déjà." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] creation failed. Same account already exists.\n", RFIFOP(fd,6));
- ladmin_log("Account [%s] creation failed. Same account already exists." RETCODE, RFIFOP(fd,6));
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Compte [%s] créé avec succès [id: %d].\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Compte [%s] créé avec succès [id: %d]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("Account [%s] is successfully created [id: %d].\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Account [%s] is successfully created [id: %d]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x7933: // Answer of login-server about an account deletion
- if (RFIFOREST(fd) < 30)
- return 0;
- if (RFIFOL(fd,2) == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec de la suppression du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
- ladmin_log("Echec de la suppression du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] deletion failed. Account doesn't exist.\n", RFIFOP(fd,6));
- ladmin_log("Account [%s] deletion failed. Account doesn't exist." RETCODE, RFIFOP(fd,6));
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Compte [%s][id: %d] SUPPRIME avec succès.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Compte [%s][id: %d] SUPPRIME avec succès." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("Account [%s][id: %d] is successfully DELETED.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Account [%s][id: %d] is successfully DELETED." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x7935: // answer of the change of an account password
- if (RFIFOREST(fd) < 30)
- return 0;
- if (RFIFOL(fd,2) == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec de la modification du mot de passe du compte [%s].\n", RFIFOP(fd,6));
- printf("Le compte [%s] n'existe pas.\n", RFIFOP(fd,6));
- ladmin_log("Echec de la modification du mot de passe du compte. Le compte [%s] n'existe pas." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] password changing failed.\n", RFIFOP(fd,6));
- printf("Account [%s] doesn't exist.\n", RFIFOP(fd,6));
- ladmin_log("Account password changing failed. The compte [%s] doesn't exist." RETCODE, RFIFOP(fd,6));
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Modification du mot de passe du compte [%s][id: %d] réussie.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Modification du mot de passe du compte [%s][id: %d] réussie." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("Account [%s][id: %d] password successfully changed.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Account [%s][id: %d] password successfully changed." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x7937: // answer of the change of an account state
- if (RFIFOREST(fd) < 34)
- return 0;
- if (RFIFOL(fd,2) == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec du changement du statut du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
- ladmin_log("Echec du changement du statut du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] state changing failed. Account doesn't exist.\n", RFIFOP(fd,6));
- ladmin_log("Account [%s] state changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6));
- }
- } else {
- char tmpstr[256];
- if (defaultlanguage == 'F') {
- sprintf(tmpstr, "Statut du compte [%s] changé avec succès en [", RFIFOP(fd,6));
- } else {
- sprintf(tmpstr, "Account [%s] state successfully changed in [", RFIFOP(fd,6));
- }
- switch(RFIFOL(fd,30)) {
- case 0:
- if (defaultlanguage == 'F')
- strcat(tmpstr, "0: Compte Ok");
- else
- strcat(tmpstr, "0: Account OK");
- break;
- case 1:
- strcat(tmpstr, "1: Unregistered ID");
- break;
- case 2:
- strcat(tmpstr, "2: Incorrect Password");
- break;
- case 3:
- strcat(tmpstr, "3: This ID is expired");
- break;
- case 4:
- strcat(tmpstr, "4: Rejected from Server");
- break;
- case 5:
- strcat(tmpstr, "5: You have been blocked by the GM Team");
- break;
- case 6:
- strcat(tmpstr, "6: [Your Game's EXE file is not the latest version");
- break;
- case 7:
- strcat(tmpstr, "7: You are Prohibited to log in until...");
- break;
- case 8:
- strcat(tmpstr, "8: Server is jammed due to over populated");
- break;
- case 9:
- strcat(tmpstr, "9: No MSG");
- break;
- default: // 100
- strcat(tmpstr, "100: This ID is totally erased");
- break;
- }
- strcat(tmpstr, "]");
- printf("%s\n", tmpstr);
- ladmin_log("%s%s", tmpstr, RETCODE);
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,34);
- break;
-
- case 0x7939: // answer of the number of online players
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- // Get length of the received packet
- int i;
- char name[20];
- if (defaultlanguage == 'F') {
- ladmin_log(" Réception du nombre de joueurs en ligne." RETCODE);
- } else {
- ladmin_log(" Receiving of the number of online players." RETCODE);
- }
- // Read information of the servers
- if (RFIFOW(fd,2) < 5) {
- if (defaultlanguage == 'F') {
- printf(" Aucun serveur n'est connecté au login serveur.\n");
- } else {
- printf(" No server is connected to the login-server.\n");
- }
- } else {
- if (defaultlanguage == 'F') {
- printf(" Nombre de joueurs en ligne (serveur: nb):\n");
- } else {
- printf(" Number of online players (server: number).\n");
- }
- // Displaying of result
- for(i = 4; i < RFIFOW(fd,2); i += 32) {
- memcpy(name, RFIFOP(fd,i+6), sizeof(name));
- name[sizeof(name) - 1] = '\0';
- printf(" %-20s : %5d\n", name, RFIFOW(fd,i+26));
- }
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
-
- case 0x793b: // answer of the check of a password
- if (RFIFOREST(fd) < 30)
- return 0;
- if (RFIFOL(fd,2) == -1) {
- if (defaultlanguage == 'F') {
- printf("Le compte [%s] n'existe pas ou le mot de passe est incorrect.\n", RFIFOP(fd,6));
- ladmin_log("Le compte [%s] n'existe pas ou le mot de passe est incorrect." RETCODE, RFIFOP(fd,6));
- } else {
- printf("The account [%s] doesn't exist or the password is incorrect.\n", RFIFOP(fd,6));
- ladmin_log("The account [%s] doesn't exist or the password is incorrect." RETCODE, RFIFOP(fd,6));
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Le mot de passe donné correspond bien au compte [%s][id: %d].\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Le mot de passe donné correspond bien au compte [%s][id: %d]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("The proposed password is correct for the account [%s][id: %d].\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("The proposed password is correct for the account [%s][id: %d]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x793d: // answer of the change of an account sex
- if (RFIFOREST(fd) < 30)
- return 0;
- if (RFIFOL(fd,2) == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec de la modification du sexe du compte [%s].\n", RFIFOP(fd,6));
- printf("Le compte [%s] n'existe pas ou le sexe est déjà celui demandé.\n", RFIFOP(fd,6));
- ladmin_log("Echec de la modification du sexe du compte. Le compte [%s] n'existe pas ou le sexe est déjà celui demandé." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] sex changing failed.\n", RFIFOP(fd,6));
- printf("Account [%s] doesn't exist or the sex is already the good sex.\n", RFIFOP(fd,6));
- ladmin_log("Account sex changing failed. The compte [%s] doesn't exist or the sex is already the good sex." RETCODE, RFIFOP(fd,6));
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Sexe du compte [%s][id: %d] changé avec succès.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Sexe du compte [%s][id: %d] changé avec succès." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("Account [%s][id: %d] sex successfully changed.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Account [%s][id: %d] sex successfully changed." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x793f: // answer of the change of an account GM level
- if (RFIFOREST(fd) < 30)
- return 0;
- if (RFIFOL(fd,2) == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec de la modification du niveau de GM du compte [%s].\n", RFIFOP(fd,6));
- printf("Le compte [%s] n'existe pas, le niveau de GM est déjà celui demandé\n", RFIFOP(fd,6));
- printf("ou il est impossible de modifier le fichier des comptes GM.\n");
- ladmin_log("Echec de la modification du niveau de GM du compte. Le compte [%s] n'existe pas, le niveau de GM est déjà celui demandé ou il est impossible de modifier le fichier des comptes GM." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] GM level changing failed.\n", RFIFOP(fd,6));
- printf("Account [%s] doesn't exist, the GM level is already the good GM level\n", RFIFOP(fd,6));
- printf("or it's impossible to modify the GM accounts file.\n");
- ladmin_log("Account GM level changing failed. The compte [%s] doesn't exist, the GM level is already the good sex or it's impossible to modify the GM accounts file." RETCODE, RFIFOP(fd,6));
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Niveau de GM du compte [%s][id: %d] changé avec succès.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Niveau de GM du compte [%s][id: %d] changé avec succès." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("Account [%s][id: %d] GM level successfully changed.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Account [%s][id: %d] GM level successfully changed." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x7941: // answer of the change of an account email
- if (RFIFOREST(fd) < 30)
- return 0;
- if (RFIFOL(fd,2) == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec de la modification de l'e-mail du compte [%s].\n", RFIFOP(fd,6));
- printf("Le compte [%s] n'existe pas.\n", RFIFOP(fd,6));
- ladmin_log("Echec de la modification de l'e-mail du compte. Le compte [%s] n'existe pas." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] e-mail changing failed.\n", RFIFOP(fd,6));
- printf("Account [%s] doesn't exist.\n", RFIFOP(fd,6));
- ladmin_log("Account e-mail changing failed. The compte [%s] doesn't exist." RETCODE, RFIFOP(fd,6));
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Modification de l'e-mail du compte [%s][id: %d] réussie.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Modification de l'e-mail du compte [%s][id: %d] réussie." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("Account [%s][id: %d] e-mail successfully changed.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Account [%s][id: %d] e-mail successfully changed." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x7943: // answer of the change of an account memo
- if (RFIFOREST(fd) < 30)
- return 0;
- if (RFIFOL(fd,2) == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec du changement du mémo du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
- ladmin_log("Echec du changement du mémo du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] memo changing failed. Account doesn't exist.\n", RFIFOP(fd,6));
- ladmin_log("Account [%s] memo changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6));
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Mémo du compte [%s][id: %d] changé avec succès.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Mémo du compte [%s][id: %d] changé avec succès." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("Account [%s][id: %d] memo successfully changed.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Account [%s][id: %d] memo successfully changed." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x7945: // answer of an account id search
- if (RFIFOREST(fd) < 30)
- return 0;
- if (RFIFOL(fd,2) == -1) {
- if (defaultlanguage == 'F') {
- printf("Impossible de trouver l'id du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
- ladmin_log("Impossible de trouver l'id du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Unable to find the account [%s] id. Account doesn't exist.\n", RFIFOP(fd,6));
- ladmin_log("Unable to find the account [%s] id. Account doesn't exist." RETCODE, RFIFOP(fd,6));
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Le compte [%s] a pour id: %d.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Le compte [%s] a pour id: %d." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("The account [%s] have the id: %d.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("The account [%s] have the id: %d." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x7947: // answer of an account name search
- if (RFIFOREST(fd) < 30)
- return 0;
- if (strcmp((const char*)RFIFOP(fd,6), "") == 0) {
- if (defaultlanguage == 'F') {
- printf("Impossible de trouver le nom du compte [%d]. Le compte n'existe pas.\n", RFIFOL(fd,2));
- ladmin_log("Impossible de trouver le nom du compte [%d]. Le compte n'existe pas." RETCODE, RFIFOL(fd,2));
- } else {
- printf("Unable to find the account [%d] name. Account doesn't exist.\n", RFIFOL(fd,2));
- ladmin_log("Unable to find the account [%d] name. Account doesn't exist." RETCODE, RFIFOL(fd,2));
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Le compte [id: %d] a pour nom: %s.\n", RFIFOL(fd,2), RFIFOP(fd,6));
- ladmin_log("Le compte [id: %d] a pour nom: %s." RETCODE, RFIFOL(fd,2), RFIFOP(fd,6));
- } else {
- printf("The account [id: %d] have the name: %s.\n", RFIFOL(fd,2), RFIFOP(fd,6));
- ladmin_log("The account [id: %d] have the name: %s." RETCODE, RFIFOL(fd,2), RFIFOP(fd,6));
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x7949: // answer of an account validity limit set
- if (RFIFOREST(fd) < 34)
- return 0;
- if (RFIFOL(fd,2) == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec du changement de la validité du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
- ladmin_log("Echec du changement de la validité du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] validity limit changing failed. Account doesn't exist.\n", RFIFOP(fd,6));
- ladmin_log("Account [%s] validity limit changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6));
- }
- } else {
- time_t timestamp = RFIFOL(fd,30);
- if (timestamp == 0) {
- if (defaultlanguage == 'F') {
- printf("Limite de validité du compte [%s][id: %d] changée avec succès en [illimité].\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Limite de validité du compte [%s][id: %d] changée avec succès en [illimité]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("Validity Limit of the account [%s][id: %d] successfully changed to [unlimited].\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Validity Limit of the account [%s][id: %d] successfully changed to [unlimited]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- } else {
- char tmpstr[128];
- strftime(tmpstr, 24, date_format, localtime(&timestamp));
- if (defaultlanguage == 'F') {
- printf("Limite de validité du compte [%s][id: %d] changée avec succès pour être jusqu'au %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
- ladmin_log("Limite de validité du compte [%s][id: %d] changée avec succès pour être jusqu'au %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
- } else {
- printf("Validity Limit of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
- ladmin_log("Validity Limit of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
- }
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,34);
- break;
-
- case 0x794b: // answer of an account ban set
- if (RFIFOREST(fd) < 34)
- return 0;
- if (RFIFOL(fd,2) == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec du changement de la date finale de banissement du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
- ladmin_log("Echec du changement de la date finale de banissement du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] final date of banishment changing failed. Account doesn't exist.\n", RFIFOP(fd,6));
- ladmin_log("Account [%s] final date of banishment changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6));
- }
- } else {
- time_t timestamp = RFIFOL(fd,30);
- if (timestamp == 0) {
- if (defaultlanguage == 'F') {
- printf("Date finale de banissement du compte [%s][id: %d] changée avec succès en [dé-bannie].\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Date finale de banissement du compte [%s][id: %d] changée avec succès en [dé-bannie]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished].\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- } else {
- char tmpstr[128];
- strftime(tmpstr, 24, date_format, localtime(&timestamp));
- if (defaultlanguage == 'F') {
- printf("Date finale de banissement du compte [%s][id: %d] changée avec succès pour être jusqu'au %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
- ladmin_log("Date finale de banissement du compte [%s][id: %d] changée avec succès pour être jusqu'au %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
- } else {
- printf("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
- ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
- }
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,34);
- break;
-
- case 0x794d: // answer of an account ban date/time changing
- if (RFIFOREST(fd) < 34)
- return 0;
- if (RFIFOL(fd,2) == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec du changement de la date finale de banissement du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
- ladmin_log("Echec du changement de la date finale de banissement du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] final date of banishment changing failed. Account doesn't exist.\n", RFIFOP(fd,6));
- ladmin_log("Account [%s] final date of banishment changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6));
- }
- } else {
- time_t timestamp = RFIFOL(fd,30);
- if (timestamp == 0) {
- if (defaultlanguage == 'F') {
- printf("Date finale de banissement du compte [%s][id: %d] changée avec succès en [dé-bannie].\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Date finale de banissement du compte [%s][id: %d] changée avec succès en [dé-bannie]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished].\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- } else {
- char tmpstr[128];
- strftime(tmpstr, 24, date_format, localtime(&timestamp));
- if (defaultlanguage == 'F') {
- printf("Date finale de banissement du compte [%s][id: %d] changée avec succès pour être jusqu'au %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
- ladmin_log("Date finale de banissement du compte [%s][id: %d] changée avec succès pour être jusqu'au %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
- } else {
- printf("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
- ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
- }
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,34);
- break;
-
- case 0x794f: // answer of a broadcast
- if (RFIFOREST(fd) < 4)
- return 0;
- if (RFIFOW(fd,2) == (unsigned short)-1) {
- if (defaultlanguage == 'F') {
- printf("Echec de l'envoi du message. Aucun server de char en ligne.\n");
- ladmin_log("Echec de l'envoi du message. Aucun server de char en ligne." RETCODE);
- } else {
- printf("Message sending failed. No online char-server.\n");
- ladmin_log("Message sending failed. No online char-server." RETCODE);
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Message transmis au server de logins avec succès.\n");
- ladmin_log("Message transmis au server de logins avec succès." RETCODE);
- } else {
- printf("Message successfully sended to login-server.\n");
- ladmin_log("Message successfully sended to login-server." RETCODE);
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,4);
- break;
-
- case 0x7951: // answer of an account validity limit changing
- if (RFIFOREST(fd) < 34)
- return 0;
- if (RFIFOL(fd,2) == -1) {
- if (defaultlanguage == 'F') {
- printf("Echec du changement de la validité du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6));
- ladmin_log("Echec du changement de la validité du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6));
- } else {
- printf("Account [%s] validity limit changing failed. Account doesn't exist.\n", RFIFOP(fd,6));
- ladmin_log("Account [%s] validity limit changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6));
- }
- } else {
- time_t timestamp = RFIFOL(fd,30);
- if (timestamp == 0) {
- if (defaultlanguage == 'F') {
- printf("Limite de validité du compte [%s][id: %d] inchangée.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- printf("Le compte a une validité illimitée ou\n");
- printf("la modification est impossible avec les ajustements demandés.\n");
- ladmin_log("Limite de validité du compte [%s][id: %d] inchangée. Le compte a une validité illimitée ou la modification est impossible avec les ajustements demandés." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("Validity limit of the account [%s][id: %d] unchanged.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- printf("The account have an unlimited validity limit or\n");
- printf("the changing is impossible with the proposed adjustments.\n");
- ladmin_log("Validity limit of the account [%s][id: %d] unchanged. The account have an unlimited validity limit or the changing is impossible with the proposed adjustments." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- } else {
- char tmpstr[128];
- strftime(tmpstr, 24, date_format, localtime(&timestamp));
- if (defaultlanguage == 'F') {
- printf("Limite de validité du compte [%s][id: %d] changée avec succès pour être jusqu'au %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
- ladmin_log("Limite de validité du compte [%s][id: %d] changée avec succès pour être jusqu'au %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
- } else {
- printf("Validity limit of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
- ladmin_log("Validity limit of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
- }
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,34);
- break;
-
- case 0x7953: // answer of a request about informations of an account (by account name/id)
- if (RFIFOREST(fd) < 150 || RFIFOREST(fd) < (150 + RFIFOW(fd,148)))
- return 0;
- {
- char userid[24], error_message[20], lastlogin[24], last_ip[16], email[40], memo[255];
- time_t ban_until_time; // # of seconds 1/1/1970 (timestamp): ban time limit of the account (0 = no ban)
- time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
- memcpy(userid, RFIFOP(fd,7), sizeof(userid));
- userid[sizeof(userid)-1] = '\0';
- memcpy(error_message, RFIFOP(fd,40), sizeof(error_message));
- error_message[sizeof(error_message)-1] = '\0';
- memcpy(lastlogin, RFIFOP(fd,60), sizeof(lastlogin));
- lastlogin[sizeof(lastlogin)-1] = '\0';
- memcpy(last_ip, RFIFOP(fd,84), sizeof(last_ip));
- last_ip[sizeof(last_ip)-1] = '\0';
- memcpy(email, RFIFOP(fd,100), sizeof(email));
- email[sizeof(email)-1] = '\0';
- connect_until_time = (time_t)RFIFOL(fd,140);
- ban_until_time = (time_t)RFIFOL(fd,144);
- memset(memo, '\0', sizeof(memo));
- strncpy(memo, (const char*)RFIFOP(fd,150), RFIFOW(fd,148));
- if (RFIFOL(fd,2) == -1) {
- if (defaultlanguage == 'F') {
- printf("Impossible de trouver le compte [%s]. Le compte n'existe pas.\n", parameters);
- ladmin_log("Impossible de trouver le compte [%s]. Le compte n'existe pas." RETCODE, parameters);
- } else {
- printf("Unabled to find the account [%s]. Account doesn't exist.\n", parameters);
- ladmin_log("Unabled to find the account [%s]. Account doesn't exist." RETCODE, parameters);
- }
- } else if (strlen(userid) == 0) {
- if (defaultlanguage == 'F') {
- printf("Impossible de trouver le compte [id: %s]. Le compte n'existe pas.\n", parameters);
- ladmin_log("Impossible de trouver le compte [id: %s]. Le compte n'existe pas." RETCODE, parameters);
- } else {
- printf("Unabled to find the account [id: %s]. Account doesn't exist.\n", parameters);
- ladmin_log("Unabled to find the account [id: %s]. Account doesn't exist." RETCODE, parameters);
- }
- } else {
- if (defaultlanguage == 'F') {
- ladmin_log("Réception d'information concernant un compte." RETCODE);
- printf("Le compte a les caractéristiques suivantes:\n");
- } else {
- ladmin_log("Receiving information about an account." RETCODE);
- printf("The account is set with:\n");
- }
- if (RFIFOB(fd,6) == 0) {
- printf(" Id: %d (non-GM)\n", RFIFOL(fd,2));
- } else {
- if (defaultlanguage == 'F') {
- printf(" Id: %d (GM niveau %d)\n", RFIFOL(fd,2), (int)RFIFOB(fd,6));
- } else {
- printf(" Id: %d (GM level %d)\n", RFIFOL(fd,2), (int)RFIFOB(fd,6));
- }
- }
- if (defaultlanguage == 'F') {
- printf(" Nom: '%s'\n", userid);
- if (RFIFOB(fd,31) == 0)
- printf(" Sexe: Femme\n");
- else if (RFIFOB(fd,31) == 1)
- printf(" Sexe: Male\n");
- else
- printf(" Sexe: Serveur\n");
- } else {
- printf(" Name: '%s'\n", userid);
- if (RFIFOB(fd,31) == 0)
- printf(" Sex: Female\n");
- else if (RFIFOB(fd,31) == 1)
- printf(" Sex: Male\n");
- else
- printf(" Sex: Server\n");
- }
- printf(" E-mail: %s\n", email);
- switch(RFIFOL(fd,36)) {
- case 0:
- if (defaultlanguage == 'F')
- printf(" Statut: 0 [Compte Ok]\n");
- else
- printf(" Statut: 0 [Account OK]\n");
- break;
- case 1:
- printf(" Statut: 1 [Unregistered ID]\n");
- break;
- case 2:
- printf(" Statut: 2 [Incorrect Password]\n");
- break;
- case 3:
- printf(" Statut: 3 [This ID is expired]\n");
- break;
- case 4:
- printf(" Statut: 4 [Rejected from Server]\n");
- break;
- case 5:
- printf(" Statut: 5 [You have been blocked by the GM Team]\n");
- break;
- case 6:
- printf(" Statut: 6 [Your Game's EXE file is not the latest version]\n");
- break;
- case 7:
- printf(" Statut: 7 [You are Prohibited to log in until %s]\n", error_message);
- break;
- case 8:
- printf(" Statut: 8 [Server is jammed due to over populated]\n");
- break;
- case 9:
- printf(" Statut: 9 [No MSG]\n");
- break;
- default: // 100
- printf(" Statut: %d [This ID is totally erased]\n", RFIFOL(fd,36));
- break;
- }
- if (defaultlanguage == 'F') {
- if (ban_until_time == 0) {
- printf(" Banissement: non banni.\n");
- } else {
- char tmpstr[128];
- strftime(tmpstr, 24, date_format, localtime(&ban_until_time));
- printf(" Banissement: jusqu'au %s.\n", tmpstr);
- }
- if (RFIFOL(fd,32) > 1)
- printf(" Compteur: %d connexions.\n", RFIFOL(fd,32));
- else
- printf(" Compteur: %d connexion.\n", RFIFOL(fd,32));
- printf(" Dernière connexion le: %s (ip: %s)\n", lastlogin, last_ip);
- if (connect_until_time == 0) {
- printf(" Limite de validité: illimité.\n");
- } else {
- char tmpstr[128];
- strftime(tmpstr, 24, date_format, localtime(&connect_until_time));
- printf(" Limite de validité: jusqu'au %s.\n", tmpstr);
- }
- } else {
- if (ban_until_time == 0) {
- printf(" Banishment: not banished.\n");
- } else {
- char tmpstr[128];
- strftime(tmpstr, 24, date_format, localtime(&ban_until_time));
- printf(" Banishment: until %s.\n", tmpstr);
- }
- if (RFIFOL(fd,32) > 1)
- printf(" Count: %d connections.\n", RFIFOL(fd,32));
- else
- printf(" Count: %d connection.\n", RFIFOL(fd,32));
- printf(" Last connection at: %s (ip: %s)\n", lastlogin, last_ip);
- if (connect_until_time == 0) {
- printf(" Validity limit: unlimited.\n");
- } else {
- char tmpstr[128];
- strftime(tmpstr, 24, date_format, localtime(&connect_until_time));
- printf(" Validity limit: until %s.\n", tmpstr);
- }
- }
- printf(" Memo: '%s'\n", memo);
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,150 + RFIFOW(fd,148));
- break;
-
- default:
- printf("Remote administration has been disconnected (unknown packet).\n");
- ladmin_log("'End of connection, unknown packet." RETCODE);
- session[fd]->eof = 1;
- return 0;
- }
- }
-
- // if we don't wait new packets, do the prompt
- prompt();
-
- return 0;
-}
-
-//------------------------------------
-// Function to connect to login-server
-//------------------------------------
-int Connect_login_server() {
- if (defaultlanguage == 'F') {
- printf("Essai de connection au server de logins...\n");
- ladmin_log("Essai de connection au server de logins..." RETCODE);
- } else {
- printf("Attempt to connect to login-server...\n");
- ladmin_log("Attempt to connect to login-server..." RETCODE);
- }
-
- login_fd = make_connection(login_ip, loginserverport);
-
-#ifdef PASSWORDENC
- if (passenc == 0) {
-#endif
- WFIFOW(login_fd,0) = 0x7918; // Request for administation login
- WFIFOW(login_fd,2) = 0; // no encrypted
- memcpy(WFIFOP(login_fd,4), loginserveradminpassword, 24);
- WFIFOSET(login_fd,28);
- bytes_to_read = 1;
- if (defaultlanguage == 'F') {
- printf("Envoi du mot de passe...\n");
- ladmin_log("Envoi du mot de passe..." RETCODE);
- } else {
- printf("Sending of the password...\n");
- ladmin_log("Sending of the password..." RETCODE);
- }
-#ifdef PASSWORDENC
- } else {
- WFIFOW(login_fd,0) = 0x791a; // Sending request about the coding key
- WFIFOSET(login_fd,2);
- bytes_to_read = 1;
- if (defaultlanguage == 'F') {
- printf("Demande de la clef MD5...\n");
- ladmin_log("Demande de la clef MD5..." RETCODE);
- } else {
- printf("Request about the MD5 key...\n");
- ladmin_log("Request about the MD5 key..." RETCODE);
- }
- }
-#endif
-
- return 0;
-}
-
-//-------------------------------------------------
-// Return numerical value of a switch configuration
-// on/off, english, français, deutsch, español
-//-------------------------------------------------
-int config_switch(const char *str) {
- if (strcmpi(str, "on") == 0 || strcmpi(str, "yes") == 0 || strcmpi(str, "oui") == 0 || strcmpi(str, "ja") == 0 || strcmpi(str, "si") == 0)
- return 1;
- if (strcmpi(str, "off") == 0 || strcmpi(str, "no") == 0 || strcmpi(str, "non") == 0 || strcmpi(str, "nein") == 0)
- return 0;
-
- return atoi(str);
-}
-
-//-----------------------------------
-// Reading general configuration file
-//-----------------------------------
-int ladmin_config_read(const char *cfgName) {
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- fp = fopen(cfgName, "r");
- if (fp == NULL) {
- if (defaultlanguage == 'F') {
- printf("\033[0mFichier de configuration (%s) non trouvé.\n", cfgName);
- } else {
- printf("\033[0mConfiguration file (%s) not found.\n", cfgName);
- }
- return 1;
- }
-
- if (defaultlanguage == 'F') {
- printf("\033[0m---Début de lecture du fichier de configuration Ladmin (%s)\n", cfgName);
- } else {
- printf("\033[0m---Start reading of Ladmin configuration file (%s)\n", cfgName);
- }
- while(fgets(line, sizeof(line)-1, fp)) {
- if (line[0] == '/' && line[1] == '/')
- continue;
-
- line[sizeof(line)-1] = '\0';
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2) {
- remove_control_chars((unsigned char *) w1);
- remove_control_chars((unsigned char *) w2);
-
- if(strcmpi(w1,"login_ip")==0){
- struct hostent *h = gethostbyname (w2);
- if (h != NULL) {
- if (defaultlanguage == 'F') {
- printf("Adresse du serveur de logins: %s -> %d.%d.%d.%d\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- } else {
- printf("Login server IP address: %s -> %d.%d.%d.%d\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- }
- sprintf(loginserverip, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- } else
- memcpy(loginserverip, w2, 16);
- } else if (strcmpi(w1, "login_port") == 0) {
- loginserverport = atoi(w2);
- } else if (strcmpi(w1, "admin_pass") == 0) {
- strncpy(loginserveradminpassword, w2, sizeof(loginserveradminpassword));
- loginserveradminpassword[sizeof(loginserveradminpassword)-1] = '\0';
-#ifdef PASSWORDENC
- } else if (strcmpi(w1, "passenc") == 0) {
- passenc = atoi(w2);
- if (passenc < 0 || passenc > 2)
- passenc = 0;
-#endif
- } else if (strcmpi(w1, "defaultlanguage") == 0) {
- if (w2[0] == 'F' || w2[0] == 'E')
- defaultlanguage = w2[0];
- } else if (strcmpi(w1, "ladmin_log_filename") == 0) {
- strncpy(ladmin_log_filename, w2, sizeof(ladmin_log_filename));
- ladmin_log_filename[sizeof(ladmin_log_filename)-1] = '\0';
- } else if (strcmpi(w1, "date_format") == 0) { // note: never have more than 19 char for the date!
- switch (atoi(w2)) {
- case 0:
- strcpy(date_format, "%d-%m-%Y %H:%M:%S"); // 31-12-2004 23:59:59
- break;
- case 1:
- strcpy(date_format, "%m-%d-%Y %H:%M:%S"); // 12-31-2004 23:59:59
- break;
- case 2:
- strcpy(date_format, "%Y-%d-%m %H:%M:%S"); // 2004-31-12 23:59:59
- break;
- case 3:
- strcpy(date_format, "%Y-%m-%d %H:%M:%S"); // 2004-12-31 23:59:59
- break;
- }
- } else if (strcmpi(w1, "import") == 0) {
- ladmin_config_read(w2);
- }
- }
- }
- fclose(fp);
-
- login_ip = inet_addr(loginserverip);
-
- if (defaultlanguage == 'F') {
- printf("---Lecture du fichier de configuration Ladmin terminée.\n");
- } else {
- printf("---End reading of Ladmin configuration file.\n");
- }
-
- return 0;
-}
-
-//--------------------------------------
-// Function called at exit of the server
-//--------------------------------------
-void do_final(void) {
-
- if (already_exit_function == 0) {
- delete_session(login_fd);
-
- if (defaultlanguage == 'F') {
- printf("\033[0m----Fin de Ladmin (fin normale avec fermeture de tous les fichiers).\n");
- ladmin_log("----Fin de Ladmin (fin normale avec fermeture de tous les fichiers)." RETCODE);
- } else {
- printf("\033[0m----End of Ladmin (normal end with closing of all files).\n");
- ladmin_log("----End of Ladmin (normal end with closing of all files)." RETCODE);
- }
-
- already_exit_function = 1;
- }
-}
-
-//------------------------
-// Main function of ladmin
-//------------------------
-int do_init(int argc, char **argv) {
- // read ladmin configuration
- ladmin_config_read((argc > 1) ? argv[1] : LADMIN_CONF_NAME);
-
- ladmin_log("");
- if (defaultlanguage == 'F') {
- ladmin_log("Fichier de configuration lu." RETCODE);
- } else {
- ladmin_log("Configuration file readed." RETCODE);
- }
-
- srand(time(NULL));
-
- set_termfunc(do_final);
- set_defaultparse(parse_fromlogin);
-
- if (defaultlanguage == 'F') {
- printf("Outil d'administration à distance de eAthena.\n");
- printf("(pour eAthena version %d.%d.%d.)\n", ATHENA_MAJOR_VERSION, ATHENA_MINOR_VERSION, ATHENA_REVISION);
- } else {
- printf("EAthena login-server administration tool.\n");
- printf("(for eAthena version %d.%d.%d.)\n", ATHENA_MAJOR_VERSION, ATHENA_MINOR_VERSION, ATHENA_REVISION);
- }
-
- if (defaultlanguage == 'F') {
- ladmin_log("Ladmin est prêt." RETCODE);
- printf("Ladmin est \033[1;32mprêt\033[0m.\n\n");
- } else {
- ladmin_log("Ladmin is ready." RETCODE);
- printf("Ladmin is \033[1;32mready\033[0m.\n\n");
- }
-
- Connect_login_server();
-
- atexit(do_final);
-
- return 0;
-}
diff --git a/src/ladmin/ladmin.h b/src/ladmin/ladmin.h
deleted file mode 100644
index f76bfc266..000000000
--- a/src/ladmin/ladmin.h
+++ /dev/null
@@ -1,11 +0,0 @@
-// $Id: ladmin.h,v 1.1.1.1 2004/09/10 17:26:52 MagicalTux Exp $
-#ifndef _LADMIN_H_
-#define _LADMIN_H_
-
-#define LADMIN_CONF_NAME "conf/ladmin_athena.conf"
-#define PASSWORDENC 3 // A definition is given when making an encryption password correspond.
- // It is 1 at the time of passwordencrypt.
- // It is made into 2 at the time of passwordencrypt2.
- // When it is made 3, it corresponds to both.
-
-#endif
diff --git a/src/ladmin/md5calc.c b/src/ladmin/md5calc.c
deleted file mode 100644
index c6c958583..000000000
--- a/src/ladmin/md5calc.c
+++ /dev/null
@@ -1,237 +0,0 @@
-// $Id: md5calc.c,v 1.1.1.1 2004/09/10 17:26:53 MagicalTux Exp $
-/***********************************************************
- * md5 calculation algorithm
- *
- * The source code referred to the following URL.
- * http://www.geocities.co.jp/SiliconValley-Oakland/8878/lab17/lab17.html
- *
- ***********************************************************/
-
-#include "md5calc.h"
-#include <string.h>
-#include <stdio.h>
-
-#ifndef UINT_MAX
-#define UINT_MAX 4294967295U
-#endif
-
-// Global variable
-static unsigned int *pX;
-
-// Stirng Table
-static const unsigned int T[] = {
- 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, //0
- 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, //4
- 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, //8
- 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, //12
- 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, //16
- 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8, //20
- 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, //24
- 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, //28
- 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, //32
- 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, //36
- 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, //40
- 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, //44
- 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, //48
- 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, //52
- 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, //56
- 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 //60
-};
-
-// ROTATE_LEFT The left is made to rotate x [ n-bit ]. This is diverted as it is from RFC.
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
-
-// The function used for other calculation
-static unsigned int F(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return (X & Y) | (~X & Z);
-}
-static unsigned int G(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return (X & Z) | (Y & ~Z);
-}
-static unsigned int H(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return X ^ Y ^ Z;
-}
-static unsigned int I(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return Y ^ (X | ~Z);
-}
-
-static unsigned int Round(unsigned int a, unsigned int b, unsigned int FGHI,
- unsigned int k, unsigned int s, unsigned int i)
-{
- return b + ROTATE_LEFT(a + FGHI + pX[k] + T[i], s);
-}
-
-static void Round1(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, F(b,c,d), k, s, i);
-}
-static void Round2(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, G(b,c,d), k, s, i);
-}
-static void Round3(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, H(b,c,d), k, s, i);
-}
-static void Round4(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, I(b,c,d), k, s, i);
-}
-
-static void MD5_Round_Calculate(const unsigned char *block,
- unsigned int *A2, unsigned int *B2, unsigned int *C2, unsigned int *D2)
-{
- //create X It is since it is required.
- unsigned int X[16]; //512bit 64byte
- int j,k;
-
- //Save A as AA, B as BB, C as CC, and and D as DD (saving of A, B, C, and D)
- unsigned int A=*A2, B=*B2, C=*C2, D=*D2;
- unsigned int AA = A,BB = B,CC = C,DD = D;
-
- //It is a large region variable reluctantly because of calculation of a round. . . for Round1...4
- pX = X;
-
- //Copy block(padding_message) i into X
- for (j=0,k=0; j<64; j+=4,k++)
- X[k] = ( (unsigned int )block[j] ) // 8byte*4 -> 32byte conversion
- | ( ((unsigned int )block[j+1]) << 8 ) // A function called Decode as used in the field of RFC
- | ( ((unsigned int )block[j+2]) << 16 )
- | ( ((unsigned int )block[j+3]) << 24 );
-
-
- //Round 1
- Round1(&A,B,C,D, 0, 7, 0); Round1(&D,A,B,C, 1, 12, 1); Round1(&C,D,A,B, 2, 17, 2); Round1(&B,C,D,A, 3, 22, 3);
- Round1(&A,B,C,D, 4, 7, 4); Round1(&D,A,B,C, 5, 12, 5); Round1(&C,D,A,B, 6, 17, 6); Round1(&B,C,D,A, 7, 22, 7);
- Round1(&A,B,C,D, 8, 7, 8); Round1(&D,A,B,C, 9, 12, 9); Round1(&C,D,A,B, 10, 17, 10); Round1(&B,C,D,A, 11, 22, 11);
- Round1(&A,B,C,D, 12, 7, 12); Round1(&D,A,B,C, 13, 12, 13); Round1(&C,D,A,B, 14, 17, 14); Round1(&B,C,D,A, 15, 22, 15);
-
- //Round 2
- Round2(&A,B,C,D, 1, 5, 16); Round2(&D,A,B,C, 6, 9, 17); Round2(&C,D,A,B, 11, 14, 18); Round2(&B,C,D,A, 0, 20, 19);
- Round2(&A,B,C,D, 5, 5, 20); Round2(&D,A,B,C, 10, 9, 21); Round2(&C,D,A,B, 15, 14, 22); Round2(&B,C,D,A, 4, 20, 23);
- Round2(&A,B,C,D, 9, 5, 24); Round2(&D,A,B,C, 14, 9, 25); Round2(&C,D,A,B, 3, 14, 26); Round2(&B,C,D,A, 8, 20, 27);
- Round2(&A,B,C,D, 13, 5, 28); Round2(&D,A,B,C, 2, 9, 29); Round2(&C,D,A,B, 7, 14, 30); Round2(&B,C,D,A, 12, 20, 31);
-
- //Round 3
- Round3(&A,B,C,D, 5, 4, 32); Round3(&D,A,B,C, 8, 11, 33); Round3(&C,D,A,B, 11, 16, 34); Round3(&B,C,D,A, 14, 23, 35);
- Round3(&A,B,C,D, 1, 4, 36); Round3(&D,A,B,C, 4, 11, 37); Round3(&C,D,A,B, 7, 16, 38); Round3(&B,C,D,A, 10, 23, 39);
- Round3(&A,B,C,D, 13, 4, 40); Round3(&D,A,B,C, 0, 11, 41); Round3(&C,D,A,B, 3, 16, 42); Round3(&B,C,D,A, 6, 23, 43);
- Round3(&A,B,C,D, 9, 4, 44); Round3(&D,A,B,C, 12, 11, 45); Round3(&C,D,A,B, 15, 16, 46); Round3(&B,C,D,A, 2, 23, 47);
-
- //Round 4
- Round4(&A,B,C,D, 0, 6, 48); Round4(&D,A,B,C, 7, 10, 49); Round4(&C,D,A,B, 14, 15, 50); Round4(&B,C,D,A, 5, 21, 51);
- Round4(&A,B,C,D, 12, 6, 52); Round4(&D,A,B,C, 3, 10, 53); Round4(&C,D,A,B, 10, 15, 54); Round4(&B,C,D,A, 1, 21, 55);
- Round4(&A,B,C,D, 8, 6, 56); Round4(&D,A,B,C, 15, 10, 57); Round4(&C,D,A,B, 6, 15, 58); Round4(&B,C,D,A, 13, 21, 59);
- Round4(&A,B,C,D, 4, 6, 60); Round4(&D,A,B,C, 11, 10, 61); Round4(&C,D,A,B, 2, 15, 62); Round4(&B,C,D,A, 9, 21, 63);
-
- // Then perform the following additions. (let's add)
- *A2 = A + AA;
- *B2 = B + BB;
- *C2 = C + CC;
- *D2 = D + DD;
-
- //The clearance of confidential information
- memset(pX, 0, sizeof(X));
-}
-
-//-------------------------------------------------------------------
-// The function for the exteriors
-
-/** output is the coded binary in the character sequence which wants to code string. */
-void MD5_String2binary(const char * string, char * output)
-{
-//var
- /*8bit*/
- unsigned char padding_message[64]; //Extended message 512bit 64byte
- unsigned char *pstring; //The position of string in the present scanning notes is held.
-
-// unsigned char digest[16];
- /*32bit*/
- unsigned int string_byte_len, //The byte chief of string is held.
- string_bit_len, //The bit length of string is held.
- copy_len, //The number of bytes which is used by 1-3 and which remained
- msg_digest[4]; //Message digest 128bit 4byte
- unsigned int *A = &msg_digest[0], //The message digest in accordance with RFC (reference)
- *B = &msg_digest[1],
- *C = &msg_digest[2],
- *D = &msg_digest[3];
- int i;
-
-//prog
- //Step 3.Initialize MD Buffer (although it is the initialization; step 3 of A, B, C, and D -- unavoidable -- a head)
- *A = 0x67452301;
- *B = 0xefcdab89;
- *C = 0x98badcfe;
- *D = 0x10325476;
-
- //Step 1.Append Padding Bits (extension of a mark bit)
- //1-1
- string_byte_len = strlen(string); //The byte chief of a character sequence is acquired.
- pstring = (unsigned char *)string; //The position of the present character sequence is set.
-
- //1-2 Repeat calculation until length becomes less than 64 bytes.
- for (i=string_byte_len; 64<=i; i-=64,pstring+=64)
- MD5_Round_Calculate(pstring, A,B,C,D);
-
- //1-3
- copy_len = string_byte_len % 64; //The number of bytes which remained is computed.
- strncpy((char *)padding_message, (char *)pstring, copy_len); //A message is copied to an extended bit sequence.
- memset(padding_message+copy_len, 0, 64 - copy_len); //It buries by 0 until it becomes extended bit length.
- padding_message[copy_len] |= 0x80; //The next of a message is 1.
-
- //1-4
- //If 56 bytes or more (less than 64 bytes) of remainder becomes, it will calculate by extending to 64 bytes.
- if (56 <= copy_len) {
- MD5_Round_Calculate(padding_message, A,B,C,D);
- memset(padding_message, 0, 56); //56 bytes is newly fill uped with 0.
- }
-
-
- //Step 2.Append Length (the information on length is added)
- string_bit_len = string_byte_len * 8; //From the byte chief to bit length (32 bytes of low rank)
- memcpy(&padding_message[56], &string_bit_len, 4); //32 bytes of low rank is set.
-
- //When bit length cannot be expressed in 32 bytes of low rank, it is a beam raising to a higher rank.
- if (UINT_MAX / 8 < string_byte_len) {
- unsigned int high = (string_byte_len - UINT_MAX / 8) * 8;
- memcpy(&padding_message[60], &high, 4);
- } else
- memset(&padding_message[60], 0, 4); //In this case, it is good for a higher rank at 0.
-
- //Step 4.Process Message in 16-Word Blocks (calculation of MD5)
- MD5_Round_Calculate(padding_message, A,B,C,D);
-
-
- //Step 5.Output (output)
- memcpy(output,msg_digest,16);
-// memcpy (digest, msg_digest, and 16); //8 byte*4 < - 32byte conversion A function called Encode as used in the field of RFC
-/* sprintf(output,
- "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
- digest[ 0], digest[ 1], digest[ 2], digest[ 3],
- digest[ 4], digest[ 5], digest[ 6], digest[ 7],
- digest[ 8], digest[ 9], digest[10], digest[11],
- digest[12], digest[13], digest[14], digest[15]);*/
-}
-
-/** output is the coded character sequence in the character sequence which wants to code string. */
-void MD5_String(const char * string, char * output)
-{
- unsigned char digest[16];
-
- MD5_String2binary(string,(char*)digest);
- sprintf(output,
- "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
- digest[ 0], digest[ 1], digest[ 2], digest[ 3],
- digest[ 4], digest[ 5], digest[ 6], digest[ 7],
- digest[ 8], digest[ 9], digest[10], digest[11],
- digest[12], digest[13], digest[14], digest[15]);
-}
-
diff --git a/src/ladmin/md5calc.h b/src/ladmin/md5calc.h
deleted file mode 100644
index b4dd61495..000000000
--- a/src/ladmin/md5calc.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// $Id: md5calc.h,v 1.1.1.1 2004/09/10 17:26:53 MagicalTux Exp $
-#ifndef _MD5CALC_H_
-#define _MD5CALC_H_
-
-void MD5_String(const char * string, char * output);
-void MD5_String2binary(const char * string, char * output);
-
-#endif
diff --git a/src/lib/zconf_win32.h b/src/lib/zconf_win32.h
deleted file mode 100644
index 6d450fc79..000000000
--- a/src/lib/zconf_win32.h
+++ /dev/null
@@ -1,279 +0,0 @@
-/* zconf.h -- configuration of the zlib compression library
- * Copyright (C) 1995-1998 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* @(#) $Id$ */
-
-#ifndef _ZCONF_H
-#define _ZCONF_H
-
-/*
- * If you *really* need a unique prefix for all types and library functions,
- * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
- */
-#ifdef Z_PREFIX
-# define deflateInit_ z_deflateInit_
-# define deflate z_deflate
-# define deflateEnd z_deflateEnd
-# define inflateInit_ z_inflateInit_
-# define inflate z_inflate
-# define inflateEnd z_inflateEnd
-# define deflateInit2_ z_deflateInit2_
-# define deflateSetDictionary z_deflateSetDictionary
-# define deflateCopy z_deflateCopy
-# define deflateReset z_deflateReset
-# define deflateParams z_deflateParams
-# define inflateInit2_ z_inflateInit2_
-# define inflateSetDictionary z_inflateSetDictionary
-# define inflateSync z_inflateSync
-# define inflateSyncPoint z_inflateSyncPoint
-# define inflateReset z_inflateReset
-# define compress z_compress
-# define compress2 z_compress2
-# define uncompress z_uncompress
-# define adler32 z_adler32
-# define crc32 z_crc32
-# define get_crc_table z_get_crc_table
-
-# define Byte z_Byte
-# define uInt z_uInt
-# define uLong z_uLong
-# define Bytef z_Bytef
-# define charf z_charf
-# define intf z_intf
-# define uIntf z_uIntf
-# define uLongf z_uLongf
-# define voidpf z_voidpf
-# define voidp z_voidp
-#endif
-
-#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
-# define WIN32
-#endif
-#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386)
-# ifndef __32BIT__
-# define __32BIT__
-# endif
-#endif
-#if defined(__MSDOS__) && !defined(MSDOS)
-# define MSDOS
-#endif
-
-/*
- * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
- * than 64k bytes at a time (needed on systems with 16-bit int).
- */
-#if defined(MSDOS) && !defined(__32BIT__)
-# define MAXSEG_64K
-#endif
-#ifdef MSDOS
-# define UNALIGNED_OK
-#endif
-
-#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32)) && !defined(STDC)
-# define STDC
-#endif
-#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__)
-# ifndef STDC
-# define STDC
-# endif
-#endif
-
-#ifndef STDC
-# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
-# define const
-# endif
-#endif
-
-/* Some Mac compilers merge all .h files incorrectly: */
-#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__)
-# define NO_DUMMY_DECL
-#endif
-
-/* Old Borland C incorrectly complains about missing returns: */
-#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500)
-# define NEED_DUMMY_RETURN
-#endif
-
-
-/* Maximum value for memLevel in deflateInit2 */
-#ifndef MAX_MEM_LEVEL
-# ifdef MAXSEG_64K
-# define MAX_MEM_LEVEL 8
-# else
-# define MAX_MEM_LEVEL 9
-# endif
-#endif
-
-/* Maximum value for windowBits in deflateInit2 and inflateInit2.
- * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
- * created by gzip. (Files created by minigzip can still be extracted by
- * gzip.)
- */
-#ifndef MAX_WBITS
-# define MAX_WBITS 15 /* 32K LZ77 window */
-#endif
-
-/* The memory requirements for deflate are (in bytes):
- (1 << (windowBits+2)) + (1 << (memLevel+9))
- that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
- plus a few kilobytes for small objects. For example, if you want to reduce
- the default memory requirements from 256K to 128K, compile with
- make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
- Of course this will generally degrade compression (there's no free lunch).
-
- The memory requirements for inflate are (in bytes) 1 << windowBits
- that is, 32K for windowBits=15 (default value) plus a few kilobytes
- for small objects.
-*/
-
- /* Type declarations */
-
-#ifndef OF /* function prototypes */
-# ifdef STDC
-# define OF(args) args
-# else
-# define OF(args) ()
-# endif
-#endif
-
-/* The following definitions for FAR are needed only for MSDOS mixed
- * model programming (small or medium model with some far allocations).
- * This was tested only with MSC; for other MSDOS compilers you may have
- * to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
- * just define FAR to be empty.
- */
-#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__)
- /* MSC small or medium model */
-# define SMALL_MEDIUM
-# ifdef _MSC_VER
-# define FAR _far
-# else
-# define FAR far
-# endif
-#endif
-#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__))
-# ifndef __32BIT__
-# define SMALL_MEDIUM
-# define FAR _far
-# endif
-#endif
-
-/* Compile with -DZLIB_DLL for Windows DLL support */
-#if defined(ZLIB_DLL)
-# if defined(_WINDOWS) || defined(WINDOWS)
-# ifdef FAR
-# undef FAR
-# endif
-# include <windows.h>
-# define ZEXPORT WINAPI
-# ifdef WIN32
-# define ZEXPORTVA WINAPIV
-# else
-# define ZEXPORTVA FAR _cdecl _export
-# endif
-# endif
-# if defined (__BORLANDC__)
-# if (__BORLANDC__ >= 0x0500) && defined (WIN32)
-# include <windows.h>
-# define ZEXPORT __declspec(dllexport) WINAPI
-# define ZEXPORTRVA __declspec(dllexport) WINAPIV
-# else
-# if defined (_Windows) && defined (__DLL__)
-# define ZEXPORT _export
-# define ZEXPORTVA _export
-# endif
-# endif
-# endif
-#endif
-
-#if defined (__BEOS__)
-# if defined (ZLIB_DLL)
-# define ZEXTERN extern __declspec(dllexport)
-# else
-# define ZEXTERN extern __declspec(dllimport)
-# endif
-#endif
-
-#ifndef ZEXPORT
-# define ZEXPORT
-#endif
-#ifndef ZEXPORTVA
-# define ZEXPORTVA
-#endif
-#ifndef ZEXTERN
-# define ZEXTERN extern
-#endif
-
-#ifndef FAR
-# define FAR
-#endif
-
-#if !defined(MACOS) && !defined(TARGET_OS_MAC)
-typedef unsigned char Byte; /* 8 bits */
-#endif
-typedef unsigned int uInt; /* 16 bits or more */
-typedef unsigned long uLong; /* 32 bits or more */
-
-#ifdef SMALL_MEDIUM
- /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
-# define Bytef Byte FAR
-#else
- typedef Byte FAR Bytef;
-#endif
-typedef char FAR charf;
-typedef int FAR intf;
-typedef uInt FAR uIntf;
-typedef uLong FAR uLongf;
-
-#ifdef STDC
- typedef void FAR *voidpf;
- typedef void *voidp;
-#else
- typedef Byte FAR *voidpf;
- typedef Byte *voidp;
-#endif
-
-#ifdef HAVE_UNISTD_H
-# include <sys/types.h> /* for off_t */
-# include <unistd.h> /* for SEEK_* and off_t */
-# define z_off_t off_t
-#endif
-#ifndef SEEK_SET
-# define SEEK_SET 0 /* Seek from beginning of file. */
-# define SEEK_CUR 1 /* Seek from current position. */
-# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
-#endif
-#ifndef z_off_t
-# define z_off_t long
-#endif
-
-/* MVS linker does not support external names larger than 8 bytes */
-#if defined(__MVS__)
-# pragma map(deflateInit_,"DEIN")
-# pragma map(deflateInit2_,"DEIN2")
-# pragma map(deflateEnd,"DEEND")
-# pragma map(inflateInit_,"ININ")
-# pragma map(inflateInit2_,"ININ2")
-# pragma map(inflateEnd,"INEND")
-# pragma map(inflateSync,"INSY")
-# pragma map(inflateSetDictionary,"INSEDI")
-# pragma map(inflate_blocks,"INBL")
-# pragma map(inflate_blocks_new,"INBLNE")
-# pragma map(inflate_blocks_free,"INBLFR")
-# pragma map(inflate_blocks_reset,"INBLRE")
-# pragma map(inflate_codes_free,"INCOFR")
-# pragma map(inflate_codes,"INCO")
-# pragma map(inflate_fast,"INFA")
-# pragma map(inflate_flush,"INFLU")
-# pragma map(inflate_mask,"INMA")
-# pragma map(inflate_set_dictionary,"INSEDI2")
-# pragma map(inflate_copyright,"INCOPY")
-# pragma map(inflate_trees_bits,"INTRBI")
-# pragma map(inflate_trees_dynamic,"INTRDY")
-# pragma map(inflate_trees_fixed,"INTRFI")
-# pragma map(inflate_trees_free,"INTRFR")
-#endif
-
-#endif /* _ZCONF_H */
diff --git a/src/lib/zlib_win32.h b/src/lib/zlib_win32.h
deleted file mode 100644
index 3cd63c939..000000000
--- a/src/lib/zlib_win32.h
+++ /dev/null
@@ -1,893 +0,0 @@
-/* zlib.h -- interface of the 'zlib' general purpose compression library
- version 1.1.3, July 9th, 1998
-
- Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-
- Jean-loup Gailly Mark Adler
- jloup@gzip.org madler@alumni.caltech.edu
-
-
- The data format used by the zlib library is described by RFCs (Request for
- Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt
- (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
-*/
-
-#ifndef _ZLIB_H
-#define _ZLIB_H
-
-#include "zconf_win32.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define ZLIB_VERSION "1.1.3"
-
-/*
- The 'zlib' compression library provides in-memory compression and
- decompression functions, including integrity checks of the uncompressed
- data. This version of the library supports only one compression method
- (deflation) but other algorithms will be added later and will have the same
- stream interface.
-
- Compression can be done in a single step if the buffers are large
- enough (for example if an input file is mmap'ed), or can be done by
- repeated calls of the compression function. In the latter case, the
- application must provide more input and/or consume the output
- (providing more output space) before each call.
-
- The library also supports reading and writing files in gzip (.gz) format
- with an interface similar to that of stdio.
-
- The library does not install any signal handler. The decoder checks
- the consistency of the compressed data, so the library should never
- crash even in case of corrupted input.
-*/
-
-typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
-typedef void (*free_func) OF((voidpf opaque, voidpf address));
-
-struct internal_state;
-
-typedef struct z_stream_s {
- Bytef *next_in; /* next input byte */
- uInt avail_in; /* number of bytes available at next_in */
- uLong total_in; /* total nb of input bytes read so far */
-
- Bytef *next_out; /* next output byte should be put there */
- uInt avail_out; /* remaining free space at next_out */
- uLong total_out; /* total nb of bytes output so far */
-
- char *msg; /* last error message, NULL if no error */
- struct internal_state FAR *state; /* not visible by applications */
-
- alloc_func zalloc; /* used to allocate the internal state */
- free_func zfree; /* used to free the internal state */
- voidpf opaque; /* private data object passed to zalloc and zfree */
-
- int data_type; /* best guess about the data type: ascii or binary */
- uLong adler; /* adler32 value of the uncompressed data */
- uLong reserved; /* reserved for future use */
-} z_stream;
-
-typedef z_stream FAR *z_streamp;
-
-/*
- The application must update next_in and avail_in when avail_in has
- dropped to zero. It must update next_out and avail_out when avail_out
- has dropped to zero. The application must initialize zalloc, zfree and
- opaque before calling the init function. All other fields are set by the
- compression library and must not be updated by the application.
-
- The opaque value provided by the application will be passed as the first
- parameter for calls of zalloc and zfree. This can be useful for custom
- memory management. The compression library attaches no meaning to the
- opaque value.
-
- zalloc must return Z_NULL if there is not enough memory for the object.
- If zlib is used in a multi-threaded application, zalloc and zfree must be
- thread safe.
-
- On 16-bit systems, the functions zalloc and zfree must be able to allocate
- exactly 65536 bytes, but will not be required to allocate more than this
- if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
- pointers returned by zalloc for objects of exactly 65536 bytes *must*
- have their offset normalized to zero. The default allocation function
- provided by this library ensures this (see zutil.c). To reduce memory
- requirements and avoid any allocation of 64K objects, at the expense of
- compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
-
- The fields total_in and total_out can be used for statistics or
- progress reports. After compression, total_in holds the total size of
- the uncompressed data and may be saved for use in the decompressor
- (particularly if the decompressor wants to decompress everything in
- a single step).
-*/
-
- /* constants */
-
-#define Z_NO_FLUSH 0
-#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */
-#define Z_SYNC_FLUSH 2
-#define Z_FULL_FLUSH 3
-#define Z_FINISH 4
-/* Allowed flush values; see deflate() below for details */
-
-#define Z_OK 0
-#define Z_STREAM_END 1
-#define Z_NEED_DICT 2
-#define Z_ERRNO (-1)
-#define Z_STREAM_ERROR (-2)
-#define Z_DATA_ERROR (-3)
-#define Z_MEM_ERROR (-4)
-#define Z_BUF_ERROR (-5)
-#define Z_VERSION_ERROR (-6)
-/* Return codes for the compression/decompression functions. Negative
- * values are errors, positive values are used for special but normal events.
- */
-
-#define Z_NO_COMPRESSION 0
-#define Z_BEST_SPEED 1
-#define Z_BEST_COMPRESSION 9
-#define Z_DEFAULT_COMPRESSION (-1)
-/* compression levels */
-
-#define Z_FILTERED 1
-#define Z_HUFFMAN_ONLY 2
-#define Z_DEFAULT_STRATEGY 0
-/* compression strategy; see deflateInit2() below for details */
-
-#define Z_BINARY 0
-#define Z_ASCII 1
-#define Z_UNKNOWN 2
-/* Possible values of the data_type field */
-
-#define Z_DEFLATED 8
-/* The deflate compression method (the only one supported in this version) */
-
-#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */
-
-#define zlib_version zlibVersion()
-/* for compatibility with versions < 1.0.2 */
-
- /* basic functions */
-
-ZEXTERN const char * ZEXPORT zlibVersion OF((void));
-/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
- If the first character differs, the library code actually used is
- not compatible with the zlib.h header file used by the application.
- This check is automatically made by deflateInit and inflateInit.
- */
-
-/*
-ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
-
- Initializes the internal stream state for compression. The fields
- zalloc, zfree and opaque must be initialized before by the caller.
- If zalloc and zfree are set to Z_NULL, deflateInit updates them to
- use default allocation functions.
-
- The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
- 1 gives best speed, 9 gives best compression, 0 gives no compression at
- all (the input data is simply copied a block at a time).
- Z_DEFAULT_COMPRESSION requests a default compromise between speed and
- compression (currently equivalent to level 6).
-
- deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
- enough memory, Z_STREAM_ERROR if level is not a valid compression level,
- Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible
- with the version assumed by the caller (ZLIB_VERSION).
- msg is set to null if there is no error message. deflateInit does not
- perform any compression: this will be done by deflate().
-*/
-
-
-ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
-/*
- deflate compresses as much data as possible, and stops when the input
- buffer becomes empty or the output buffer becomes full. It may introduce some
- output latency (reading input without producing any output) except when
- forced to flush.
-
- The detailed semantics are as follows. deflate performs one or both of the
- following actions:
-
- - Compress more input starting at next_in and update next_in and avail_in
- accordingly. If not all input can be processed (because there is not
- enough room in the output buffer), next_in and avail_in are updated and
- processing will resume at this point for the next call of deflate().
-
- - Provide more output starting at next_out and update next_out and avail_out
- accordingly. This action is forced if the parameter flush is non zero.
- Forcing flush frequently degrades the compression ratio, so this parameter
- should be set only when necessary (in interactive applications).
- Some output may be provided even if flush is not set.
-
- Before the call of deflate(), the application should ensure that at least
- one of the actions is possible, by providing more input and/or consuming
- more output, and updating avail_in or avail_out accordingly; avail_out
- should never be zero before the call. The application can consume the
- compressed output when it wants, for example when the output buffer is full
- (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK
- and with zero avail_out, it must be called again after making room in the
- output buffer because there might be more output pending.
-
- If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
- flushed to the output buffer and the output is aligned on a byte boundary, so
- that the decompressor can get all input data available so far. (In particular
- avail_in is zero after the call if enough output space has been provided
- before the call.) Flushing may degrade compression for some compression
- algorithms and so it should be used only when necessary.
-
- If flush is set to Z_FULL_FLUSH, all output is flushed as with
- Z_SYNC_FLUSH, and the compression state is reset so that decompression can
- restart from this point if previous compressed data has been damaged or if
- random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
- the compression.
-
- If deflate returns with avail_out == 0, this function must be called again
- with the same value of the flush parameter and more output space (updated
- avail_out), until the flush is complete (deflate returns with non-zero
- avail_out).
-
- If the parameter flush is set to Z_FINISH, pending input is processed,
- pending output is flushed and deflate returns with Z_STREAM_END if there
- was enough output space; if deflate returns with Z_OK, this function must be
- called again with Z_FINISH and more output space (updated avail_out) but no
- more input data, until it returns with Z_STREAM_END or an error. After
- deflate has returned Z_STREAM_END, the only possible operations on the
- stream are deflateReset or deflateEnd.
-
- Z_FINISH can be used immediately after deflateInit if all the compression
- is to be done in a single step. In this case, avail_out must be at least
- 0.1% larger than avail_in plus 12 bytes. If deflate does not return
- Z_STREAM_END, then it must be called again as described above.
-
- deflate() sets strm->adler to the adler32 checksum of all input read
- so far (that is, total_in bytes).
-
- deflate() may update data_type if it can make a good guess about
- the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered
- binary. This field is only for information purposes and does not affect
- the compression algorithm in any manner.
-
- deflate() returns Z_OK if some progress has been made (more input
- processed or more output produced), Z_STREAM_END if all input has been
- consumed and all output has been produced (only when flush is set to
- Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
- if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible
- (for example avail_in or avail_out was zero).
-*/
-
-
-ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
-/*
- All dynamically allocated data structures for this stream are freed.
- This function discards any unprocessed input and does not flush any
- pending output.
-
- deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
- stream state was inconsistent, Z_DATA_ERROR if the stream was freed
- prematurely (some input or output was discarded). In the error case,
- msg may be set but then points to a static string (which must not be
- deallocated).
-*/
-
-
-/*
-ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
-
- Initializes the internal stream state for decompression. The fields
- next_in, avail_in, zalloc, zfree and opaque must be initialized before by
- the caller. If next_in is not Z_NULL and avail_in is large enough (the exact
- value depends on the compression method), inflateInit determines the
- compression method from the zlib header and allocates all data structures
- accordingly; otherwise the allocation will be deferred to the first call of
- inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to
- use default allocation functions.
-
- inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
- memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
- version assumed by the caller. msg is set to null if there is no error
- message. inflateInit does not perform any decompression apart from reading
- the zlib header if present: this will be done by inflate(). (So next_in and
- avail_in may be modified, but next_out and avail_out are unchanged.)
-*/
-
-
-ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
-/*
- inflate decompresses as much data as possible, and stops when the input
- buffer becomes empty or the output buffer becomes full. It may some
- introduce some output latency (reading input without producing any output)
- except when forced to flush.
-
- The detailed semantics are as follows. inflate performs one or both of the
- following actions:
-
- - Decompress more input starting at next_in and update next_in and avail_in
- accordingly. If not all input can be processed (because there is not
- enough room in the output buffer), next_in is updated and processing
- will resume at this point for the next call of inflate().
-
- - Provide more output starting at next_out and update next_out and avail_out
- accordingly. inflate() provides as much output as possible, until there
- is no more input data or no more space in the output buffer (see below
- about the flush parameter).
-
- Before the call of inflate(), the application should ensure that at least
- one of the actions is possible, by providing more input and/or consuming
- more output, and updating the next_* and avail_* values accordingly.
- The application can consume the uncompressed output when it wants, for
- example when the output buffer is full (avail_out == 0), or after each
- call of inflate(). If inflate returns Z_OK and with zero avail_out, it
- must be called again after making room in the output buffer because there
- might be more output pending.
-
- If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much
- output as possible to the output buffer. The flushing behavior of inflate is
- not specified for values of the flush parameter other than Z_SYNC_FLUSH
- and Z_FINISH, but the current implementation actually flushes as much output
- as possible anyway.
-
- inflate() should normally be called until it returns Z_STREAM_END or an
- error. However if all decompression is to be performed in a single step
- (a single call of inflate), the parameter flush should be set to
- Z_FINISH. In this case all pending input is processed and all pending
- output is flushed; avail_out must be large enough to hold all the
- uncompressed data. (The size of the uncompressed data may have been saved
- by the compressor for this purpose.) The next operation on this stream must
- be inflateEnd to deallocate the decompression state. The use of Z_FINISH
- is never required, but can be used to inform inflate that a faster routine
- may be used for the single inflate() call.
-
- If a preset dictionary is needed at this point (see inflateSetDictionary
- below), inflate sets strm-adler to the adler32 checksum of the
- dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise
- it sets strm->adler to the adler32 checksum of all output produced
- so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or
- an error code as described below. At the end of the stream, inflate()
- checks that its computed adler32 checksum is equal to that saved by the
- compressor and returns Z_STREAM_END only if the checksum is correct.
-
- inflate() returns Z_OK if some progress has been made (more input processed
- or more output produced), Z_STREAM_END if the end of the compressed data has
- been reached and all uncompressed output has been produced, Z_NEED_DICT if a
- preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
- corrupted (input stream not conforming to the zlib format or incorrect
- adler32 checksum), Z_STREAM_ERROR if the stream structure was inconsistent
- (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not
- enough memory, Z_BUF_ERROR if no progress is possible or if there was not
- enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR
- case, the application may then call inflateSync to look for a good
- compression block.
-*/
-
-
-ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
-/*
- All dynamically allocated data structures for this stream are freed.
- This function discards any unprocessed input and does not flush any
- pending output.
-
- inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
- was inconsistent. In the error case, msg may be set but then points to a
- static string (which must not be deallocated).
-*/
-
- /* Advanced functions */
-
-/*
- The following functions are needed only in some special applications.
-*/
-
-/*
-ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
- int level,
- int method,
- int windowBits,
- int memLevel,
- int strategy));
-
- This is another version of deflateInit with more compression options. The
- fields next_in, zalloc, zfree and opaque must be initialized before by
- the caller.
-
- The method parameter is the compression method. It must be Z_DEFLATED in
- this version of the library.
-
- The windowBits parameter is the base two logarithm of the window size
- (the size of the history buffer). It should be in the range 8..15 for this
- version of the library. Larger values of this parameter result in better
- compression at the expense of memory usage. The default value is 15 if
- deflateInit is used instead.
-
- The memLevel parameter specifies how much memory should be allocated
- for the internal compression state. memLevel=1 uses minimum memory but
- is slow and reduces compression ratio; memLevel=9 uses maximum memory
- for optimal speed. The default value is 8. See zconf.h for total memory
- usage as a function of windowBits and memLevel.
-
- The strategy parameter is used to tune the compression algorithm. Use the
- value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
- filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman encoding only (no
- string match). Filtered data consists mostly of small values with a
- somewhat random distribution. In this case, the compression algorithm is
- tuned to compress them better. The effect of Z_FILTERED is to force more
- Huffman coding and less string matching; it is somewhat intermediate
- between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy parameter only affects
- the compression ratio but not the correctness of the compressed output even
- if it is not set appropriately.
-
- deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
- memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid
- method). msg is set to null if there is no error message. deflateInit2 does
- not perform any compression: this will be done by deflate().
-*/
-
-ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
- const Bytef *dictionary,
- uInt dictLength));
-/*
- Initializes the compression dictionary from the given byte sequence
- without producing any compressed output. This function must be called
- immediately after deflateInit, deflateInit2 or deflateReset, before any
- call of deflate. The compressor and decompressor must use exactly the same
- dictionary (see inflateSetDictionary).
-
- The dictionary should consist of strings (byte sequences) that are likely
- to be encountered later in the data to be compressed, with the most commonly
- used strings preferably put towards the end of the dictionary. Using a
- dictionary is most useful when the data to be compressed is short and can be
- predicted with good accuracy; the data can then be compressed better than
- with the default empty dictionary.
-
- Depending on the size of the compression data structures selected by
- deflateInit or deflateInit2, a part of the dictionary may in effect be
- discarded, for example if the dictionary is larger than the window size in
- deflate or deflate2. Thus the strings most likely to be useful should be
- put at the end of the dictionary, not at the front.
-
- Upon return of this function, strm->adler is set to the Adler32 value
- of the dictionary; the decompressor may later use this value to determine
- which dictionary has been used by the compressor. (The Adler32 value
- applies to the whole dictionary even if only a subset of the dictionary is
- actually used by the compressor.)
-
- deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
- parameter is invalid (such as NULL dictionary) or the stream state is
- inconsistent (for example if deflate has already been called for this stream
- or if the compression method is bsort). deflateSetDictionary does not
- perform any compression: this will be done by deflate().
-*/
-
-ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
- z_streamp source));
-/*
- Sets the destination stream as a complete copy of the source stream.
-
- This function can be useful when several compression strategies will be
- tried, for example when there are several ways of pre-processing the input
- data with a filter. The streams that will be discarded should then be freed
- by calling deflateEnd. Note that deflateCopy duplicates the internal
- compression state which can be quite large, so this strategy is slow and
- can consume lots of memory.
-
- deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
- enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
- (such as zalloc being NULL). msg is left unchanged in both source and
- destination.
-*/
-
-ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));
-/*
- This function is equivalent to deflateEnd followed by deflateInit,
- but does not free and reallocate all the internal compression state.
- The stream will keep the same compression level and any other attributes
- that may have been set by deflateInit2.
-
- deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
- stream state was inconsistent (such as zalloc or state being NULL).
-*/
-
-ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
- int level,
- int strategy));
-/*
- Dynamically update the compression level and compression strategy. The
- interpretation of level and strategy is as in deflateInit2. This can be
- used to switch between compression and straight copy of the input data, or
- to switch to a different kind of input data requiring a different
- strategy. If the compression level is changed, the input available so far
- is compressed with the old level (and may be flushed); the new level will
- take effect only at the next call of deflate().
-
- Before the call of deflateParams, the stream state must be set as for
- a call of deflate(), since the currently available input may have to
- be compressed and flushed. In particular, strm->avail_out must be non-zero.
-
- deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
- stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR
- if strm->avail_out was zero.
-*/
-
-/*
-ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
- int windowBits));
-
- This is another version of inflateInit with an extra parameter. The
- fields next_in, avail_in, zalloc, zfree and opaque must be initialized
- before by the caller.
-
- The windowBits parameter is the base two logarithm of the maximum window
- size (the size of the history buffer). It should be in the range 8..15 for
- this version of the library. The default value is 15 if inflateInit is used
- instead. If a compressed stream with a larger window size is given as
- input, inflate() will return with the error code Z_DATA_ERROR instead of
- trying to allocate a larger window.
-
- inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
- memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative
- memLevel). msg is set to null if there is no error message. inflateInit2
- does not perform any decompression apart from reading the zlib header if
- present: this will be done by inflate(). (So next_in and avail_in may be
- modified, but next_out and avail_out are unchanged.)
-*/
-
-ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
- const Bytef *dictionary,
- uInt dictLength));
-/*
- Initializes the decompression dictionary from the given uncompressed byte
- sequence. This function must be called immediately after a call of inflate
- if this call returned Z_NEED_DICT. The dictionary chosen by the compressor
- can be determined from the Adler32 value returned by this call of
- inflate. The compressor and decompressor must use exactly the same
- dictionary (see deflateSetDictionary).
-
- inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
- parameter is invalid (such as NULL dictionary) or the stream state is
- inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the
- expected one (incorrect Adler32 value). inflateSetDictionary does not
- perform any decompression: this will be done by subsequent calls of
- inflate().
-*/
-
-ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
-/*
- Skips invalid compressed data until a full flush point (see above the
- description of deflate with Z_FULL_FLUSH) can be found, or until all
- available input is skipped. No output is provided.
-
- inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR
- if no more input was provided, Z_DATA_ERROR if no flush point has been found,
- or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
- case, the application may save the current current value of total_in which
- indicates where valid compressed data was found. In the error case, the
- application may repeatedly call inflateSync, providing more input each time,
- until success or end of the input data.
-*/
-
-ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
-/*
- This function is equivalent to inflateEnd followed by inflateInit,
- but does not free and reallocate all the internal decompression state.
- The stream will keep attributes that may have been set by inflateInit2.
-
- inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
- stream state was inconsistent (such as zalloc or state being NULL).
-*/
-
-
- /* utility functions */
-
-/*
- The following utility functions are implemented on top of the
- basic stream-oriented functions. To simplify the interface, some
- default options are assumed (compression level and memory usage,
- standard memory allocation functions). The source code of these
- utility functions can easily be modified if you need special options.
-*/
-
-ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
- const Bytef *source, uLong sourceLen));
-/*
- Compresses the source buffer into the destination buffer. sourceLen is
- the byte length of the source buffer. Upon entry, destLen is the total
- size of the destination buffer, which must be at least 0.1% larger than
- sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the
- compressed buffer.
- This function can be used to compress a whole file at once if the
- input file is mmap'ed.
- compress returns Z_OK if success, Z_MEM_ERROR if there was not
- enough memory, Z_BUF_ERROR if there was not enough room in the output
- buffer.
-*/
-
-ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
- const Bytef *source, uLong sourceLen,
- int level));
-/*
- Compresses the source buffer into the destination buffer. The level
- parameter has the same meaning as in deflateInit. sourceLen is the byte
- length of the source buffer. Upon entry, destLen is the total size of the
- destination buffer, which must be at least 0.1% larger than sourceLen plus
- 12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
-
- compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
- memory, Z_BUF_ERROR if there was not enough room in the output buffer,
- Z_STREAM_ERROR if the level parameter is invalid.
-*/
-
-ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
- const Bytef *source, uLong sourceLen));
-/*
- Decompresses the source buffer into the destination buffer. sourceLen is
- the byte length of the source buffer. Upon entry, destLen is the total
- size of the destination buffer, which must be large enough to hold the
- entire uncompressed data. (The size of the uncompressed data must have
- been saved previously by the compressor and transmitted to the decompressor
- by some mechanism outside the scope of this compression library.)
- Upon exit, destLen is the actual size of the compressed buffer.
- This function can be used to decompress a whole file at once if the
- input file is mmap'ed.
-
- uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
- enough memory, Z_BUF_ERROR if there was not enough room in the output
- buffer, or Z_DATA_ERROR if the input data was corrupted.
-*/
-
-
-typedef voidp gzFile;
-
-ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
-/*
- Opens a gzip (.gz) file for reading or writing. The mode parameter
- is as in fopen ("rb" or "wb") but can also include a compression level
- ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for
- Huffman only compression as in "wb1h". (See the description
- of deflateInit2 for more information about the strategy parameter.)
-
- gzopen can be used to read a file which is not in gzip format; in this
- case gzread will directly read from the file without decompression.
-
- gzopen returns NULL if the file could not be opened or if there was
- insufficient memory to allocate the (de)compression state; errno
- can be checked to distinguish the two cases (if errno is zero, the
- zlib error is Z_MEM_ERROR). */
-
-ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
-/*
- gzdopen() associates a gzFile with the file descriptor fd. File
- descriptors are obtained from calls like open, dup, creat, pipe or
- fileno (in the file has been previously opened with fopen).
- The mode parameter is as in gzopen.
- The next call of gzclose on the returned gzFile will also close the
- file descriptor fd, just like fclose(fdopen(fd), mode) closes the file
- descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode).
- gzdopen returns NULL if there was insufficient memory to allocate
- the (de)compression state.
-*/
-
-ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
-/*
- Dynamically update the compression level or strategy. See the description
- of deflateInit2 for the meaning of these parameters.
- gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not
- opened for writing.
-*/
-
-ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
-/*
- Reads the given number of uncompressed bytes from the compressed file.
- If the input file was not in gzip format, gzread copies the given number
- of bytes into the buffer.
- gzread returns the number of uncompressed bytes actually read (0 for
- end of file, -1 for error). */
-
-ZEXTERN int ZEXPORT gzwrite OF((gzFile file,
- const voidp buf, unsigned len));
-/*
- Writes the given number of uncompressed bytes into the compressed file.
- gzwrite returns the number of uncompressed bytes actually written
- (0 in case of error).
-*/
-
-ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...));
-/*
- Converts, formats, and writes the args to the compressed file under
- control of the format string, as in fprintf. gzprintf returns the number of
- uncompressed bytes actually written (0 in case of error).
-*/
-
-ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
-/*
- Writes the given null-terminated string to the compressed file, excluding
- the terminating null character.
- gzputs returns the number of characters written, or -1 in case of error.
-*/
-
-ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
-/*
- Reads bytes from the compressed file until len-1 characters are read, or
- a newline character is read and transferred to buf, or an end-of-file
- condition is encountered. The string is then terminated with a null
- character.
- gzgets returns buf, or Z_NULL in case of error.
-*/
-
-ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));
-/*
- Writes c, converted to an unsigned char, into the compressed file.
- gzputc returns the value that was written, or -1 in case of error.
-*/
-
-ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
-/*
- Reads one byte from the compressed file. gzgetc returns this byte
- or -1 in case of end of file or error.
-*/
-
-ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
-/*
- Flushes all pending output into the compressed file. The parameter
- flush is as in the deflate() function. The return value is the zlib
- error number (see function gzerror below). gzflush returns Z_OK if
- the flush parameter is Z_FINISH and all output could be flushed.
- gzflush should be called only when strictly necessary because it can
- degrade compression.
-*/
-
-ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
- z_off_t offset, int whence));
-/*
- Sets the starting position for the next gzread or gzwrite on the
- given compressed file. The offset represents a number of bytes in the
- uncompressed data stream. The whence parameter is defined as in lseek(2);
- the value SEEK_END is not supported.
- If the file is opened for reading, this function is emulated but can be
- extremely slow. If the file is opened for writing, only forward seeks are
- supported; gzseek then compresses a sequence of zeroes up to the new
- starting position.
-
- gzseek returns the resulting offset location as measured in bytes from
- the beginning of the uncompressed stream, or -1 in case of error, in
- particular if the file is opened for writing and the new starting position
- would be before the current position.
-*/
-
-ZEXTERN int ZEXPORT gzrewind OF((gzFile file));
-/*
- Rewinds the given file. This function is supported only for reading.
-
- gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
-*/
-
-ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file));
-/*
- Returns the starting position for the next gzread or gzwrite on the
- given compressed file. This position represents a number of bytes in the
- uncompressed data stream.
-
- gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
-*/
-
-ZEXTERN int ZEXPORT gzeof OF((gzFile file));
-/*
- Returns 1 when EOF has previously been detected reading the given
- input stream, otherwise zero.
-*/
-
-ZEXTERN int ZEXPORT gzclose OF((gzFile file));
-/*
- Flushes all pending output if necessary, closes the compressed file
- and deallocates all the (de)compression state. The return value is the zlib
- error number (see function gzerror below).
-*/
-
-ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
-/*
- Returns the error message for the last error which occurred on the
- given compressed file. errnum is set to zlib error number. If an
- error occurred in the file system and not in the compression library,
- errnum is set to Z_ERRNO and the application may consult errno
- to get the exact error code.
-*/
-
- /* checksum functions */
-
-/*
- These functions are not related to compression but are exported
- anyway because they might be useful in applications using the
- compression library.
-*/
-
-ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
-
-/*
- Update a running Adler-32 checksum with the bytes buf[0..len-1] and
- return the updated checksum. If buf is NULL, this function returns
- the required initial value for the checksum.
- An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
- much faster. Usage example:
-
- uLong adler = adler32(0L, Z_NULL, 0);
-
- while (read_buffer(buffer, length) != EOF) {
- adler = adler32(adler, buffer, length);
- }
- if (adler != original_adler) error();
-*/
-
-ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
-/*
- Update a running crc with the bytes buf[0..len-1] and return the updated
- crc. If buf is NULL, this function returns the required initial value
- for the crc. Pre- and post-conditioning (one's complement) is performed
- within this function so it shouldn't be done by the application.
- Usage example:
-
- uLong crc = crc32(0L, Z_NULL, 0);
-
- while (read_buffer(buffer, length) != EOF) {
- crc = crc32(crc, buffer, length);
- }
- if (crc != original_crc) error();
-*/
-
-
- /* various hacks, don't look :) */
-
-/* deflateInit and inflateInit are macros to allow checking the zlib version
- * and the compiler's view of z_stream:
- */
-ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,
- const char *version, int stream_size));
-ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,
- const char *version, int stream_size));
-ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method,
- int windowBits, int memLevel,
- int strategy, const char *version,
- int stream_size));
-ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits,
- const char *version, int stream_size));
-#define deflateInit(strm, level) \
- deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream))
-#define inflateInit(strm) \
- inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream))
-#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
- deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
- (strategy), ZLIB_VERSION, sizeof(z_stream))
-#define inflateInit2(strm, windowBits) \
- inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
-
-
-#if !defined(_Z_UTIL_H) && !defined(NO_DUMMY_DECL)
- struct internal_state {int dummy;}; /* hack for buggy compilers */
-#endif
-
-ZEXTERN const char * ZEXPORT zError OF((int err));
-ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z));
-ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void));
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _ZLIB_H */
diff --git a/src/login/Makefile b/src/login/Makefile
deleted file mode 100644
index 01810b1d1..000000000
--- a/src/login/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-all: login-server
-txt: login-server
-
-COMMON_OBJ = ../common/obj/core.o ../common/obj/socket.o ../common/obj/timer.o ../common/obj/db.o ../common/obj/lock.o ../common/obj/malloc.o ../common/obj/showmsg.o ../common/obj/strlib.o
-COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/db.h ../common/lock.h ../common/malloc.h ../common/showmsg.h ../common/strlib.h
-
-login-server: login.o md5calc.o $(COMMON_OBJ)
- $(CC) -o ../../$@ login.o md5calc.o $(COMMON_OBJ) $(LIB_S)
-
-login.o: login.c login.h md5calc.h $(COMMON_H)
-md5calc.o: md5calc.c md5calc.h
-
-clean:
- rm -f *.o ../../login-server
diff --git a/src/login/login.c b/src/login/login.c
deleted file mode 100644
index 733411f56..000000000
--- a/src/login/login.c
+++ /dev/null
@@ -1,4017 +0,0 @@
-// $Id: login.c,v 1.1.1.1 2004/09/10 17:26:53 MagicalTux Exp $
-// new version of the login-server by [Yor]
-
-#include <sys/types.h>
-#ifdef __WIN32
-#define WIN32_LEAN_AND_MEAN
-#include <winsock2.h>
-#include <time.h>
-void Gettimeofday(struct timeval *timenow)
-{
- time_t t;
- t = clock();
- timenow->tv_usec = t;
- timenow->tv_sec = t / CLK_TCK;
- return;
-}
-#define gettimeofday(timenow, dummy) Gettimeofday(timenow)
-#define in_addr_t unsigned long
-#else
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <sys/time.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <sys/stat.h> // for stat/lstat/fstat
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdarg.h>
-
-#include "../common/core.h"
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "login.h"
-#include "../common/mmo.h"
-#include "../common/version.h"
-#include "../common/db.h"
-#include "../common/lock.h"
-#include "../common/malloc.h"
-#include "../common/buffer.h"
-#include "../common/strlib.h"
-
-#ifdef PASSWORDENC
-#include "md5calc.h"
-#endif
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-int account_id_count = START_ACCOUNT_NUM;
-int server_num;
-int new_account_flag = 0;
-char bind_ip_str[16];
-in_addr_t bind_ip;
-int login_port = 6900;
-char lan_char_ip[16];
-int subneti[4];
-int subnetmaski[4];
-
-char account_filename[1024] = "save/account.txt";
-char GM_account_filename[1024] = "conf/GM_account.txt";
-char login_log_filename[1024] = "log/login.log";
-FILE *log_fp = NULL;
-char login_log_unknown_packets_filename[1024] = "log/login_unknown_packets.log";
-char date_format[32] = "%Y-%m-%d %H:%M:%S";
-int save_unknown_packets = 0;
-long creation_time_GM_account_file;
-int gm_account_filename_check_timer = 15; // Timer to check if GM_account file has been changed and reload GM account automaticaly (in seconds; default: 15)
-
-int log_login = 1;
-
-int display_parse_login = 0; // 0: no, 1: yes
-int display_parse_admin = 0; // 0: no, 1: yes
-int display_parse_fromchar = 0; // 0: no, 1: yes (without packet 0x2714), 2: all packets
-
-struct mmo_char_server server[MAX_SERVERS];
-int server_fd[MAX_SERVERS];
-
-int login_fd;
-
-//Added for Mugendai's I'm Alive mod
-int imalive_on=0;
-int imalive_time=60;
-//Added by Mugendai for GUI
-int flush_on=1;
-int flush_time=100;
-
-enum {
- ACO_DENY_ALLOW = 0,
- ACO_ALLOW_DENY,
- ACO_MUTUAL_FAILTURE,
- ACO_STRSIZE = 128,
-};
-
-int access_order = ACO_DENY_ALLOW;
-int access_allownum = 0;
-int access_denynum = 0;
-char *access_allow = NULL;
-char *access_deny = NULL;
-
-int access_ladmin_allownum = 0;
-char *access_ladmin_allow = NULL;
-
-int min_level_to_connect = 0; // minimum level of player/GM (0: player, 1-99: gm) to connect on the server
-int add_to_unlimited_account = 0; // Give possibility or not to adjust (ladmin command: timeadd) the time of an unlimited account.
-int start_limited_time = -1; // Starting additional sec from now for the limited time at creation of accounts (-1: unlimited time, 0 or more: additional sec from now)
-int check_ip_flag = 1; // It's to check IP of a player between login-server and char-server (part of anti-hacking system)
-
-int check_client_version = 0; //Client version check ON/OFF .. (sirius)
-int client_version_to_connect = 20; //Client version needed to connect ..(sirius)
-
-
-
-struct login_session_data {
- int md5keylen;
- char md5key[20];
-};
-
-#define AUTH_FIFO_SIZE 256
-struct {
- int account_id, login_id1, login_id2;
- int ip, sex, delflag;
-} auth_fifo[AUTH_FIFO_SIZE];
-int auth_fifo_pos = 0;
-
-struct auth_dat {
- int account_id, sex;
- char userid[24], pass[33], lastlogin[24]; // 33 for 32 + NULL terminated
- int logincount;
- int state; // packet 0x006a value + 1 (0: compte OK)
- char email[40]; // e-mail (by default: a@a.com)
- char error_message[20]; // Message of error code #6 = Your are Prohibited to log in until %s (packet 0x006a)
- time_t ban_until_time; // # of seconds 1/1/1970 (timestamp): ban time limit of the account (0 = no ban)
- time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
- char last_ip[16]; // save of last IP of connection
- char memo[255]; // a memo field
- int account_reg2_num;
- struct global_reg account_reg2[ACCOUNT_REG2_NUM];
-} *auth_dat = NULL;
-
-int auth_num = 0, auth_max = 0;
-
-// define the number of times that some players must authentify them before to save account file.
-// it's just about normal authentification. If an account is created or modified, save is immediatly done.
-// An authentification just change last connected IP and date. It already save in log file.
-// set minimum auth change before save:
-#define AUTH_BEFORE_SAVE_FILE 10
-// set divider of auth_num to found number of change before save
-#define AUTH_SAVE_FILE_DIVIDER 50
-int auth_before_save_file = 0; // Counter. First save when 1st char-server do connection.
-
-int admin_state = 0;
-char admin_pass[24] = "";
-int GM_num;
-int GM_max=256;
-char gm_pass[64] = "";
-int level_new_gm = 60;
-
-struct gm_account *gm_account_db;
-
-static struct dbt *online_db;
-
-int dynamic_pass_failure_ban = 1;
-int dynamic_pass_failure_ban_time = 5;
-int dynamic_pass_failure_ban_how_many = 3;
-int dynamic_pass_failure_ban_how_long = 1;
-
-int use_md5_passwds = 0;
-
-int console = 0;
-
-//------------------------------
-// Writing function of logs file
-//------------------------------
-int login_log(char *fmt, ...) {
- if (log_login) {
- va_list ap;
- struct timeval tv;
- char tmpstr[2048];
-
- if(!log_fp)
- log_fp = fopen(login_log_filename, "a");
-
- if (log_fp) {
- if (fmt[0] == '\0') // jump a line if no message
- fprintf(log_fp, RETCODE);
- else {
- va_start(ap, fmt);
- gettimeofday(&tv, NULL);
- strftime(tmpstr, 24, date_format, localtime((const time_t*)&(tv.tv_sec)));
- sprintf(tmpstr + strlen(tmpstr), ".%03d: %s", (int)tv.tv_usec / 1000, fmt);
- vfprintf(log_fp, tmpstr, ap);
- va_end(ap);
- }
- fflush(log_fp); // under cygwin or windows, if software is stopped, data are not written in the file -> fflush at every line
- }
- }
-
- return 0;
-}
-
-//-----------------------------------------------------
-// Online User Database [Wizputer]
-//-----------------------------------------------------
-
-void add_online_user (int account_id) {
- int *p;
- p = (int *)aMalloc(sizeof(int));
- *p = account_id;
- numdb_insert(online_db, account_id, p);
-}
-int is_user_online (int account_id) {
- int *p = (int*)numdb_search(online_db, account_id);
- return (p != NULL);
-}
-void remove_online_user (int account_id) {
- int *p;
- p = (int*)numdb_erase(online_db, account_id);
- aFree(p);
-}
-
-//----------------------------------------------------------------------
-// Determine if an account (id) is a GM account
-// and returns its level (or 0 if it isn't a GM account or if not found)
-//----------------------------------------------------------------------
-int isGM(int account_id) {
- int i;
- for(i=0; i < GM_num; i++)
- if(gm_account_db[i].account_id == account_id)
- return gm_account_db[i].level;
- return 0;
-}
-
-//----------------------------------------------------------------------
-// Adds a new GM using acc id and level
-//----------------------------------------------------------------------
-void addGM(int account_id, int level) {
- int i;
- int do_add = 0;
- for(i = 0; i < auth_num; i++) {
- if (auth_dat[i].account_id==account_id) {
- do_add = 1;
- break;
- }
- }
- for(i = 0; i < GM_num; i++)
- if (gm_account_db[i].account_id == account_id) {
- if (gm_account_db[i].level == level)
- printf("addGM: GM account %d defined twice (same level: %d).\n", account_id, level);
- else {
- printf("addGM: GM account %d defined twice (levels: %d and %d).\n", account_id, gm_account_db[i].level, level);
- gm_account_db[i].level = level;
- }
- return;
- }
-
- // if new account
- if (i == GM_num && do_add) {
- if (GM_num >= GM_max) {
- GM_max += 256;
- gm_account_db = (struct gm_account*)aRealloc(gm_account_db, sizeof(struct gm_account) * GM_max);
- memset(gm_account_db + (GM_max - 256), 0, sizeof(struct gm_account) * 256);
- }
- gm_account_db[GM_num].account_id = account_id;
- gm_account_db[GM_num].level = level;
- GM_num++;
- if (GM_num >= 4000) {
- printf("***WARNING: 4000 GM accounts found. Next GM accounts are not read.\n");
- login_log("***WARNING: 4000 GM accounts found. Next GM accounts are not read." RETCODE);
- }
- }
-}
-
-//-------------------------------------------------------
-// Reading function of GM accounts file (and their level)
-//-------------------------------------------------------
-int read_gm_account() {
- char line[512];
- FILE *fp;
- int account_id, level;
- int line_counter;
- struct stat file_stat;
- int start_range = 0, end_range = 0, is_range = 0, current_id = 0;
-
- if(gm_account_db) aFree(gm_account_db);
- GM_num = 0;
- if(GM_max < 0) GM_max = 256;
- gm_account_db = (struct gm_account*)aCalloc(GM_max, sizeof(struct gm_account));
-
- // get last modify time/date
- if (stat(GM_account_filename, &file_stat))
- creation_time_GM_account_file = 0; // error
- else
- creation_time_GM_account_file = file_stat.st_mtime;
-
- if ((fp = fopen(GM_account_filename, "r")) == NULL) {
- printf("read_gm_account: GM accounts file [%s] not found.\n", GM_account_filename);
- printf(" Actually, there is no GM accounts on the server.\n");
- login_log("read_gm_account: GM accounts file [%s] not found." RETCODE, GM_account_filename);
- login_log(" Actually, there is no GM accounts on the server." RETCODE);
- return 1;
- }
-
- line_counter = 0;
- // limited to 4000, because we send information to char-servers (more than 4000 GM accounts???)
- // int (id) + int (level) = 8 bytes * 4000 = 32k (limit of packets in windows)
- while(fgets(line, sizeof(line)-1, fp) && GM_num < 4000) {
- line_counter++;
- if ((line[0] == '/' && line[1] == '/') || line[0] == '\0' || line[0] == '\n' || line[0] == '\r')
- continue;
- is_range = (sscanf(line, "%d%*[-~]%d %d",&start_range,&end_range,&level)==3); // ID Range [MC Cameri]
- if (!is_range && sscanf(line, "%d %d", &account_id, &level) != 2 && sscanf(line, "%d: %d", &account_id, &level) != 2)
- printf("read_gm_account: file [%s], invalid 'acount_id|range level' format (line #%d).\n", GM_account_filename, line_counter);
- else if (level <= 0)
- printf("read_gm_account: file [%s] %dth account (line #%d) (invalid level [0 or negative]: %d).\n", GM_account_filename, GM_num+1, line_counter, level);
- else {
- if (level > 99) {
- printf("read_gm_account: file [%s] %dth account (invalid level, but corrected: %d->99).\n", GM_account_filename, GM_num+1, level);
- level = 99;
- }
- if (is_range) {
- if (start_range==end_range)
- printf("read_gm_account: file [%s] invalid range, beginning of range is equal to end of range (line #%d).\n", GM_account_filename, line_counter);
- else if (start_range>end_range)
- printf("read_gm_account: file [%s] invalid range, beginning of range must be lower than end of range (line #%d).\n", GM_account_filename, line_counter);
- else
- for (current_id = start_range;current_id<=end_range;current_id++)
- addGM(current_id,level);
- } else {
- addGM(account_id,level);
- }
- }
- }
- fclose(fp);
-
- printf("read_gm_account: file '%s' read (%d GM accounts found).\n", GM_account_filename, GM_num);
- login_log("read_gm_account: file '%s' read (%d GM accounts found)." RETCODE, GM_account_filename, GM_num);
-
- return 0;
-}
-
-//--------------------------------------------------------------
-// Test of the IP mask
-// (ip: IP to be tested, str: mask x.x.x.x/# or x.x.x.x/y.y.y.y)
-//--------------------------------------------------------------
-int check_ipmask(unsigned int ip, const unsigned char *str) {
- unsigned int mask = 0, i = 0, m, ip2, a0, a1, a2, a3;
- unsigned char *p = (unsigned char *)&ip2, *p2 = (unsigned char *)&mask;
-
- if (sscanf((const char*)str, "%d.%d.%d.%d/%n", &a0, &a1, &a2, &a3, &i) != 4 || i == 0)
- return 0;
- p[0] = a0; p[1] = a1; p[2] = a2; p[3] = a3;
-
- if (sscanf((const char*)str+i, "%d.%d.%d.%d", &a0, &a1, &a2, &a3) == 4) {
- p2[0] = a0; p2[1] = a1; p2[2] = a2; p2[3] = a3;
- mask = ntohl(mask);
- } else if (sscanf((const char*)(str+i), "%d", &m) == 1 && m >= 0 && m <= 32) {
- for(i = 0; i < m && i < 32; i++)
- mask = (mask >> 1) | 0x80000000;
- } else {
- printf("check_ipmask: invalid mask [%s].\n", str);
- return 0;
- }
-
-// printf("Tested IP: %08x, network: %08x, network mask: %08x\n",
-// (unsigned int)ntohl(ip), (unsigned int)ntohl(ip2), (unsigned int)mask);
- return ((ntohl(ip) & mask) == (ntohl(ip2) & mask));
-}
-
-//---------------------
-// Access control by IP
-//---------------------
-int check_ip(unsigned int ip) {
- int i;
- unsigned char *p = (unsigned char *)&ip;
- char buf[16];
- char * access_ip;
- enum { ACF_DEF, ACF_ALLOW, ACF_DENY } flag = ACF_DEF;
-
- if (access_allownum == 0 && access_denynum == 0)
- return 1; // When there is no restriction, all IP are authorised.
-
-// + 012.345.: front match form, or
-// all: all IP are matched, or
-// 012.345.678.901/24: network form (mask with # of bits), or
-// 012.345.678.901/255.255.255.0: network form (mask with ip mask)
-// + Note about the DNS resolution (like www.ne.jp, etc.):
-// There is no guarantee to have an answer.
-// If we have an answer, there is no guarantee to have a 100% correct value.
-// And, the waiting time (to check) can be long (over 1 minute to a timeout). That can block the software.
-// So, DNS notation isn't authorised for ip checking.
- sprintf(buf, "%d.%d.%d.%d.", p[0], p[1], p[2], p[3]);
-
- for(i = 0; i < access_allownum; i++) {
- access_ip = access_allow + i * ACO_STRSIZE;
- if (memcmp(access_ip, buf, strlen(access_ip)) == 0 || check_ipmask(ip, (unsigned char*)access_ip)) {
- if(access_order == ACO_ALLOW_DENY)
- return 1; // With 'allow, deny' (deny if not allow), allow has priority
- flag = ACF_ALLOW;
- break;
- }
- }
-
- for(i = 0; i < access_denynum; i++) {
- access_ip = access_deny + i * ACO_STRSIZE;
- if (memcmp(access_ip, buf, strlen(access_ip)) == 0 || check_ipmask(ip, (unsigned char*)access_ip)) {
- //flag = ACF_DENY; // not necessary to define flag
- return 0; // At this point, if it's 'deny', we refuse connection.
- }
- }
-
- return (flag == ACF_ALLOW || access_order == ACO_DENY_ALLOW) ? 1:0;
- // With 'mutual-failture', only 'allow' and non 'deny' IP are authorised.
- // A non 'allow' (even non 'deny') IP is not authorised. It's like: if allowed and not denied, it's authorised.
- // So, it's disapproval if you have no description at the time of 'mutual-failture'.
- // With 'deny,allow' (allow if not deny), because here it's not deny, we authorise.
-}
-
-//--------------------------------
-// Access control by IP for ladmin
-//--------------------------------
-int check_ladminip(unsigned int ip) {
- int i;
- unsigned char *p = (unsigned char *)&ip;
- char buf[16];
- char * access_ip;
-
- if (access_ladmin_allownum == 0)
- return 1; // When there is no restriction, all IP are authorised.
-
-// + 012.345.: front match form, or
-// all: all IP are matched, or
-// 012.345.678.901/24: network form (mask with # of bits), or
-// 012.345.678.901/255.255.255.0: network form (mask with ip mask)
-// + Note about the DNS resolution (like www.ne.jp, etc.):
-// There is no guarantee to have an answer.
-// If we have an answer, there is no guarantee to have a 100% correct value.
-// And, the waiting time (to check) can be long (over 1 minute to a timeout). That can block the software.
-// So, DNS notation isn't authorised for ip checking.
- sprintf(buf, "%d.%d.%d.%d.", p[0], p[1], p[2], p[3]);
-
- for(i = 0; i < access_ladmin_allownum; i++) {
- access_ip = access_ladmin_allow + i * ACO_STRSIZE;
- if (memcmp(access_ip, buf, strlen(access_ip)) == 0 || check_ipmask(ip, (unsigned char*)access_ip)) {
- return 1;
- }
- }
-
- return 0;
-}
-
-//---------------------------------------------------
-// E-mail check: return 0 (not correct) or 1 (valid).
-//---------------------------------------------------
-int e_mail_check(char *email) {
- char ch;
- char* last_arobas;
-
- // athena limits
- if (strlen(email) < 3 || strlen(email) > 39)
- return 0;
-
- // part of RFC limits (official reference of e-mail description)
- if (strchr(email, '@') == NULL || email[strlen(email)-1] == '@')
- return 0;
-
- if (email[strlen(email)-1] == '.')
- return 0;
-
- last_arobas = strrchr(email, '@');
-
- if (strstr(last_arobas, "@.") != NULL ||
- strstr(last_arobas, "..") != NULL)
- return 0;
-
- for(ch = 1; ch < 32; ch++)
- if (strchr(last_arobas, ch) != NULL)
- return 0;
-
- if (strchr(last_arobas, ' ') != NULL ||
- strchr(last_arobas, ';') != NULL)
- return 0;
-
- // all correct
- return 1;
-}
-
-//-----------------------------------------------
-// Search an account id
-// (return account index or -1 (if not found))
-// If exact account name is not found,
-// the function checks without case sensitive
-// and returns index if only 1 account is found
-// and similar to the searched name.
-//-----------------------------------------------
-int search_account_index(char* account_name) {
- int i, quantity, index;
-
- quantity = 0;
- index = -1;
-
- for(i = 0; i < auth_num; i++) {
- // Without case sensitive check (increase the number of similar account names found)
- if (stricmp(auth_dat[i].userid, account_name) == 0) {
- // Strict comparison (if found, we finish the function immediatly with correct value)
- if (strcmp(auth_dat[i].userid, account_name) == 0)
- return i;
- quantity++;
- index = i;
- }
- }
- // Here, the exact account name is not found
- // We return the found index of a similar account ONLY if there is 1 similar account
- if (quantity == 1)
- return index;
-
- // Exact account name is not found and 0 or more than 1 similar accounts have been found ==> we say not found
- return -1;
-}
-
-//--------------------------------------------------------
-// Create a string to save the account in the account file
-//--------------------------------------------------------
-int mmo_auth_tostr(char *str, struct auth_dat *p) {
- int i;
- char *str_p = str;
-
- str_p += sprintf(str_p, "%d\t%s\t%s\t%s\t%c\t%d\t%d\t"
- "%s\t%s\t%ld\t%s\t%s\t%ld\t",
- p->account_id, p->userid, p->pass, p->lastlogin,
- (p->sex == 2) ? 'S' : (p->sex ? 'M' : 'F'),
- p->logincount, p->state,
- p->email, p->error_message,
- p->connect_until_time, p->last_ip, p->memo, p->ban_until_time);
-
- for(i = 0; i < p->account_reg2_num; i++)
- if (p->account_reg2[i].str[0])
- str_p += sprintf(str_p, "%s,%d ", p->account_reg2[i].str, p->account_reg2[i].value);
-
- return 0;
-}
-
-//---------------------------------
-// Reading of the accounts database
-//---------------------------------
-int mmo_auth_init(void) {
- FILE *fp;
- int account_id, logincount, state, n, i, j, v;
- char line[2048], *p, userid[2048], pass[2048], lastlogin[2048], sex, email[2048], error_message[2048], last_ip[2048], memo[2048];
- time_t ban_until_time;
- time_t connect_until_time;
- char str[2048];
- int GM_count = 0;
- int server_count = 0;
-
- auth_max = 256;
- auth_dat = (struct auth_dat*)aCalloc(auth_max, sizeof(struct auth_dat));
-
- if ((fp = fopen(account_filename, "r")) == NULL) {
- // no account file -> no account -> no login, including char-server (ERROR)
- printf("\033[1;31mmmo_auth_init: Accounts file [%s] not found.\033[0m\n", account_filename);
- return 0;
- }
-
- while(fgets(line, sizeof(line)-1, fp) != NULL) {
- if (line[0] == '/' && line[1] == '/')
- continue;
- line[sizeof(line)-1] = '\0';
- // remove carriage return if exist
- while(line[0] != '\0' && (line[strlen(line)-1] == '\n' || line[strlen(line)-1] == '\r'))
- line[strlen(line)-1] = '\0';
- p = line;
-
- memset(userid, 0, sizeof(userid));
- memset(pass, 0, sizeof(pass));
- memset(lastlogin, 0, sizeof(lastlogin));
- memset(email, 0, sizeof(email));
- memset(error_message, 0, sizeof(error_message));
- memset(last_ip, 0, sizeof(last_ip));
- memset(memo, 0, sizeof(memo));
-
- // database version reading (v2)
- if (((i = sscanf(line, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d\t%d\t"
- "%[^\t]\t%[^\t]\t%ld\t%[^\t]\t%[^\t]\t%ld%n",
- &account_id, userid, pass, lastlogin, &sex, &logincount, &state,
- email, error_message, &connect_until_time, last_ip, memo, &ban_until_time, &n)) == 13 && line[n] == '\t') ||
- ((i = sscanf(line, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d\t%d\t"
- "%[^\t]\t%[^\t]\t%ld\t%[^\t]\t%[^\t]%n",
- &account_id, userid, pass, lastlogin, &sex, &logincount, &state,
- email, error_message, &connect_until_time, last_ip, memo, &n)) == 12 && line[n] == '\t')) {
- n = n + 1;
-
- // Some checks
- if (account_id > END_ACCOUNT_NUM) {
- printf("\033[1;31mmmo_auth_init: ******Error: an account has an id higher than %d\n", END_ACCOUNT_NUM);
- printf(" account id #%d -> account not read (saved in log file).\033[0m\n", account_id);
- login_log("mmmo_auth_init: ******Error: an account has an id higher than %d." RETCODE, END_ACCOUNT_NUM);
- login_log(" account id #%d -> account not read (saved in next line):" RETCODE, account_id);
- login_log("%s", line);
- continue;
- }
- userid[23] = '\0';
- remove_control_chars((unsigned char *)userid);
- for(j = 0; j < auth_num; j++) {
- if (auth_dat[j].account_id == account_id) {
- printf("\033[1;31mmmo_auth_init: ******Error: an account has an identical id to another.\n");
- printf(" account id #%d -> new account not read (saved in log file).\033[0m\n", account_id);
- login_log("mmmo_auth_init: ******Error: an account has an identical id to another." RETCODE);
- login_log(" account id #%d -> new account not read (saved in next line):" RETCODE, account_id);
- login_log("%s", line);
- break;
- } else if (strcmp(auth_dat[j].userid, userid) == 0) {
- printf("\033[1;31mmmo_auth_init: ******Error: account name already exists.\n");
- printf(" account name '%s' -> new account not read.\n", userid); // 2 lines, account name can be long.
- printf(" Account saved in log file.\033[0m\n");
- login_log("mmmo_auth_init: ******Error: an account has an identical name to another." RETCODE);
- login_log(" account name '%s' -> new account not read (saved in next line):" RETCODE, userid);
- login_log("%s", line);
- break;
- }
- }
- if (j != auth_num)
- continue;
-
- if (auth_num >= auth_max) {
- auth_max += 256;
- auth_dat = (struct auth_dat*)aRealloc(auth_dat, sizeof(struct auth_dat) * auth_max);
- }
-
- memset(&auth_dat[auth_num], '\0', sizeof(struct auth_dat));
-
- auth_dat[auth_num].account_id = account_id;
-
- strncpy(auth_dat[auth_num].userid, userid, 24);
-
- pass[23] = '\0';
- remove_control_chars((unsigned char *)pass);
- strncpy(auth_dat[auth_num].pass, pass, 24);
-
- lastlogin[23] = '\0';
- remove_control_chars((unsigned char *)lastlogin);
- strncpy(auth_dat[auth_num].lastlogin, lastlogin, 24);
-
- auth_dat[auth_num].sex = (sex == 'S' || sex == 's') ? 2 : (sex == 'M' || sex == 'm');
-
- if (logincount >= 0)
- auth_dat[auth_num].logincount = logincount;
- else
- auth_dat[auth_num].logincount = 0;
-
- if (state > 255)
- auth_dat[auth_num].state = 100;
- else if (state < 0)
- auth_dat[auth_num].state = 0;
- else
- auth_dat[auth_num].state = state;
-
- if (e_mail_check(email) == 0) {
- printf("Account %s (%d): invalid e-mail (replaced par a@a.com).\n", auth_dat[auth_num].userid, auth_dat[auth_num].account_id);
- strncpy(auth_dat[auth_num].email, "a@a.com", 40);
- } else {
- remove_control_chars((unsigned char *)email);
- strncpy(auth_dat[auth_num].email, email, 40);
- }
-
- error_message[19] = '\0';
- remove_control_chars((unsigned char *)error_message);
- if (error_message[0] == '\0' || state != 7) { // 7, because state is packet 0x006a value + 1
- strncpy(auth_dat[auth_num].error_message, "-", 20);
- } else {
- strncpy(auth_dat[auth_num].error_message, error_message, 20);
- }
-
- if (i == 13)
- auth_dat[auth_num].ban_until_time = ban_until_time;
- else
- auth_dat[auth_num].ban_until_time = 0;
-
- auth_dat[auth_num].connect_until_time = connect_until_time;
-
- last_ip[15] = '\0';
- remove_control_chars((unsigned char *)last_ip);
- strncpy(auth_dat[auth_num].last_ip, last_ip, 16);
-
- memo[254] = '\0';
- remove_control_chars((unsigned char *)memo);
- strncpy(auth_dat[auth_num].memo, memo, 255);
-
- for(j = 0; j < ACCOUNT_REG2_NUM; j++) {
- p += n;
- if (sscanf(p, "%[^\t,],%d %n", str, &v, &n) != 2) {
- // We must check if a str is void. If it's, we can continue to read other REG2.
- // Account line will have something like: str2,9 ,9 str3,1 (here, ,9 is not good)
- if (p[0] == ',' && sscanf(p, ",%d %n", &v, &n) == 1) {
- j--;
- continue;
- } else
- break;
- }
- str[31] = '\0';
- remove_control_chars((unsigned char *)str);
- strncpy(auth_dat[auth_num].account_reg2[j].str, str, 32);
- auth_dat[auth_num].account_reg2[j].value = v;
- }
- auth_dat[auth_num].account_reg2_num = j;
-
- if (isGM(account_id) > 0)
- GM_count++;
- if (auth_dat[auth_num].sex == 2)
- server_count++;
-
- auth_num++;
- if (account_id >= account_id_count)
- account_id_count = account_id + 1;
-
- // Old athena database version reading (v1)
- } else if ((i = sscanf(line, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d\t%d\t%n",
- &account_id, userid, pass, lastlogin, &sex, &logincount, &state, &n)) >= 5) {
- if (account_id > END_ACCOUNT_NUM) {
- printf("\033[1;31mmmo_auth_init: ******Error: an account has an id higher than %d\n", END_ACCOUNT_NUM);
- printf(" account id #%d -> account not read (saved in log file).\033[0m\n", account_id);
- login_log("mmmo_auth_init: ******Error: an account has an id higher than %d." RETCODE, END_ACCOUNT_NUM);
- login_log(" account id #%d -> account not read (saved in next line):" RETCODE, account_id);
- login_log("%s", line);
- continue;
- }
- userid[23] = '\0';
- remove_control_chars((unsigned char *)userid);
- for(j = 0; j < auth_num; j++) {
- if (auth_dat[j].account_id == account_id) {
- printf("\033[1;31mmmo_auth_init: ******Error: an account has an identical id to another.\n");
- printf(" account id #%d -> new account not read (saved in log file).\033[0m\n", account_id);
- login_log("mmmo_auth_init: ******Error: an account has an identical id to another." RETCODE);
- login_log(" account id #%d -> new account not read (saved in next line):" RETCODE, account_id);
- login_log("%s", line);
- break;
- } else if (strcmp(auth_dat[j].userid, userid) == 0) {
- printf("\033[1;31mmmo_auth_init: ******Error: account name already exists.\n");
- printf(" account name '%s' -> new account not read.\n", userid); // 2 lines, account name can be long.
- printf(" Account saved in log file.\033[0m\n");
- login_log("mmmo_auth_init: ******Error: an account has an identical id to another." RETCODE);
- login_log(" account id #%d -> new account not read (saved in next line):" RETCODE, account_id);
- login_log("%s", line);
- break;
- }
- }
- if (j != auth_num)
- continue;
-
- if (auth_num >= auth_max) {
- auth_max += 256;
- auth_dat = (struct auth_dat*)aRealloc(auth_dat, sizeof(struct auth_dat) * auth_max);
- }
-
- memset(&auth_dat[auth_num], '\0', sizeof(struct auth_dat));
-
- auth_dat[auth_num].account_id = account_id;
-
- strncpy(auth_dat[auth_num].userid, userid, 24);
-
- pass[23] = '\0';
- remove_control_chars((unsigned char *)pass);
- strncpy(auth_dat[auth_num].pass, pass, 24);
-
- lastlogin[23] = '\0';
- remove_control_chars((unsigned char *)lastlogin);
- strncpy(auth_dat[auth_num].lastlogin, lastlogin, 24);
-
- auth_dat[auth_num].sex = (sex == 'S' || sex == 's') ? 2 : (sex == 'M' || sex == 'm');
-
- if (i >= 6) {
- if (logincount >= 0)
- auth_dat[auth_num].logincount = logincount;
- else
- auth_dat[auth_num].logincount = 0;
- } else
- auth_dat[auth_num].logincount = 0;
-
- if (i >= 7) {
- if (state > 255)
- auth_dat[auth_num].state = 100;
- else if (state < 0)
- auth_dat[auth_num].state = 0;
- else
- auth_dat[auth_num].state = state;
- } else
- auth_dat[auth_num].state = 0;
-
- // Initialization of new data
- strncpy(auth_dat[auth_num].email, "a@a.com", 40);
- strncpy(auth_dat[auth_num].error_message, "-", 20);
- auth_dat[auth_num].ban_until_time = 0;
- auth_dat[auth_num].connect_until_time = 0;
- strncpy(auth_dat[auth_num].last_ip, "-", 16);
- strncpy(auth_dat[auth_num].memo, "-", 255);
-
- for(j = 0; j < ACCOUNT_REG2_NUM; j++) {
- p += n;
- if (sscanf(p, "%[^\t,],%d %n", str, &v, &n) != 2) {
- // We must check if a str is void. If it's, we can continue to read other REG2.
- // Account line will have something like: str2,9 ,9 str3,1 (here, ,9 is not good)
- if (p[0] == ',' && sscanf(p, ",%d %n", &v, &n) == 1) {
- j--;
- continue;
- } else
- break;
- }
- str[31] = '\0';
- remove_control_chars((unsigned char *)str);
- strncpy(auth_dat[auth_num].account_reg2[j].str, str, 32);
- auth_dat[auth_num].account_reg2[j].value = v;
- }
- auth_dat[auth_num].account_reg2_num = j;
-
- if (isGM(account_id) > 0)
- GM_count++;
- if (auth_dat[auth_num].sex == 2)
- server_count++;
-
- auth_num++;
- if (account_id >= account_id_count)
- account_id_count = account_id + 1;
-
- } else {
- i = 0;
- if (sscanf(line, "%d\t%%newid%%\n%n", &account_id, &i) == 1 &&
- i > 0 && account_id > account_id_count)
- account_id_count = account_id;
- }
- }
- fclose(fp);
-
- if (auth_num == 0) {
- printf("mmo_auth_init: No account found in %s.\n", account_filename);
- sprintf(line, "No account found in %s.", account_filename);
- } else {
- if (auth_num == 1) {
- printf("mmo_auth_init: 1 account read in %s,\n", account_filename);
- sprintf(line, "1 account read in %s,", account_filename);
- } else {
- printf("mmo_auth_init: %d accounts read in %s,\n", auth_num, account_filename);
- sprintf(line, "%d accounts read in %s,", auth_num, account_filename);
- }
- if (GM_count == 0) {
- printf(" of which is no GM account, and ");
- sprintf(str, "%s of which is no GM account and", line);
- } else if (GM_count == 1) {
- printf(" of which is 1 GM account, and ");
- sprintf(str, "%s of which is 1 GM account and", line);
- } else {
- printf(" of which is %d GM accounts, and ", GM_count);
- sprintf(str, "%s of which is %d GM accounts and", line, GM_count);
- }
- if (server_count == 0) {
- printf("no server account ('S').\n");
- sprintf(line, "%s no server account ('S').", str);
- } else if (server_count == 1) {
- printf("1 server account ('S').\n");
- sprintf(line, "%s 1 server account ('S').", str);
- } else {
- printf("%d server accounts ('S').\n", server_count);
- sprintf(line, "%s %d server accounts ('S').", str, server_count);
- }
- }
- login_log("%s" RETCODE, line);
-
- return 0;
-}
-
-//------------------------------------------
-// Writing of the accounts database file
-// (accounts are sorted by id before save)
-//------------------------------------------
-void mmo_auth_sync(void) {
- FILE *fp;
- int i, j, k, lock;
- int account_id;
- //int id[auth_num];
- //int *id = (int *)aCalloc(auth_num, sizeof(int));
- CREATE_BUFFER(id, int, auth_num);
- char line[65536];
-
- // Sorting before save
- for(i = 0; i < auth_num; i++) {
- id[i] = i;
- account_id = auth_dat[i].account_id;
- for(j = 0; j < i; j++) {
- if (account_id < auth_dat[id[j]].account_id) {
- for(k = i; k > j; k--)
- id[k] = id[k-1];
- id[j] = i; // id[i]
- break;
- }
- }
- }
-
- // Data save
- if ((fp = lock_fopen(account_filename, &lock)) == NULL) {
- //if (id) aFree(id); // aFree, right?
- DELETE_BUFFER(id);
- return;
- }
-
- fprintf(fp, "// Accounts file: here are saved all information about the accounts.\n");
- fprintf(fp, "// Structure: ID, account name, password, last login time, sex, # of logins, state, email, error message for state 7, validity time, last (accepted) login ip, memo field, ban timestamp, repeated(register text, register value)\n");
- fprintf(fp, "// Some explanations:\n");
- fprintf(fp, "// account name : between 4 to 23 char for a normal account (standard client can't send less than 4 char).\n");
- fprintf(fp, "// account password: between 4 to 23 char\n");
- fprintf(fp, "// sex : M or F for normal accounts, S for server accounts\n");
- fprintf(fp, "// state : 0: account is ok, 1 to 256: error code of packet 0x006a + 1\n");
- fprintf(fp, "// email : between 3 to 39 char (a@a.com is like no email)\n");
- fprintf(fp, "// error message : text for the state 7: 'Your are Prohibited to login until <text>'. Max 19 char\n");
- fprintf(fp, "// valitidy time : 0: unlimited account, <other value>: date calculated by addition of 1/1/1970 + value (number of seconds since the 1/1/1970)\n");
- fprintf(fp, "// memo field : max 254 char\n");
- fprintf(fp, "// ban time : 0: no ban, <other value>: banned until the date: date calculated by addition of 1/1/1970 + value (number of seconds since the 1/1/1970)\n");
- for(i = 0; i < auth_num; i++) {
- k = id[i]; // use of sorted index
- if (auth_dat[k].account_id < 0)
- continue;
-
- mmo_auth_tostr(line, &auth_dat[k]);
- fprintf(fp, "%s" RETCODE, line);
- }
- fprintf(fp, "%d\t%%newid%%\n", account_id_count);
-
- lock_fclose(fp, account_filename, &lock);
-
- // set new counter to minimum number of auth before save
- auth_before_save_file = auth_num / AUTH_SAVE_FILE_DIVIDER; // Re-initialise counter. We have save.
- if (auth_before_save_file < AUTH_BEFORE_SAVE_FILE)
- auth_before_save_file = AUTH_BEFORE_SAVE_FILE;
-
- //if (id) aFree(id);
- DELETE_BUFFER(id);
-
- return;
-}
-
-//-----------------------------------------------------
-// Check if we must save accounts file or not
-// every minute, we check if we must save because we
-// have do some authentifications without arrive to
-// the minimum of authentifications for the save.
-// Note: all other modification of accounts (deletion,
-// change of some informations excepted lastip/
-// lastlogintime, creation) are always save
-// immediatly and set the minimum of
-// authentifications to its initialization value.
-//-----------------------------------------------------
-int check_auth_sync(int tid, unsigned int tick, int id, int data) {
- // we only save if necessary:
- // we have do some authentifications without do saving
- if (auth_before_save_file < AUTH_BEFORE_SAVE_FILE ||
- auth_before_save_file < (int)(auth_num / AUTH_SAVE_FILE_DIVIDER))
- mmo_auth_sync();
-
- return 0;
-}
-
-//--------------------------------------------------------------------
-// Packet send to all char-servers, except one (wos: without our self)
-//--------------------------------------------------------------------
-int charif_sendallwos(int sfd, unsigned char *buf, unsigned int len) {
- int i, c, fd;
-
- for(i = 0, c = 0; i < MAX_SERVERS; i++) {
- if ((fd = server_fd[i]) >= 0 && fd != sfd) {
- memcpy(WFIFOP(fd,0), buf, len);
- WFIFOSET(fd, len);
- c++;
- }
- }
- return c;
-}
-
-//-----------------------------------------------------
-// Send GM accounts to all char-server
-//-----------------------------------------------------
-void send_GM_accounts() {
- int i;
- unsigned char buf[32767];
- int len;
-
- len = 4;
- WBUFW(buf,0) = 0x2732;
- for(i = 0; i < GM_num; i++)
- // send only existing accounts. We can not create a GM account when server is online.
- if (gm_account_db[i].level > 0) {
- WBUFL(buf,len) = gm_account_db[i].account_id;
- WBUFB(buf,len+4) = (unsigned char)gm_account_db[i].level;
- len += 5;
- }
- WBUFW(buf,2) = len;
- charif_sendallwos(-1, buf, len);
-
- return;
-}
-
-//-----------------------------------------------------
-// Check if GM file account have been changed
-//-----------------------------------------------------
-int check_GM_file(int tid, unsigned int tick, int id, int data) {
- struct stat file_stat;
- long new_time;
-
- // if we would not check
- if (gm_account_filename_check_timer < 1)
- return 0;
-
- // get last modify time/date
- if (stat(GM_account_filename, &file_stat))
- new_time = 0; // error
- else
- new_time = file_stat.st_mtime;
-
- if (new_time != creation_time_GM_account_file) {
- read_gm_account();
- send_GM_accounts();
- }
-
- return 0;
-}
-
-//-------------------------------------
-// Account creation (with e-mail check)
-//-------------------------------------
-int mmo_auth_new(struct mmo_account* account, char sex, char* email) {
- time_t timestamp, timestamp_temp;
- struct tm *tmtime;
- int i = auth_num;
-
- if (auth_num >= auth_max) {
- auth_max += 256;
- auth_dat = (struct auth_dat*)aRealloc(auth_dat, sizeof(struct auth_dat) * auth_max);
- }
-
- memset(&auth_dat[i], '\0', sizeof(struct auth_dat));
-
- while (isGM(account_id_count) > 0)
- account_id_count++;
-
- auth_dat[i].account_id = account_id_count++;
-
- strncpy(auth_dat[i].userid, account->userid, 24);
- auth_dat[i].userid[23] = '\0';
-
- strncpy(auth_dat[i].pass, account->passwd, 32);
- auth_dat[i].pass[23] = '\0';
-
- memcpy(auth_dat[i].lastlogin, "-", 2);
-
- auth_dat[i].sex = (sex == 'M');
-
- auth_dat[i].logincount = 0;
-
- auth_dat[i].state = 0;
-
- if (e_mail_check(email) == 0)
- strncpy(auth_dat[i].email, "a@a.com", 40);
- else
- strncpy(auth_dat[i].email, email, 40);
-
- strncpy(auth_dat[i].error_message, "-", 20);
-
- auth_dat[i].ban_until_time = 0;
-
- if (start_limited_time < 0)
- auth_dat[i].connect_until_time = 0; // unlimited
- else { // limited time
- timestamp = time(NULL) + start_limited_time;
- // double conversion to be sure that it is possible
- tmtime = localtime(&timestamp);
- timestamp_temp = mktime(tmtime);
- if (timestamp_temp != -1 && (timestamp_temp + 3600) >= timestamp) // check possible value and overflow (and avoid summer/winter hour)
- auth_dat[i].connect_until_time = timestamp_temp;
- else
- auth_dat[i].connect_until_time = 0; // unlimited
- }
-
- strncpy(auth_dat[i].last_ip, "-", 16);
-
- strncpy(auth_dat[i].memo, "-", 255);
-
- auth_dat[i].account_reg2_num = 0;
-
- auth_num++;
-
- return (account_id_count - 1);
-}
-
-//---------------------------------------
-// Check/authentification of a connection
-//---------------------------------------
-int mmo_auth(struct mmo_account* account, int fd) {
- int i;
- struct timeval tv;
- char tmpstr[256];
- int len, newaccount = 0;
-#ifdef PASSWORDENC
- struct login_session_data *ld;
-#endif
- int encpasswdok;
- char md5str[64], md5bin[32];
- char ip[16];
- unsigned char *sin_addr = (unsigned char *)&session[fd]->client_addr.sin_addr;
- char user_password[256];
-
- sprintf(ip, "%d.%d.%d.%d", sin_addr[0], sin_addr[1], sin_addr[2], sin_addr[3]);
-
- len = strlen(account->userid) - 2;
- // Account creation with _M/_F
- if (account->passwdenc == 0 && account->userid[len] == '_' &&
- (account->userid[len+1] == 'F' || account->userid[len+1] == 'M') && new_account_flag == 1 &&
- account_id_count <= END_ACCOUNT_NUM && len >= 4 && strlen(account->passwd) >= 4) {
- if (new_account_flag == 1)
- newaccount = 1;
- account->userid[len] = '\0';
- }
-
- //EXE Version check [Sirius]
- if(check_client_version == 1 && account->version != 0){
- if(account->version != client_version_to_connect){
- return 5;
- }
- }
-
- // Strict account search
- for(i = 0; i < auth_num; i++) {
- if (strcmp(account->userid, auth_dat[i].userid) == 0)
- break;
- }
- // if there is no creation request and strict account search fails, we do a no sensitive case research for index
- if (newaccount == 0 && i == auth_num) {
- i = search_account_index(account->userid);
- if (i == -1)
- i = auth_num;
- else
- memcpy(account->userid, auth_dat[i].userid, 24); // for the possible tests/checks afterwards (copy correcte sensitive case).
- }
-
- if (i != auth_num) {
- if (newaccount) {
- login_log("Attempt of creation of an already existant account (account: %s_%c, pass: %s, received pass: %s, ip: %s)" RETCODE,
- account->userid, account->userid[len+1], auth_dat[i].pass, account->passwd, ip);
- return 1; // 1 = Incorrect Password
- }
- if(use_md5_passwds)
- MD5_String(account->passwd, user_password);
- else
- memcpy(user_password, account->passwd, 25);
- encpasswdok = 0;
-#ifdef PASSWORDENC
- ld = (struct login_session_data*)session[fd]->session_data;
- if (account->passwdenc > 0) {
- int j = account->passwdenc;
- if (!ld) {
- login_log("Md5 key not created (account: %s, ip: %s)" RETCODE, account->userid, ip);
- return 1; // 1 = Incorrect Password
- }
- if (j > 2)
- j = 1;
- do {
- if (j == 1) {
- sprintf(md5str, "%s%s", ld->md5key, auth_dat[i].pass); // 20 + 24
- } else if (j == 2) {
- sprintf(md5str, "%s%s", auth_dat[i].pass, ld->md5key); // 24 + 20
- } else
- md5str[0] = '\0';
- md5str[sizeof(md5str)-1] = '\0'; // 64
- MD5_String2binary(md5str, md5bin);
- encpasswdok = (memcmp(account->passwd, md5bin, 16) == 0);
- } while (j < 2 && !encpasswdok && (j++) != account->passwdenc);
-// printf("key[%s] md5 [%s] ", md5key, md5);
-// printf("client [%s] accountpass [%s]\n", account->passwd, auth_dat[i].pass);
- }
-#endif
- if ((strcmp(account->passwd, auth_dat[i].pass) && !encpasswdok)) {
- if (account->passwdenc == 0)
- login_log("Invalid password (account: %s, pass: %s, received pass: %s, ip: %s)" RETCODE, account->userid, auth_dat[i].pass, account->passwd, ip);
-#ifdef PASSWORDENC
- else {
- char logbuf[512], *p = logbuf;
- int j;
- p += sprintf(p, "Invalid password (account: %s, received md5[", account->userid);
- for(j = 0; j < 16; j++)
- p += sprintf(p, "%02x", ((unsigned char *)account->passwd)[j]);
- p += sprintf(p,"] calculated md5[");
- for(j = 0; j < 16; j++)
- p += sprintf(p, "%02x", ((unsigned char *)md5bin)[j]);
- p += sprintf(p, "] md5 key[");
- for(j = 0; j < ld->md5keylen; j++)
- p += sprintf(p, "%02x", ((unsigned char *)ld->md5key)[j]);
- p += sprintf(p, "], ip: %s)" RETCODE, ip);
- login_log(logbuf);
- }
-#endif
- return 1; // 1 = Incorrect Password
- }
-
- if (auth_dat[i].state) {
- login_log("Connection refused (account: %s, pass: %s, state: %d, ip: %s)" RETCODE,
- account->userid, account->passwd, auth_dat[i].state, ip);
- switch(auth_dat[i].state) { // packet 0x006a value + 1
- case 1: // 0 = Unregistered ID
- case 2: // 1 = Incorrect Password
- case 3: // 2 = This ID is expired
- case 4: // 3 = Rejected from Server
- case 5: // 4 = You have been blocked by the GM Team
- case 6: // 5 = Your Game's EXE file is not the latest version
- case 7: // 6 = Your are Prohibited to log in until %s
- case 8: // 7 = Server is jammed due to over populated
- case 9: // 8 = No MSG (actually, all states after 9 except 99 are No MSG, use only this)
- case 100: // 99 = This ID has been totally erased
- return auth_dat[i].state - 1;
- default:
- return 99; // 99 = ID has been totally erased
- }
- }
-
- if (auth_dat[i].ban_until_time != 0) { // if account is banned
- strftime(tmpstr, 20, date_format, localtime(&auth_dat[i].ban_until_time));
- tmpstr[19] = '\0';
- if (auth_dat[i].ban_until_time > time(NULL)) { // always banned
- login_log("Connection refused (account: %s, pass: %s, banned until %s, ip: %s)" RETCODE,
- account->userid, account->passwd, tmpstr, ip);
- return 6; // 6 = Your are Prohibited to log in until %s
- } else { // ban is finished
- login_log("End of ban (account: %s, pass: %s, previously banned until %s -> not more banned, ip: %s)" RETCODE,
- account->userid, account->passwd, tmpstr, ip);
- auth_dat[i].ban_until_time = 0; // reset the ban time
- }
- }
-
- if (auth_dat[i].connect_until_time != 0 && auth_dat[i].connect_until_time < time(NULL)) {
- login_log("Connection refused (account: %s, pass: %s, expired ID, ip: %s)" RETCODE,
- account->userid, account->passwd, ip);
- return 2; // 2 = This ID is expired
- }
-
- login_log("Authentification accepted (account: %s (id: %d), ip: %s)" RETCODE, account->userid, auth_dat[i].account_id, ip);
- } else {
- if (newaccount == 0) {
- login_log("Unknown account (account: %s, received pass: %s, ip: %s)" RETCODE,
- account->userid, account->passwd, ip);
- return 0; // 0 = Unregistered ID
- } else {
- int new_id = mmo_auth_new(account, account->userid[len+1], "a@a.com");
- login_log("Account creation and authentification accepted (account %s (id: %d), pass: %s, sex: %c, connection with _F/_M, ip: %s)" RETCODE,
- account->userid, new_id, account->passwd, account->userid[len+1], ip);
- auth_before_save_file = 0; // Creation of an account -> save accounts file immediatly
- }
- }
-
- gettimeofday(&tv, NULL);
- strftime(tmpstr, 24, date_format, localtime((const time_t*)&(tv.tv_sec)));
- sprintf(tmpstr + strlen(tmpstr), ".%03d", (int)tv.tv_usec / 1000);
-
- account->account_id = auth_dat[i].account_id;
- account->login_id1 = rand();
- account->login_id2 = rand();
- memcpy(account->lastlogin, auth_dat[i].lastlogin, 24);
- memcpy(auth_dat[i].lastlogin, tmpstr, 24);
- account->sex = auth_dat[i].sex;
- strncpy(auth_dat[i].last_ip, ip, 16);
- auth_dat[i].logincount++;
-
- // Save until for change ip/time of auth is not very useful => limited save for that
- // Save there informations isnot necessary, because they are saved in log file.
- if (--auth_before_save_file <= 0) // Reduce counter. 0 or less, we save
- mmo_auth_sync();
-
- return -1; // account OK
-}
-
-//--------------------------------
-// Packet parsing for char-servers
-//--------------------------------
-int parse_fromchar(int fd) {
- int i, j, id;
- unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
- char ip[16];
- int acc;
-
- sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
-
- for(id = 0; id < MAX_SERVERS; id++)
- if (server_fd[id] == fd)
- break;
- if (id == MAX_SERVERS)
- session[fd]->eof = 1;
- if(session[fd]->eof) {
- if (id < MAX_SERVERS) {
- printf("Char-server '%s' has disconnected.\n", server[id].name);
- login_log("Char-server '%s' has disconnected (ip: %s)." RETCODE,
- server[id].name, ip);
- server_fd[id] = -1;
- memset(&server[id], 0, sizeof(struct mmo_char_server));
- }
- close(fd);
- delete_session(fd);
- return 0;
- }
-
- while (RFIFOREST(fd) >= 2) {
- if (display_parse_fromchar == 2 || (display_parse_fromchar == 1 && RFIFOW(fd,0) != 0x2714)) // 0x2714 is done very often (number of players)
- printf("parse_fromchar: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd));
-
- switch (RFIFOW(fd,0)) {
- // request from map-server via char-server to reload GM accounts (by Yor).
- case 0x2709:
- login_log("Char-server '%s': Request to re-load GM configuration file (ip: %s)." RETCODE, server[id].name, ip);
- read_gm_account();
- // send GM accounts to all char-servers
- send_GM_accounts();
- RFIFOSKIP(fd,2);
- break;
-
- case 0x2712: // request from char-server to authentify an account
- if (RFIFOREST(fd) < 19)
- return 0;
- {
- int acc;
- acc = RFIFOL(fd,2); // speed up
- for(i = 0; i < AUTH_FIFO_SIZE; i++) {
- if (auth_fifo[i].account_id == acc &&
- auth_fifo[i].login_id1 == RFIFOL(fd,6) &&
-#if CMP_AUTHFIFO_LOGIN2 != 0
- auth_fifo[i].login_id2 == RFIFOL(fd,10) && // relate to the versions higher than 18
-#endif
- auth_fifo[i].sex == RFIFOB(fd,14) &&
- (!check_ip_flag || auth_fifo[i].ip == RFIFOL(fd,15)) &&
- !auth_fifo[i].delflag) {
- int p, k;
- auth_fifo[i].delflag = 1;
- login_log("Char-server '%s': authentification of the account %d accepted (ip: %s)." RETCODE,
- server[id].name, acc, ip);
-// printf("%d\n", i);
- for(k = 0; k < auth_num; k++) {
- if (auth_dat[k].account_id == acc) {
- WFIFOW(fd,0) = 0x2729; // Sending of the account_reg2
- WFIFOL(fd,4) = acc;
- for(p = 8, j = 0; j < auth_dat[k].account_reg2_num; p += 36, j++) {
- memcpy(WFIFOP(fd,p), auth_dat[k].account_reg2[j].str, 32);
- WFIFOL(fd,p+32) = auth_dat[k].account_reg2[j].value;
- }
- WFIFOW(fd,2) = p;
- WFIFOSET(fd,p);
-// printf("parse_fromchar: Sending of account_reg2: login->char (auth fifo)\n");
- WFIFOW(fd,0) = 0x2713;
- WFIFOL(fd,2) = acc;
- WFIFOB(fd,6) = 0;
- memcpy(WFIFOP(fd, 7), auth_dat[k].email, 40);
- WFIFOL(fd,47) = (unsigned long)auth_dat[k].connect_until_time;
- WFIFOSET(fd,51);
- break;
- }
- }
- break;
- }
- }
- // authentification not found
- if (i == AUTH_FIFO_SIZE) {
- login_log("Char-server '%s': authentification of the account %d REFUSED (ip: %s)." RETCODE,
- server[id].name, acc, ip);
- WFIFOW(fd,0) = 0x2713;
- WFIFOL(fd,2) = acc;
- WFIFOB(fd,6) = 1;
- // It is unnecessary to send email
- // It is unnecessary to send validity date of the account
- WFIFOSET(fd,51);
- }
- }
- RFIFOSKIP(fd,19);
- break;
-
- case 0x2714:
- if (RFIFOREST(fd) < 6)
- return 0;
- //printf("parse_fromchar: Receiving of the users number of the server '%s': %d\n", server[id].name, RFIFOL(fd,2));
- server[id].users = RFIFOL(fd,2);
- // send some answer
- WFIFOW(fd,0) = 0x2718;
- WFIFOSET(fd,2);
-
- RFIFOSKIP(fd,6);
- break;
-
- // we receive a e-mail creation of an account with a default e-mail (no answer)
- case 0x2715:
- if (RFIFOREST(fd) < 46)
- return 0;
- {
- char email[40];
- acc = RFIFOL(fd,2); // speed up
- memcpy(email, RFIFOP(fd,6), 40);
- email[39] = '\0';
- remove_control_chars((unsigned char *)email);
- //printf("parse_fromchar: an e-mail creation of an account with a default e-mail: server '%s', account: %d, e-mail: '%s'.\n", server[id].name, acc, RFIFOP(fd,6));
- if (e_mail_check(email) == 0)
- login_log("Char-server '%s': Attempt to create an e-mail on an account with a default e-mail REFUSED - e-mail is invalid (account: %d, ip: %s)" RETCODE,
- server[id].name, acc, ip);
- else {
- for(i = 0; i < auth_num; i++) {
- if (auth_dat[i].account_id == acc && (strcmp(auth_dat[i].email, "a@a.com") == 0 || auth_dat[i].email[0] == '\0')) {
- memcpy(auth_dat[i].email, email, 40);
- login_log("Char-server '%s': Create an e-mail on an account with a default e-mail (account: %d, new e-mail: %s, ip: %s)." RETCODE,
- server[id].name, acc, email, ip);
- // Save
- mmo_auth_sync();
- break;
- }
- }
- if (i == auth_num)
- login_log("Char-server '%s': Attempt to create an e-mail on an account with a default e-mail REFUSED - account doesn't exist or e-mail of account isn't default e-mail (account: %d, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- }
- }
- RFIFOSKIP(fd,46);
- break;
-
- // We receive an e-mail/limited time request, because a player comes back from a map-server to the char-server
- case 0x2716:
- if (RFIFOREST(fd) < 6)
- return 0;
- //printf("parse_fromchar: E-mail/limited time request from '%s' server (concerned account: %d)\n", server[id].name, RFIFOL(fd,2));
- for(i = 0; i < auth_num; i++) {
- if (auth_dat[i].account_id == RFIFOL(fd,2)) {
- login_log("Char-server '%s': e-mail of the account %d found (ip: %s)." RETCODE,
- server[id].name, RFIFOL(fd,2), ip);
- WFIFOW(fd,0) = 0x2717;
- WFIFOL(fd,2) = RFIFOL(fd,2);
- memcpy(WFIFOP(fd, 6), auth_dat[i].email, 40);
- WFIFOL(fd,46) = (unsigned long)auth_dat[i].connect_until_time;
- WFIFOSET(fd,50);
- break;
- }
- }
- if (i == auth_num)
- login_log("Char-server '%s': e-mail of the account %d NOT found (ip: %s)." RETCODE,
- server[id].name, RFIFOL(fd,2), ip);
- RFIFOSKIP(fd,6);
- break;
-
- case 0x2720: // To become GM request
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- unsigned char buf[10];
- FILE *fp;
- acc = RFIFOL(fd,4);
- //printf("parse_fromchar: Request to become a GM acount from %d account.\n", acc);
- WBUFW(buf,0) = 0x2721;
- WBUFL(buf,2) = acc;
- WBUFL(buf,6) = 0;
- if (strcmp((char*)RFIFOP(fd,8), gm_pass) == 0) {
- // only non-GM can become GM
- if (isGM(acc) == 0) {
- // if we autorise creation
- if (level_new_gm > 0) {
- // if we can open the file to add the new GM
- if ((fp = fopen(GM_account_filename, "a")) != NULL) {
- char tmpstr[24];
- struct timeval tv;
- gettimeofday(&tv, NULL);
- strftime(tmpstr, 23, date_format, localtime((const time_t*)&(tv.tv_sec)));
- fprintf(fp, RETCODE "// %s: @GM command on account %d" RETCODE "%d %d" RETCODE, tmpstr, acc, acc, level_new_gm);
- fclose(fp);
- WBUFL(buf,6) = level_new_gm;
- read_gm_account();
- send_GM_accounts();
- printf("GM Change of the account %d: level 0 -> %d.\n", acc, level_new_gm);
- login_log("Char-server '%s': GM Change of the account %d: level 0 -> %d (ip: %s)." RETCODE,
- server[id].name, acc, level_new_gm, ip);
- } else {
- printf("Error of GM change (suggested account: %d, correct password, unable to add a GM account in GM accounts file)\n", acc);
- login_log("Char-server '%s': Error of GM change (suggested account: %d, correct password, unable to add a GM account in GM accounts file, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- }
- } else {
- printf("Error of GM change (suggested account: %d, correct password, but GM creation is disable (level_new_gm = 0))\n", acc);
- login_log("Char-server '%s': Error of GM change (suggested account: %d, correct password, but GM creation is disable (level_new_gm = 0), ip: %s)." RETCODE,
- server[id].name, acc, ip);
- }
- } else {
- printf("Error of GM change (suggested account: %d (already GM), correct password).\n", acc);
- login_log("Char-server '%s': Error of GM change (suggested account: %d (already GM), correct password, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- }
- } else {
- printf("Error of GM change (suggested account: %d, invalid password).\n", acc);
- login_log("Char-server '%s': Error of GM change (suggested account: %d, invalid password, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- }
- charif_sendallwos(-1, buf, 10);
- }
- RFIFOSKIP(fd, RFIFOW(fd,2));
- return 0;
-
- // Map server send information to change an email of an account via char-server
- case 0x2722: // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B
- if (RFIFOREST(fd) < 86)
- return 0;
- {
- char actual_email[40], new_email[40];
- acc = RFIFOL(fd,2);
- memcpy(actual_email, RFIFOP(fd,6), 40);
- actual_email[39] = '\0';
- remove_control_chars((unsigned char *)actual_email);
- memcpy(new_email, RFIFOP(fd,46), 40);
- new_email[39] = '\0';
- remove_control_chars((unsigned char *)new_email);
- if (e_mail_check(actual_email) == 0)
- login_log("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command), but actual email is invalid (account: %d, ip: %s)" RETCODE,
- server[id].name, acc, ip);
- else if (e_mail_check(new_email) == 0)
- login_log("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a invalid new e-mail (account: %d, ip: %s)" RETCODE,
- server[id].name, acc, ip);
- else if (strcmpi(new_email, "a@a.com") == 0)
- login_log("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a default e-mail (account: %d, ip: %s)" RETCODE,
- server[id].name, acc, ip);
- else {
- for(i = 0; i < auth_num; i++) {
- if (auth_dat[i].account_id == acc) {
- if (strcmpi(auth_dat[i].email, actual_email) == 0) {
- memcpy(auth_dat[i].email, new_email, 40);
- login_log("Char-server '%s': Modify an e-mail on an account (@email GM command) (account: %d (%s), new e-mail: %s, ip: %s)." RETCODE,
- server[id].name, acc, auth_dat[i].userid, new_email, ip);
- // Save
- mmo_auth_sync();
- } else
- login_log("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command), but actual e-mail is incorrect (account: %d (%s), actual e-mail: %s, proposed e-mail: %s, ip: %s)." RETCODE,
- server[id].name, acc, auth_dat[i].userid, auth_dat[i].email, actual_email, ip);
- break;
- }
- }
- if (i == auth_num)
- login_log("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command), but account doesn't exist (account: %d, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- }
- }
- RFIFOSKIP(fd, 86);
- break;
-
- // Receiving of map-server via char-server a status change resquest (by Yor)
- case 0x2724:
- if (RFIFOREST(fd) < 10)
- return 0;
- {
- int acc, statut;
- acc = RFIFOL(fd,2);
- statut = RFIFOL(fd,6);
- for(i = 0; i < auth_num; i++) {
- if (auth_dat[i].account_id == acc) {
- if (auth_dat[i].state != statut) {
- login_log("Char-server '%s': Status change (account: %d, new status %d, ip: %s)." RETCODE,
- server[id].name, acc, statut, ip);
- if (statut != 0) {
- unsigned char buf[16];
- WBUFW(buf,0) = 0x2731;
- WBUFL(buf,2) = acc;
- WBUFB(buf,6) = 0; // 0: change of statut, 1: ban
- WBUFL(buf,7) = statut; // status or final date of a banishment
- charif_sendallwos(-1, buf, 11);
- for(j = 0; j < AUTH_FIFO_SIZE; j++)
- if (auth_fifo[j].account_id == acc)
- auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
- }
- auth_dat[i].state = statut;
- // Save
- mmo_auth_sync();
- } else
- login_log("Char-server '%s': Error of Status change - actual status is already the good status (account: %d, status %d, ip: %s)." RETCODE,
- server[id].name, acc, statut, ip);
- break;
- }
- }
- if (i == auth_num) {
- login_log("Char-server '%s': Error of Status change (account: %d not found, suggested status %d, ip: %s)." RETCODE,
- server[id].name, acc, statut, ip);
- }
- RFIFOSKIP(fd,10);
- }
- return 0;
-
- case 0x2725: // Receiving of map-server via char-server a ban resquest (by Yor)
- if (RFIFOREST(fd) < 18)
- return 0;
- {
- acc = RFIFOL(fd,2);
- for(i = 0; i < auth_num; i++) {
- if (auth_dat[i].account_id == acc) {
- time_t timestamp;
- struct tm *tmtime;
- if (auth_dat[i].ban_until_time == 0 || auth_dat[i].ban_until_time < time(NULL))
- timestamp = time(NULL);
- else
- timestamp = auth_dat[i].ban_until_time;
- tmtime = localtime(&timestamp);
- tmtime->tm_year = tmtime->tm_year + (short)RFIFOW(fd,6);
- tmtime->tm_mon = tmtime->tm_mon + (short)RFIFOW(fd,8);
- tmtime->tm_mday = tmtime->tm_mday + (short)RFIFOW(fd,10);
- tmtime->tm_hour = tmtime->tm_hour + (short)RFIFOW(fd,12);
- tmtime->tm_min = tmtime->tm_min + (short)RFIFOW(fd,14);
- tmtime->tm_sec = tmtime->tm_sec + (short)RFIFOW(fd,16);
- timestamp = mktime(tmtime);
- if (timestamp != -1) {
- if (timestamp <= time(NULL))
- timestamp = 0;
- if (auth_dat[i].ban_until_time != timestamp) {
- if (timestamp != 0) {
- unsigned char buf[16];
- char tmpstr[2048];
- strftime(tmpstr, 24, date_format, localtime(&timestamp));
- login_log("Char-server '%s': Ban request (account: %d, new final date of banishment: %d (%s), ip: %s)." RETCODE,
- server[id].name, acc, timestamp, (timestamp == 0 ? "no banishment" : tmpstr), ip);
- WBUFW(buf,0) = 0x2731;
- WBUFL(buf,2) = auth_dat[i].account_id;
- WBUFB(buf,6) = 1; // 0: change of statut, 1: ban
- WBUFL(buf,7) = timestamp; // status or final date of a banishment
- charif_sendallwos(-1, buf, 11);
- for(j = 0; j < AUTH_FIFO_SIZE; j++)
- if (auth_fifo[j].account_id == acc)
- auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
- } else {
- login_log("Char-server '%s': Error of ban request (account: %d, new date unbans the account, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- }
- auth_dat[i].ban_until_time = timestamp;
- // Save
- mmo_auth_sync();
- } else {
- login_log("Char-server '%s': Error of ban request (account: %d, no change for ban date, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- }
- } else {
- login_log("Char-server '%s': Error of ban request (account: %d, invalid date, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- }
- break;
- }
- }
- if (i == auth_num)
- login_log("Char-server '%s': Error of ban request (account: %d not found, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- RFIFOSKIP(fd,18);
- }
- return 0;
-
- case 0x2727: // Change of sex (sex is reversed)
- if (RFIFOREST(fd) < 6)
- return 0;
- {
- int sex;
- acc = RFIFOL(fd,2);
- for(i = 0; i < auth_num; i++) {
-// printf("%d,", auth_dat[i].account_id);
- if (auth_dat[i].account_id == acc) {
- if (auth_dat[i].sex == 2)
- login_log("Char-server '%s': Error of sex change - Server account (suggested account: %d, actual sex %d (Server), ip: %s)." RETCODE,
- server[id].name, acc, auth_dat[i].sex, ip);
- else {
- unsigned char buf[16];
- if (auth_dat[i].sex == 0)
- sex = 1;
- else
- sex = 0;
- login_log("Char-server '%s': Sex change (account: %d, new sex %c, ip: %s)." RETCODE,
- server[id].name, acc, (sex == 2) ? 'S' : (sex ? 'M' : 'F'), ip);
- for(j = 0; j < AUTH_FIFO_SIZE; j++)
- if (auth_fifo[j].account_id == acc)
- auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
- auth_dat[i].sex = sex;
- WBUFW(buf,0) = 0x2723;
- WBUFL(buf,2) = acc;
- WBUFB(buf,6) = sex;
- charif_sendallwos(-1, buf, 7);
- // Save
- mmo_auth_sync();
- }
- break;
- }
- }
- if (i == auth_num)
- login_log("Char-server '%s': Error of sex change (account: %d not found, sex would be reversed, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- RFIFOSKIP(fd,6);
- }
- return 0;
-
- case 0x2728: // We receive account_reg2 from a char-server, and we send them to other char-servers.
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- int p;
- acc = RFIFOL(fd,4);
- for(i = 0; i < auth_num; i++) {
- if (auth_dat[i].account_id == acc) {
- //unsigned char buf[RFIFOW(fd,2)+1];
- unsigned char *buf;
- buf = (unsigned char*)aCalloc(RFIFOW(fd,2)+1, sizeof(unsigned char));
- login_log("Char-server '%s': receiving (from the char-server) of account_reg2 (account: %d, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- for(p = 8, j = 0; p < RFIFOW(fd,2) && j < ACCOUNT_REG2_NUM; p += 36, j++) {
- memcpy(auth_dat[i].account_reg2[j].str, RFIFOP(fd,p), 32);
- auth_dat[i].account_reg2[j].str[31] = '\0';
- remove_control_chars((unsigned char *)auth_dat[i].account_reg2[j].str);
- auth_dat[i].account_reg2[j].value = RFIFOL(fd,p+32);
- }
- auth_dat[i].account_reg2_num = j;
- // Sending information towards the other char-servers.
- memcpy(WBUFP(buf,0), RFIFOP(fd,0), RFIFOW(fd,2));
- WBUFW(buf,0) = 0x2729;
- charif_sendallwos(fd, buf, WBUFW(buf,2));
- // Save
- mmo_auth_sync();
-// printf("parse_fromchar: receiving (from the char-server) of account_reg2 (account id: %d).\n", acc);
- if (buf) free(buf);
- break;
- }
- }
- if (i == auth_num) {
-// printf("parse_fromchar: receiving (from the char-server) of account_reg2 (unknwon account id: %d).\n", acc);
- login_log("Char-server '%s': receiving (from the char-server) of account_reg2 (account: %d not found, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- }
- }
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
-
- case 0x272a: // Receiving of map-server via char-server a unban resquest (by Yor)
- if (RFIFOREST(fd) < 6)
- return 0;
- {
- acc = RFIFOL(fd,2);
- for(i = 0; i < auth_num; i++) {
- if (auth_dat[i].account_id == acc) {
- if (auth_dat[i].ban_until_time != 0) {
- auth_dat[i].ban_until_time = 0;
- login_log("Char-server '%s': UnBan request (account: %d, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- } else {
- login_log("Char-server '%s': Error of UnBan request (account: %d, no change for unban date, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- }
- break;
- }
- }
- if (i == auth_num)
- login_log("Char-server '%s': Error of UnBan request (account: %d not found, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- RFIFOSKIP(fd,6);
- }
- return 0;
-
- case 0x272b: // Set account_id to online [Wizputer]
- if (RFIFOREST(fd) < 6)
- return 0;
- add_online_user(RFIFOL(fd,2));
- RFIFOSKIP(fd,6);
- break;
-
- case 0x272c: // Set account_id to offline [Wizputer]
- if (RFIFOREST(fd) < 6)
- return 0;
- remove_online_user(RFIFOL(fd,2));
- RFIFOSKIP(fd,6);
- break;
-
- case 0x3000: //change sex for chrif_changesex()
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- int sex, i = 0;
- acc = RFIFOL(fd,4);
- sex = RFIFOB(fd,8);
- if (sex != 0 && sex != 1)
- sex = 0;
- for(i = 0; i < auth_num; i++) {
- if (auth_dat[i].account_id == acc) {
- unsigned char buf[16];
- login_log("Char-server '%s': Sex change (account: %d, new sex %c, ip: %s)." RETCODE,
- server[id].name, acc, (sex == 2) ? 'S' : (sex ? 'M' : 'F'), ip);
- auth_fifo[i].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
- auth_dat[i].sex = sex;
- WBUFW(buf,0) = 0x2723;
- WBUFL(buf,2) = acc;
- WBUFB(buf,6) = sex;
- charif_sendallwos(-1, buf, 7);
- break;
- }
- }
- if (i == auth_num) {
- login_log("Char-server '%s': Error of Sex change (account: %d not found, suggested sex %c, ip: %s)." RETCODE,
- server[id].name, acc, (sex == 2) ? 'S' : (sex ? 'M' : 'F'), ip);
- }
- RFIFOSKIP(fd,RFIFOW(fd,2));
- }
- return 0;
-
- default:
- {
- FILE *logfp;
- char tmpstr[24];
- struct timeval tv;
- logfp = fopen(login_log_unknown_packets_filename, "a");
- if (logfp) {
- gettimeofday(&tv, NULL);
- strftime(tmpstr, 23, date_format, localtime((const time_t*)&(tv.tv_sec)));
- fprintf(logfp, "%s.%03d: receiving of an unknown packet -> disconnection" RETCODE, tmpstr, (int)tv.tv_usec / 1000);
- fprintf(logfp, "parse_fromchar: connection #%d (ip: %s), packet: 0x%x (with being read: %d)." RETCODE, fd, ip, RFIFOW(fd,0), RFIFOREST(fd));
- fprintf(logfp, "Detail (in hex):" RETCODE);
- fprintf(logfp, "---- 00-01-02-03-04-05-06-07 08-09-0A-0B-0C-0D-0E-0F" RETCODE);
- memset(tmpstr, '\0', sizeof(tmpstr));
- for(i = 0; i < RFIFOREST(fd); i++) {
- if ((i & 15) == 0)
- fprintf(logfp, "%04X ",i);
- fprintf(logfp, "%02x ", RFIFOB(fd,i));
- if (RFIFOB(fd,i) > 0x1f)
- tmpstr[i % 16] = RFIFOB(fd,i);
- else
- tmpstr[i % 16] = '.';
- if ((i - 7) % 16 == 0) // -8 + 1
- fprintf(logfp, " ");
- else if ((i + 1) % 16 == 0) {
- fprintf(logfp, " %s" RETCODE, tmpstr);
- memset(tmpstr, '\0', sizeof(tmpstr));
- }
- }
- if (i % 16 != 0) {
- for(j = i; j % 16 != 0; j++) {
- fprintf(logfp, " ");
- if ((j - 7) % 16 == 0) // -8 + 1
- fprintf(logfp, " ");
- }
- fprintf(logfp, " %s" RETCODE, tmpstr);
- }
- fprintf(logfp, RETCODE);
- fclose(logfp);
- }
- }
- printf("parse_fromchar: Unknown packet 0x%x (from a char-server)! -> disconnection.\n", RFIFOW(fd,0));
- session[fd]->eof = 1;
- printf("Char-server has been disconnected (unknown packet).\n");
- return 0;
- }
- }
- return 0;
-}
-
-//---------------------------------------
-// Packet parsing for administation login
-//---------------------------------------
-int parse_admin(int fd) {
- int i, j;
- unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
- char* account_name;
- char ip[16];
-
- sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
-
- if (session[fd]->eof) {
- close(fd);
- delete_session(fd);
- printf("Remote administration has disconnected (session #%d).\n", fd);
- return 0;
- }
-
- while(RFIFOREST(fd) >= 2) {
- if (display_parse_admin == 1)
- printf("parse_admin: connection #%d, packet: 0x%x (with being read: %d).\n", fd, RFIFOW(fd,0), RFIFOREST(fd));
-
- switch(RFIFOW(fd,0)) {
- case 0x7530: // Request of the server version
- login_log("'ladmin': Sending of the server version (ip: %s)" RETCODE, ip);
- WFIFOW(fd,0) = 0x7531;
- WFIFOB(fd,2) = ATHENA_MAJOR_VERSION;
- WFIFOB(fd,3) = ATHENA_MINOR_VERSION;
- WFIFOB(fd,4) = ATHENA_REVISION;
- WFIFOB(fd,5) = ATHENA_RELEASE_FLAG;
- WFIFOB(fd,6) = ATHENA_OFFICIAL_FLAG;
- WFIFOB(fd,7) = ATHENA_SERVER_LOGIN;
- WFIFOW(fd,8) = ATHENA_MOD_VERSION;
- WFIFOSET(fd,10);
- RFIFOSKIP(fd,2);
- break;
-
- case 0x7532: // Request of end of connection
- login_log("'ladmin': End of connection (ip: %s)" RETCODE, ip);
- RFIFOSKIP(fd,2);
- session[fd]->eof = 1;
- break;
-
- case 0x7920: // Request of an accounts list
- if (RFIFOREST(fd) < 10)
- return 0;
- {
- int st, ed, len;
- //int id[auth_num];
- //int *id=(int *)aCalloc(auth_num, sizeof(int));
- CREATE_BUFFER(id, int, auth_num);
- st = RFIFOL(fd,2);
- ed = RFIFOL(fd,6);
- RFIFOSKIP(fd,10);
- WFIFOW(fd,0) = 0x7921;
- if (st < 0)
- st = 0;
- if (ed > END_ACCOUNT_NUM || ed < st || ed <= 0)
- ed = END_ACCOUNT_NUM;
- login_log("'ladmin': Sending an accounts list (ask: from %d to %d, ip: %s)" RETCODE, st, ed, ip);
- // Sort before send
- for(i = 0; i < auth_num; i++) {
- int k;
- id[i] = i;
- for(j = 0; j < i; j++) {
- if (auth_dat[id[i]].account_id < auth_dat[id[j]].account_id) {
- for(k = i; k > j; k--) {
- id[k] = id[k-1];
- }
- id[j] = i; // id[i]
- break;
- }
- }
- }
- // Sending accounts information
- len = 4;
- for(i = 0; i < auth_num && len < 30000; i++) {
- int account_id = auth_dat[id[i]].account_id; // use sorted index
- if (account_id >= st && account_id <= ed) {
- j = id[i];
- WFIFOL(fd,len) = account_id;
- WFIFOB(fd,len+4) = (unsigned char)isGM(account_id);
- memcpy(WFIFOP(fd,len+5), auth_dat[j].userid, 24);
- WFIFOB(fd,len+29) = auth_dat[j].sex;
- WFIFOL(fd,len+30) = auth_dat[j].logincount;
- if (auth_dat[j].state == 0 && auth_dat[j].ban_until_time != 0) // if no state and banished
- WFIFOL(fd,len+34) = 7; // 6 = Your are Prohibited to log in until %s
- else
- WFIFOL(fd,len+34) = auth_dat[j].state;
- len += 38;
- }
- }
- WFIFOW(fd,2) = len;
- WFIFOSET(fd,len);
- //if (id) free(id);
- DELETE_BUFFER(id);
- }
- break;
-
- case 0x7930: // Request for an account creation
- if (RFIFOREST(fd) < 91)
- return 0;
- {
- struct mmo_account ma;
- ma.userid = (char*)RFIFOP(fd, 2);
- memcpy(ma.passwd, RFIFOP(fd, 26), 24);
- ma.passwd[24] = '\0';
- memcpy(ma.lastlogin, "-", 2);
- ma.sex = RFIFOB(fd,50);
- WFIFOW(fd,0) = 0x7931;
- WFIFOL(fd,2) = 0xffffffff;
- memcpy(WFIFOP(fd,6), RFIFOP(fd,2), 24);
- if (strlen(ma.userid) > 23 || strlen(ma.passwd) > 23) {
- login_log("'ladmin': Attempt to create an invalid account (account or pass is too long, ip: %s)" RETCODE,
- ip);
- } else if (strlen(ma.userid) < 4 || strlen(ma.passwd) < 4) {
- login_log("'ladmin': Attempt to create an invalid account (account or pass is too short, ip: %s)" RETCODE,
- ip);
- } else if (ma.sex != 'F' && ma.sex != 'M') {
- login_log("'ladmin': Attempt to create an invalid account (account: %s, received pass: %s, invalid sex, ip: %s)" RETCODE,
- ma.userid, ma.passwd, ip);
- } else if (account_id_count > END_ACCOUNT_NUM) {
- login_log("'ladmin': Attempt to create an account, but there is no more available id number (account: %s, pass: %s, sex: %c, ip: %s)" RETCODE,
- ma.userid, ma.passwd, ma.sex, ip);
- } else {
- remove_control_chars((unsigned char *)ma.userid);
- remove_control_chars((unsigned char *)ma.passwd);
- for(i = 0; i < auth_num; i++) {
- if (strncmp(auth_dat[i].userid, ma.userid, 24) == 0) {
- login_log("'ladmin': Attempt to create an already existing account (account: %s, pass: %s, received pass: %s, ip: %s)" RETCODE,
- auth_dat[i].userid, auth_dat[i].pass, ma.passwd, ip);
- break;
- }
- }
- if (i == auth_num) {
- int new_id;
- char email[40];
- memcpy(email, RFIFOP(fd,51), 40);
- email[39] = '\0';
- remove_control_chars((unsigned char *)email);
- new_id = mmo_auth_new(&ma, ma.sex, email);
- login_log("'ladmin': Account creation (account: %s (id: %d), pass: %s, sex: %c, email: %s, ip: %s)" RETCODE,
- ma.userid, new_id, ma.passwd, ma.sex, auth_dat[i].email, ip);
- WFIFOL(fd,2) = new_id;
- mmo_auth_sync();
- }
- }
- WFIFOSET(fd,30);
- RFIFOSKIP(fd,91);
- }
- break;
-
- case 0x7932: // Request for an account deletion
- if (RFIFOREST(fd) < 26)
- return 0;
- WFIFOW(fd,0) = 0x7933;
- WFIFOL(fd,2) = 0xFFFFFFFF;
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- i = search_account_index(account_name);
- if (i != -1) {
- // Char-server is notified of deletion (for characters deletion).
- unsigned char buf[65535];
- WBUFW(buf,0) = 0x2730;
- WBUFL(buf,2) = auth_dat[i].account_id;
- charif_sendallwos(-1, buf, 6);
- // send answer
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- WFIFOL(fd,2) = auth_dat[i].account_id;
- // save deleted account in log file
- login_log("'ladmin': Account deletion (account: %s, id: %d, ip: %s) - saved in next line:" RETCODE,
- auth_dat[i].userid, auth_dat[i].account_id, ip);
- mmo_auth_tostr((char*)buf, &auth_dat[i]);
- login_log("%s" RETCODE, buf);
- // delete account
- memset(auth_dat[i].userid, '\0', sizeof(auth_dat[i].userid));
- auth_dat[i].account_id = -1;
- mmo_auth_sync();
- } else {
- memcpy(WFIFOP(fd,6), account_name, 24);
- login_log("'ladmin': Attempt to delete an unknown account (account: %s, ip: %s)" RETCODE,
- account_name, ip);
- }
- WFIFOSET(fd,30);
- RFIFOSKIP(fd,26);
- break;
-
- case 0x7934: // Request to change a password
- if (RFIFOREST(fd) < 50)
- return 0;
- WFIFOW(fd,0) = 0x7935;
- WFIFOL(fd,2) = 0xFFFFFFFF; /// WTF??? an unsigned being set to a -1
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- i = search_account_index(account_name);
- if (i != -1) {
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- memcpy(auth_dat[i].pass, RFIFOP(fd,26), 24);
- auth_dat[i].pass[23] = '\0';
- remove_control_chars((unsigned char *)auth_dat[i].pass);
- WFIFOL(fd,2) = auth_dat[i].account_id;
- login_log("'ladmin': Modification of a password (account: %s, new password: %s, ip: %s)" RETCODE,
- auth_dat[i].userid, auth_dat[i].pass, ip);
- mmo_auth_sync();
- } else {
- memcpy(WFIFOP(fd,6), account_name, 24);
- login_log("'ladmin': Attempt to modify the password of an unknown account (account: %s, ip: %s)" RETCODE,
- account_name, ip);
- }
- WFIFOSET(fd,30);
- RFIFOSKIP(fd,50);
- break;
-
- case 0x7936: // Request to modify a state
- if (RFIFOREST(fd) < 50)
- return 0;
- {
- char error_message[20];
- int statut;
- WFIFOW(fd,0) = 0x7937;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- statut = RFIFOL(fd,26);
- memcpy(error_message, RFIFOP(fd,30), 20);
- error_message[19] = '\0';
- remove_control_chars((unsigned char *)error_message);
- if (statut != 7 || error_message[0] == '\0') { // 7: // 6 = Your are Prohibited to log in until %s
- strcpy(error_message, "-");
- }
- i = search_account_index(account_name);
- if (i != -1) {
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- WFIFOL(fd,2) = auth_dat[i].account_id;
- if (auth_dat[i].state == statut && strcmp(auth_dat[i].error_message, error_message) == 0)
- login_log("'ladmin': Modification of a state, but the state of the account is already the good state (account: %s, received state: %d, ip: %s)" RETCODE,
- account_name, statut, ip);
- else {
- if (statut == 7)
- login_log("'ladmin': Modification of a state (account: %s, new state: %d - prohibited to login until '%s', ip: %s)" RETCODE,
- auth_dat[i].userid, statut, error_message, ip);
- else
- login_log("'ladmin': Modification of a state (account: %s, new state: %d, ip: %s)" RETCODE,
- auth_dat[i].userid, statut, ip);
- if (auth_dat[i].state == 0) {
- unsigned char buf[16];
- WBUFW(buf,0) = 0x2731;
- WBUFL(buf,2) = auth_dat[i].account_id;
- WBUFB(buf,6) = 0; // 0: change of statut, 1: ban
- WBUFL(buf,7) = statut; // status or final date of a banishment
- charif_sendallwos(-1, buf, 11);
- for(j = 0; j < AUTH_FIFO_SIZE; j++)
- if (auth_fifo[j].account_id == auth_dat[i].account_id)
- auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
- }
- auth_dat[i].state = statut;
- memcpy(auth_dat[i].error_message, error_message, 20);
- mmo_auth_sync();
- }
- } else {
- memcpy(WFIFOP(fd,6), account_name, 24);
- login_log("'ladmin': Attempt to modify the state of an unknown account (account: %s, received state: %d, ip: %s)" RETCODE,
- account_name, statut, ip);
- }
- WFIFOL(fd,30) = statut;
- }
- WFIFOSET(fd,34);
- RFIFOSKIP(fd,50);
- break;
-
- case 0x7938: // Request for servers list and # of online players
- login_log("'ladmin': Sending of servers list (ip: %s)" RETCODE, ip);
- server_num = 0;
- for(i = 0; i < MAX_SERVERS; i++) {
- if (server_fd[i] >= 0) {
- WFIFOL(fd,4+server_num*32) = server[i].ip;
- WFIFOW(fd,4+server_num*32+4) = server[i].port;
- memcpy(WFIFOP(fd,4+server_num*32+6), server[i].name, 20);
- WFIFOW(fd,4+server_num*32+26) = server[i].users;
- WFIFOW(fd,4+server_num*32+28) = server[i].maintenance;
- WFIFOW(fd,4+server_num*32+30) = server[i].new_;
- server_num++;
- }
- }
- WFIFOW(fd,0) = 0x7939;
- WFIFOW(fd,2) = 4 + 32 * server_num;
- WFIFOSET(fd,4+32*server_num);
- RFIFOSKIP(fd,2);
- break;
-
- case 0x793a: // Request to password check
- if (RFIFOREST(fd) < 50)
- return 0;
- WFIFOW(fd,0) = 0x793b;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- i = search_account_index(account_name);
- if (i != -1) {
- char pass[25];
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- memcpy(pass, RFIFOP(fd,26), 24);
- pass[24] = '\0';
- remove_control_chars((unsigned char *)pass);
- if (strcmp(auth_dat[i].pass, pass) == 0) {
- WFIFOL(fd,2) = auth_dat[i].account_id;
- login_log("'ladmin': Check of password OK (account: %s, password: %s, ip: %s)" RETCODE,
- auth_dat[i].userid, auth_dat[i].pass, ip);
- } else {
- login_log("'ladmin': Failure of password check (account: %s, proposed pass: %s, ip: %s)" RETCODE,
- auth_dat[i].userid, pass, ip);
- }
- } else {
- memcpy(WFIFOP(fd,6), account_name, 24);
- login_log("'ladmin': Attempt to check the password of an unknown account (account: %s, ip: %s)" RETCODE,
- account_name, ip);
- }
- WFIFOSET(fd,30);
- RFIFOSKIP(fd,50);
- break;
-
- case 0x793c: // Request to modify sex
- if (RFIFOREST(fd) < 27)
- return 0;
- WFIFOW(fd,0) = 0x793d;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- memcpy(WFIFOP(fd,6), account_name, 24);
- {
- char sex;
- sex = RFIFOB(fd,26);
- if (sex != 'F' && sex != 'M') {
- if (sex > 31)
- login_log("'ladmin': Attempt to give an invalid sex (account: %s, received sex: %c, ip: %s)" RETCODE,
- account_name, sex, ip);
- else
- login_log("'ladmin': Attempt to give an invalid sex (account: %s, received sex: 'control char', ip: %s)" RETCODE,
- account_name, ip);
- } else {
- i = search_account_index(account_name);
- if (i != -1) {
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- if (auth_dat[i].sex != ((sex == 'S' || sex == 's') ? 2 : (sex == 'M' || sex == 'm'))) {
- unsigned char buf[16];
- WFIFOL(fd,2) = auth_dat[i].account_id;
- for(j = 0; j < AUTH_FIFO_SIZE; j++)
- if (auth_fifo[j].account_id == auth_dat[i].account_id)
- auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
- auth_dat[i].sex = (sex == 'S' || sex == 's') ? 2 : (sex == 'M' || sex == 'm');
- login_log("'ladmin': Modification of a sex (account: %s, new sex: %c, ip: %s)" RETCODE,
- auth_dat[i].userid, sex, ip);
- mmo_auth_sync();
- // send to all char-server the change
- WBUFW(buf,0) = 0x2723;
- WBUFL(buf,2) = auth_dat[i].account_id;
- WBUFB(buf,6) = auth_dat[i].sex;
- charif_sendallwos(-1, buf, 7);
- } else {
- login_log("'ladmin': Modification of a sex, but the sex is already the good sex (account: %s, sex: %c, ip: %s)" RETCODE,
- auth_dat[i].userid, sex, ip);
- }
- } else {
- login_log("'ladmin': Attempt to modify the sex of an unknown account (account: %s, received sex: %c, ip: %s)" RETCODE,
- account_name, sex, ip);
- }
- }
- }
- WFIFOSET(fd,30);
- RFIFOSKIP(fd,27);
- break;
-
- case 0x793e: // Request to modify GM level
- if (RFIFOREST(fd) < 27)
- return 0;
- WFIFOW(fd,0) = 0x793f;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- memcpy(WFIFOP(fd,6), account_name, 24);
- {
- char new_gm_level;
- new_gm_level = RFIFOB(fd,26);
- if (new_gm_level < 0 || new_gm_level > 99) {
- login_log("'ladmin': Attempt to give an invalid GM level (account: %s, received GM level: %d, ip: %s)" RETCODE,
- account_name, (int)new_gm_level, ip);
- } else {
- i = search_account_index(account_name);
- if (i != -1) {
- int acc = auth_dat[i].account_id;
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- if (isGM(acc) != new_gm_level) {
- // modification of the file
- FILE *fp, *fp2;
- int lock;
- char line[512];
- int GM_account, GM_level;
- int modify_flag;
- char tmpstr[24];
- struct timeval tv;
- if ((fp2 = lock_fopen(GM_account_filename, &lock)) != NULL) {
- if ((fp = fopen(GM_account_filename, "r")) != NULL) {
- gettimeofday(&tv, NULL);
- strftime(tmpstr, 23, date_format, localtime((const time_t*)&(tv.tv_sec)));
- modify_flag = 0;
- // read/write GM file
- while(fgets(line, sizeof(line)-1, fp)) {
- while(line[0] != '\0' && (line[strlen(line)-1] == '\n' || line[strlen(line)-1] == '\r'))
- line[strlen(line)-1] = '\0';
- if ((line[0] == '/' && line[1] == '/') || line[0] == '\0')
- fprintf(fp2, "%s" RETCODE, line);
- else {
- if (sscanf(line, "%d %d", &GM_account, &GM_level) != 2 && sscanf(line, "%d: %d", &GM_account, &GM_level) != 2)
- fprintf(fp2, "%s" RETCODE, line);
- else if (GM_account != acc)
- fprintf(fp2, "%s" RETCODE, line);
- else if (new_gm_level < 1) {
- fprintf(fp2, "// %s: 'ladmin' GM level removed on account %d '%s' (previous level: %d)" RETCODE "//%d %d" RETCODE, tmpstr, acc, auth_dat[i].userid, GM_level, acc, new_gm_level);
- modify_flag = 1;
- } else {
- fprintf(fp2, "// %s: 'ladmin' GM level on account %d '%s' (previous level: %d)" RETCODE "%d %d" RETCODE, tmpstr, acc, auth_dat[i].userid, GM_level, acc, new_gm_level);
- modify_flag = 1;
- }
- }
- }
- if (modify_flag == 0)
- fprintf(fp2, "// %s: 'ladmin' GM level on account %d '%s' (previous level: 0)" RETCODE "%d %d" RETCODE, tmpstr, acc, auth_dat[i].userid, acc, new_gm_level);
- fclose(fp);
- } else {
- login_log("'ladmin': Attempt to modify of a GM level - impossible to read GM accounts file (account: %s (%d), received GM level: %d, ip: %s)" RETCODE,
- auth_dat[i].userid, acc, (int)new_gm_level, ip);
- }
- if (lock_fclose(fp2, GM_account_filename, &lock) == 0) {
- WFIFOL(fd,2) = acc;
- login_log("'ladmin': Modification of a GM level (account: %s (%d), new GM level: %d, ip: %s)" RETCODE,
- auth_dat[i].userid, acc, (int)new_gm_level, ip);
- // read and send new GM informations
- read_gm_account();
- send_GM_accounts();
- } else {
- login_log("'ladmin': Attempt to modify of a GM level - impossible to write GM accounts file (account: %s (%d), received GM level: %d, ip: %s)" RETCODE,
- auth_dat[i].userid, acc, (int)new_gm_level, ip);
- }
- } else {
- login_log("'ladmin': Attempt to modify of a GM level - impossible to write GM accounts file (account: %s (%d), received GM level: %d, ip: %s)" RETCODE,
- auth_dat[i].userid, acc, (int)new_gm_level, ip);
- }
- } else {
- login_log("'ladmin': Attempt to modify of a GM level, but the GM level is already the good GM level (account: %s (%d), GM level: %d, ip: %s)" RETCODE,
- auth_dat[i].userid, acc, (int)new_gm_level, ip);
- }
- } else {
- login_log("'ladmin': Attempt to modify the GM level of an unknown account (account: %s, received GM level: %d, ip: %s)" RETCODE,
- account_name, (int)new_gm_level, ip);
- }
- }
- }
- WFIFOSET(fd,30);
- RFIFOSKIP(fd,27);
- break;
-
- case 0x7940: // Request to modify e-mail
- if (RFIFOREST(fd) < 66)
- return 0;
- WFIFOW(fd,0) = 0x7941;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- memcpy(WFIFOP(fd,6), account_name, 24);
- {
- char email[40];
- memcpy(email, RFIFOP(fd,26), 40);
- if (e_mail_check(email) == 0) {
- login_log("'ladmin': Attempt to give an invalid e-mail (account: %s, ip: %s)" RETCODE,
- account_name, ip);
- } else {
- remove_control_chars((unsigned char *)email);
- i = search_account_index(account_name);
- if (i != -1) {
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- memcpy(auth_dat[i].email, email, 40);
- WFIFOL(fd,2) = auth_dat[i].account_id;
- login_log("'ladmin': Modification of an email (account: %s, new e-mail: %s, ip: %s)" RETCODE,
- auth_dat[i].userid, email, ip);
- mmo_auth_sync();
- } else {
- login_log("'ladmin': Attempt to modify the e-mail of an unknown account (account: %s, received e-mail: %s, ip: %s)" RETCODE,
- account_name, email, ip);
- }
- }
- }
- WFIFOSET(fd,30);
- RFIFOSKIP(fd,66);
- break;
-
- case 0x7942: // Request to modify memo field
- if (RFIFOREST(fd) < 28 || RFIFOREST(fd) < (28 + RFIFOW(fd,26)))
- return 0;
- WFIFOW(fd,0) = 0x7943;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- i = search_account_index(account_name);
- if (i != -1) {
- int size_of_memo = sizeof(auth_dat[i].memo);
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- memset(auth_dat[i].memo, '\0', size_of_memo);
- if (RFIFOW(fd,26) == 0) {
- strncpy(auth_dat[i].memo, "-", size_of_memo);
- } else if (RFIFOW(fd,26) > size_of_memo - 1) {
- memcpy(auth_dat[i].memo, RFIFOP(fd,28), size_of_memo - 1);
- } else {
- memcpy(auth_dat[i].memo, RFIFOP(fd,28), RFIFOW(fd,26));
- }
- auth_dat[i].memo[size_of_memo - 1] = '\0';
- remove_control_chars((unsigned char *)auth_dat[i].memo);
- WFIFOL(fd,2) = auth_dat[i].account_id;
- login_log("'ladmin': Modification of a memo field (account: %s, new memo: %s, ip: %s)" RETCODE,
- auth_dat[i].userid, auth_dat[i].memo, ip);
- mmo_auth_sync();
- } else {
- memcpy(WFIFOP(fd,6), account_name, 24);
- login_log("'ladmin': Attempt to modify the memo field of an unknown account (account: %s, ip: %s)" RETCODE,
- account_name, ip);
- }
- WFIFOSET(fd,30);
- RFIFOSKIP(fd,28 + RFIFOW(fd,26));
- break;
-
- case 0x7944: // Request to found an account id
- if (RFIFOREST(fd) < 26)
- return 0;
- WFIFOW(fd,0) = 0x7945;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- i = search_account_index(account_name);
- if (i != -1) {
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- WFIFOL(fd,2) = auth_dat[i].account_id;
- login_log("'ladmin': Request (by the name) of an account id (account: %s, id: %d, ip: %s)" RETCODE,
- auth_dat[i].userid, auth_dat[i].account_id, ip);
- } else {
- memcpy(WFIFOP(fd,6), account_name, 24);
- login_log("'ladmin': ID request (by the name) of an unknown account (account: %s, ip: %s)" RETCODE,
- account_name, ip);
- }
- WFIFOSET(fd,30);
- RFIFOSKIP(fd,26);
- break;
-
- case 0x7946: // Request to found an account name
- if (RFIFOREST(fd) < 6)
- return 0;
- WFIFOW(fd,0) = 0x7947;
- WFIFOL(fd,2) = RFIFOL(fd,2);
- memset(WFIFOP(fd,6), '\0', 24);
- for(i = 0; i < auth_num; i++) {
- if (auth_dat[i].account_id == RFIFOL(fd,2)) {
- strncpy((char*)WFIFOP(fd,6), auth_dat[i].userid, 24);
- login_log("'ladmin': Request (by id) of an account name (account: %s, id: %d, ip: %s)" RETCODE,
- auth_dat[i].userid, RFIFOL(fd,2), ip);
- break;
- }
- }
- if (i == auth_num) {
- login_log("'ladmin': Name request (by id) of an unknown account (id: %d, ip: %s)" RETCODE,
- RFIFOL(fd,2), ip);
- strncpy((char*)WFIFOP(fd,6), "", 24);
- }
- WFIFOSET(fd,30);
- RFIFOSKIP(fd,6);
- break;
-
- case 0x7948: // Request to change the validity limit (timestamp) (absolute value)
- if (RFIFOREST(fd) < 30)
- return 0;
- {
- time_t timestamp;
- char tmpstr[2048];
- WFIFOW(fd,0) = 0x7949;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- timestamp = (time_t)RFIFOL(fd,26);
- strftime(tmpstr, 24, date_format, localtime(&timestamp));
- i = search_account_index(account_name);
- if (i != -1) {
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- login_log("'ladmin': Change of a validity limit (account: %s, new validity: %d (%s), ip: %s)" RETCODE,
- auth_dat[i].userid, timestamp, (timestamp == 0 ? "unlimited" : tmpstr), ip);
- auth_dat[i].connect_until_time = timestamp;
- WFIFOL(fd,2) = auth_dat[i].account_id;
- mmo_auth_sync();
- } else {
- memcpy(WFIFOP(fd,6), account_name, 24);
- login_log("'ladmin': Attempt to change the validity limit of an unknown account (account: %s, received validity: %d (%s), ip: %s)" RETCODE,
- account_name, timestamp, (timestamp == 0 ? "unlimited" : tmpstr), ip);
- }
- WFIFOL(fd,30) = timestamp;
- }
- WFIFOSET(fd,34);
- RFIFOSKIP(fd,30);
- break;
-
- case 0x794a: // Request to change the final date of a banishment (timestamp) (absolute value)
- if (RFIFOREST(fd) < 30)
- return 0;
- {
- time_t timestamp;
- char tmpstr[2048];
- WFIFOW(fd,0) = 0x794b;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- timestamp = (time_t)RFIFOL(fd,26);
- if (timestamp <= time(NULL))
- timestamp = 0;
- strftime(tmpstr, 24, date_format, localtime(&timestamp));
- i = search_account_index(account_name);
- if (i != -1) {
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- WFIFOL(fd,2) = auth_dat[i].account_id;
- login_log("'ladmin': Change of the final date of a banishment (account: %s, new final date of banishment: %d (%s), ip: %s)" RETCODE,
- auth_dat[i].userid, timestamp, (timestamp == 0 ? "no banishment" : tmpstr), ip);
- if (auth_dat[i].ban_until_time != timestamp) {
- if (timestamp != 0) {
- unsigned char buf[16];
- WBUFW(buf,0) = 0x2731;
- WBUFL(buf,2) = auth_dat[i].account_id;
- WBUFB(buf,6) = 1; // 0: change of statut, 1: ban
- WBUFL(buf,7) = timestamp; // status or final date of a banishment
- charif_sendallwos(-1, buf, 11);
- for(j = 0; j < AUTH_FIFO_SIZE; j++)
- if (auth_fifo[j].account_id == auth_dat[i].account_id)
- auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
- }
- auth_dat[i].ban_until_time = timestamp;
- mmo_auth_sync();
- }
- } else {
- memcpy(WFIFOP(fd,6), account_name, 24);
- login_log("'ladmin': Attempt to change the final date of a banishment of an unknown account (account: %s, received final date of banishment: %d (%s), ip: %s)" RETCODE,
- account_name, timestamp, (timestamp == 0 ? "no banishment" : tmpstr), ip);
- }
- WFIFOL(fd,30) = timestamp;
- }
- WFIFOSET(fd,34);
- RFIFOSKIP(fd,30);
- break;
-
- case 0x794c: // Request to change the final date of a banishment (timestamp) (relative change)
- if (RFIFOREST(fd) < 38)
- return 0;
- {
- time_t timestamp;
- struct tm *tmtime;
- char tmpstr[2048];
- WFIFOW(fd,0) = 0x794d;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- i = search_account_index(account_name);
- if (i != -1) {
- WFIFOL(fd,2) = auth_dat[i].account_id;
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- if (auth_dat[i].ban_until_time == 0 || auth_dat[i].ban_until_time < time(NULL))
- timestamp = time(NULL);
- else
- timestamp = auth_dat[i].ban_until_time;
- tmtime = localtime(&timestamp);
- tmtime->tm_year = tmtime->tm_year + (short)RFIFOW(fd,26);
- tmtime->tm_mon = tmtime->tm_mon + (short)RFIFOW(fd,28);
- tmtime->tm_mday = tmtime->tm_mday + (short)RFIFOW(fd,30);
- tmtime->tm_hour = tmtime->tm_hour + (short)RFIFOW(fd,32);
- tmtime->tm_min = tmtime->tm_min + (short)RFIFOW(fd,34);
- tmtime->tm_sec = tmtime->tm_sec + (short)RFIFOW(fd,36);
- timestamp = mktime(tmtime);
- if (timestamp != -1) {
- if (timestamp <= time(NULL))
- timestamp = 0;
- strftime(tmpstr, 24, date_format, localtime(&timestamp));
- login_log("'ladmin': Adjustment of a final date of a banishment (account: %s, (%+d y %+d m %+d d %+d h %+d mn %+d s) -> new validity: %d (%s), ip: %s)" RETCODE,
- auth_dat[i].userid, (short)RFIFOW(fd,26), (short)RFIFOW(fd,28), (short)RFIFOW(fd,30), (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), timestamp, (timestamp == 0 ? "no banishment" : tmpstr), ip);
- if (auth_dat[i].ban_until_time != timestamp) {
- if (timestamp != 0) {
- unsigned char buf[16];
- WBUFW(buf,0) = 0x2731;
- WBUFL(buf,2) = auth_dat[i].account_id;
- WBUFB(buf,6) = 1; // 0: change of statut, 1: ban
- WBUFL(buf,7) = timestamp; // status or final date of a banishment
- charif_sendallwos(-1, buf, 11);
- for(j = 0; j < AUTH_FIFO_SIZE; j++)
- if (auth_fifo[j].account_id == auth_dat[i].account_id)
- auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification)
- }
- auth_dat[i].ban_until_time = timestamp;
- mmo_auth_sync();
- }
- } else {
- strftime(tmpstr, 24, date_format, localtime(&auth_dat[i].ban_until_time));
- login_log("'ladmin': Impossible to adjust the final date of a banishment (account: %s, %d (%s) + (%+d y %+d m %+d d %+d h %+d mn %+d s) -> ???, ip: %s)" RETCODE,
- auth_dat[i].userid, auth_dat[i].ban_until_time, (auth_dat[i].ban_until_time == 0 ? "no banishment" : tmpstr), (short)RFIFOW(fd,26), (short)RFIFOW(fd,28), (short)RFIFOW(fd,30), (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), ip);
- }
- WFIFOL(fd,30) = (unsigned long)auth_dat[i].ban_until_time;
- } else {
- memcpy(WFIFOP(fd,6), account_name, 24);
- login_log("'ladmin': Attempt to adjust the final date of a banishment of an unknown account (account: %s, ip: %s)" RETCODE,
- account_name, ip);
- WFIFOL(fd,30) = 0;
- }
- }
- WFIFOSET(fd,34);
- RFIFOSKIP(fd,38);
- break;
-
- case 0x794e: // Request to send a broadcast message
- if (RFIFOREST(fd) < 8 || RFIFOREST(fd) < (8 + RFIFOL(fd,4)))
- return 0;
- WFIFOW(fd,0) = 0x794f;
- WFIFOW(fd,2) = 0xFFFF; // WTF???
- if (RFIFOL(fd,4) < 1) {
- login_log("'ladmin': Receiving a message for broadcast, but message is void (ip: %s)" RETCODE,
- ip);
- } else {
- // at least 1 char-server
- for(i = 0; i < MAX_SERVERS; i++)
- if (server_fd[i] >= 0)
- break;
- if (i == MAX_SERVERS) {
- login_log("'ladmin': Receiving a message for broadcast, but no char-server is online (ip: %s)" RETCODE,
- ip);
- } else {
- unsigned char buf[32000];
- char message[32000];
- WFIFOW(fd,2) = 0;
- memset(message, '\0', sizeof(message));
- memcpy(message, RFIFOP(fd,8), RFIFOL(fd,4));
- message[sizeof(message)-1] = '\0';
- remove_control_chars((unsigned char *)message);
- if (RFIFOW(fd,2) == 0)
- login_log("'ladmin': Receiving a message for broadcast (message (in yellow): %s, ip: %s)" RETCODE,
- message, ip);
- else
- login_log("'ladmin': Receiving a message for broadcast (message (in blue): %s, ip: %s)" RETCODE,
- message, ip);
- // send same message to all char-servers (no answer)
- memcpy(WBUFP(buf,0), RFIFOP(fd,0), 8 + RFIFOL(fd,4));
- WBUFW(buf,0) = 0x2726;
- charif_sendallwos(-1, buf, 8 + RFIFOL(fd,4));
- }
- }
- WFIFOSET(fd,4);
- RFIFOSKIP(fd,8 + RFIFOL(fd,4));
- break;
-
- case 0x7950: // Request to change the validity limite (timestamp) (relative change)
- if (RFIFOREST(fd) < 38)
- return 0;
- {
- time_t timestamp;
- struct tm *tmtime;
- char tmpstr[2048];
- char tmpstr2[2048];
- WFIFOW(fd,0) = 0x7951;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- i = search_account_index(account_name);
- if (i != -1) {
- WFIFOL(fd,2) = auth_dat[i].account_id;
- memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24);
- timestamp = auth_dat[i].connect_until_time;
- if (add_to_unlimited_account == 0 && timestamp == 0) {
- login_log("'ladmin': Attempt to adjust the validity limit of an unlimited account (account: %s, ip: %s)" RETCODE,
- auth_dat[i].userid, ip);
- WFIFOL(fd,30) = 0;
- } else {
- if (timestamp == 0 || timestamp < time(NULL))
- timestamp = time(NULL);
- tmtime = localtime(&timestamp);
- tmtime->tm_year = tmtime->tm_year + (short)RFIFOW(fd,26);
- tmtime->tm_mon = tmtime->tm_mon + (short)RFIFOW(fd,28);
- tmtime->tm_mday = tmtime->tm_mday + (short)RFIFOW(fd,30);
- tmtime->tm_hour = tmtime->tm_hour + (short)RFIFOW(fd,32);
- tmtime->tm_min = tmtime->tm_min + (short)RFIFOW(fd,34);
- tmtime->tm_sec = tmtime->tm_sec + (short)RFIFOW(fd,36);
- timestamp = mktime(tmtime);
- if (timestamp != -1) {
- strftime(tmpstr, 24, date_format, localtime(&auth_dat[i].connect_until_time));
- strftime(tmpstr2, 24, date_format, localtime(&timestamp));
- login_log("'ladmin': Adjustment of a validity limit (account: %s, %d (%s) + (%+d y %+d m %+d d %+d h %+d mn %+d s) -> new validity: %d (%s), ip: %s)" RETCODE,
- auth_dat[i].userid, auth_dat[i].connect_until_time, (auth_dat[i].connect_until_time == 0 ? "unlimited" : tmpstr), (short)RFIFOW(fd,26), (short)RFIFOW(fd,28), (short)RFIFOW(fd,30), (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), timestamp, (timestamp == 0 ? "unlimited" : tmpstr2), ip);
- auth_dat[i].connect_until_time = timestamp;
- mmo_auth_sync();
- WFIFOL(fd,30) = (unsigned long)auth_dat[i].connect_until_time;
- } else {
- strftime(tmpstr, 24, date_format, localtime(&auth_dat[i].connect_until_time));
- login_log("'ladmin': Impossible to adjust a validity limit (account: %s, %d (%s) + (%+d y %+d m %+d d %+d h %+d mn %+d s) -> ???, ip: %s)" RETCODE,
- auth_dat[i].userid, auth_dat[i].connect_until_time, (auth_dat[i].connect_until_time == 0 ? "unlimited" : tmpstr), (short)RFIFOW(fd,26), (short)RFIFOW(fd,28), (short)RFIFOW(fd,30), (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), ip);
- WFIFOL(fd,30) = 0;
- }
- }
- } else {
- memcpy(WFIFOP(fd,6), account_name, 24);
- login_log("'ladmin': Attempt to adjust the validity limit of an unknown account (account: %s, ip: %s)" RETCODE,
- account_name, ip);
- WFIFOL(fd,30) = 0;
- }
- }
- WFIFOSET(fd,34);
- RFIFOSKIP(fd,38);
- break;
-
- case 0x7952: // Request about informations of an account (by account name)
- if (RFIFOREST(fd) < 26)
- return 0;
- WFIFOW(fd,0) = 0x7953;
- WFIFOL(fd,2) = 0xFFFFFFFF; // WTF???
- account_name = (char*)RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars((unsigned char *)account_name);
- i = search_account_index(account_name);
- if (i != -1) {
- WFIFOL(fd,2) = auth_dat[i].account_id;
- WFIFOB(fd,6) = (unsigned char)isGM(auth_dat[i].account_id);
- memcpy(WFIFOP(fd,7), auth_dat[i].userid, 24);
- WFIFOB(fd,31) = auth_dat[i].sex;
- WFIFOL(fd,32) = auth_dat[i].logincount;
- WFIFOL(fd,36) = auth_dat[i].state;
- memcpy(WFIFOP(fd,40), auth_dat[i].error_message, 20);
- memcpy(WFIFOP(fd,60), auth_dat[i].lastlogin, 24);
- memcpy(WFIFOP(fd,84), auth_dat[i].last_ip, 16);
- memcpy(WFIFOP(fd,100), auth_dat[i].email, 40);
- WFIFOL(fd,140) = (unsigned long)auth_dat[i].connect_until_time;
- WFIFOL(fd,144) = (unsigned long)auth_dat[i].ban_until_time;
- WFIFOW(fd,148) = strlen(auth_dat[i].memo);
- if (auth_dat[i].memo[0]) {
- memcpy(WFIFOP(fd,150), auth_dat[i].memo, strlen(auth_dat[i].memo));
- }
- login_log("'ladmin': Sending information of an account (request by the name; account: %s, id: %d, ip: %s)" RETCODE,
- auth_dat[i].userid, auth_dat[i].account_id, ip);
- WFIFOSET(fd,150+strlen(auth_dat[i].memo));
- } else {
- memcpy(WFIFOP(fd,7), account_name, 24);
- WFIFOW(fd,148) = 0;
- login_log("'ladmin': Attempt to obtain information (by the name) of an unknown account (account: %s, ip: %s)" RETCODE,
- account_name, ip);
- WFIFOSET(fd,150);
- }
- RFIFOSKIP(fd,26);
- break;
-
- case 0x7954: // Request about information of an account (by account id)
- if (RFIFOREST(fd) < 6)
- return 0;
- WFIFOW(fd,0) = 0x7953;
- WFIFOL(fd,2) = RFIFOL(fd,2);
- memset(WFIFOP(fd,7), '\0', 24);
- for(i = 0; i < auth_num; i++) {
- if (auth_dat[i].account_id == RFIFOL(fd,2)) {
- login_log("'ladmin': Sending information of an account (request by the id; account: %s, id: %d, ip: %s)" RETCODE,
- auth_dat[i].userid, RFIFOL(fd,2), ip);
- WFIFOB(fd,6) = (unsigned char)isGM(auth_dat[i].account_id);
- memcpy(WFIFOP(fd,7), auth_dat[i].userid, 24);
- WFIFOB(fd,31) = auth_dat[i].sex;
- WFIFOL(fd,32) = auth_dat[i].logincount;
- WFIFOL(fd,36) = auth_dat[i].state;
- memcpy(WFIFOP(fd,40), auth_dat[i].error_message, 20);
- memcpy(WFIFOP(fd,60), auth_dat[i].lastlogin, 24);
- memcpy(WFIFOP(fd,84), auth_dat[i].last_ip, 16);
- memcpy(WFIFOP(fd,100), auth_dat[i].email, 40);
- WFIFOL(fd,140) = (unsigned long)auth_dat[i].connect_until_time;
- WFIFOL(fd,144) = (unsigned long)auth_dat[i].ban_until_time;
- WFIFOW(fd,148) = strlen(auth_dat[i].memo);
- if (auth_dat[i].memo[0]) {
- memcpy(WFIFOP(fd,150), auth_dat[i].memo, strlen(auth_dat[i].memo));
- }
- WFIFOSET(fd,150+strlen(auth_dat[i].memo));
- break;
- }
- }
- if (i == auth_num) {
- login_log("'ladmin': Attempt to obtain information (by the id) of an unknown account (id: %d, ip: %s)" RETCODE,
- RFIFOL(fd,2), ip);
- strncpy((char*)WFIFOP(fd,7), "", 24);
- WFIFOW(fd,148) = 0;
- WFIFOSET(fd,150);
- }
- RFIFOSKIP(fd,6);
- break;
-
- case 0x7955: // Request to reload GM file (no answer)
- login_log("'ladmin': Request to re-load GM configuration file (ip: %s)." RETCODE, ip);
- read_gm_account();
- // send GM accounts to all char-servers
- send_GM_accounts();
- RFIFOSKIP(fd,2);
- break;
-
- default:
- {
- FILE *logfp;
- char tmpstr[24];
- struct timeval tv;
- logfp = fopen(login_log_unknown_packets_filename, "a");
- if (logfp) {
- gettimeofday(&tv, NULL);
- strftime(tmpstr, 23, date_format, localtime((const time_t*)&(tv.tv_sec)));
- fprintf(logfp, "%s.%03d: receiving of an unknown packet -> disconnection" RETCODE, tmpstr, (int)tv.tv_usec / 1000);
- fprintf(logfp, "parse_admin: connection #%d (ip: %s), packet: 0x%x (with being read: %d)." RETCODE, fd, ip, RFIFOW(fd,0), RFIFOREST(fd));
- fprintf(logfp, "Detail (in hex):" RETCODE);
- fprintf(logfp, "---- 00-01-02-03-04-05-06-07 08-09-0A-0B-0C-0D-0E-0F" RETCODE);
- memset(tmpstr, '\0', sizeof(tmpstr));
- for(i = 0; i < RFIFOREST(fd); i++) {
- if ((i & 15) == 0)
- fprintf(logfp, "%04X ",i);
- fprintf(logfp, "%02x ", RFIFOB(fd,i));
- if (RFIFOB(fd,i) > 0x1f)
- tmpstr[i % 16] = RFIFOB(fd,i);
- else
- tmpstr[i % 16] = '.';
- if ((i - 7) % 16 == 0) // -8 + 1
- fprintf(logfp, " ");
- else if ((i + 1) % 16 == 0) {
- fprintf(logfp, " %s" RETCODE, tmpstr);
- memset(tmpstr, '\0', sizeof(tmpstr));
- }
- }
- if (i % 16 != 0) {
- for(j = i; j % 16 != 0; j++) {
- fprintf(logfp, " ");
- if ((j - 7) % 16 == 0) // -8 + 1
- fprintf(logfp, " ");
- }
- fprintf(logfp, " %s" RETCODE, tmpstr);
- }
- fprintf(logfp, RETCODE);
- fclose(logfp);
- }
- }
- login_log("'ladmin': End of connection, unknown packet (ip: %s)" RETCODE, ip);
- session[fd]->eof = 1;
- printf("Remote administration has been disconnected (unknown packet).\n");
- return 0;
- }
- //WFIFOW(fd,0) = 0x791f;
- //WFIFOSET(fd,2);
- }
- return 0;
-}
-
-//--------------------------------------------
-// Test to know if an IP come from LAN or WAN.
-//--------------------------------------------
-int lan_ip_check(unsigned char *p) {
- int i;
- int lancheck = 1;
-
-// printf("lan_ip_check: to compare: %d.%d.%d.%d, network: %d.%d.%d.%d/%d.%d.%d.%d\n",
-// p[0], p[1], p[2], p[3],
-// subneti[0], subneti[1], subneti[2], subneti[3],
-// subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]);
- for(i = 0; i < 4; i++) {
- if ((subneti[i] & subnetmaski[i]) != (p[i] & subnetmaski[i])) {
- lancheck = 0;
- break;
- }
- }
- printf("LAN test (result): %s source\033[0m.\n", (lancheck) ? "\033[1;36mLAN" : "\033[1;32mWAN");
- return lancheck;
-}
-
-//----------------------------------------------------------------------------------------
-// Default packet parsing (normal players or administation/char-server connexion requests)
-//----------------------------------------------------------------------------------------
-int parse_login(int fd) {
- struct mmo_account account;
- int result, i, j;
- unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
- char ip[16];
-
- sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
-
- memset(&account, 0, sizeof(account));
-
- if (session[fd]->eof) {
- close(fd);
- delete_session(fd);
- return 0;
- }
-
- while(RFIFOREST(fd) >= 2) {
- if (display_parse_login == 1) {
- if (RFIFOW(fd,0) == 0x64 || RFIFOW(fd,0) == 0x01dd) {
- if (RFIFOREST(fd) >= ((RFIFOW(fd,0) == 0x64) ? 55 : 47))
- printf("parse_login: connection #%d, packet: 0x%x (with being read: %d), account: %s.\n", fd, RFIFOW(fd,0), RFIFOREST(fd), RFIFOP(fd,6));
- } else if (RFIFOW(fd,0) == 0x2710) {
- if (RFIFOREST(fd) >= 86)
- printf("parse_login: connection #%d, packet: 0x%x (with being read: %d), server: %s.\n", fd, RFIFOW(fd,0), RFIFOREST(fd), RFIFOP(fd,60));
- } else
- printf("parse_login: connection #%d, packet: 0x%x (with being read: %d).\n", fd, RFIFOW(fd,0), RFIFOREST(fd));
- }
-
- switch(RFIFOW(fd,0)) {
- case 0x200: // New alive packet: structure: 0x200 <account.userid>.24B. used to verify if client is always alive.
- if (RFIFOREST(fd) < 26)
- return 0;
- RFIFOSKIP(fd,26);
- break;
-
- case 0x204: // New alive packet: structure: 0x204 <encrypted.account.userid>.16B. (new ragexe from 22 june 2004)
- if (RFIFOREST(fd) < 18)
- return 0;
- RFIFOSKIP(fd,18);
- break;
-
- case 0x64: // Ask connection of a client
- case 0x01dd: // Ask connection of a client (encryption mode)
- if (RFIFOREST(fd) < ((RFIFOW(fd,0) == 0x64) ? 55 : 47))
- return 0;
-
- account.version = RFIFOL(fd, 2); //for exe version check [Sirius]
- account.userid = (char*)RFIFOP(fd,6);
- account.userid[23] = '\0';
- remove_control_chars((unsigned char *)account.userid);
- if (RFIFOW(fd,0) == 0x64) {
- memcpy(account.passwd, RFIFOP(fd,30), 24);
- account.passwd[24] = '\0';
- } else {
- memcpy(account.passwd, RFIFOP(fd,30), 32);
- account.passwd[32] = '\0';
- }
- remove_control_chars((unsigned char *)account.passwd);
-#ifdef PASSWORDENC
- account.passwdenc = (RFIFOW(fd,0) == 0x64) ? 0 : PASSWORDENC;
-#else
- account.passwdenc = 0;
-#endif
-
- if (RFIFOW(fd,0) == 0x64)
- login_log("Request for connection (non encryption mode) of %s (ip: %s)." RETCODE, account.userid, ip);
- else
- login_log("Request for connection (encryption mode) of %s (ip: %s)." RETCODE, account.userid, ip);
-
- if (!check_ip(session[fd]->client_addr.sin_addr.s_addr)) {
- login_log("Connection refused: IP isn't authorised (deny/allow, ip: %s)." RETCODE, ip);
- WFIFOW(fd,0) = 0x6a;
- WFIFOB(fd,2) = 3; // 3 = Rejected from Server
- WFIFOSET(fd,23);
- RFIFOSKIP(fd,(RFIFOW(fd,0) == 0x64) ? 55 : 47);
- break;
- }
-
- result = mmo_auth(&account, fd);
- if (result == -1) {
- int gm_level = isGM(account.account_id);
- if (min_level_to_connect > gm_level) {
- login_log("Connection refused: the minimum GM level for connection is %d (account: %s, GM level: %d, ip: %s)." RETCODE,
- min_level_to_connect, account.userid, gm_level, ip);
- WFIFOW(fd,0) = 0x81;
- WFIFOL(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- } else {
- if (gm_level)
- printf("Connection of the GM (level:%d) account '%s' accepted.\n", gm_level, account.userid);
- else
- printf("Connection of the account '%s' accepted.\n", account.userid);
- server_num = 0;
- for(i = 0; i < MAX_SERVERS; i++) {
- if (server_fd[i] >= 0) {
- if (lan_ip_check(p))
- WFIFOL(fd,47+server_num*32) = inet_addr(lan_char_ip);
- else
- WFIFOL(fd,47+server_num*32) = server[i].ip;
- WFIFOW(fd,47+server_num*32+4) = server[i].port;
- memcpy(WFIFOP(fd,47+server_num*32+6), server[i].name, 20);
- WFIFOW(fd,47+server_num*32+26) = server[i].users;
- WFIFOW(fd,47+server_num*32+28) = server[i].maintenance;
- WFIFOW(fd,47+server_num*32+30) = server[i].new_;
- server_num++;
- }
- }
- // if at least 1 char-server
- if (server_num > 0) {
- WFIFOW(fd,0) = 0x69;
- WFIFOW(fd,2) = 47+32*server_num;
- WFIFOL(fd,4) = account.login_id1;
- WFIFOL(fd,8) = account.account_id;
- WFIFOL(fd,12) = account.login_id2;
- WFIFOL(fd,16) = 0; // in old version, that was for ip (not more used)
- memcpy(WFIFOP(fd,20), account.lastlogin, 24); // in old version, that was for name (not more used)
- WFIFOB(fd,46) = account.sex;
- WFIFOSET(fd,47+32*server_num);
- if (auth_fifo_pos >= AUTH_FIFO_SIZE)
- auth_fifo_pos = 0;
- auth_fifo[auth_fifo_pos].account_id = account.account_id;
- auth_fifo[auth_fifo_pos].login_id1 = account.login_id1;
- auth_fifo[auth_fifo_pos].login_id2 = account.login_id2;
- auth_fifo[auth_fifo_pos].sex = account.sex;
- auth_fifo[auth_fifo_pos].delflag = 0;
- auth_fifo[auth_fifo_pos].ip = session[fd]->client_addr.sin_addr.s_addr;
- auth_fifo_pos++;
- // if no char-server, don't send void list of servers, just disconnect the player with proper message
- } else {
- login_log("Connection refused: there is no char-server online (account: %s, ip: %s)." RETCODE,
- account.userid, ip);
- WFIFOW(fd,0) = 0x81;
- WFIFOL(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- }
- }
- } else {
- memset(WFIFOP(fd,0), '\0', 23);
- WFIFOW(fd,0) = 0x6a;
- WFIFOB(fd,2) = result;
- if (result == 6) { // 6 = Your are Prohibited to log in until %s
- i = search_account_index(account.userid);
- if (i != -1) {
- if (auth_dat[i].ban_until_time != 0) { // if account is banned, we send ban timestamp
- char tmpstr[256];
- strftime(tmpstr, 20, date_format, localtime(&auth_dat[i].ban_until_time));
- tmpstr[19] = '\0';
- memcpy(WFIFOP(fd,3), tmpstr, 20);
- } else { // we send error message
- memcpy(WFIFOP(fd,3), auth_dat[i].error_message, 20);
- }
- }
- }
- WFIFOSET(fd,23);
- }
- RFIFOSKIP(fd,(RFIFOW(fd,0) == 0x64) ? 55 : 47);
- break;
-
- case 0x01db: // Sending request of the coding key
- case 0x791a: // Sending request of the coding key (administration packet)
- {
- struct login_session_data *ld;
- if (session[fd]->session_data) {
- printf("login: abnormal request of MD5 key (already opened session).\n");
- session[fd]->eof = 1;
- return 0;
- }
- ld = (struct login_session_data*)aCalloc(1, sizeof(struct login_session_data));
- session[fd]->session_data = ld;
- if (!ld) {
- printf("login: Request for md5 key: memory allocation failure (malloc)!\n");
- session[fd]->eof = 1;
- return 0;
- }
- if (RFIFOW(fd,0) == 0x01db)
- login_log("Sending request of the coding key (ip: %s)" RETCODE, ip);
- else
- login_log("'ladmin': Sending request of the coding key (ip: %s)" RETCODE, ip);
- // Creation of the coding key
- memset(ld->md5key, '\0', sizeof(ld->md5key));
- ld->md5keylen = rand() % 4 + 12;
- for(i = 0; i < ld->md5keylen; i++)
- ld->md5key[i] = rand() % 255 + 1;
- RFIFOSKIP(fd,2);
- WFIFOW(fd,0) = 0x01dc;
- WFIFOW(fd,2) = 4 + ld->md5keylen;
- memcpy(WFIFOP(fd,4), ld->md5key, ld->md5keylen);
- WFIFOSET(fd,WFIFOW(fd,2));
- }
- break;
-
- case 0x2710: // Connection request of a char-server
- if (RFIFOREST(fd) < 86)
- return 0;
- {
- int GM_value, len;
- char* server_name;
- account.userid = (char*)RFIFOP(fd,2);
- account.userid[23] = '\0';
- remove_control_chars((unsigned char *)account.userid);
- memcpy(account.passwd, RFIFOP(fd,26), 24);
- account.passwd[24] = '\0';
- remove_control_chars((unsigned char *)account.passwd);
- account.passwdenc = 0;
- server_name = (char*)RFIFOP(fd,60);
- server_name[19] = '\0';
- remove_control_chars((unsigned char *)server_name);
- login_log("Connection request of the char-server '%s' @ %d.%d.%d.%d:%d (ip: %s)" RETCODE,
- server_name, RFIFOB(fd,54), RFIFOB(fd,55), RFIFOB(fd,56), RFIFOB(fd,57), RFIFOW(fd,58), ip);
- result = mmo_auth(&account, fd);
- if (result == -1 && account.sex == 2 && account.account_id < MAX_SERVERS && server_fd[account.account_id] == -1) {
- login_log("Connection of the char-server '%s' accepted (account: %s, pass: %s, ip: %s)" RETCODE,
- server_name, account.userid, account.passwd, ip);
- printf("Connection of the char-server '%s' accepted.\n", server_name);
- memset(&server[account.account_id], 0, sizeof(struct mmo_char_server));
- server[account.account_id].ip = RFIFOL(fd,54);
- server[account.account_id].port = RFIFOW(fd,58);
- memcpy(server[account.account_id].name, server_name, 20);
- server[account.account_id].users = 0;
- server[account.account_id].maintenance = RFIFOW(fd,82);
- server[account.account_id].new_ = RFIFOW(fd,84);
- server_fd[account.account_id] = fd;
- WFIFOW(fd,0) = 0x2711;
- WFIFOB(fd,2) = 0;
- WFIFOSET(fd,3);
- session[fd]->func_parse = parse_fromchar;
- realloc_fifo(fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
- // send GM account to char-server
- len = 4;
- WFIFOW(fd,0) = 0x2732;
- for(i = 0; i < auth_num; i++)
- // send only existing accounts. We can not create a GM account when server is online.
- if ((GM_value = isGM(auth_dat[i].account_id)) > 0) {
- WFIFOL(fd,len) = auth_dat[i].account_id;
- WFIFOB(fd,len+4) = (unsigned char)GM_value;
- len += 5;
- }
- WFIFOW(fd,2) = len;
- WFIFOSET(fd,len);
- } else {
- if (server_fd[account.account_id] != -1) {
- printf("Connection of the char-server '%s' REFUSED - already connected (account: %ld-%s, pass: %s, ip: %s)\n",
- server_name, account.account_id, account.userid, account.passwd, ip);
- login_log("Connexion of the char-server '%s' REFUSED - already connected (account: %ld-%s, pass: %s, ip: %s)" RETCODE,
- server_name, account.account_id, account.userid, account.passwd, ip);
- } else {
- printf("Connection of the char-server '%s' REFUSED (account: %s, pass: %s, ip: %s).\n", server_name, account.userid, account.passwd, ip);
- login_log("Connexion of the char-server '%s' REFUSED (account: %s, pass: %s, ip: %s)" RETCODE,
- server_name, account.userid, account.passwd, ip);
- }
- WFIFOW(fd,0) = 0x2711;
- WFIFOB(fd,2) = 3;
- WFIFOSET(fd,3);
- }
- }
- RFIFOSKIP(fd,86);
- return 0;
-
- case 0x7530: // Request of the server version
- login_log("Sending of the server version (ip: %s)" RETCODE, ip);
- WFIFOW(fd,0) = 0x7531;
- WFIFOB(fd,2) = ATHENA_MAJOR_VERSION;
- WFIFOB(fd,3) = ATHENA_MINOR_VERSION;
- WFIFOB(fd,4) = ATHENA_REVISION;
- WFIFOB(fd,5) = ATHENA_RELEASE_FLAG;
- WFIFOB(fd,6) = ATHENA_OFFICIAL_FLAG;
- WFIFOB(fd,7) = ATHENA_SERVER_LOGIN;
- WFIFOW(fd,8) = ATHENA_MOD_VERSION;
- WFIFOSET(fd,10);
- RFIFOSKIP(fd,2);
- break;
-
- case 0x7532: // Request to end connection
- login_log("End of connection (ip: %s)" RETCODE, ip);
- session[fd]->eof = 1;
- return 0;
-
- case 0x7918: // Request for administation login
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < ((RFIFOW(fd,2) == 0) ? 28 : 20))
- return 0;
- WFIFOW(fd,0) = 0x7919;
- WFIFOB(fd,2) = 1;
- if (!check_ladminip(session[fd]->client_addr.sin_addr.s_addr)) {
- login_log("'ladmin'-login: Connection in administration mode refused: IP isn't authorised (ladmin_allow, ip: %s)." RETCODE, ip);
- } else {
- struct login_session_data *ld = (struct login_session_data*)session[fd]->session_data;
- if (RFIFOW(fd,2) == 0) { // non encrypted password
- char* password="";
- memcpy(password, RFIFOP(fd,4), 24);
- password[24] = '\0';
- remove_control_chars((unsigned char *)password);
- // If remote administration is enabled and password sent by client matches password read from login server configuration file
- if ((admin_state == 1) && (strcmp(password, admin_pass) == 0)) {
- login_log("'ladmin'-login: Connection in administration mode accepted (non encrypted password: %s, ip: %s)" RETCODE, password, ip);
- printf("Connection of a remote administration accepted (non encrypted password).\n");
- WFIFOB(fd,2) = 0;
- session[fd]->func_parse = parse_admin;
- } else if (admin_state != 1)
- login_log("'ladmin'-login: Connection in administration mode REFUSED - remote administration is disabled (non encrypted password: %s, ip: %s)" RETCODE, password, ip);
- else
- login_log("'ladmin'-login: Connection in administration mode REFUSED - invalid password (non encrypted password: %s, ip: %s)" RETCODE, password, ip);
- } else { // encrypted password
- if (!ld)
- printf("'ladmin'-login: error! MD5 key not created/requested for an administration login.\n");
- else {
- char md5str[64] = "", md5bin[32];
- if (RFIFOW(fd,2) == 1) {
- sprintf(md5str, "%s%s", ld->md5key, admin_pass); // 20 24
- } else if (RFIFOW(fd,2) == 2) {
- sprintf(md5str, "%s%s", admin_pass, ld->md5key); // 24 20
- }
- MD5_String2binary(md5str, md5bin);
- // If remote administration is enabled and password hash sent by client matches hash of password read from login server configuration file
- if ((admin_state == 1) && (memcmp(md5bin, RFIFOP(fd,4), 16) == 0)) {
- login_log("'ladmin'-login: Connection in administration mode accepted (encrypted password, ip: %s)" RETCODE, ip);
- printf("Connection of a remote administration accepted (encrypted password).\n");
- WFIFOB(fd,2) = 0;
- session[fd]->func_parse = parse_admin;
- } else if (admin_state != 1)
- login_log("'ladmin'-login: Connection in administration mode REFUSED - remote administration is disabled (encrypted password, ip: %s)" RETCODE, ip);
- else
- login_log("'ladmin'-login: Connection in administration mode REFUSED - invalid password (encrypted password, ip: %s)" RETCODE, ip);
- }
- }
- }
- WFIFOSET(fd,3);
- RFIFOSKIP(fd, (RFIFOW(fd,2) == 0) ? 28 : 20);
- break;
-
- default:
- if (save_unknown_packets) {
- FILE *logfp;
- char tmpstr[24];
- struct timeval tv;
- logfp = fopen(login_log_unknown_packets_filename, "a");
- if (logfp) {
- gettimeofday(&tv, NULL);
- strftime(tmpstr, 23, date_format, localtime((const time_t*)&(tv.tv_sec)));
- fprintf(logfp, "%s.%03d: receiving of an unknown packet -> disconnection" RETCODE, tmpstr, (int)tv.tv_usec / 1000);
- fprintf(logfp, "parse_login: connection #%d (ip: %s), packet: 0x%x (with being read: %d)." RETCODE, fd, ip, RFIFOW(fd,0), RFIFOREST(fd));
- fprintf(logfp, "Detail (in hex):" RETCODE);
- fprintf(logfp, "---- 00-01-02-03-04-05-06-07 08-09-0A-0B-0C-0D-0E-0F" RETCODE);
- memset(tmpstr, '\0', sizeof(tmpstr));
- for(i = 0; i < RFIFOREST(fd); i++) {
- if ((i & 15) == 0)
- fprintf(logfp, "%04X ",i);
- fprintf(logfp, "%02x ", RFIFOB(fd,i));
- if (RFIFOB(fd,i) > 0x1f)
- tmpstr[i % 16] = RFIFOB(fd,i);
- else
- tmpstr[i % 16] = '.';
- if ((i - 7) % 16 == 0) // -8 + 1
- fprintf(logfp, " ");
- else if ((i + 1) % 16 == 0) {
- fprintf(logfp, " %s" RETCODE, tmpstr);
- memset(tmpstr, '\0', sizeof(tmpstr));
- }
- }
- if (i % 16 != 0) {
- for(j = i; j % 16 != 0; j++) {
- fprintf(logfp, " ");
- if ((j - 7) % 16 == 0) // -8 + 1
- fprintf(logfp, " ");
- }
- fprintf(logfp, " %s" RETCODE, tmpstr);
- }
- fprintf(logfp, RETCODE);
- fclose(logfp);
- }
- }
- login_log("End of connection, unknown packet (ip: %s)" RETCODE, ip);
- session[fd]->eof = 1;
- return 0;
- }
- }
- return 0;
-}
-
-//-----------------------
-// Console Command Parser [Wizputer]
-//-----------------------
-int parse_console(char *buf) {
- char command[256];
-
- memset(command,0,sizeof(command));
-
- sscanf(buf, "%[^\n]", command);
-
- login_log("Console command :%s" RETCODE, command);
-
- if(strcmpi("shutdown", command) == 0 ||
- strcmpi("exit", command) == 0 ||
- strcmpi("quit", command) == 0 ||
- strcmpi("end", command) == 0)
- exit(0);
- else if(strcmpi("alive", command) == 0 ||
- strcmpi("status", command) == 0)
- printf("\033[0;36mConsole: \033[0m\033[1mI'm Alive.\033[0m\n");
- else if(strcmpi("help", command) == 0) {
- printf("\033[32mHelp of commands:\033[0m\n");
- printf(" To shutdown the server:\n");
- printf(" 'shutdown|exit|qui|end'\n");
- printf(" To know if server is alive:\n");
- printf(" 'alive|status'\n");
- }
-
- return 0;
-}
-
-
-//-------------------------------------------------
-// Return numerical value of a switch configuration
-// on/off, english, français, deutsch, español
-//-------------------------------------------------
-int config_switch(const char *str) {
- if (strcmpi(str, "on") == 0 || strcmpi(str, "yes") == 0 || strcmpi(str, "oui") == 0 || strcmpi(str, "ja") == 0 || strcmpi(str, "si") == 0)
- return 1;
- if (strcmpi(str, "off") == 0 || strcmpi(str, "no") == 0 || strcmpi(str, "non") == 0 || strcmpi(str, "nein") == 0)
- return 0;
-
- return atoi(str);
-}
-
-//----------------------------------
-// Reading Lan Support configuration
-//----------------------------------
-int login_lan_config_read(const char *lancfgName) {
- int j;
- struct hostent * h = NULL;
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- // set default configuration
- strncpy(lan_char_ip, "127.0.0.1", sizeof(lan_char_ip));
- subneti[0] = 127;
- subneti[1] = 0;
- subneti[2] = 0;
- subneti[3] = 1;
- for(j = 0; j < 4; j++)
- subnetmaski[j] = 255;
-
- fp = fopen(lancfgName, "r");
-
- if (fp == NULL) {
- printf("***WARNING: LAN Support configuration file is not found: %s\n", lancfgName);
- return 1;
- }
-
- printf("---Start reading Lan Support configuration file\n");
-
- while(fgets(line, sizeof(line)-1, fp)) {
- if (line[0] == '/' && line[1] == '/')
- continue;
-
- line[sizeof(line)-1] = '\0';
- memset(w2, 0, sizeof(w2));
- if (sscanf(line,"%[^:]: %[^\r\n]", w1, w2) != 2)
- continue;
-
- remove_control_chars((unsigned char *)w1);
- remove_control_chars((unsigned char *)w2);
- if (strcmpi(w1, "lan_char_ip") == 0) { // Read Char-Server Lan IP Address
- memset(lan_char_ip, 0, sizeof(lan_char_ip));
- h = gethostbyname(w2);
- if (h != NULL) {
- sprintf(lan_char_ip, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- } else {
- strncpy(lan_char_ip, w2, sizeof(lan_char_ip));
- lan_char_ip[sizeof(lan_char_ip)-1] = '\0';
- }
- printf("LAN IP of char-server: %s.\n", lan_char_ip);
- } else if (strcmpi(w1, "subnet") == 0) { // Read Subnetwork
- for(j = 0; j < 4; j++)
- subneti[j] = 0;
- h = gethostbyname(w2);
- if (h != NULL) {
- for(j = 0; j < 4; j++)
- subneti[j] = (unsigned char)h->h_addr[j];
- } else {
- sscanf(w2, "%d.%d.%d.%d", &subneti[0], &subneti[1], &subneti[2], &subneti[3]);
- }
- printf("Sub-network of the char-server: %d.%d.%d.%d.\n", subneti[0], subneti[1], subneti[2], subneti[3]);
- } else if (strcmpi(w1, "subnetmask") == 0) { // Read Subnetwork Mask
- for(j = 0; j < 4; j++)
- subnetmaski[j] = 255;
- h = gethostbyname(w2);
- if (h != NULL) {
- for(j = 0; j < 4; j++)
- subnetmaski[j] = (unsigned char)h->h_addr[j];
- } else {
- sscanf(w2, "%d.%d.%d.%d", &subnetmaski[0], &subnetmaski[1], &subnetmaski[2], &subnetmaski[3]);
- }
- printf("Sub-network mask of the char-server: %d.%d.%d.%d.\n", subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]);
- }
- }
- fclose(fp);
-
- // log the LAN configuration
- login_log("The LAN configuration of the server is set:" RETCODE);
- login_log("- with LAN IP of char-server: %s." RETCODE, lan_char_ip);
- login_log("- with the sub-network of the char-server: %d.%d.%d.%d/%d.%d.%d.%d." RETCODE,
- subneti[0], subneti[1], subneti[2], subneti[3], subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]);
-
- // sub-network check of the char-server
- {
- unsigned int a0, a1, a2, a3;
- unsigned char p[4];
- sscanf(lan_char_ip, "%d.%d.%d.%d", &a0, &a1, &a2, &a3);
- p[0] = a0; p[1] = a1; p[2] = a2; p[3] = a3;
- printf("LAN test of LAN IP of the char-server: ");
- if (lan_ip_check(p) == 0) {
- printf("\033[1;31m***ERROR: LAN IP of the char-server doesn't belong to the specified Sub-network\033[0m\n");
- login_log("***ERROR: LAN IP of the char-server doesn't belong to the specified Sub-network." RETCODE);
- }
- }
-
- printf("---End reading of Lan Support configuration file\n");
-
- return 0;
-}
-
-//-----------------------------------
-// Reading general configuration file
-//-----------------------------------
-int login_config_read(const char *cfgName) {
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
- struct hostent *h = NULL;
-
- bind_ip_str[0] = '\0';
-
- if ((fp = fopen(cfgName, "r")) == NULL) {
- printf("Configuration file (%s) not found.\n", cfgName);
- return 1;
- }
-
- printf("---Start reading of Login Server configuration file (%s)\n", cfgName);
- while(fgets(line, sizeof(line)-1, fp)) {
- if (line[0] == '/' && line[1] == '/')
- continue;
-
- line[sizeof(line)-1] = '\0';
- memset(w2, 0, sizeof(w2));
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2) {
- remove_control_chars((unsigned char *)w1);
- remove_control_chars((unsigned char *)w2);
-
- if (strcmpi(w1, "admin_state") == 0) {
- admin_state = config_switch(w2);
- } else if (strcmpi(w1, "admin_pass") == 0) {
- memset(admin_pass, 0, sizeof(admin_pass));
- strncpy(admin_pass, w2, sizeof(admin_pass));
- admin_pass[sizeof(admin_pass)-1] = '\0';
- } else if (strcmpi(w1, "ladminallowip") == 0) {
- if (strcmpi(w2, "clear") == 0) {
- if (access_ladmin_allow)
- aFree(access_ladmin_allow);
- access_ladmin_allow = NULL;
- access_ladmin_allownum = 0;
- } else {
- if (strcmpi(w2, "all") == 0) {
- // reset all previous values
- if (access_ladmin_allow)
- aFree(access_ladmin_allow);
- // set to all
- access_ladmin_allow = (char*)aCalloc(ACO_STRSIZE, sizeof(char));
- access_ladmin_allownum = 1;
- access_ladmin_allow[0] = '\0';
- } else if (w2[0] && !(access_ladmin_allownum == 1 && access_ladmin_allow[0] == '\0')) { // don't add IP if already 'all'
- if (access_ladmin_allow)
- access_ladmin_allow = (char*)aRealloc(access_ladmin_allow, (access_ladmin_allownum+1) * ACO_STRSIZE);
- else
- access_ladmin_allow = (char*)aCalloc(ACO_STRSIZE, sizeof(char));
- strncpy(access_ladmin_allow + (access_ladmin_allownum++) * ACO_STRSIZE, w2, ACO_STRSIZE);
- access_ladmin_allow[access_ladmin_allownum * ACO_STRSIZE - 1] = '\0';
- }
- }
- } else if (strcmpi(w1, "gm_pass") == 0) {
- memset(gm_pass, 0, sizeof(gm_pass));
- strncpy(gm_pass, w2, sizeof(gm_pass));
- gm_pass[sizeof(gm_pass)-1] = '\0';
- } else if (strcmpi(w1, "level_new_gm") == 0) {
- level_new_gm = atoi(w2);
- } else if (strcmpi(w1, "new_account") == 0) {
- new_account_flag = config_switch(w2);
- } else if (strcmpi(w1, "bind_ip") == 0) {
- //bind_ip_set_ = 1;
- h = gethostbyname (w2);
- if (h != NULL) {
- printf("Login server binding IP address : %s -> %d.%d.%d.%d\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- sprintf(bind_ip_str, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- } else
- memcpy(bind_ip_str,w2,16);
- } else if (strcmpi(w1, "login_port") == 0) {
- login_port = atoi(w2);
- } else if (strcmpi(w1, "account_filename") == 0) {
- memset(account_filename, 0, sizeof(account_filename));
- strncpy(account_filename, w2, sizeof(account_filename));
- account_filename[sizeof(account_filename)-1] = '\0';
- } else if (strcmpi(w1, "gm_account_filename") == 0) {
- memset(GM_account_filename, 0, sizeof(GM_account_filename));
- strncpy(GM_account_filename, w2, sizeof(GM_account_filename));
- GM_account_filename[sizeof(GM_account_filename)-1] = '\0';
- } else if (strcmpi(w1, "gm_account_filename_check_timer") == 0) {
- gm_account_filename_check_timer = atoi(w2);
- } else if (strcmpi(w1, "use_MD5_passwords") == 0) {
- use_md5_passwds = config_switch(w2);
- } else if (strcmpi(w1, "login_log_filename") == 0) {
- memset(login_log_filename, 0, sizeof(login_log_filename));
- strncpy(login_log_filename, w2, sizeof(login_log_filename));
- login_log_filename[sizeof(login_log_filename)-1] = '\0';
- } else if (strcmpi(w1, "log_login") == 0) {
- log_login = atoi(w2);
- } else if (strcmpi(w1, "login_log_unknown_packets_filename") == 0) {
- memset(login_log_unknown_packets_filename, 0, sizeof(login_log_unknown_packets_filename));
- strncpy(login_log_unknown_packets_filename, w2, sizeof(login_log_unknown_packets_filename));
- login_log_unknown_packets_filename[sizeof(login_log_unknown_packets_filename)-1] = '\0';
- } else if (strcmpi(w1, "save_unknown_packets") == 0) {
- save_unknown_packets = config_switch(w2);
- } else if (strcmpi(w1, "display_parse_login") == 0) {
- display_parse_login = config_switch(w2); // 0: no, 1: yes
- } else if (strcmpi(w1, "display_parse_admin") == 0) {
- display_parse_admin = config_switch(w2); // 0: no, 1: yes
- } else if (strcmpi(w1, "display_parse_fromchar") == 0) {
- display_parse_fromchar = config_switch(w2); // 0: no, 1: yes (without packet 0x2714), 2: all packets
- } else if (strcmpi(w1, "date_format") == 0) { // note: never have more than 19 char for the date!
- memset(date_format, 0, sizeof(date_format));
- switch (atoi(w2)) {
- case 0:
- strcpy(date_format, "%d-%m-%Y %H:%M:%S"); // 31-12-2004 23:59:59
- break;
- case 1:
- strcpy(date_format, "%m-%d-%Y %H:%M:%S"); // 12-31-2004 23:59:59
- break;
- case 2:
- strcpy(date_format, "%Y-%d-%m %H:%M:%S"); // 2004-31-12 23:59:59
- break;
- case 3:
- strcpy(date_format, "%Y-%m-%d %H:%M:%S"); // 2004-12-31 23:59:59
- break;
- }
- } else if (strcmpi(w1, "min_level_to_connect") == 0) {
- min_level_to_connect = atoi(w2);
- } else if (strcmpi(w1, "add_to_unlimited_account") == 0) {
- add_to_unlimited_account = config_switch(w2);
- } else if (strcmpi(w1, "start_limited_time") == 0) {
- start_limited_time = atoi(w2);
- } else if (strcmpi(w1, "check_ip_flag") == 0) {
- check_ip_flag = config_switch(w2);
- } else if (strcmpi(w1, "order") == 0) {
- access_order = atoi(w2);
- if (strcmpi(w2, "deny,allow") == 0 ||
- strcmpi(w2, "deny, allow") == 0) access_order = ACO_DENY_ALLOW;
- if (strcmpi(w2, "allow,deny") == 0 ||
- strcmpi(w2, "allow, deny") == 0) access_order = ACO_ALLOW_DENY;
- if (strcmpi(w2, "mutual-failture") == 0 ||
- strcmpi(w2, "mutual-failure") == 0) access_order = ACO_MUTUAL_FAILTURE;
- } else if (strcmpi(w1, "allow") == 0) {
- if (strcmpi(w2, "clear") == 0) {
- if (access_allow)
- aFree(access_allow);
- access_allow = NULL;
- access_allownum = 0;
- } else {
- if (strcmpi(w2, "all") == 0) {
- // reset all previous values
- if (access_allow)
- aFree(access_allow);
- // set to all
- access_allow = (char*)aCalloc(ACO_STRSIZE, sizeof(char));
- access_allownum = 1;
- access_allow[0] = '\0';
- } else if (w2[0] && !(access_allownum == 1 && access_allow[0] == '\0')) { // don't add IP if already 'all'
- if (access_allow)
- access_allow = (char*)aRealloc(access_allow, (access_allownum+1) * ACO_STRSIZE);
- else
- access_allow = (char*)aCalloc(ACO_STRSIZE, sizeof(char));
- strncpy(access_allow + (access_allownum++) * ACO_STRSIZE, w2, ACO_STRSIZE);
- access_allow[access_allownum * ACO_STRSIZE - 1] = '\0';
- }
- }
- } else if (strcmpi(w1, "deny") == 0) {
- if (strcmpi(w2, "clear") == 0) {
- if (access_deny)
- aFree(access_deny);
- access_deny = NULL;
- access_denynum = 0;
- } else {
- if (strcmpi(w2, "all") == 0) {
- // reset all previous values
- if (access_deny)
- aFree(access_deny);
- // set to all
- access_deny = (char*)aCalloc(ACO_STRSIZE, sizeof(char));
- access_denynum = 1;
- access_deny[0] = '\0';
- } else if (w2[0] && !(access_denynum == 1 && access_deny[0] == '\0')) { // don't add IP if already 'all'
- if (access_deny)
- access_deny = (char*)aRealloc(access_deny, (access_denynum+1) * ACO_STRSIZE);
- else
- access_deny = (char*)aCalloc(ACO_STRSIZE, sizeof(char));
- strncpy(access_deny + (access_denynum++) * ACO_STRSIZE, w2, ACO_STRSIZE);
- access_deny[access_denynum * ACO_STRSIZE - 1] = '\0';
- }
- }
- // dynamic password error ban
- } else if (strcmpi(w1, "dynamic_pass_failure_ban") == 0) {
- dynamic_pass_failure_ban = config_switch(w2);
- } else if (strcmpi(w1, "dynamic_pass_failure_ban_time") == 0) {
- dynamic_pass_failure_ban_time = atoi(w2);
- } else if (strcmpi(w1, "dynamic_pass_failure_ban_how_many") == 0) {
- dynamic_pass_failure_ban_how_many = atoi(w2);
- } else if (strcmpi(w1, "dynamic_pass_failure_ban_how_long") == 0) {
- dynamic_pass_failure_ban_how_long = atoi(w2);
- } else if (strcmpi(w1, "import") == 0) {
- login_config_read(w2);
- } else if(strcmpi(w1,"imalive_on")==0) { //Added by Mugendai for I'm Alive mod
- imalive_on = atoi(w2); //Added by Mugendai for I'm Alive mod
- } else if(strcmpi(w1,"imalive_time")==0) { //Added by Mugendai for I'm Alive mod
- imalive_time = atoi(w2); //Added by Mugendai for I'm Alive mod
- } else if(strcmpi(w1,"flush_on")==0) { //Added by Mugendai for GUI
- flush_on = atoi(w2); //Added by Mugendai for GUI
- } else if(strcmpi(w1,"flush_time")==0) { //Added by Mugendai for GUI
- flush_time = atoi(w2); //Added by Mugendai for GUI
- } else if(strcmpi(w1, "check_client_version") == 0){ //Added by Sirius for client version check
- if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 ){
- check_client_version = 1;
- }
- if(strcmpi(w2,"off") == 0 || strcmpi(w2,"no") == 0 ){
- check_client_version = 0;
- }
- }else if(strcmpi(w1, "client_version_to_connect") == 0){ //Added by Sirius for client version check
- client_version_to_connect = atoi(w2); //Added by Sirius for client version check
- } else if (strcmpi(w1, "console") == 0) {
- if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
- console = 1;
- }
- }
- }
- fclose(fp);
-
- printf("---End reading of Login Server configuration file.\n");
-
- return 0;
-}
-
-//-------------------------------------
-// Displaying of configuration warnings
-//-------------------------------------
-void display_conf_warnings(void) {
- if (admin_state != 0 && admin_state != 1) {
- printf("***WARNING: Invalid value for admin_state parameter -> set to 0 (no remote admin).\n");
- admin_state = 0;
- }
-
- if (admin_state == 1) {
- if (admin_pass[0] == '\0') {
- printf("***WARNING: Administrator password is void (admin_pass).\n");
- } else if (strcmp(admin_pass, "admin") == 0) {
- printf("***WARNING: You are using the default administrator password (admin_pass).\n");
- printf(" We highly recommend that you change it.\n");
- }
- }
-
- if (gm_pass[0] == '\0') {
- printf("***WARNING: 'To GM become' password is void (gm_pass).\n");
- printf(" We highly recommend that you set one password.\n");
- } else if (strcmp(gm_pass, "gm") == 0) {
- printf("***WARNING: You are using the default GM password (gm_pass).\n");
- printf(" We highly recommend that you change it.\n");
- }
-
- if (level_new_gm < 0 || level_new_gm > 99) {
- printf("***WARNING: Invalid value for level_new_gm parameter -> set to 60 (default).\n");
- level_new_gm = 60;
- }
-
- if (new_account_flag != 0 && new_account_flag != 1) {
- printf("***WARNING: Invalid value for new_account parameter -> set to 0 (no new account).\n");
- new_account_flag = 0;
- }
-
- if (login_port < 1024 || login_port > 65535) {
- printf("***WARNING: Invalid value for login_port parameter -> set to 6900 (default).\n");
- login_port = 6900;
- }
-
- if (gm_account_filename_check_timer < 0) {
- printf("***WARNING: Invalid value for gm_account_filename_check_timer parameter.\n");
- printf(" -> set to 15 sec (default).\n");
- gm_account_filename_check_timer = 15;
- } else if (gm_account_filename_check_timer == 1) {
- printf("***WARNING: Invalid value for gm_account_filename_check_timer parameter.\n");
- printf(" -> set to 2 sec (minimum value).\n");
- gm_account_filename_check_timer = 2;
- }
-
- if (save_unknown_packets != 0 && save_unknown_packets != 1) {
- printf("WARNING: Invalid value for save_unknown_packets parameter -> set to 0-no save.\n");
- save_unknown_packets = 0;
- }
-
- if (display_parse_login != 0 && display_parse_login != 1) { // 0: no, 1: yes
- printf("***WARNING: Invalid value for display_parse_login parameter\n");
- printf(" -> set to 0 (no display).\n");
- display_parse_login = 0;
- }
-
- if (display_parse_admin != 0 && display_parse_admin != 1) { // 0: no, 1: yes
- printf("***WARNING: Invalid value for display_parse_admin parameter\n");
- printf(" -> set to 0 (no display).\n");
- display_parse_admin = 0;
- }
-
- if (display_parse_fromchar < 0 || display_parse_fromchar > 2) { // 0: no, 1: yes (without packet 0x2714), 2: all packets
- printf("***WARNING: Invalid value for display_parse_fromchar parameter\n");
- printf(" -> set to 0 (no display).\n");
- display_parse_fromchar = 0;
- }
-
- if (min_level_to_connect < 0) { // 0: all players, 1-99 at least gm level x
- printf("***WARNING: Invalid value for min_level_to_connect (%d) parameter\n", min_level_to_connect);
- printf(" -> set to 0 (any player).\n");
- min_level_to_connect = 0;
- } else if (min_level_to_connect > 99) { // 0: all players, 1-99 at least gm level x
- printf("***WARNING: Invalid value for min_level_to_connect (%d) parameter\n", min_level_to_connect);
- printf(" -> set to 99 (only GM level 99).\n");
- min_level_to_connect = 99;
- }
-
- if (add_to_unlimited_account != 0 && add_to_unlimited_account != 1) { // 0: no, 1: yes
- printf("***WARNING: Invalid value for add_to_unlimited_account parameter\n");
- printf(" -> set to 0 (impossible to add a time to an unlimited account).\n");
- add_to_unlimited_account = 0;
- }
-
- if (start_limited_time < -1) { // -1: create unlimited account, 0 or more: additionnal sec from now to create limited time
- printf("***WARNING: Invalid value for start_limited_time parameter\n");
- printf(" -> set to -1 (new accounts are created with unlimited time).\n");
- start_limited_time = -1;
- }
-
- if (check_ip_flag != 0 && check_ip_flag != 1) { // 0: no, 1: yes
- printf("***WARNING: Invalid value for check_ip_flag parameter\n");
- printf(" -> set to 1 (check players ip between login-server & char-server).\n");
- check_ip_flag = 1;
- }
-
- if (access_order == ACO_DENY_ALLOW) {
- if (access_denynum == 1 && access_deny[0] == '\0') {
- printf("***WARNING: The IP security order is 'deny,allow' (allow if not deny).\n");
- printf(" And you refuse ALL IP.\n");
- }
- } else if (access_order == ACO_ALLOW_DENY) {
- if (access_allownum == 0) {
- printf("***WARNING: The IP security order is 'allow,deny' (deny if not allow).\n");
- printf(" But, NO IP IS AUTHORISED!\n");
- }
- } else { // ACO_MUTUAL_FAILTURE
- if (access_allownum == 0) {
- printf("***WARNING: The IP security order is 'mutual-failture'\n");
- printf(" (allow if in the allow list and not in the deny list).\n");
- printf(" But, NO IP IS AUTHORISED!\n");
- } else if (access_denynum == 1 && access_deny[0] == '\0') {
- printf("***WARNING: The IP security order is mutual-failture\n");
- printf(" (allow if in the allow list and not in the deny list).\n");
- printf(" But, you refuse ALL IP!\n");
- }
- }
-
- if (dynamic_pass_failure_ban != 0) {
- if (dynamic_pass_failure_ban_time < 1) {
- printf("***WARNING: Invalid value for dynamic_pass_failure_ban_time (%d) parameter\n", dynamic_pass_failure_ban_time);
- printf(" -> set to 5 (5 minutes to look number of invalid passwords.\n");
- dynamic_pass_failure_ban_time = 5;
- }
- if (dynamic_pass_failure_ban_how_many < 1) {
- printf("***WARNING: Invalid value for dynamic_pass_failure_ban_how_many (%d) parameter\n", dynamic_pass_failure_ban_how_many);
- printf(" -> set to 3 (3 invalid passwords before to temporarily ban.\n");
- dynamic_pass_failure_ban_how_many = 3;
- }
- if (dynamic_pass_failure_ban_how_long < 1) {
- printf("***WARNING: Invalid value for dynamic_pass_failure_ban_how_long (%d) parameter\n", dynamic_pass_failure_ban_how_long);
- printf(" -> set to 1 (1 minute of temporarily ban.\n");
- dynamic_pass_failure_ban_how_long = 1;
- }
- }
-
- return;
-}
-
-//-------------------------------
-// Save configuration in log file
-//-------------------------------
-void save_config_in_log(void) {
- int i;
-
- // a newline in the log...
- login_log("");
- login_log("The login-server starting..." RETCODE);
-
- // save configuration in log file
- login_log("The configuration of the server is set:" RETCODE);
-
- if (admin_state != 1)
- login_log("- with no remote administration." RETCODE);
- else if (admin_pass[0] == '\0')
- login_log("- with a remote administration with a VOID password." RETCODE);
- else if (strcmp(admin_pass, "admin") == 0)
- login_log("- with a remote administration with the DEFAULT password." RETCODE);
- else
- login_log("- with a remote administration with the password of %d character(s)." RETCODE, strlen(admin_pass));
- if (access_ladmin_allownum == 0 || (access_ladmin_allownum == 1 && access_ladmin_allow[0] == '\0')) {
- login_log("- to accept any IP for remote administration" RETCODE);
- } else {
- login_log("- to accept following IP for remote administration:" RETCODE);
- for(i = 0; i < access_ladmin_allownum; i++)
- login_log(" %s" RETCODE, (char *)(access_ladmin_allow + i * ACO_STRSIZE));
- }
-
- if (gm_pass[0] == '\0')
- login_log("- with a VOID 'To GM become' password (gm_pass)." RETCODE);
- else if (strcmp(gm_pass, "gm") == 0)
- login_log("- with the DEFAULT 'To GM become' password (gm_pass)." RETCODE);
- else
- login_log("- with a 'To GM become' password (gm_pass) of %d character(s)." RETCODE, strlen(gm_pass));
- if (level_new_gm == 0)
- login_log("- to refuse any creation of GM with @gm." RETCODE);
- else
- login_log("- to create GM with level '%d' when @gm is used." RETCODE, level_new_gm);
-
- if (new_account_flag == 1)
- login_log("- to ALLOW new users (with _F/_M)." RETCODE);
- else
- login_log("- to NOT ALLOW new users (with _F/_M)." RETCODE);
- login_log("- with port: %d." RETCODE, login_port);
- login_log("- with the accounts file name: '%s'." RETCODE, account_filename);
- login_log("- with the GM accounts file name: '%s'." RETCODE, GM_account_filename);
- if (gm_account_filename_check_timer == 0)
- login_log("- to NOT check GM accounts file modifications." RETCODE);
- else
- login_log("- to check GM accounts file modifications every %d seconds." RETCODE, gm_account_filename_check_timer);
-
- if (use_md5_passwds == 0)
- login_log("- to save password in plain text." RETCODE);
- else
- login_log("- to save password with MD5 encrypting." RETCODE);
-
- // not necessary to log the 'login_log_filename', we are inside :)
-
- login_log("- with the unknown packets file name: '%s'." RETCODE, login_log_unknown_packets_filename);
- if (save_unknown_packets)
- login_log("- to SAVE all unkown packets." RETCODE);
- else
- login_log("- to SAVE only unkown packets sending by a char-server or a remote administration." RETCODE);
- if (display_parse_login)
- login_log("- to display normal parse packets on console." RETCODE);
- else
- login_log("- to NOT display normal parse packets on console." RETCODE);
- if (display_parse_admin)
- login_log("- to display administration parse packets on console." RETCODE);
- else
- login_log("- to NOT display administration parse packets on console." RETCODE);
- if (display_parse_fromchar)
- login_log("- to display char-server parse packets on console." RETCODE);
- else
- login_log("- to NOT display char-server parse packets on console." RETCODE);
-
- if (min_level_to_connect == 0) // 0: all players, 1-99 at least gm level x
- login_log("- with no minimum level for connection." RETCODE);
- else if (min_level_to_connect == 99)
- login_log("- to accept only GM with level 99." RETCODE);
- else
- login_log("- to accept only GM with level %d or more." RETCODE, min_level_to_connect);
-
- if (add_to_unlimited_account)
- login_log("- to authorize adjustment (with timeadd ladmin) on an unlimited account." RETCODE);
- else
- login_log("- to refuse adjustment (with timeadd ladmin) on an unlimited account. You must use timeset (ladmin command) before." RETCODE);
-
- if (start_limited_time < 0)
- login_log("- to create new accounts with an unlimited time." RETCODE);
- else if (start_limited_time == 0)
- login_log("- to create new accounts with a limited time: time of creation." RETCODE);
- else
- login_log("- to create new accounts with a limited time: time of creation + %d second(s)." RETCODE, start_limited_time);
-
- if (check_ip_flag)
- login_log("- with control of players IP between login-server and char-server." RETCODE);
- else
- login_log("- to not check players IP between login-server and char-server." RETCODE);
-
- if (access_order == ACO_DENY_ALLOW) {
- if (access_denynum == 0) {
- login_log("- with the IP security order: 'deny,allow' (allow if not deny). You refuse no IP." RETCODE);
- } else if (access_denynum == 1 && access_deny[0] == '\0') {
- login_log("- with the IP security order: 'deny,allow' (allow if not deny). You refuse ALL IP." RETCODE);
- } else {
- login_log("- with the IP security order: 'deny,allow' (allow if not deny). Refused IP are:" RETCODE);
- for(i = 0; i < access_denynum; i++)
- login_log(" %s" RETCODE, (char *)(access_deny + i * ACO_STRSIZE));
- }
- } else if (access_order == ACO_ALLOW_DENY) {
- if (access_allownum == 0) {
- login_log("- with the IP security order: 'allow,deny' (deny if not allow). But, NO IP IS AUTHORISED!" RETCODE);
- } else if (access_allownum == 1 && access_allow[0] == '\0') {
- login_log("- with the IP security order: 'allow,deny' (deny if not allow). You authorise ALL IP." RETCODE);
- } else {
- login_log("- with the IP security order: 'allow,deny' (deny if not allow). Authorised IP are:" RETCODE);
- for(i = 0; i < access_allownum; i++)
- login_log(" %s" RETCODE, (char *)(access_allow + i * ACO_STRSIZE));
- }
- } else { // ACO_MUTUAL_FAILTURE
- login_log("- with the IP security order: 'mutual-failture' (allow if in the allow list and not in the deny list)." RETCODE);
- if (access_allownum == 0) {
- login_log(" But, NO IP IS AUTHORISED!" RETCODE);
- } else if (access_denynum == 1 && access_deny[0] == '\0') {
- login_log(" But, you refuse ALL IP!" RETCODE);
- } else {
- if (access_allownum == 1 && access_allow[0] == '\0') {
- login_log(" You authorise ALL IP." RETCODE);
- } else {
- login_log(" Authorised IP are:" RETCODE);
- for(i = 0; i < access_allownum; i++)
- login_log(" %s" RETCODE, (char *)(access_allow + i * ACO_STRSIZE));
- }
- login_log(" Refused IP are:" RETCODE);
- for(i = 0; i < access_denynum; i++)
- login_log(" %s" RETCODE, (char *)(access_deny + i * ACO_STRSIZE));
- }
-
- // dynamic password error ban
- if (dynamic_pass_failure_ban == 0)
- login_log("- with NO dynamic password error ban." RETCODE);
- else {
- printf("- with a dynamic password error ban:" RETCODE);
- printf(" After %d invalid password in %d minutes" RETCODE, dynamic_pass_failure_ban_how_many, dynamic_pass_failure_ban_time);
- printf(" IP is banned for %d minutes" RETCODE, dynamic_pass_failure_ban_how_long);
- }
- }
-}
-
-//-----------------------------------------------------
-//I'm Alive Alert
-//Used to output 'I'm Alive' every few seconds
-//Intended to let frontends know if the app froze
-//-----------------------------------------------------
-int imalive_timer(int tid, unsigned int tick, int id, int data){
- printf("I'm Alive\n");
- return 0;
-}
-
-//-----------------------------------------------------
-//Flush stdout
-//stdout buffer needs flushed to be seen in GUI
-//-----------------------------------------------------
-int flush_timer(int tid, unsigned int tick, int id, int data){
- fflush(stdout);
- return 0;
-}
-
-//--------------------------------------
-// Function called at exit of the server
-//--------------------------------------
-static int online_db_final(void *key,void *data,va_list ap)
-{
- int *p = (int *) data;
- if (p) aFree(p);
- return 0;
-}
-void do_final(void) {
- int i, fd;
- printf("Terminating...\n");
- fflush(stdout);
- mmo_auth_sync();
- numdb_final(online_db, online_db_final);
-
- if(auth_dat) aFree(auth_dat);
- if(gm_account_db) aFree(gm_account_db);
- if(access_ladmin_allow) aFree(access_ladmin_allow);
- if(access_allow) aFree(access_allow);
- if(access_deny) aFree(access_deny);
- for (i = 0; i < MAX_SERVERS; i++) {
- if ((fd = server_fd[i]) >= 0) {
- server_fd[i] = -1;
- memset(&server[i], 0, sizeof(struct mmo_char_server));
- close(fd);
- delete_session(fd);
- }
- }
- close(login_fd);
- delete_session(login_fd);
- exit_dbn();
- timer_final();
-
- login_log("----End of login-server (normal end with closing of all files)." RETCODE);
-
- if(log_fp)
- fclose(log_fp);
- printf("Finished.\n");
-}
-
-//------------------------------
-// Main function of login-server
-//------------------------------
-int do_init(int argc, char **argv) {
- int i, j;
-
- SERVER_TYPE = SERVER_LOGIN;
- // read login-server configuration
- login_config_read((argc > 1) ? argv[1] : LOGIN_CONF_NAME);
- display_conf_warnings(); // not in login_config_read, because we can use 'import' option, and display same message twice or more
- save_config_in_log(); // not before, because log file name can be changed
- login_lan_config_read((argc > 1) ? argv[1] : LAN_CONF_NAME);
-
- srand(time(NULL));
-
- for(i = 0; i< AUTH_FIFO_SIZE; i++)
- auth_fifo[i].delflag = 1;
- for(i = 0; i < MAX_SERVERS; i++)
- server_fd[i] = -1;
-
- //gm_account_db = numdb_init();
- gm_account_db = NULL;
- GM_num = 0;
- GM_max = 0;
- mmo_auth_init();
- read_gm_account();
-// set_termfunc(mmo_auth_sync);
- set_defaultparse(parse_login);
- // Online user database init
- online_db = numdb_init();
-
- if (bind_ip_str[0] != '\0')
- bind_ip = inet_addr(bind_ip_str);
- else
- bind_ip = INADDR_ANY;
-
- //login_fd = make_listen_port(login_port);
- login_fd = make_listen_bind(bind_ip,login_port);
-
- add_timer_func_list(check_auth_sync, "check_auth_sync");
- i = add_timer_interval(gettick() + 60000, check_auth_sync, 0, 0, 60000); // every 60 sec we check if we must save accounts file (only if necessary to save)
-
- // add timer to check GM accounts file modification
- j = gm_account_filename_check_timer;
- if (j == 0) // if we would not to check, we check every 60 sec, just to have timer (if we change timer, is was not necessary to check if timer already exists)
- j = 60;
-
- //Added for Mugendais I'm Alive mod
- if(imalive_on)
- add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000);
-
- //Added by Mugendai for GUI support
- if(flush_on)
- add_timer_interval(gettick()+10, flush_timer,0,0,flush_time);
-
- add_timer_func_list(check_GM_file, "check_GM_file");
- i = add_timer_interval(gettick() + j * 1000, check_GM_file, 0, 0, j * 1000); // every x sec we check if gm file has been changed
-
- if(console) {
- set_defaultconsoleparse(parse_console);
- start_console();
- }
-
- login_log("The login-server is ready (Server is listening on the port %d)." RETCODE, login_port);
- printf("The login-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", login_port);
-
- atexit(do_final);
-
- return 0;
-}
diff --git a/src/login/login.h b/src/login/login.h
deleted file mode 100644
index c08952383..000000000
--- a/src/login/login.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// $Id: login.h,v 1.1.1.1 2004/09/10 17:26:53 MagicalTux Exp $
-#ifndef _LOGIN_H_
-#define _LOGIN_H_
-
-#define MAX_SERVERS 30
-
-#define LOGIN_CONF_NAME "conf/login_athena.conf"
-#define LAN_CONF_NAME "conf/lan_support.conf"
-#define PASSWORDENC 3 // A definition is given when making an encryption password correspond.
- // It is 1 at the time of passwordencrypt.
- // It is made into 2 at the time of passwordencrypt2.
- // When it is made 3, it corresponds to both.
-#define START_ACCOUNT_NUM 2000000
-#define END_ACCOUNT_NUM 100000000
-
-extern int login_port;
-struct mmo_account {
- int version; //Added for version check [Sirius]
- char* userid;
- char passwd[33];
- int passwdenc;
-
- long account_id;
- long login_id1;
- long login_id2;
- long char_id;
- char lastlogin[24];
- int sex;
-};
-
-struct mmo_char_server {
- char name[21];
- long ip;
- short port;
- int users;
- int maintenance;
- int new_;
-};
-
-extern struct mmo_char_server server[MAX_SERVERS];
-extern int server_fd[MAX_SERVERS];
-#endif
diff --git a/src/login/md5calc.c b/src/login/md5calc.c
deleted file mode 100644
index 0ee64476d..000000000
--- a/src/login/md5calc.c
+++ /dev/null
@@ -1,237 +0,0 @@
-// $Id: md5calc.c,v 1.1.1.1 2004/09/10 17:26:54 MagicalTux Exp $
-/***********************************************************
- * md5 calculation algorithm
- *
- * The source code referred to the following URL.
- * http://www.geocities.co.jp/SiliconValley-Oakland/8878/lab17/lab17.html
- *
- ***********************************************************/
-
-#include "md5calc.h"
-#include <string.h>
-#include <stdio.h>
-
-#ifndef UINT_MAX
-#define UINT_MAX 4294967295U
-#endif
-
-// Global variable
-static unsigned int *pX;
-
-// Stirng Table
-static const unsigned int T[] = {
- 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, //0
- 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, //4
- 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, //8
- 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, //12
- 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, //16
- 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8, //20
- 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, //24
- 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, //28
- 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, //32
- 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, //36
- 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, //40
- 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, //44
- 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, //48
- 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, //52
- 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, //56
- 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 //60
-};
-
-// ROTATE_LEFT The left is made to rotate x [ n-bit ]. This is diverted as it is from RFC.
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
-
-// The function used for other calculation
-static unsigned int F(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return (X & Y) | (~X & Z);
-}
-static unsigned int G(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return (X & Z) | (Y & ~Z);
-}
-static unsigned int H(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return X ^ Y ^ Z;
-}
-static unsigned int I(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return Y ^ (X | ~Z);
-}
-
-static unsigned int Round(unsigned int a, unsigned int b, unsigned int FGHI,
- unsigned int k, unsigned int s, unsigned int i)
-{
- return b + ROTATE_LEFT(a + FGHI + pX[k] + T[i], s);
-}
-
-static void Round1(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, F(b,c,d), k, s, i);
-}
-static void Round2(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, G(b,c,d), k, s, i);
-}
-static void Round3(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, H(b,c,d), k, s, i);
-}
-static void Round4(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, I(b,c,d), k, s, i);
-}
-
-static void MD5_Round_Calculate(const unsigned char *block,
- unsigned int *A2, unsigned int *B2, unsigned int *C2, unsigned int *D2)
-{
- //create X It is since it is required.
- unsigned int X[16]; //512bit 64byte
- int j,k;
-
- //Save A as AA, B as BB, C as CC, and and D as DD (saving of A, B, C, and D)
- unsigned int A=*A2, B=*B2, C=*C2, D=*D2;
- unsigned int AA = A,BB = B,CC = C,DD = D;
-
- //It is a large region variable reluctantly because of calculation of a round. . . for Round1...4
- pX = X;
-
- //Copy block(padding_message) i into X
- for (j=0,k=0; j<64; j+=4,k++)
- X[k] = ( (unsigned int )block[j] ) // 8byte*4 -> 32byte conversion
- | ( ((unsigned int )block[j+1]) << 8 ) // A function called Decode as used in the field of RFC
- | ( ((unsigned int )block[j+2]) << 16 )
- | ( ((unsigned int )block[j+3]) << 24 );
-
-
- //Round 1
- Round1(&A,B,C,D, 0, 7, 0); Round1(&D,A,B,C, 1, 12, 1); Round1(&C,D,A,B, 2, 17, 2); Round1(&B,C,D,A, 3, 22, 3);
- Round1(&A,B,C,D, 4, 7, 4); Round1(&D,A,B,C, 5, 12, 5); Round1(&C,D,A,B, 6, 17, 6); Round1(&B,C,D,A, 7, 22, 7);
- Round1(&A,B,C,D, 8, 7, 8); Round1(&D,A,B,C, 9, 12, 9); Round1(&C,D,A,B, 10, 17, 10); Round1(&B,C,D,A, 11, 22, 11);
- Round1(&A,B,C,D, 12, 7, 12); Round1(&D,A,B,C, 13, 12, 13); Round1(&C,D,A,B, 14, 17, 14); Round1(&B,C,D,A, 15, 22, 15);
-
- //Round 2
- Round2(&A,B,C,D, 1, 5, 16); Round2(&D,A,B,C, 6, 9, 17); Round2(&C,D,A,B, 11, 14, 18); Round2(&B,C,D,A, 0, 20, 19);
- Round2(&A,B,C,D, 5, 5, 20); Round2(&D,A,B,C, 10, 9, 21); Round2(&C,D,A,B, 15, 14, 22); Round2(&B,C,D,A, 4, 20, 23);
- Round2(&A,B,C,D, 9, 5, 24); Round2(&D,A,B,C, 14, 9, 25); Round2(&C,D,A,B, 3, 14, 26); Round2(&B,C,D,A, 8, 20, 27);
- Round2(&A,B,C,D, 13, 5, 28); Round2(&D,A,B,C, 2, 9, 29); Round2(&C,D,A,B, 7, 14, 30); Round2(&B,C,D,A, 12, 20, 31);
-
- //Round 3
- Round3(&A,B,C,D, 5, 4, 32); Round3(&D,A,B,C, 8, 11, 33); Round3(&C,D,A,B, 11, 16, 34); Round3(&B,C,D,A, 14, 23, 35);
- Round3(&A,B,C,D, 1, 4, 36); Round3(&D,A,B,C, 4, 11, 37); Round3(&C,D,A,B, 7, 16, 38); Round3(&B,C,D,A, 10, 23, 39);
- Round3(&A,B,C,D, 13, 4, 40); Round3(&D,A,B,C, 0, 11, 41); Round3(&C,D,A,B, 3, 16, 42); Round3(&B,C,D,A, 6, 23, 43);
- Round3(&A,B,C,D, 9, 4, 44); Round3(&D,A,B,C, 12, 11, 45); Round3(&C,D,A,B, 15, 16, 46); Round3(&B,C,D,A, 2, 23, 47);
-
- //Round 4
- Round4(&A,B,C,D, 0, 6, 48); Round4(&D,A,B,C, 7, 10, 49); Round4(&C,D,A,B, 14, 15, 50); Round4(&B,C,D,A, 5, 21, 51);
- Round4(&A,B,C,D, 12, 6, 52); Round4(&D,A,B,C, 3, 10, 53); Round4(&C,D,A,B, 10, 15, 54); Round4(&B,C,D,A, 1, 21, 55);
- Round4(&A,B,C,D, 8, 6, 56); Round4(&D,A,B,C, 15, 10, 57); Round4(&C,D,A,B, 6, 15, 58); Round4(&B,C,D,A, 13, 21, 59);
- Round4(&A,B,C,D, 4, 6, 60); Round4(&D,A,B,C, 11, 10, 61); Round4(&C,D,A,B, 2, 15, 62); Round4(&B,C,D,A, 9, 21, 63);
-
- // Then perform the following additions. (let's add)
- *A2 = A + AA;
- *B2 = B + BB;
- *C2 = C + CC;
- *D2 = D + DD;
-
- //The clearance of confidential information
- memset(pX, 0, sizeof(X));
-}
-
-//-------------------------------------------------------------------
-// The function for the exteriors
-
-/** output is the coded binary in the character sequence which wants to code string. */
-void MD5_String2binary(const char * string, char * output)
-{
-//var
- /*8bit*/
- unsigned char padding_message[64]; //Extended message 512bit 64byte
- unsigned char *pstring; //The position of string in the present scanning notes is held.
-
-// unsigned char digest[16];
- /*32bit*/
- unsigned int string_byte_len, //The byte chief of string is held.
- string_bit_len, //The bit length of string is held.
- copy_len, //The number of bytes which is used by 1-3 and which remained
- msg_digest[4]; //Message digest 128bit 4byte
- unsigned int *A = &msg_digest[0], //The message digest in accordance with RFC (reference)
- *B = &msg_digest[1],
- *C = &msg_digest[2],
- *D = &msg_digest[3];
- int i;
-
-//prog
- //Step 3.Initialize MD Buffer (although it is the initialization; step 3 of A, B, C, and D -- unavoidable -- a head)
- *A = 0x67452301;
- *B = 0xefcdab89;
- *C = 0x98badcfe;
- *D = 0x10325476;
-
- //Step 1.Append Padding Bits (extension of a mark bit)
- //1-1
- string_byte_len = strlen(string); //The byte chief of a character sequence is acquired.
- pstring = (unsigned char *)string; //The position of the present character sequence is set.
-
- //1-2 Repeat calculation until length becomes less than 64 bytes.
- for (i=string_byte_len; 64<=i; i-=64,pstring+=64)
- MD5_Round_Calculate(pstring, A,B,C,D);
-
- //1-3
- copy_len = string_byte_len % 64; //The number of bytes which remained is computed.
- strncpy((char *)padding_message, (char *)pstring, copy_len); //A message is copied to an extended bit sequence.
- memset(padding_message+copy_len, 0, 64 - copy_len); //It buries by 0 until it becomes extended bit length.
- padding_message[copy_len] |= 0x80; //The next of a message is 1.
-
- //1-4
- //If 56 bytes or more (less than 64 bytes) of remainder becomes, it will calculate by extending to 64 bytes.
- if (56 <= copy_len) {
- MD5_Round_Calculate(padding_message, A,B,C,D);
- memset(padding_message, 0, 56); //56 bytes is newly fill uped with 0.
- }
-
-
- //Step 2.Append Length (the information on length is added)
- string_bit_len = string_byte_len * 8; //From the byte chief to bit length (32 bytes of low rank)
- memcpy(&padding_message[56], &string_bit_len, 4); //32 bytes of low rank is set.
-
- //When bit length cannot be expressed in 32 bytes of low rank, it is a beam raising to a higher rank.
- if (UINT_MAX / 8 < string_byte_len) {
- unsigned int high = (string_byte_len - UINT_MAX / 8) * 8;
- memcpy(&padding_message[60], &high, 4);
- } else
- memset(&padding_message[60], 0, 4); //In this case, it is good for a higher rank at 0.
-
- //Step 4.Process Message in 16-Word Blocks (calculation of MD5)
- MD5_Round_Calculate(padding_message, A,B,C,D);
-
-
- //Step 5.Output (output)
- memcpy(output,msg_digest,16);
-// memcpy (digest, msg_digest, and 16); //8 byte*4 < - 32byte conversion A function called Encode as used in the field of RFC
-/* sprintf(output,
- "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
- digest[ 0], digest[ 1], digest[ 2], digest[ 3],
- digest[ 4], digest[ 5], digest[ 6], digest[ 7],
- digest[ 8], digest[ 9], digest[10], digest[11],
- digest[12], digest[13], digest[14], digest[15]);*/
-}
-
-/** output is the coded character sequence in the character sequence which wants to code string. */
-void MD5_String(const char * string, char * output)
-{
- unsigned char digest[16];
-
- MD5_String2binary(string,(char*)digest);
- sprintf(output,
- "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
- digest[ 0], digest[ 1], digest[ 2], digest[ 3],
- digest[ 4], digest[ 5], digest[ 6], digest[ 7],
- digest[ 8], digest[ 9], digest[10], digest[11],
- digest[12], digest[13], digest[14], digest[15]);
-}
-
diff --git a/src/login/md5calc.h b/src/login/md5calc.h
deleted file mode 100644
index 9137b5b2c..000000000
--- a/src/login/md5calc.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// $Id: md5calc.h,v 1.1.1.1 2004/09/10 17:26:54 MagicalTux Exp $
-#ifndef _MD5CALC_H_
-#define _MD5CALC_H_
-
-void MD5_String(const char * string, char * output);
-void MD5_String2binary(const char * string, char * output);
-
-#endif
diff --git a/src/login_sql/Makefile b/src/login_sql/Makefile
deleted file mode 100644
index 20b01c66d..000000000
--- a/src/login_sql/Makefile
+++ /dev/null
@@ -1,16 +0,0 @@
-all: login-server_sql
-sql: login-server_sql
-
-shared_libs=all
-COMMON_OBJ = ../common/obj/core.o ../common/obj/socket.o ../common/obj/timer.o ../common/obj/db.o ../common/obj/malloc.o ../common/obj/showmsg.o ../common/obj/strlib.o
-COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/db.h ../common/malloc.h ../common/showmsg.h ../common/strlib.h
-
-login-server_sql: login.o md5calc.o $(COMMON_OBJ)
- $(CC) -o ../../$@ $^ $(LIB_S)
-
-login.o: login.c login.h md5calc.h $(COMMON_H)
-md5calc.o: md5calc.c md5calc.h
-
-clean:
- rm -f *.o ../../login-server_sql
-
diff --git a/src/login_sql/login.c b/src/login_sql/login.c
deleted file mode 100644
index ff9e4706a..000000000
--- a/src/login_sql/login.c
+++ /dev/null
@@ -1,1896 +0,0 @@
-// $Id: login.c,v 1.6 2004/09/19 21:12:07 Valaris Exp $
-// original : login2.c 2003/01/28 02:29:17 Rev.1.1.1.1
-// txt version 1.100
-
-#include <sys/types.h>
-
-#ifdef LCCWIN32
-#include <winsock.h>
-#pragma lib <libmysql.lib>
-#else
-#ifdef WIN32
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <winsock2.h>
-#include <time.h>
-void Gettimeofday(struct timeval *timenow)
-{
- time_t t;
- t = clock();
- timenow->tv_usec = t;
- timenow->tv_sec = t / CLK_TCK;
- return;
-}
-#define gettimeofday(timenow, dummy) Gettimeofday(timenow)
-#pragma comment(lib,"libmysql.lib")
-#else
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <sys/time.h>
-#include <sys/ioctl.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <unistd.h>
-#endif
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <sys/stat.h> // for stat/lstat/fstat
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-
-//add include for DBMS(mysql)
-#include <mysql.h>
-
-#include "../common/core.h"
-#include "../common/socket.h"
-#include "../common/malloc.h"
-#include "../common/db.h"
-#include "../common/timer.h"
-#include "../common/strlib.h"
-#include "../common/mmo.h"
-#include "../common/version.h"
-#include "login.h"
-
-#ifdef PASSWORDENC
-#include "md5calc.h"
-#endif
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-#define J_MAX_MALLOC_SIZE 65535
-
-//-----------------------------------------------------
-// global variable
-//-----------------------------------------------------
-int account_id_count = START_ACCOUNT_NUM;
-int server_num;
-int new_account_flag = 0; //Set from config too XD [Sirius]
-char bind_ip_str[16];
-in_addr_t bind_ip;
-int login_port = 6900;
-char lan_char_ip[128]; // Lan char ip added by kashy
-int subnetmaski[4]; // Subnetmask added by kashy
-
-struct mmo_char_server server[MAX_SERVERS];
-int server_fd[MAX_SERVERS];
-
-int login_fd;
-
-//Added for Mugendai's I'm Alive mod
-int imalive_on=0;
-int imalive_time=60;
-//Added by Mugendai for GUI
-int flush_on=1;
-int flush_time=100;
-
-char date_format[32] = "%Y-%m-%d %H:%M:%S";
-int auth_num = 0, auth_max = 0;
-
-int min_level_to_connect = 0; // minimum level of player/GM (0: player, 1-99: gm) to connect on the server
-int check_ip_flag = 1; // It's to check IP of a player between login-server and char-server (part of anti-hacking system)
-int check_client_version = 0; //Client version check ON/OFF .. (sirius)
-int client_version_to_connect = 20; //Client version needed to connect ..(sirius)
-int register_users_online = 1;
-
-MYSQL mysql_handle;
-
-int ipban = 1;
-int dynamic_account_ban = 1;
-int dynamic_account_ban_class = 0;
-int dynamic_pass_failure_ban = 1;
-int dynamic_pass_failure_ban_time = 5;
-int dynamic_pass_failure_ban_how_many = 3;
-int dynamic_pass_failure_ban_how_long = 60;
-
-int login_server_port = 3306;
-char login_server_ip[32] = "127.0.0.1";
-char login_server_id[32] = "ragnarok";
-char login_server_pw[32] = "ragnarok";
-char login_server_db[32] = "ragnarok";
-int use_md5_passwds = 0;
-char login_db[256] = "login";
-char loginlog_db[256] = "loginlog";
-
-// added to help out custom login tables, without having to recompile
-// source so options are kept in the login_athena.conf or the inter_athena.conf
-char login_db_account_id[256] = "account_id";
-char login_db_userid[256] = "userid";
-char login_db_user_pass[256] = "user_pass";
-char login_db_level[256] = "level";
-
-char tmpsql[65535], tmp_sql[65535];
-
-int console = 0;
-
-int case_sensitive = 1;
-
-//-----------------------------------------------------
-
-#define AUTH_FIFO_SIZE 256
-struct {
- int account_id,login_id1,login_id2;
- int ip,sex,delflag;
-} auth_fifo[AUTH_FIFO_SIZE];
-
-int auth_fifo_pos = 0;
-
-
-//-----------------------------------------------------
-
-static char md5key[20], md5keylen = 16;
-
-struct dbt *online_db;
-
-//-----------------------------------------------------
-// Online User Database [Wizputer]
-//-----------------------------------------------------
-
-void add_online_user(int account_id) {
- int *p;
- if(register_users_online <= 0)
- return;
- p = (int*)aMalloc(sizeof(int));
- *p = account_id;
- numdb_insert(online_db, account_id, p);
-}
-
-int is_user_online(int account_id) {
- int *p;
- if(register_users_online <= 0)
- return 0;
-
- p = (int*)numdb_search(online_db, account_id);
- if (p != NULL)
- printf("Acccount %d\n",*p);
-
- return (p != NULL);
-}
-
-void remove_online_user(int account_id) {
- int *p;
- if(register_users_online <= 0)
- return;
- p = (int*)numdb_erase(online_db,account_id);
- aFree(p);
-}
-
-//-----------------------------------------------------
-// check user level
-//-----------------------------------------------------
-
-int isGM(int account_id) {
- int level;
-
- MYSQL_RES* sql_res;
- MYSQL_ROW sql_row;
- level = 0;
- sprintf(tmpsql,"SELECT `%s` FROM `%s` WHERE `%s`='%d'", login_db_level, login_db, login_db_account_id, account_id);
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error (select GM Level to Memory)- %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res);
- level = atoi(sql_row[0]);
- if (level > 99)
- level = 99;
- }
-
- if (level == 0) {
- return 0;
- //not GM
- }
-
- mysql_free_result(sql_res);
-
- return level;
-}
-
-//---------------------------------------------------
-// E-mail check: return 0 (not correct) or 1 (valid).
-//---------------------------------------------------
-int e_mail_check(char *email) {
- char ch;
- char* last_arobas;
-
- // athena limits
- if (strlen(email) < 3 || strlen(email) > 39)
- return 0;
-
- // part of RFC limits (official reference of e-mail description)
- if (strchr(email, '@') == NULL || email[strlen(email)-1] == '@')
- return 0;
-
- if (email[strlen(email)-1] == '.')
- return 0;
-
- last_arobas = strrchr(email, '@');
-
- if (strstr(last_arobas, "@.") != NULL ||
- strstr(last_arobas, "..") != NULL)
- return 0;
-
- for(ch = 1; ch < 32; ch++) {
- if (strchr(last_arobas, ch) != NULL) {
- return 0;
- break;
- }
- }
-
- if (strchr(last_arobas, ' ') != NULL ||
- strchr(last_arobas, ';') != NULL)
- return 0;
-
- // all correct
- return 1;
-}
-
-//-----------------------------------------------------
-// Read Account database - mysql db
-//-----------------------------------------------------
-int mmo_auth_sqldb_init(void) {
-
- printf("Login server init....\n");
-
- // memory initialize
- printf("memory initialize....\n");
-
- mysql_init(&mysql_handle);
-
- // DB connection start
- printf("Connect Login Database Server....\n");
- if (!mysql_real_connect(&mysql_handle, login_server_ip, login_server_id, login_server_pw,
- login_server_db, login_server_port, (char *)NULL, 0)) {
- // pointer check
- printf("%s\n", mysql_error(&mysql_handle));
- exit(1);
- } else {
- printf("connect success!\n");
- }
-
- sprintf(tmpsql, "INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '', 'lserver', '100','login server started')", loginlog_db);
-
- //query
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- return 0;
-}
-
-//-----------------------------------------------------
-// DB server connect check
-//-----------------------------------------------------
-void mmo_auth_sqldb_sync(void) {
- // db connect check? or close?
- // ping pong DB server -if losted? then connect try. else crash.
-}
-
-//-----------------------------------------------------
-// close DB
-//-----------------------------------------------------
-void mmo_db_close(void) {
- int i, fd;
-
- //set log.
- sprintf(tmpsql,"INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '', 'lserver','100', 'login server shutdown')", loginlog_db);
-
- //query
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- //delete all server status
- sprintf(tmpsql,"DELETE FROM `sstatus`");
- //query
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- mysql_close(&mysql_handle);
- printf("close DB connect....\n");
-
- for (i = 0; i < MAX_SERVERS; i++) {
- if ((fd = server_fd[i]) >= 0)
- delete_session(fd);
- }
- delete_session(login_fd);
-}
-
-//-----------------------------------------------------
-// Make new account
-//-----------------------------------------------------
-int mmo_auth_sqldb_new(struct mmo_account* account,const char *tmpstr, char sex) {
- //no need on DB version
-
- printf("Request new account.... - not support on this version\n");
-
- return 0;
-}
-
-//-----------------------------------------------------
-// Make new account
-//-----------------------------------------------------
-int mmo_auth_new(struct mmo_account* account, const char *tmpstr, char sex) {
-
- return 0;
-}
-
-#ifdef LCCWIN32
-extern void gettimeofday(struct timeval *t, struct timezone *dummy);
-#endif
-
-//-----------------------------------------------------
-// Auth
-//-----------------------------------------------------
-int mmo_auth( struct mmo_account* account , int fd){
- struct timeval tv;
- time_t ban_until_time;
- char tmpstr[256];
- char t_uid[256], t_pass[256];
- char user_password[256];
-
- //added for account creation _M _F
- int len;
-
- MYSQL_RES* sql_res;
- MYSQL_ROW sql_row;
- //int sql_fields, sql_cnt;
- char md5str[64], md5bin[32];
-
- char ip[16];
-
- unsigned char *sin_addr = (unsigned char *)&session[fd]->client_addr.sin_addr;
-
-
- printf ("auth start...\n");
- sprintf(ip, "%d.%d.%d.%d", sin_addr[0], sin_addr[1], sin_addr[2], sin_addr[3]);
-
- //accountreg with _M/_F .. [Sirius]
- len = strlen(account->userid) -2;
-
- if (account->passwdenc == 0 && account->userid[len] == '_' &&
- (account->userid[len+1] == 'F' || account->userid[len+1] == 'M') && new_account_flag == 1 &&
- account_id_count <= END_ACCOUNT_NUM && len >= 4 && strlen(account->passwd) >= 4) {
- if (new_account_flag == 1)
- account->userid[len] = '\0';
- sprintf(tmp_sql, "SELECT `%s` FROM `%s` WHERE `userid` = '%s'", login_db_userid, login_db, account->userid);
- if(mysql_query(&mysql_handle, tmp_sql)){
- printf("SQL error (_M/_F reg): %s", mysql_error(&mysql_handle));
- }else{
- sql_res = mysql_store_result(&mysql_handle);
- if(mysql_num_rows(sql_res) == 0){
- //ok no existing acc,
- printf("Adding a new account user: %s with passwd: %s sex: %c (ip: %s)\n", account->userid, account->passwd, account->userid[len+1], ip);
- sprintf(tmp_sql, "INSERT INTO `%s` (`%s`, `%s`, `sex`, `email`) VALUES ('%s', '%s', '%c', '%s')", login_db, login_db_userid, login_db_user_pass, account->userid, account->passwd, account->userid[len+1], "a@a.com");
- if(mysql_query(&mysql_handle, tmp_sql)){
- //Failed to insert new acc :/
- printf("SQL Error (_M/_F reg) .. insert ..: %s", mysql_error(&mysql_handle));
- }//sql query check to insert
- }//rownum check (0!)
- mysql_free_result(sql_res);
- }//sqlquery
- }//all values for NEWaccount ok ?
-
-
-
- // auth start : time seed
- gettimeofday(&tv, NULL);
- strftime(tmpstr, 24, "%Y-%m-%d %H:%M:%S",localtime((const time_t*)&(tv.tv_sec)));
- sprintf(tmpstr+19, ".%03d", (int)tv.tv_usec/1000);
-
- jstrescapecpy(t_uid,account->userid);
- jstrescapecpy(t_pass, account->passwd);
-
-
- // make query
- sprintf(tmpsql, "SELECT `%s`,`%s`,`%s`,`lastlogin`,`logincount`,`sex`,`connect_until`,`last_ip`,`ban_until`,`state`,`%s`"
- " FROM `%s` WHERE %s `%s`='%s'", login_db_account_id, login_db_userid, login_db_user_pass, login_db_level, login_db, case_sensitive ? "BINARY" : "", login_db_userid, t_uid);
- //login {0-account_id/1-userid/2-user_pass/3-lastlogin/4-logincount/5-sex/6-connect_untl/7-last_ip/8-ban_until/9-state}
-
- // query
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res); //row fetching
- if (!sql_row) {
- //there's no id.
- printf ("auth failed no account %s %s %s\n", tmpstr, account->userid, account->passwd);
- mysql_free_result(sql_res);
- return 0;
- }
- } else {
- printf("mmo_auth DB result error ! \n");
- return 0;
- }
-
- //Client Version check[Sirius]
- if(check_client_version == 1 && account->version != 0){
- if(account->version != client_version_to_connect){
- mysql_free_result(sql_res);
- return 6;
- }
- }
-
- // Documented by CLOWNISIUS || LLRO || Gunstar lead this one with me
- // IF changed to diferent returns~ you get diferent responses from your msgstringtable.txt
- //Ireturn 2 == line 9
- //Ireturn 5 == line 311
- //Ireturn 6 == line 450
- //Ireturn 7 == line 440
- //Ireturn 8 == line 682
- //Ireturn 9 == line 704
- //Ireturn 10 == line 705
- //Ireturn 11 == line 706
- //Ireturn 12 == line 707
- //Ireturn 13 == line 708
- //Ireturn 14 == line 709
- //Ireturn 15 == line 710
- //Ireturn -1 == line 010
- // Check status
- {
- int encpasswdok = 0;
-
- if (atoi(sql_row[9]) == -3) {
- //id is banned
- mysql_free_result(sql_res);
- return -3;
- } else if (atoi(sql_row[9]) == -2) { //dynamic ban
- //id is banned
- mysql_free_result(sql_res);
- //add IP list.
- return -2;
- }
-
- if (use_md5_passwds) {
- MD5_String(account->passwd,user_password);
- } else {
- jstrescapecpy(user_password, account->passwd);
- }
- printf("account id ok encval:%d\n",account->passwdenc);
-#ifdef PASSWORDENC
- if (account->passwdenc > 0) {
- int j = account->passwdenc;
- printf ("start md5calc..\n");
- if (j > 2)
- j = 1;
- do {
- if (j == 1) {
- sprintf(md5str, "%s%s", md5key,sql_row[2]);
- } else if (j == 2) {
- sprintf(md5str, "%s%s", sql_row[2], md5key);
- } else
- md5str[0] = 0;
- printf("j:%d mdstr:%s\n", j, md5str);
- MD5_String2binary(md5str, md5bin);
- encpasswdok = (memcmp(user_password, md5bin, 16) == 0);
- } while (j < 2 && !encpasswdok && (j++) != account->passwdenc);
- //printf("key[%s] md5 [%s] ", md5key, md5);
- printf("client [%s] accountpass [%s]\n", user_password, sql_row[2]);
- printf ("end md5calc..\n");
- }
-#endif
- if ((strcmp(user_password, sql_row[2]) && !encpasswdok)) {
- if (account->passwdenc == 0) {
- printf ("auth failed pass error %s %s %s" RETCODE, tmpstr, account->userid, user_password);
-#ifdef PASSWORDENC
- } else {
- char logbuf[1024], *p = logbuf;
- int j;
- p += sprintf(p, "auth failed pass error %s %s recv-md5[", tmpstr, account->userid);
- for(j = 0; j < 16; j++)
- p += sprintf(p, "%02x", ((unsigned char *)user_password)[j]);
- p += sprintf(p, "] calc-md5[");
- for(j = 0; j < 16; j++)
- p += sprintf(p, "%02x", ((unsigned char *)md5bin)[j]);
- p += sprintf(p, "] md5key[");
- for(j = 0; j < md5keylen; j++)
- p += sprintf(p, "%02x", ((unsigned char *)md5key)[j]);
- p += sprintf(p, "]" RETCODE);
- printf("%s\n", p);
-#endif
- }
- return 1;
- }
- printf("auth ok %s %s" RETCODE, tmpstr, account->userid);
- }
-
-/*
-// do not remove this section. this is meant for future, and current forums usage
-// as a login manager and CP for login server. [CLOWNISIUS]
- if (atoi(sql_row[10]) == 1) {
- return 4;
- }
-
- if (atoi(sql_row[10]) >= 5) {
- switch(atoi(sql_row[10])) {
- case 5:
- return 5;
- break;
- case 6:
- return 7;
- break;
- case 7:
- return 9;
- break;
- case 8:
- return 10;
- break;
- case 9:
- return 11;
- break;
- default:
- return 10;
- break;
- }
- }
-*/
- ban_until_time = atol(sql_row[8]);
-
- //login {0-account_id/1-userid/2-user_pass/3-lastlogin/4-logincount/5-sex/6-connect_untl/7-last_ip/8-ban_until/9-state}
- if (ban_until_time != 0) { // if account is banned
- strftime(tmpstr, 20, date_format, localtime(&ban_until_time));
- tmpstr[19] = '\0';
- if (ban_until_time > time(NULL)) { // always banned
- return 6; // 6 = Your are Prohibited to log in until %s
- } else { // ban is finished
- // reset the ban time
- if (atoi(sql_row[9])==7) {//it was a temp ban - so we set STATE to 0
- sprintf(tmpsql, "UPDATE `%s` SET `ban_until`='0', `state`='0' WHERE %s `%s`='%s'", login_db, case_sensitive ? "BINARY" : "", login_db_userid, t_uid);
- strcpy(sql_row[9],"0"); //we clear STATE
- } else //it was a permanent ban + temp ban. So we leave STATE = 5, but clear the temp ban
- sprintf(tmpsql, "UPDATE `%s` SET `ban_until`='0' WHERE %s `%s`='%s'", login_db, case_sensitive ? "BINARY" : "", login_db_userid, t_uid);
-
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- }
- }
-
- if (atoi(sql_row[9])) {
- switch(atoi(sql_row[9])) { // packet 0x006a value + 1
- case 1: // 0 = Unregistered ID
- case 2: // 1 = Incorrect Password
- case 3: // 2 = This ID is expired
- case 4: // 3 = Rejected from Server
- case 5: // 4 = You have been blocked by the GM Team
- case 6: // 5 = Your Game's EXE file is not the latest version
- case 7: // 6 = Your are Prohibited to log in until %s
- case 8: // 7 = Server is jammed due to over populated
- case 9: // 8 = No MSG (actually, all states after 9 except 99 are No MSG, use only this)
- case 100: // 99 = This ID has been totally erased
- printf("Auth Error #%d\n", atoi(sql_row[9]));
- return atoi(sql_row[9]) - 1;
- break;
- default:
- return 99; // 99 = ID has been totally erased
- break;
- }
- }
-
- if (atol(sql_row[6]) != 0 && atol(sql_row[6]) < time(NULL)) {
- return 2; // 2 = This ID is expired
- }
-
- if ( is_user_online(atol(sql_row[0])) && register_users_online > 0) {
- printf("User [%s] is already online - Rejected.\n",sql_row[1]);
-#ifndef TWILIGHT
- return 3; // Rejected
-#endif
- }
-
- account->account_id = atoi(sql_row[0]);
- account->login_id1 = rand();
- account->login_id2 = rand();
- memcpy(tmpstr, sql_row[3], 19);
- memcpy(account->lastlogin, tmpstr, 24);
- account->sex = sql_row[5][0] == 'S' ? 2 : sql_row[5][0]=='M';
-
- sprintf(tmpsql, "UPDATE `%s` SET `lastlogin` = NOW(), `logincount`=`logincount` +1, `last_ip`='%s' WHERE %s `%s` = '%s'",
- login_db, ip, case_sensitive ? "BINARY" : "", login_db_userid, sql_row[1]);
- mysql_free_result(sql_res) ; //resource free
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- return -1;
-}
-
-// Send to char
-int charif_sendallwos(int sfd, unsigned char *buf, unsigned int len) {
- int i, c;
- int fd;
-
- c = 0;
- for(i = 0; i < MAX_SERVERS; i++) {
- if ((fd = server_fd[i]) > 0 && fd != sfd) {
- memcpy(WFIFOP(fd,0), buf, len);
- WFIFOSET(fd,len);
- c++;
- }
- }
-
- return c;
-}
-
-//-----------------------------------------------------
-// char-server packet parse
-//-----------------------------------------------------
-int parse_fromchar(int fd){
- int i, id;
- MYSQL_RES* sql_res;
- MYSQL_ROW sql_row = NULL;
-
- unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
- char ip[16];
-
- sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
-
- for(id = 0; id < MAX_SERVERS; id++)
- if (server_fd[id] == fd)
- break;
-
- if (id == MAX_SERVERS)
- session[fd]->eof = 1;
- if(session[fd]->eof) {
- if (id < MAX_SERVERS) {
- printf("Char-server '%s' has disconnected.\n", server[id].name);
- server_fd[id] = -1;
- memset(&server[id], 0, sizeof(struct mmo_char_server));
- // server delete
- sprintf(tmpsql, "DELETE FROM `sstatus` WHERE `index`='%d'", id);
- // query
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- }
- close(fd);
- delete_session(fd);
- return 0;
- }
-
- while(RFIFOREST(fd) >= 2) {
-// printf("char_parse: %d %d packet case=%x\n", fd, RFIFOREST(fd), RFIFOW(fd, 0));
-
- switch (RFIFOW(fd,0)) {
- case 0x2712:
- if (RFIFOREST(fd) < 19)
- return 0;
- {
- int account_id;
- account_id = RFIFOL(fd,2); // speed up
- for(i=0;i<AUTH_FIFO_SIZE;i++){
- if (auth_fifo[i].account_id == account_id &&
- auth_fifo[i].login_id1 == RFIFOL(fd,6) &&
-#if CMP_AUTHFIFO_LOGIN2 != 0
- auth_fifo[i].login_id2 == RFIFOL(fd,10) && // relate to the versions higher than 18
-#endif
- auth_fifo[i].sex == RFIFOB(fd,14) &&
-#if CMP_AUTHFIFO_IP != 0
- auth_fifo[i].ip == RFIFOL(fd,15) &&
-#endif
- !auth_fifo[i].delflag) {
- auth_fifo[i].delflag = 1;
- printf("auth -> %d\n", i);
- break;
- }
- }
-
- if (i != AUTH_FIFO_SIZE) { // send account_reg
- int p;
- time_t connect_until_time = 0;
- char email[40] = "";
- account_id=RFIFOL(fd,2);
- sprintf(tmpsql, "SELECT `email`,`connect_until` FROM `%s` WHERE `%s`='%d'", login_db, login_db_account_id, account_id);
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res);
- connect_until_time = atol(sql_row[1]);
- strcpy(email, sql_row[0]);
- }
- mysql_free_result(sql_res);
- if (account_id > 0) {
- sprintf(tmpsql, "SELECT `str`,`value` FROM `global_reg_value` WHERE `type`='1' AND `account_id`='%d'",account_id);
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res) {
- WFIFOW(fd,0) = 0x2729;
- WFIFOL(fd,4) = account_id;
- for(p = 8; (sql_row = mysql_fetch_row(sql_res));p+=36){
- memcpy(WFIFOP(fd,p), sql_row[0], 32);
- WFIFOL(fd,p+32) = atoi(sql_row[1]);
- }
- WFIFOW(fd,2) = p;
- WFIFOSET(fd,p);
- //printf("account_reg2 send : login->char (auth fifo)\n");
- WFIFOW(fd,0) = 0x2713;
- WFIFOL(fd,2) = account_id;
- WFIFOB(fd,6) = 0;
- memcpy(WFIFOP(fd, 7), email, 40);
- WFIFOL(fd,47) = (unsigned long) connect_until_time;
- WFIFOSET(fd,51);
- }
- mysql_free_result(sql_res);
- }
- } else {
- WFIFOW(fd,0) = 0x2713;
- WFIFOL(fd,2) = account_id;
- WFIFOB(fd,6) = 1;
- WFIFOSET(fd,51);
- }
- }
- RFIFOSKIP(fd,19);
- break;
-
- case 0x2714:
- if (RFIFOREST(fd) < 6)
- return 0;
- // how many users on world? (update)
- if (server[id].users != RFIFOL(fd,2))
- {
- printf("set users %s : %d\n", server[id].name, RFIFOL(fd,2));
-
- server[id].users = RFIFOL(fd,2);
- sprintf(tmpsql,"UPDATE `sstatus` SET `user` = '%d' WHERE `index` = '%d'", server[id].users, id);
- // query
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- }
-
- // send some answer
- WFIFOW(fd,0) = 0x2718;
- WFIFOSET(fd,2);
-
- RFIFOSKIP(fd,6);
- break;
-
- // We receive an e-mail/limited time request, because a player comes back from a map-server to the char-server
- case 0x2716:
- if (RFIFOREST(fd) < 6)
- return 0;
- {
- int account_id;
- time_t connect_until_time = 0;
- char email[40] = "";
- account_id=RFIFOL(fd,2);
- sprintf(tmpsql,"SELECT `email`,`connect_until` FROM `%s` WHERE `%s`='%d'",login_db, login_db_account_id, account_id);
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res);
- connect_until_time = atol(sql_row[1]);
- strcpy(email, sql_row[0]);
- }
- mysql_free_result(sql_res);
- //printf("parse_fromchar: E-mail/limited time request from '%s' server (concerned account: %d)\n", server[id].name, RFIFOL(fd,2));
- WFIFOW(fd,0) = 0x2717;
- WFIFOL(fd,2) = RFIFOL(fd,2);
- memcpy(WFIFOP(fd, 6), email, 40);
- WFIFOL(fd,46) = (unsigned long) connect_until_time;
- WFIFOSET(fd,50);
- }
- RFIFOSKIP(fd,6);
- break;
-
- case 0x2720: // GM
- if (RFIFOREST(fd) < 4)
- return 0;
- if (RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- //oldacc = RFIFOL(fd,4);
- printf("change GM isn't support in this login server version.\n");
- printf("change GM error 0 %s\n", RFIFOP(fd, 8));
-
- RFIFOSKIP(fd, RFIFOW(fd, 2));
- WFIFOW(fd, 0) = 0x2721;
- WFIFOL(fd, 2) = RFIFOL(fd,4); // oldacc;
- WFIFOL(fd, 6) = 0; // newacc;
- WFIFOSET(fd, 10);
- return 0;
-
- // Map server send information to change an email of an account via char-server
- case 0x2722: // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B
- if (RFIFOREST(fd) < 86)
- return 0;
- {
- int acc;
- char actual_email[40], new_email[40];
- acc = RFIFOL(fd,2);
- memcpy(actual_email, RFIFOP(fd,6), 40);
- memcpy(new_email, RFIFOP(fd,46), 40);
- if (e_mail_check(actual_email) == 0)
- printf("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command), but actual email is invalid (account: %d, ip: %s)" RETCODE,
- server[id].name, acc, ip);
- else if (e_mail_check(new_email) == 0)
- printf("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a invalid new e-mail (account: %d, ip: %s)" RETCODE,
- server[id].name, acc, ip);
- else if (strcmpi(new_email, "a@a.com") == 0)
- printf("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a default e-mail (account: %d, ip: %s)" RETCODE,
- server[id].name, acc, ip);
- else {
- sprintf(tmpsql, "SELECT `%s`,`email` FROM `%s` WHERE `%s` = '%d'", login_db_userid, login_db, login_db_account_id, acc);
- if (mysql_query(&mysql_handle, tmpsql))
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res); //row fetching
-
- if (strcmpi(sql_row[1], actual_email) == 0) {
- sprintf(tmpsql, "UPDATE `%s` SET `email` = '%s' WHERE `%s` = '%d'", login_db, new_email, login_db_account_id, acc);
- // query
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- printf("Char-server '%s': Modify an e-mail on an account (@email GM command) (account: %d (%s), new e-mail: %s, ip: %s)." RETCODE,
- server[id].name, acc, sql_row[0], actual_email, ip);
- }
- }
-
- }
- }
- RFIFOSKIP(fd, 86);
- break;
-
- case 0x2724: // Receiving of map-server via char-server a status change resquest (by Yor)
- if (RFIFOREST(fd) < 10)
- return 0;
- {
- int acc, statut;
- acc = RFIFOL(fd,2);
- statut = RFIFOL(fd,6);
- sprintf(tmpsql, "SELECT `state` FROM `%s` WHERE `%s` = '%d'", login_db, login_db_account_id, acc);
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res); // row fetching
- }
- if (atoi(sql_row[0]) != statut && statut != 0) {
- unsigned char buf[16];
- WBUFW(buf,0) = 0x2731;
- WBUFL(buf,2) = acc;
- WBUFB(buf,6) = 0; // 0: change of statut, 1: ban
- WBUFL(buf,7) = statut; // status or final date of a banishment
- charif_sendallwos(-1, buf, 11);
- }
- sprintf(tmpsql,"UPDATE `%s` SET `state` = '%d' WHERE `%s` = '%d'", login_db, statut,login_db_account_id,acc);
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- RFIFOSKIP(fd,10);
- }
- return 0;
-
- case 0x2725: // Receiving of map-server via char-server a ban resquest (by Yor)
- if (RFIFOREST(fd) < 18)
- return 0;
- {
- int acc;
- struct tm *tmtime;
- time_t timestamp, tmptime;
- acc = RFIFOL(fd,2);
- sprintf(tmpsql, "SELECT `ban_until` FROM `%s` WHERE `%s` = '%d'",login_db,login_db_account_id,acc);
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res); // row fetching
- }
- tmptime = atol(sql_row[0]);
- if (tmptime == 0 || tmptime < time(NULL))
- timestamp = time(NULL);
- else
- timestamp = tmptime;
- tmtime = localtime(&timestamp);
- tmtime->tm_year = tmtime->tm_year + (short)RFIFOW(fd,6);
- tmtime->tm_mon = tmtime->tm_mon + (short)RFIFOW(fd,8);
- tmtime->tm_mday = tmtime->tm_mday + (short)RFIFOW(fd,10);
- tmtime->tm_hour = tmtime->tm_hour + (short)RFIFOW(fd,12);
- tmtime->tm_min = tmtime->tm_min + (short)RFIFOW(fd,14);
- tmtime->tm_sec = tmtime->tm_sec + (short)RFIFOW(fd,16);
- timestamp = mktime(tmtime);
- if (timestamp != -1) {
- if (timestamp <= time(NULL))
- timestamp = 0;
- if (tmptime != timestamp) {
- if (timestamp != 0) {
- unsigned char buf[16];
- WBUFW(buf,0) = 0x2731;
- WBUFL(buf,2) = acc;
- WBUFB(buf,6) = 1; // 0: change of statut, 1: ban
- WBUFL(buf,7) = timestamp; // status or final date of a banishment
- charif_sendallwos(-1, buf, 11);
- }
- printf("Account: %d Banned until: %ld\n", acc, timestamp);
- sprintf(tmpsql, "UPDATE `%s` SET `ban_until` = '%ld', `state`='7' WHERE `%s` = '%d'", login_db, timestamp, login_db_account_id, acc);
- // query
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- }
- }
- RFIFOSKIP(fd,18);
- break;
- }
- return 0;
-
- case 0x2727:
- if (RFIFOREST(fd) < 6)
- return 0;
- {
- int acc,sex;
- unsigned char buf[16];
- acc=RFIFOL(fd,4);
- sprintf(tmpsql,"SELECT `sex` FROM `%s` WHERE `%s` = '%d'",login_db,login_db_account_id,acc);
-
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- return 0;
- }
-
- sql_res = mysql_store_result(&mysql_handle) ;
-
- if (sql_res) {
- if (mysql_num_rows(sql_res) == 0) {
- mysql_free_result(sql_res);
- return 0;
- }
- sql_row = mysql_fetch_row(sql_res); //row fetching
- }
-
- if (strcmpi(sql_row[0], "M") == 0)
- sex = 1;
- else
- sex = 0;
- sprintf(tmpsql,"UPDATE `%s` SET `sex` = '%c' WHERE `%s` = '%d'", login_db, (sex==0?'M':'F'), login_db_account_id, acc);
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- WBUFW(buf,0) = 0x2723;
- WBUFL(buf,2) = acc;
- WBUFB(buf,6) = sex;
- charif_sendallwos(-1, buf, 7);
- RFIFOSKIP(fd,6);
- }
- return 0;
-
- case 0x2728: // save account_reg
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- int acc,p,j;
- char str[32];
- char temp_str[32];
- int value;
- acc=RFIFOL(fd,4);
-
- if (acc>0){
- unsigned char buf[RFIFOW(fd,2)+1];
- for(p=8,j=0;p<RFIFOW(fd,2) && j<ACCOUNT_REG2_NUM;p+=36,j++){
- memcpy(str,RFIFOP(fd,p),32);
- value=RFIFOL(fd,p+32);
- sprintf(tmpsql,"DELETE FROM `global_reg_value` WHERE `type`='1' AND `account_id`='%d' AND `str`='%s';",acc,jstrescapecpy(temp_str,str));
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sprintf(tmpsql,"INSERT INTO `global_reg_value` (`type`, `account_id`, `str`, `value`) VALUES ( 1 , '%d' , '%s' , '%d');", acc, jstrescapecpy(temp_str,str), value);
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- }
-
- // Send to char
- memcpy(WBUFP(buf,0),RFIFOP(fd,0),RFIFOW(fd,2));
- WBUFW(buf,0)=0x2729;
- charif_sendallwos(fd,buf,WBUFW(buf,2));
- }
- }
- RFIFOSKIP(fd,RFIFOW(fd,2));
- //printf("login: save account_reg (from char)\n");
- break;
-
- case 0x272a: // Receiving of map-server via char-server a unban resquest (by Yor)
- if (RFIFOREST(fd) < 6)
- return 0;
- {
- int acc;
- acc = RFIFOL(fd,2);
- sprintf(tmpsql,"SELECT `ban_until` FROM `%s` WHERE `%s` = '%d'",login_db,login_db_account_id,acc);
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res); //row fetching
- }
- if (atol(sql_row[0]) != 0) {
- sprintf(tmpsql,"UPDATE `%s` SET `ban_until` = '0', `state`='0' WHERE `%s` = '%d'", login_db,login_db_account_id,acc);
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- break;
- }
- RFIFOSKIP(fd,6);
- }
- return 0;
-
- case 0x272b: // Set account_id to online [Wizputer]
- if (RFIFOREST(fd) < 6)
- return 0;
- add_online_user(RFIFOL(fd,2));
- RFIFOSKIP(fd,6);
- break;
-
- case 0x272c: // Set account_id to offline [Wizputer]
- if (RFIFOREST(fd) < 6)
- return 0;
- remove_online_user(RFIFOL(fd,2));
- RFIFOSKIP(fd,6);
- break;
-
- default:
- printf("login: unknown packet %x! (from char).\n", RFIFOW(fd,0));
- session[fd]->eof = 1;
- return 0;
- }
- }
-
- return 0;
-}
-
-//Lan ip check added by Kashy
-int lan_ip_check(unsigned char *p) {
- int y;
- int lancheck = 1;
- int lancharip[4];
-
- unsigned int k0, k1, k2, k3;
- sscanf(lan_char_ip, "%d.%d.%d.%d", &k0, &k1, &k2, &k3);
- lancharip[0] = k0; lancharip[1] = k1; lancharip[2] = k2; lancharip[3] = k3;
-
- for(y = 0; y < 4; y++) {
- if ((lancharip[y] & subnetmaski[y])!= (p[y]))
- lancheck = 0;
- break; }
-
- printf("LAN check: %s.\n", (lancheck) ? "\033[1;32mLAN\033[0m" : "\033[1;31mWAN\033[0m");
- return lancheck;
-}
-
-//----------------------------------------------------------------------------------------
-// Default packet parsing (normal players or administation/char-server connection requests)
-//----------------------------------------------------------------------------------------
-int parse_login(int fd) {
- //int len;
-
- MYSQL_RES* sql_res ;
- MYSQL_ROW sql_row = NULL;
-
- char t_uid[100];
- //int sql_fields, sql_cnt;
- struct mmo_account account;
-
- int result, i;
- unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
- char ip[16];
-
- sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
-
- memset(&account, 0, sizeof(account));
-
- if (ipban > 0) {
- //ip ban
- //p[0], p[1], p[2], p[3]
- //request DB connection
- //check
- sprintf(tmpsql, "SELECT count(*) FROM `ipbanlist` WHERE `list` = '%d.*.*.*' OR `list` = '%d.%d.*.*' OR `list` = '%d.%d.%d.*' OR `list` = '%d.%d.%d.%d'",
- p[0], p[0], p[1], p[0], p[1], p[2], p[0], p[1], p[2], p[3]);
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = mysql_fetch_row(sql_res); //row fetching
-
- if (atoi(sql_row[0]) >0) {
- // ip ban ok.
- printf ("packet from banned ip : %d.%d.%d.%d" RETCODE, p[0], p[1], p[2], p[3]);
- sprintf(tmpsql,"INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%d.%d.%d.%d', 'unknown','-3', 'ip banned')", loginlog_db, p[0], p[1], p[2], p[3]);
-
- // query
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- printf ("close session connection...\n");
-
- // close connection
- session[fd]->eof = 1;
-
- } else {
- printf ("packet from ip (ban check ok) : %d.%d.%d.%d" RETCODE, p[0], p[1], p[2], p[3]);
- }
- mysql_free_result(sql_res);
- }
-
- if (session[fd]->eof) {
- for(i = 0; i < MAX_SERVERS; i++)
- if (server_fd[i] == fd)
- server_fd[i] = -1;
- close(fd);
- delete_session(fd);
- return 0;
- }
-
- while(RFIFOREST(fd)>=2){
- printf("parse_login : %d %d packet case=%x\n", fd, RFIFOREST(fd), RFIFOW(fd,0));
-
- switch(RFIFOW(fd,0)){
- case 0x200: // New alive packet: structure: 0x200 <account.userid>.24B. used to verify if client is always alive.
- if (RFIFOREST(fd) < 26)
- return 0;
- RFIFOSKIP(fd,26);
- break;
-
- case 0x204: // New alive packet: structure: 0x204 <encrypted.account.userid>.16B. (new ragexe from 22 june 2004)
- if (RFIFOREST(fd) < 18)
- return 0;
- RFIFOSKIP(fd,18);
- break;
-
- case 0x64: // request client login
- case 0x01dd: // request client login with encrypt
- if(RFIFOREST(fd)< ((RFIFOW(fd, 0) ==0x64)?55:47))
- return 0;
-
- printf("client connection request %s from %d.%d.%d.%d\n", RFIFOP(fd, 6), p[0], p[1], p[2], p[3]);
- account.version = RFIFOL(fd, 2);
- account.userid = (char*)RFIFOP(fd, 6);
- account.passwd = (char*)RFIFOP(fd, 30);
-#ifdef PASSWORDENC
- account.passwdenc= (RFIFOW(fd,0)==0x64)?0:PASSWORDENC;
-#else
- account.passwdenc=0;
-#endif
- result=mmo_auth(&account, fd);
-
-
- jstrescapecpy(t_uid,(char*)RFIFOP(fd, 6));
- if(result==-1){
- int gm_level = isGM(account.account_id);
-
- if (min_level_to_connect > gm_level) {
- WFIFOW(fd,0) = 0x81;
- WFIFOL(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- } else {
-
- if (p[0] != 127) {
- sprintf(tmpsql,"INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%d.%d.%d.%d', '%s','100', 'login ok')", loginlog_db, p[0], p[1], p[2], p[3], t_uid);
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- }
- if (gm_level)
- printf("Connection of the GM (level:%d) account '%s' accepted.\n", gm_level, account.userid);
- else
- printf("Connection of the account '%s' accepted.\n", account.userid);
- server_num=0;
- for(i = 0; i < MAX_SERVERS; i++) {
- if (server_fd[i] >= 0) {
- //Lan check added by Kashy
- if (lan_ip_check(p))
- WFIFOL(fd,47+server_num*32) = inet_addr(lan_char_ip);
- else
- WFIFOL(fd,47+server_num*32) = server[i].ip;
- WFIFOW(fd,47+server_num*32+4) = server[i].port;
- memcpy(WFIFOP(fd,47+server_num*32+6), server[i].name, 20);
- WFIFOW(fd,47+server_num*32+26) = server[i].users;
- WFIFOW(fd,47+server_num*32+28) = server[i].maintenance;
- WFIFOW(fd,47+server_num*32+30) = server[i].new_;
- server_num++;
- }
- }
- // if at least 1 char-server
- if (server_num > 0) {
- WFIFOW(fd,0)=0x69;
- WFIFOW(fd,2)=47+32*server_num;
- WFIFOL(fd,4)=account.login_id1;
- WFIFOL(fd,8)=account.account_id;
- WFIFOL(fd,12)=account.login_id2;
- WFIFOL(fd,16)=0;
- memcpy(WFIFOP(fd,20),account.lastlogin,24);
- WFIFOB(fd,46)=account.sex;
- WFIFOSET(fd,47+32*server_num);
- if(auth_fifo_pos>=AUTH_FIFO_SIZE)
- auth_fifo_pos=0;
- auth_fifo[auth_fifo_pos].account_id=account.account_id;
- auth_fifo[auth_fifo_pos].login_id1=account.login_id1;
- auth_fifo[auth_fifo_pos].login_id2=account.login_id2;
- auth_fifo[auth_fifo_pos].sex=account.sex;
- auth_fifo[auth_fifo_pos].delflag=0;
- auth_fifo[auth_fifo_pos].ip = session[fd]->client_addr.sin_addr.s_addr;
- auth_fifo_pos++;
- } else {
- WFIFOW(fd,0) = 0x81;
- WFIFOL(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- }
- }
- } else {
- char tmp_sql[512];
- char error[64];
- sprintf(tmp_sql,"INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%d.%d.%d.%d', '%s', '%d','login failed : %%s')", loginlog_db, p[0], p[1], p[2], p[3], t_uid, result);
- switch((result + 1)) {
- case -2: //-3 = Account Banned
- sprintf(tmpsql,tmp_sql,"Account banned.");
- sprintf(error,"Account banned.");
- break;
- case -1: //-2 = Dynamic Ban
- sprintf(tmpsql,tmp_sql,"dynamic ban (ip and account).");
- sprintf(error,"dynamic ban (ip and account).");
- break;
- case 1: // 0 = Unregistered ID
- sprintf(tmpsql,tmp_sql,"Unregisterd ID.");
- sprintf(error,"Unregisterd ID.");
- break;
- case 2: // 1 = Incorrect Password
- sprintf(tmpsql,tmp_sql,"Incorrect Password.");
- sprintf(error,"Incorrect Password.");
- break;
- case 3: // 2 = This ID is expired
- sprintf(tmpsql,tmp_sql,"Account Expired.");
- sprintf(error,"Account Expired.");
- break;
- case 4: // 3 = Rejected from Server
- sprintf(tmpsql,tmp_sql,"Rejected from server.");
- sprintf(error,"Rejected from server.");
- break;
- case 5: // 4 = You have been blocked by the GM Team
- sprintf(tmpsql,tmp_sql,"Blocked by GM.");
- sprintf(error,"Blocked by GM.");
- break;
- case 6: // 5 = Your Game's EXE file is not the latest version
- sprintf(tmpsql,tmp_sql,"Not latest game EXE.");
- sprintf(error,"Not latest game EXE.");
- break;
- case 7: // 6 = Your are Prohibited to log in until %s
- sprintf(tmpsql,tmp_sql,"Banned.");
- sprintf(error,"Banned.");
- break;
- case 8: // 7 = Server is jammed due to over populated
- sprintf(tmpsql,tmp_sql,"Server Over-population.");
- sprintf(error,"Server Over-population.");
- break;
- case 9: // 8 = No MSG (actually, all states after 9 except 99 are No MSG, use only this)
- sprintf(tmpsql,tmp_sql," ");
- sprintf(error," ");
- break;
- case 100: // 99 = This ID has been totally erased
- sprintf(tmpsql,tmp_sql,"Account gone.");
- sprintf(error,"Account gone.");
- break;
- default:
- sprintf(tmpsql,tmp_sql,"Uknown Error.");
- sprintf(error,"Uknown Error.");
- break;
- }
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- if ((result == 1) && (dynamic_pass_failure_ban != 0)){ // failed password
- sprintf(tmpsql,"SELECT count(*) FROM `%s` WHERE `ip` = '%d.%d.%d.%d' AND `rcode` = '1' AND `time` > NOW() - INTERVAL %d MINUTE",
- loginlog_db, p[0], p[1], p[2], p[3], dynamic_pass_failure_ban_time); //how many times filed account? in one ip.
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- //check query result
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = mysql_fetch_row(sql_res); //row fetching
-
- if (atoi(sql_row[0]) >= dynamic_pass_failure_ban_how_many ) {
- sprintf(tmpsql,"INSERT INTO `ipbanlist`(`list`,`btime`,`rtime`,`reason`) VALUES ('%d.%d.%d.*', NOW() , NOW() + INTERVAL %d MINUTE ,'Password error ban: %s')", p[0], p[1], p[2], dynamic_pass_failure_ban_how_long, t_uid);
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- }
- mysql_free_result(sql_res);
- }
- else if (result == -2){ //dynamic banned - add ip to ban list.
- sprintf(tmpsql,"INSERT INTO `ipbanlist`(`list`,`btime`,`rtime`,`reason`) VALUES ('%d.%d.%d.*', NOW() , NOW() + INTERVAL 1 MONTH ,'Dynamic banned user id : %s')", p[0], p[1], p[2], t_uid);
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- result = -3;
- }else if(result == 6){ //not lastet version ..
- //result = 5;
- }
-
- sprintf(tmpsql,"SELECT `ban_until` FROM `%s` WHERE %s `%s` = '%s'",login_db, case_sensitive ? "BINARY" : "",login_db_userid, t_uid);
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res); //row fetching
- }
- //cannot connect login failed
- memset(WFIFOP(fd,0),'\0',23);
- WFIFOW(fd,0)=0x6a;
- WFIFOB(fd,2)=result;
- if (result == 6) { // 6 = Your are Prohibited to log in until %s
- if (atol(sql_row[0]) != 0) { // if account is banned, we send ban timestamp
- char tmpstr[256];
- time_t ban_until_time;
- ban_until_time = atol(sql_row[0]);
- strftime(tmpstr, 20, date_format, localtime(&ban_until_time));
- tmpstr[19] = '\0';
- memcpy(WFIFOP(fd,3), tmpstr, 20);
- } else { // we send error message
- memcpy(WFIFOP(fd,3), error, 20);
- }
- }
- WFIFOSET(fd,23);
- }
- RFIFOSKIP(fd,(RFIFOW(fd,0)==0x64)?55:47);
- break;
-
- case 0x01db: // request password key
- if (session[fd]->session_data) {
- printf("login: abnormal request of MD5 key (already opened session).\n");
- session[fd]->eof = 1;
- return 0;
- }
- printf("Request Password key -%s\n",md5key);
- RFIFOSKIP(fd,2);
- WFIFOW(fd,0)=0x01dc;
- WFIFOW(fd,2)=4+md5keylen;
- memcpy(WFIFOP(fd,4),md5key,md5keylen);
- WFIFOSET(fd,WFIFOW(fd,2));
- break;
-
- case 0x2710: // request Char-server connection
- if(RFIFOREST(fd)<86)
- return 0;
- {
- unsigned char* server_name;
- sprintf(tmpsql,"INSERT DELAYED INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%d.%d.%d.%d', '%s@%s','100', 'charserver - %s@%d.%d.%d.%d:%d')", loginlog_db, p[0], p[1], p[2], p[3], RFIFOP(fd, 2),RFIFOP(fd, 60),RFIFOP(fd, 60), RFIFOB(fd, 54), RFIFOB(fd, 55), RFIFOB(fd, 56), RFIFOB(fd, 57), RFIFOW(fd, 58));
-
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- printf("server connection request %s @ %d.%d.%d.%d:%d (%d.%d.%d.%d)\n",
- RFIFOP(fd, 60), RFIFOB(fd, 54), RFIFOB(fd, 55), RFIFOB(fd, 56), RFIFOB(fd, 57), RFIFOW(fd, 58),
- p[0], p[1], p[2], p[3]);
- account.userid = (char*)RFIFOP(fd, 2);
- account.passwd = (char*)RFIFOP(fd, 26);
- account.passwdenc = 0;
- server_name = RFIFOP(fd,60);
- result = mmo_auth(&account, fd);
- //printf("Result: %d - Sex: %d - Account ID: %d\n",result,account.sex,(int) account.account_id);
-
- if(result == -1 && account.sex==2 && account.account_id<MAX_SERVERS && server_fd[account.account_id]==-1){
- printf("Connection of the char-server '%s' accepted.\n", server_name);
- memset(&server[account.account_id], 0, sizeof(struct mmo_char_server));
- server[account.account_id].ip=RFIFOL(fd,54);
- server[account.account_id].port=RFIFOW(fd,58);
- memcpy(server[account.account_id].name,RFIFOP(fd,60),20);
- server[account.account_id].users=0;
- server[account.account_id].maintenance=RFIFOW(fd,82);
- server[account.account_id].new_=RFIFOW(fd,84);
- server_fd[account.account_id]=fd;
- sprintf(tmpsql,"DELETE FROM `sstatus` WHERE `index`='%ld'", account.account_id);
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- jstrescapecpy(t_uid,server[account.account_id].name);
- sprintf(tmpsql,"INSERT INTO `sstatus`(`index`,`name`,`user`) VALUES ( '%ld', '%s', '%d')",
- account.account_id, server[account.account_id].name,0);
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- WFIFOW(fd,0)=0x2711;
- WFIFOB(fd,2)=0;
- WFIFOSET(fd,3);
- session[fd]->func_parse=parse_fromchar;
- realloc_fifo(fd,FIFOSIZE_SERVERLINK,FIFOSIZE_SERVERLINK);
- } else {
- WFIFOW(fd, 0) =0x2711;
- WFIFOB(fd, 2)=3;
- WFIFOSET(fd, 3);
- }
- }
- RFIFOSKIP(fd, 86);
- return 0;
-
- case 0x7530: // request Athena information
- WFIFOW(fd,0)=0x7531;
- WFIFOB(fd,2)=ATHENA_MAJOR_VERSION;
- WFIFOB(fd,3)=ATHENA_MINOR_VERSION;
- WFIFOB(fd,4)=ATHENA_REVISION;
- WFIFOB(fd,5)=ATHENA_RELEASE_FLAG;
- WFIFOB(fd,6)=ATHENA_OFFICIAL_FLAG;
- WFIFOB(fd,7)=ATHENA_SERVER_LOGIN;
- WFIFOW(fd,8)=ATHENA_MOD_VERSION;
- WFIFOSET(fd,10);
- RFIFOSKIP(fd,2);
- printf ("Athena version check...\n");
- break;
-
- case 0x7532:
- default:
- printf ("End of connection (ip: %s)" RETCODE, ip);
- session[fd]->eof = 1;
- return 0;
- }
- }
-
- return 0;
-}
-
-// Console Command Parser [Wizputer]
-int parse_console(char *buf) {
- char *type,*command;
-
- type = (char *)aMalloc(64);
- command = (char *)aMalloc(64);
-
- memset(type,0,64);
- memset(command,0,64);
-
- printf("Console: %s\n",buf);
-
- if ( sscanf(buf, "%[^:]:%[^\n]", type , command ) < 2 )
- sscanf(buf,"%[^\n]",type);
-
- printf("Type of command: %s || Command: %s \n",type,command);
-
- if(buf) aFree(buf);
- if(type) aFree(type);
- if(command) aFree(command);
-
- return 0;
-}
-
-//-------------------------------------------------
-// Return numerical value of a switch configuration
-// on/off, english, français, deutsch, español
-//-------------------------------------------------
-int config_switch(const char *str) {
- if (strcmpi(str, "on") == 0 || strcmpi(str, "yes") == 0 || strcmpi(str, "oui") == 0 || strcmpi(str, "ja") == 0 || strcmpi(str, "si") == 0)
- return 1;
- if (strcmpi(str, "off") == 0 || strcmpi(str, "no") == 0 || strcmpi(str, "non") == 0 || strcmpi(str, "nein") == 0)
- return 0;
-
- return atoi(str);
-}
-
-
-//Lan Support conf reading added by Kashy
-int login_lan_config_read(const char *lancfgName){
- int i;
- char subnetmask[128];
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- fp=fopen(lancfgName, "r");
-
- if (fp == NULL) {
- printf("file not found: %s\n", lancfgName);
- return 1;
- }
- printf("Start reading of Lan Support configuration file\n");
- while(fgets(line, sizeof(line)-1, fp)){
- if (line[0] == '/' && line[1] == '/')
- continue;
-
- i = sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
- if(i!=2)
- continue;
-
- else if(strcmpi(w1,"lan_char_ip")==0){
- strcpy(lan_char_ip, w2);
- printf ("set Lan_Char_IP : %s\n",w2);
- }
-
- else if(strcmpi(w1,"subnetmask")==0){
- unsigned int k0, k1, k2, k3;
-
- strcpy(subnetmask, w2);
- sscanf(subnetmask, "%d.%d.%d.%d", &k0, &k1, &k2, &k3);
- subnetmaski[0] = k0; subnetmaski[1] = k1; subnetmaski[2] = k2; subnetmaski[3] = k3;
- printf ("set subnetmask : %s\n",w2);
- }
- }
- fclose(fp);
-
- {
- unsigned int a0, a1, a2, a3;
- unsigned char p[4];
- sscanf(lan_char_ip, "%d.%d.%d.%d", &a0, &a1, &a2, &a3);
- p[0] = a0; p[1] = a1; p[2] = a2; p[3] = a3;
- printf("LAN test of LAN IP of the char-server: ");
- if (lan_ip_check(p) == 0) {
- printf("\033[1;31m***ERROR: LAN IP of the char-server doesn't belong to the specified Sub-network\033[0m\n");
- }
- }
-
- printf("End reading of Lan Support configuration file\n");
-
- return 0;
-}
-
-//-----------------------------------------------------
-//BANNED IP CHECK.
-//-----------------------------------------------------
-int ip_ban_check(int tid, unsigned int tick, int id, int data){
-
- //query
- if(mysql_query(&mysql_handle, "DELETE FROM `ipbanlist` WHERE `rtime` <= NOW()")) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- return 0;
-}
-
-//-----------------------------------------------------
-// reading configuration
-//-----------------------------------------------------
-int login_config_read(const char *cfgName){
- int i;
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
- struct hostent *h = NULL;
-
- bind_ip_str[0] = '\0';
-
- fp=fopen(cfgName,"r");
-
- if(fp==NULL){
- printf("Configuration file (%s) not found.\n", cfgName);
- return 1;
- }
- printf ("start reading configuration...\n");
- while(fgets(line, sizeof(line)-1, fp)){
- if(line[0] == '/' && line[1] == '/')
- continue;
-
- i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
- if(i!=2)
- continue;
- else if (strcmpi(w1, "bind_ip") == 0) {
- //bind_ip_set_ = 1;
- h = gethostbyname (w2);
- if (h != NULL) {
- printf("Login server binding IP address : %s -> %d.%d.%d.%d\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- sprintf(bind_ip_str, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- } else
- memcpy(bind_ip_str,w2,16);
- } else if(strcmpi(w1,"login_port")==0){
- login_port=atoi(w2);
- printf ("set login_port : %s\n",w2);
- }
- else if(strcmpi(w1,"ipban")==0){
- ipban=atoi(w2);
- printf ("set ipban : %d\n",ipban);
- }
- //account ban -> ip ban
- else if(strcmpi(w1,"dynamic_account_ban")==0){
- dynamic_account_ban=atoi(w2);
- printf ("set dynamic_account_ban : %d\n",dynamic_account_ban);
- }
- else if(strcmpi(w1,"dynamic_account_ban_class")==0){
- dynamic_account_ban_class=atoi(w2);
- printf ("set dynamic_account_ban_class : %d\n",dynamic_account_ban_class);
- }
- //dynamic password error ban
- else if(strcmpi(w1,"dynamic_pass_failure_ban")==0){
- dynamic_pass_failure_ban=atoi(w2);
- printf ("set dynamic_pass_failure_ban : %d\n",dynamic_pass_failure_ban);
- }
- else if(strcmpi(w1,"dynamic_pass_failure_ban_time")==0){
- dynamic_pass_failure_ban_time=atoi(w2);
- printf ("set dynamic_pass_failure_ban_time : %d\n",dynamic_pass_failure_ban_time);
- }
- else if(strcmpi(w1,"dynamic_pass_failure_ban_how_many")==0){
- dynamic_pass_failure_ban_how_many=atoi(w2);
- printf ("set dynamic_pass_failure_ban_how_many : %d\n",dynamic_pass_failure_ban_how_many);
- }
- else if(strcmpi(w1,"dynamic_pass_failure_ban_how_long")==0){
- dynamic_pass_failure_ban_how_long=atoi(w2);
- printf ("set dynamic_pass_failure_ban_how_long : %d\n",dynamic_pass_failure_ban_how_long);
- }
- else if (strcmpi(w1, "import") == 0) {
- login_config_read(w2);
- } else if(strcmpi(w1,"imalive_on")==0) { //Added by Mugendai for I'm Alive mod
- imalive_on = atoi(w2); //Added by Mugendai for I'm Alive mod
- } else if(strcmpi(w1,"imalive_time")==0) { //Added by Mugendai for I'm Alive mod
- imalive_time = atoi(w2); //Added by Mugendai for I'm Alive mod
- } else if(strcmpi(w1,"flush_on")==0) { //Added by Mugendai for GUI
- flush_on = atoi(w2); //Added by Mugendai for GUI
- } else if(strcmpi(w1,"flush_time")==0) { //Added by Mugendai for GUI
- flush_time = atoi(w2); //Added by Mugendai for GUI
- } else if(strcmpi(w1, "new_account") == 0){ //Added by Sirius for new account _M/_F
- new_account_flag = atoi(w2); //Added by Sirius for new account _M/_F
- } else if(strcmpi(w1, "check_client_version") == 0){ //Added by Sirius for client version check
- //check_client_version = config_switch(w2); //Added by Sirius for client version check
- if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 ){
- check_client_version = 1;
- }
- if(strcmpi(w2,"off") == 0 || strcmpi(w2,"no") == 0 ){
- check_client_version = 0;
- }
- } else if(strcmpi(w1, "client_version_to_connect") == 0){ //Added by Sirius for client version check
- client_version_to_connect = atoi(w2); //Added by SIrius for client version check
- } else if(strcmpi(w1,"use_MD5_passwords")==0){
- if (!strcmpi(w2,"yes")) {
- use_md5_passwds=1;
- } else if (!strcmpi(w2,"no")){
- use_md5_passwds=0;
- }
- printf ("Using MD5 Passwords: %s \n",w2);
- }
- else if (strcmpi(w1, "date_format") == 0) { // note: never have more than 19 char for the date!
- switch (atoi(w2)) {
- case 0:
- strcpy(date_format, "%d-%m-%Y %H:%M:%S"); // 31-12-2004 23:59:59
- break;
- case 1:
- strcpy(date_format, "%m-%d-%Y %H:%M:%S"); // 12-31-2004 23:59:59
- break;
- case 2:
- strcpy(date_format, "%Y-%d-%m %H:%M:%S"); // 2004-31-12 23:59:59
- break;
- case 3:
- strcpy(date_format, "%Y-%m-%d %H:%M:%S"); // 2004-12-31 23:59:59
- break;
- }
- }
- else if (strcmpi(w1, "min_level_to_connect") == 0) {
- min_level_to_connect = atoi(w2);
- }
- else if (strcmpi(w1, "check_ip_flag") == 0) {
- check_ip_flag = config_switch(w2);
- }
- else if (strcmpi(w1, "console") == 0) {
- if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
- console = 1;
- }
- else if (strcmpi(w1, "case_sensitive") == 0) {
- if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
- case_sensitive = 1;
- if(strcmpi(w2,"off") == 0 || strcmpi(w2,"no") == 0 )
- case_sensitive = 0;
- }
- else if(strcmpi(w1, "register_users_online") == 0) {
- register_users_online = config_switch(w2);
- }
- }
- fclose(fp);
- printf ("End reading configuration...\n");
- return 0;
-}
-
-void sql_config_read(const char *cfgName){ /* Kalaspuff, to get login_db */
- int i;
- char line[1024], w1[1024], w2[1024];
- FILE *fp=fopen(cfgName,"r");
- if(fp==NULL){
- printf("file not found: %s\n",cfgName);
- exit(1);
- }
- printf("reading configure: %s\n", cfgName);
- while(fgets(line, sizeof(line)-1, fp)){
- if(line[0] == '/' && line[1] == '/')
- continue;
- i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
- if(i!=2)
- continue;
- if (strcmpi(w1, "login_db") == 0) {
- strcpy(login_db, w2);
- }
- //add for DB connection
- else if(strcmpi(w1,"login_server_ip")==0){
- strcpy(login_server_ip, w2);
- printf ("set login_server_ip : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_port")==0){
- login_server_port=atoi(w2);
- printf ("set login_server_port : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_id")==0){
- strcpy(login_server_id, w2);
- printf ("set login_server_id : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_pw")==0){
- strcpy(login_server_pw, w2);
- printf ("set login_server_pw : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_db")==0){
- strcpy(login_server_db, w2);
- printf ("set login_server_db : %s\n",w2);
- }
- //added for custom column names for custom login table
- else if(strcmpi(w1,"login_db_account_id")==0){
- strcpy(login_db_account_id, w2);
- }
- else if(strcmpi(w1,"login_db_userid")==0){
- strcpy(login_db_userid, w2);
- }
- else if(strcmpi(w1,"login_db_user_pass")==0){
- strcpy(login_db_user_pass, w2);
- }
- else if(strcmpi(w1,"login_db_level")==0){
- strcpy(login_db_level, w2);
- }
- //end of custom table config
- else if (strcmpi(w1, "loginlog_db") == 0) {
- strcpy(loginlog_db, w2);
- }
- //support the import command, just like any other config
- else if(strcmpi(w1,"import")==0){
- sql_config_read(w2);
- }
- }
- fclose(fp);
- printf("reading configure done.....\n");
-}
-
-
-//-----------------------------------------------------
-//I'm Alive Alert
-//Used to output 'I'm Alive' every few seconds
-//Intended to let frontends know if the app froze
-//-----------------------------------------------------
-int imalive_timer(int tid, unsigned int tick, int id, int data){
- printf("I'm Alive\n");
- return 0;
-}
-
-//-----------------------------------------------------
-//Flush stdout
-//stdout buffer needs flushed to be seen in GUI
-//-----------------------------------------------------
-int flush_timer(int tid, unsigned int tick, int id, int data){
- fflush(stdout);
- return 0;
-}
-
-//--------------------------------------
-// Function called at exit of the server
-//--------------------------------------
-static int online_db_final(void *key,void *data,va_list ap)
-{
- int *p = (int *) data;
- if (p) aFree(p);
- return 0;
-}
-void do_final(void) {
- //sync account when terminating.
- //but no need when you using DBMS (mysql)
- mmo_db_close();
- numdb_final(online_db, online_db_final);
- exit_dbn();
- timer_final();
-}
-
-int do_init(int argc,char **argv){
- //initialize login server
- int i;
-
- SERVER_TYPE = SERVER_LOGIN;
- //read login configue
- login_config_read( (argc>1)?argv[1]:LOGIN_CONF_NAME );
- sql_config_read(SQL_CONF_NAME);
- login_lan_config_read((argc > 1) ? argv[1] : LAN_CONF_NAME);
- //Generate Passworded Key.
- printf ("memset md5key \n");
- memset(md5key, 0, sizeof(md5key));
- printf ("memset md5key complete\n");
- printf ("memset keyleng\n");
- md5keylen=rand()%4+12;
- for(i=0;i<md5keylen;i++)
- md5key[i]=rand()%255+1;
- printf ("memset keyleng complete\n");
-
- printf ("set FIFO Size\n");
- for(i=0;i<AUTH_FIFO_SIZE;i++)
- auth_fifo[i].delflag=1;
- printf ("set FIFO Size complete\n");
-
- printf ("set max servers\n");
- for(i=0;i<MAX_SERVERS;i++)
- server_fd[i]=-1;
- printf ("set max servers complete\n");
- //server port open & binding
-
- if (bind_ip_str[0] != '\0')
- bind_ip = inet_addr(bind_ip_str);
- else
- bind_ip = INADDR_ANY;
-
- //login_fd=make_listen_port(login_port);
- login_fd=make_listen_bind(bind_ip,login_port);
-
- //Auth start
- printf ("Running mmo_auth_sqldb_init()\n");
- mmo_auth_sqldb_init();
- printf ("finished mmo_auth_sqldb_init()\n");
- set_termfunc(do_final);
-
- //set default parser as parse_login function
- set_defaultparse(parse_login);
-
- //Added for Mugendais I'm Alive mod
- if(imalive_on)
- add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000);
-
- //Added by Mugendai for GUI support
- if(flush_on)
- add_timer_interval(gettick()+10, flush_timer,0,0,flush_time);
-
- // ban deleter timer - 1 minute term
- printf("add interval tic (ip_ban_check)....\n");
- i=add_timer_interval(gettick()+10, ip_ban_check,0,0,60*1000);
-
- if (console) {
- set_defaultconsoleparse(parse_console);
- start_console();
- }
-
- // Online user database init
- aFree(online_db);
- online_db = numdb_init();
-
- printf("The login-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", login_port);
-
- return 0;
-}
-
-
diff --git a/src/login_sql/login.h b/src/login_sql/login.h
deleted file mode 100644
index 725c02ada..000000000
--- a/src/login_sql/login.h
+++ /dev/null
@@ -1,43 +0,0 @@
-#ifndef _LOGIN_H_
-#define _LOGIN_H_
-
-#define MAX_SERVERS 30
-
-#define LOGIN_CONF_NAME "conf/login_athena.conf"
-#define SQL_CONF_NAME "conf/inter_athena.conf"
-#define LAN_CONF_NAME "conf/lan_support.conf"
-
-#define PASSWORDENC 3 // A definition is given when making an encryption password correspond.
- // It is 1 at the time of passwordencrypt.
- // It is made into 2 at the time of passwordencrypt2.
- // When it is made 3, it corresponds to both.
-
-#define START_ACCOUNT_NUM 2000000
-#define END_ACCOUNT_NUM 100000000
-
-struct mmo_account {
- int version; //Added by sirius for versioncheck
- char* userid;
- char* passwd;
- int passwdenc;
-
-
- long account_id;
- long login_id1;
- long login_id2;
- long char_id;
- char lastlogin[24];
- int sex;
-};
-
-struct mmo_char_server {
- char name[20];
- long ip;
- short port;
- int users;
- int maintenance;
- int new_;
-};
-
-
-#endif
diff --git a/src/login_sql/make.sh b/src/login_sql/make.sh
deleted file mode 100644
index 198d33baf..000000000
--- a/src/login_sql/make.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
- rsqlt=`rm -rf *.o`
- gcc -c login.c -I/usr/local/include/mysql/
- gcc -c md5calc.c -I/usr/local/include/mysql/
- gcc -c strlib.c
- gcc -o login-server login.o strlib.o md5calc.o ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o -L/usr/local/lib/mysql/ -lmysqlclient -lz
diff --git a/src/login_sql/md5calc.c b/src/login_sql/md5calc.c
deleted file mode 100644
index 856c7ecb0..000000000
--- a/src/login_sql/md5calc.c
+++ /dev/null
@@ -1,236 +0,0 @@
-/***********************************************************
- * md5 calculation algorithm
- *
- * The source code referred to the following URL.
- * http://www.geocities.co.jp/SiliconValley-Oakland/8878/lab17/lab17.html
- *
- ***********************************************************/
-
-#include "md5calc.h"
-#include <string.h>
-#include <stdio.h>
-
-#ifndef UINT_MAX
-#define UINT_MAX 4294967295U
-#endif
-
-// Global variable
-static unsigned int *pX;
-
-// Stirng Table
-static const unsigned int T[] = {
- 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, //0
- 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, //4
- 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, //8
- 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, //12
- 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, //16
- 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8, //20
- 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, //24
- 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, //28
- 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, //32
- 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, //36
- 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, //40
- 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, //44
- 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, //48
- 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, //52
- 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, //56
- 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 //60
-};
-
-// ROTATE_LEFT The left is made to rotate x [ n-bit ]. This is diverted as it is from RFC.
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
-
-// The function used for other calculation
-static unsigned int F(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return (X & Y) | (~X & Z);
-}
-static unsigned int G(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return (X & Z) | (Y & ~Z);
-}
-static unsigned int H(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return X ^ Y ^ Z;
-}
-static unsigned int I(unsigned int X, unsigned int Y, unsigned int Z)
-{
- return Y ^ (X | ~Z);
-}
-
-static unsigned int Round(unsigned int a, unsigned int b, unsigned int FGHI,
- unsigned int k, unsigned int s, unsigned int i)
-{
- return b + ROTATE_LEFT(a + FGHI + pX[k] + T[i], s);
-}
-
-static void Round1(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, F(b,c,d), k, s, i);
-}
-static void Round2(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, G(b,c,d), k, s, i);
-}
-static void Round3(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, H(b,c,d), k, s, i);
-}
-static void Round4(unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d,unsigned int k, unsigned int s, unsigned int i)
-{
- *a = Round(*a, b, I(b,c,d), k, s, i);
-}
-
-static void MD5_Round_Calculate(const unsigned char *block,
- unsigned int *A2, unsigned int *B2, unsigned int *C2, unsigned int *D2)
-{
- //create X It is since it is required.
- unsigned int X[16]; //512bit 64byte
- int j,k;
-
- //Save A as AA, B as BB, C as CC, and and D as DD (saving of A, B, C, and D)
- unsigned int A=*A2, B=*B2, C=*C2, D=*D2;
- unsigned int AA = A,BB = B,CC = C,DD = D;
-
- //It is a large region variable reluctantly because of calculation of a round. . . for Round1...4
- pX = X;
-
- //Copy block(padding_message) i into X
- for (j=0,k=0; j<64; j+=4,k++)
- X[k] = ( (unsigned int )block[j] ) // 8byte*4 -> 32byte conversion
- | ( ((unsigned int )block[j+1]) << 8 ) // A function called Decode as used in the field of RFC
- | ( ((unsigned int )block[j+2]) << 16 )
- | ( ((unsigned int )block[j+3]) << 24 );
-
-
- //Round 1
- Round1(&A,B,C,D, 0, 7, 0); Round1(&D,A,B,C, 1, 12, 1); Round1(&C,D,A,B, 2, 17, 2); Round1(&B,C,D,A, 3, 22, 3);
- Round1(&A,B,C,D, 4, 7, 4); Round1(&D,A,B,C, 5, 12, 5); Round1(&C,D,A,B, 6, 17, 6); Round1(&B,C,D,A, 7, 22, 7);
- Round1(&A,B,C,D, 8, 7, 8); Round1(&D,A,B,C, 9, 12, 9); Round1(&C,D,A,B, 10, 17, 10); Round1(&B,C,D,A, 11, 22, 11);
- Round1(&A,B,C,D, 12, 7, 12); Round1(&D,A,B,C, 13, 12, 13); Round1(&C,D,A,B, 14, 17, 14); Round1(&B,C,D,A, 15, 22, 15);
-
- //Round 2
- Round2(&A,B,C,D, 1, 5, 16); Round2(&D,A,B,C, 6, 9, 17); Round2(&C,D,A,B, 11, 14, 18); Round2(&B,C,D,A, 0, 20, 19);
- Round2(&A,B,C,D, 5, 5, 20); Round2(&D,A,B,C, 10, 9, 21); Round2(&C,D,A,B, 15, 14, 22); Round2(&B,C,D,A, 4, 20, 23);
- Round2(&A,B,C,D, 9, 5, 24); Round2(&D,A,B,C, 14, 9, 25); Round2(&C,D,A,B, 3, 14, 26); Round2(&B,C,D,A, 8, 20, 27);
- Round2(&A,B,C,D, 13, 5, 28); Round2(&D,A,B,C, 2, 9, 29); Round2(&C,D,A,B, 7, 14, 30); Round2(&B,C,D,A, 12, 20, 31);
-
- //Round 3
- Round3(&A,B,C,D, 5, 4, 32); Round3(&D,A,B,C, 8, 11, 33); Round3(&C,D,A,B, 11, 16, 34); Round3(&B,C,D,A, 14, 23, 35);
- Round3(&A,B,C,D, 1, 4, 36); Round3(&D,A,B,C, 4, 11, 37); Round3(&C,D,A,B, 7, 16, 38); Round3(&B,C,D,A, 10, 23, 39);
- Round3(&A,B,C,D, 13, 4, 40); Round3(&D,A,B,C, 0, 11, 41); Round3(&C,D,A,B, 3, 16, 42); Round3(&B,C,D,A, 6, 23, 43);
- Round3(&A,B,C,D, 9, 4, 44); Round3(&D,A,B,C, 12, 11, 45); Round3(&C,D,A,B, 15, 16, 46); Round3(&B,C,D,A, 2, 23, 47);
-
- //Round 4
- Round4(&A,B,C,D, 0, 6, 48); Round4(&D,A,B,C, 7, 10, 49); Round4(&C,D,A,B, 14, 15, 50); Round4(&B,C,D,A, 5, 21, 51);
- Round4(&A,B,C,D, 12, 6, 52); Round4(&D,A,B,C, 3, 10, 53); Round4(&C,D,A,B, 10, 15, 54); Round4(&B,C,D,A, 1, 21, 55);
- Round4(&A,B,C,D, 8, 6, 56); Round4(&D,A,B,C, 15, 10, 57); Round4(&C,D,A,B, 6, 15, 58); Round4(&B,C,D,A, 13, 21, 59);
- Round4(&A,B,C,D, 4, 6, 60); Round4(&D,A,B,C, 11, 10, 61); Round4(&C,D,A,B, 2, 15, 62); Round4(&B,C,D,A, 9, 21, 63);
-
- // Then perform the following additions. (let's add)
- *A2 = A + AA;
- *B2 = B + BB;
- *C2 = C + CC;
- *D2 = D + DD;
-
- //The clearance of confidential information
- memset(pX, 0, sizeof(X));
-}
-
-//-------------------------------------------------------------------
-// The function for the exteriors
-
-/** output is the coded binary in the character sequence which wants to code string. */
-void MD5_String2binary(const char * string, char * output)
-{
-//var
- /*8bit*/
- unsigned char padding_message[64]; //Extended message 512bit 64byte
- unsigned char *pstring; //The position of string in the present scanning notes is held.
-
-// unsigned char digest[16];
- /*32bit*/
- unsigned int string_byte_len, //The byte chief of string is held.
- string_bit_len, //The bit length of string is held.
- copy_len, //The number of bytes which is used by 1-3 and which remained
- msg_digest[4]; //Message digest 128bit 4byte
- unsigned int *A = &msg_digest[0], //The message digest in accordance with RFC (reference)
- *B = &msg_digest[1],
- *C = &msg_digest[2],
- *D = &msg_digest[3];
- int i;
-
-//prog
- //Step 3.Initialize MD Buffer (although it is the initialization; step 3 of A, B, C, and D -- unavoidable -- a head)
- *A = 0x67452301;
- *B = 0xefcdab89;
- *C = 0x98badcfe;
- *D = 0x10325476;
-
- //Step 1.Append Padding Bits (extension of a mark bit)
- //1-1
- string_byte_len = strlen(string); //The byte chief of a character sequence is acquired.
- pstring = (unsigned char *)string; //The position of the present character sequence is set.
-
- //1-2 Repeat calculation until length becomes less than 64 bytes.
- for (i=string_byte_len; 64<=i; i-=64,pstring+=64)
- MD5_Round_Calculate(pstring, A,B,C,D);
-
- //1-3
- copy_len = string_byte_len % 64; //The number of bytes which remained is computed.
- strncpy((char *)padding_message, (char *)pstring, copy_len); //A message is copied to an extended bit sequence.
- memset(padding_message+copy_len, 0, 64 - copy_len); //It buries by 0 until it becomes extended bit length.
- padding_message[copy_len] |= 0x80; //The next of a message is 1.
-
- //1-4
- //If 56 bytes or more (less than 64 bytes) of remainder becomes, it will calculate by extending to 64 bytes.
- if (56 <= copy_len) {
- MD5_Round_Calculate(padding_message, A,B,C,D);
- memset(padding_message, 0, 56); //56 bytes is newly fill uped with 0.
- }
-
-
- //Step 2.Append Length (the information on length is added)
- string_bit_len = string_byte_len * 8; //From the byte chief to bit length (32 bytes of low rank)
- memcpy(&padding_message[56], &string_bit_len, 4); //32 bytes of low rank is set.
-
- //When bit length cannot be expressed in 32 bytes of low rank, it is a beam raising to a higher rank.
- if (UINT_MAX / 8 < string_byte_len) {
- unsigned int high = (string_byte_len - UINT_MAX / 8) * 8;
- memcpy(&padding_message[60], &high, 4);
- } else
- memset(&padding_message[60], 0, 4); //In this case, it is good for a higher rank at 0.
-
- //Step 4.Process Message in 16-Word Blocks (calculation of MD5)
- MD5_Round_Calculate(padding_message, A,B,C,D);
-
-
- //Step 5.Output (output)
- memcpy(output,msg_digest,16);
-// memcpy (digest, msg_digest, and 16); //8 byte*4 < - 32byte conversion A function called Encode as used in the field of RFC
-/* sprintf(output,
- "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
- digest[ 0], digest[ 1], digest[ 2], digest[ 3],
- digest[ 4], digest[ 5], digest[ 6], digest[ 7],
- digest[ 8], digest[ 9], digest[10], digest[11],
- digest[12], digest[13], digest[14], digest[15]);*/
-}
-
-/** output is the coded character sequence in the character sequence which wants to code string. */
-void MD5_String(const char * string, char * output)
-{
- unsigned char digest[16];
-
- MD5_String2binary(string,(char*)digest);
- sprintf(output,
- "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
- digest[ 0], digest[ 1], digest[ 2], digest[ 3],
- digest[ 4], digest[ 5], digest[ 6], digest[ 7],
- digest[ 8], digest[ 9], digest[10], digest[11],
- digest[12], digest[13], digest[14], digest[15]);
-}
-
diff --git a/src/login_sql/md5calc.h b/src/login_sql/md5calc.h
deleted file mode 100644
index 9bc554f69..000000000
--- a/src/login_sql/md5calc.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef _MD5CALC_H_
-#define _MD5CALC_H_
-
-void MD5_String(const char * string, char * output);
-void MD5_String2binary(const char * string, char * output);
-
-#endif
diff --git a/src/login_sql/readme.txt b/src/login_sql/readme.txt
deleted file mode 100644
index b945af76c..000000000
--- a/src/login_sql/readme.txt
+++ /dev/null
@@ -1,120 +0,0 @@
-// Encoded UTF-8
-//---------------------------------------------
-// 007 - by Jazz
-1. 0590 official versionã«åˆã‚ã›ã¦ä¿®æ­£ã—ã¾ã—ãŸ.
-
-//---------------------------------------------
-// 006 - by Jazz
-1. パスワード決ã¾ã£ãŸå›žæ•°é–“é•ã„時自動 IPé®æ–­å…·ç¾.
-2. login_athena.confを修正
-
-//---------------------------------------------
-// 005 - by Jazz
-1. 許容ã—ãªã„ IDãŒæŽ¥è¿‘ã®æ™‚自動㧠IPé®æ–­æ©Ÿèƒ½å…·ç¾.
-2. 自動ã§é®æ–­è§£é™¤æ©Ÿèƒ½å…·ç¾.
-
-//---------------------------------------------
-// 004 - by Jazz
-1. aphostropy å•é¡Œã‚’解決ã—ã¾ã—ãŸ. ã“ã‚Œã¯ä¿å®‰ã¨é€£é–¢ãŒã‚ã‚‹å•é¡Œã§ã™.
-2. SQLã®æ§‹é€ ã‚’修正ã—ã¾ã—ãŸ.
-3. server 状態を SQLã§å‡ºåŠ›.
-
-//---------------------------------------------
-// 003 - by Jazz
-1. 接続記録を DBã§å‡ºåŠ›.
-2. IP基盤ã®æŽ¥ç¶šé®æ–­å…·ç¾.
-
-//---------------------------------------------
-// 002 - by Jazz
-1. ã„ãã¤ã‹ã®è©³ç´°å•é¡Œç‚¹ä¿®æ­£.
-
-//---------------------------------------------
-// 001 - by Jazz
-1. 一番目安定 versionã§ã™.
-
-
-// notice some..
-In this program, new parts are under BSD License.
-and imported parts are under GPL as athena did.
-
-this program is not public license. but modification and editing are
-unlimit permitted. but auther don't have any responsibility on that.
-
-this realase does not gurantee working perfectly. and, I would
-answer neither that question nor technical one.
-
-I use...
-P4 2.4Gh/512MB/WinXP/cygwin
-
-athena is under GPL license.
-Ragnarok is Gravity's trademark.
-login-db for athena is BSD license except code from original athena.
-cygwin is Redhat's trademark.
-
-// About compile.
-You need mysqlclient library to compile this. You can get this by
-compiling mysql source.
-
-"-lmysqlclient" option needed when you did compile.
-
-some patch need on mysql when you did compile under cygwin.
-
-// 몇가지 ì •ë³´ì— ëŒ€í•˜ì—¬
-
-ì´ í”„ë¡œê·¸ëž¨ì—ì„œ 새로 만들어진 ë¶€ë¶„ì€ BSD ë¼ì´ì„¼ìŠ¤ ì•„ëž˜ì— ë°°í¬ ë©ë‹ˆë‹¤.
-그리고 import ëœ ë¶€ë¶„ì€ ì›ëž˜ athenaì˜ GPL ë¼ì´ì„¼ìŠ¤ ì•„ëž˜ì— ìžˆìŠµë‹ˆë‹¤.
-
-ì´ í”„ë¡œê·¸ëž¨ì€ public licenseê°€ 아닙니다. 하지만 변경, 개조, 수정ì€
-무제한 허용ë˜ë©° ê·¸ì— ëŒ€í•œ ì±…ìž„ì€ ì €ìžê°€ 지지 않습니다.
-
-현재 ì´ ë¦´ë¦¬ì¦ˆëŠ” 완벽히 ë™ìž‘í•¨ì„ ë³´ìž¥í•˜ì§€ 않습니다. 그리고 ê·¸ì— ëŒ€í•œ
-ìƒë‹´ ë˜í•œ 절대 받지 않습니다.
-
-기술ì ì¸ ë¶€ë¶„ì˜ ìƒë‹´ì€ 받지 않습니다.
-
-개발 환경
-P4 2.4Gh/512MB/WinXP/cygwin
-
-athena는 GPL ë¼ì´ì„¼ìŠ¤ë¥¼ 준수 합니다.
-Ragnarok는 Gravityì˜ trademark입니다.
-login-db for athena는 athenaì—ì„œ 가져온 ë¶€ë¶„ì„ ì œì™¸í•˜ë©´ BSD ë¼ì´ì„¼ìŠ¤ë¥¼ 따릅니다.
-cygwinì€ Redhatì˜ trademark입니다.
-
-// 컴파ì¼ì— 대하여.
-
-ì´ í”„ë¡œê·¸ëž¨ì„ ì»´íŒŒì¼í•˜ê¸° 위하여 mysqlclientì— ëŒ€í•œ libraryê°€ 필요합니다.
-ì´ëŠ” mysqlì˜ ì†ŒìŠ¤ë¥¼ 컴파ì¼í•˜ë©´ ì–»ì„수 있습니다.
-
-컴파ì¼ì‹œì— -lmysqlclient ì˜µì…˜ì´ í•„ìš”í•©ë‹ˆë‹¤.
-
-cygwinì˜ ê²½ìš°ëŠ” 몇가지 패치가 필요합니다.
-
-// ã„ãã¤ã‹ã®æƒ…å ±ã«å¯¾ã—ã¦
-
-ã“ã®ãƒ—ログラムã§æ–°ãŸã«ä½œã‚‰ã‚ŒãŸéƒ¨åˆ†ã¯ BSD ライセンスã®ä¸‹ã«é…布ã«ãªã‚Šã¾ã™.
-ãã—㦠import ã«ãªã£ãŸéƒ¨åˆ†ã¯å…ƒã€… athenaã® GPL ライセンスã®ä¸‹ã«ã‚ã‚Šã¾ã™.
-
-ã“ã®ãƒ—ログラム㯠public licenseã§ã¯ãªã„ã§ã™. ã—ã‹ã—変更, 改造, 修正ã¯
-無制é™è¨±å®¹ã•ã‚Œã¦ãã‚Œã«å¯¾ã™ã‚‹è²¬ä»»ã¯è‘—者ãŒè² ã‘ãªã„ã§ã™.
-
-ç¾åœ¨ã“ã®ãƒªãƒªãƒ¼ã‚¹ã¯å®Œå£ã«å‹•ä½œã™ã‚‹ã“ã¨ã‚’ä¿éšœã—ãªã„ã§ã™. ãã—ã¦å½¼ã«å¤§éŸ“
-相談も絶対å—ã‘ãªã„ã§ã™.
-
-技術的ãªéƒ¨åˆ†ã®ç›¸è«‡ã¯å—ã‘ãªã„ã§ã™.
-
-開発環境
-P4 2.4Gh/512MB/WinXP/cygwin
-
-athena㯠GPL ライセンスを守りã¾ã™.
-Ragnarok㯠Gravityã® trademarkã§ã™.
-login-db for athena㯠athenaã‹ã‚‰æŒã£ã¦æ¥ãŸéƒ¨åˆ†ã‚’除ã‘ã° BSD ライセンスã«ä»˜ãã¾ã™.
-cygwin㯠Redhatã® trademarkã§ã™.
-
-// コンパイルã«å¯¾ã—ã¦.
-
-ã“ã®ãƒ—ログラムをコンパイルã™ã‚‹ãŸã‚ã« mysqlclientã«å¯¾ã™ã‚‹ libraryãŒå¿…è¦ã§ã™.
-ã“れ㯠mysqlã®ã‚½ãƒ¼ã‚¹ã‚’コンパイルã™ã‚Œã°å¾—ã‚‹ã“ã¨ãŒã§ãã¾ã™.
-
-コンパイルã®æ™‚ã« -lmysqlclient オプションãŒå¿…è¦ã§ã™.
-
-cygwinã®å ´åˆã¯ã„ãã¤ã‹ã®ãƒ‘ッãƒãŒå¿…è¦ã§ã™. \ No newline at end of file
diff --git a/src/login_sql/timer.h b/src/login_sql/timer.h
deleted file mode 100644
index be9706a32..000000000
--- a/src/login_sql/timer.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// original : core.h 2003/03/14 11:55:25 Rev 1.4
-
-#ifndef _TIMER_H_
-#define _TIMER_H_
-
-#define BASE_TICK 5
-
-#define TIMER_ONCE_AUTODEL 1
-#define TIMER_INTERVAL 2
-#define TIMER_REMOVE_HEAP 16
-
-#define DIFF_TICK(a,b) ((int)((a)-(b)))
-
-// Struct declaration
-
-struct TimerData {
- unsigned int tick;
- int (*func)(int,unsigned int,int,int);
- int id;
- int data;
- int type;
- int interval;
- int heap_pos;
-};
-
-// Function prototype declaration
-
-unsigned int gettick_nocache(void);
-unsigned int gettick(void);
-
-int add_timer(unsigned int,int (*)(int,unsigned int,int,int),int,int);
-int add_timer_interval(unsigned int,int (*)(int,unsigned int,int,int),int,int,int);
-int delete_timer(int,int (*)(int,unsigned int,int,int));
-
-int addtick_timer(int tid,unsigned int tick);
-struct TimerData *get_timer(int tid);
-
-int do_timer(unsigned int tick);
-
-int add_timer_func_list(int (*)(int,unsigned int,int,int),char*);
-char* search_timer_func_list(int (*)(int,unsigned int,int,int));
-
-#endif // _TIMER_H_
diff --git a/src/map/.svnignore b/src/map/.svnignore
deleted file mode 100644
index d2a881f54..000000000
--- a/src/map/.svnignore
+++ /dev/null
@@ -1,3 +0,0 @@
-txtobj
-GNUmakefile
-sqlobj
diff --git a/src/map/Makefile b/src/map/Makefile
deleted file mode 100644
index b413c8a62..000000000
--- a/src/map/Makefile
+++ /dev/null
@@ -1,82 +0,0 @@
-all: txt sql
-
-txt: txtobj map-server
-
-sql: sqlobj map-server_sql
-
-txtobj:
- mkdir txtobj
-
-sqlobj:
- mkdir sqlobj
-
-COMMON_OBJ = ../common/obj/core.o ../common/obj/socket.o ../common/obj/timer.o ../common/obj/grfio.o ../common/obj/db.o ../common/obj/lock.o ../common/obj/nullpo.o ../common/obj/malloc.o ../common/obj/showmsg.o ../common/obj/utils.o ../common/obj/strlib.o
-
-COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/grfio.h ../common/db.h ../common/lock.h ../common/nullpo.h ../common/malloc.h ../common/showmsg.h ../common/utils.h ../common/strlib.h
-LIBS = -lz -lm
-
-map-server: txtobj/map.o txtobj/chrif.o txtobj/clif.o txtobj/pc.o txtobj/status.o txtobj/npc.o txtobj/npc_chat.o txtobj/chat.o txtobj/path.o txtobj/itemdb.o txtobj/mob.o txtobj/script.o txtobj/storage.o txtobj/skill.o txtobj/atcommand.o txtobj/charcommand.o txtobj/battle.o txtobj/intif.o txtobj/trade.o txtobj/party.o txtobj/vending.o txtobj/guild.o txtobj/pet.o txtobj/log.o $(COMMON_OBJ)
- $(CC) -o ../../$@ $> $(LIBS) $(LIB_S)
-
-map-server_sql: sqlobj/map.o sqlobj/chrif.o sqlobj/clif.o sqlobj/pc.o sqlobj/status.o sqlobj/npc.o sqlobj/npc_chat.o sqlobj/chat.o sqlobj/path.o sqlobj/itemdb.o sqlobj/mob.o sqlobj/script.o sqlobj/storage.o sqlobj/skill.o sqlobj/atcommand.o sqlobj/charcommand.o sqlobj/battle.o sqlobj/intif.o sqlobj/trade.o sqlobj/party.o sqlobj/vending.o sqlobj/guild.o sqlobj/pet.o sqlobj/mail.o sqlobj/log.o $(COMMON_OBJ)
- $(CC) -o ../../$@ $> $(LIB_S)
-
-txtobj/%.o: %.c
- $(COMPILE.c) -DTXT_ONLY $(OUTPUT_OPTION) $<
-
-sqlobj/%.o: %.c
- $(COMPILE.c) $(OUTPUT_OPTION) $<
-
-txtobj/map.o: map.c map.h chrif.h clif.h npc.h pc.h mob.h chat.h skill.h itemdb.h storage.h party.h pet.h atcommand.h $(COMMON_H)
-txtobj/chrif.o: chrif.c map.h battle.h chrif.h clif.h intif.h pc.h npc.h $(COMMON_H)
-txtobj/clif.o: clif.c map.h chrif.h clif.h mob.h intif.h pc.h npc.h itemdb.h chat.h script.h storage.h party.h guild.h atcommand.h pet.h charcommand.h $(COMMON_H)
-txtobj/pc.o: pc.c map.h clif.h intif.h pc.h npc.h mob.h itemdb.h battle.h skill.h script.h party.h guild.h pet.h trade.h storage.h chat.h vending.h $(COMMON_H)
-txtobj/status.o: status.c pc.h map.h clif.h status.h mob.h itemdb.h battle.h skill.h script.h pet.h guild.h $(COMMON_H)
-txtobj/npc.o: npc.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h $(COMMON_H)
-txtobj/npc_chat.o: npc_chat.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h $(COMMON_H)
-txtobj/chat.o: chat.c map.h clif.h pc.h chat.h $(COMMON_H)
-txtobj/path.o: path.c map.h battle.h $(COMMON_H)
-txtobj/itemdb.o: itemdb.c map.h battle.h itemdb.h $(COMMON_H)
-txtobj/mob.o: mob.c map.h clif.h intif.h pc.h mob.h skill.h battle.h npc.h itemdb.h $(COMMON_H)
-txtobj/script.o: script.c itemdb.h map.h pc.h mob.h clif.h intif.h npc.h script.h storage.h skill.h pet.h battle.h log.h $(COMMON_H)
-txtobj/storage.o: storage.c itemdb.h pc.h clif.h intif.h storage.h guild.h $(COMMON_H)
-txtobj/skill.o: skill.c skill.h map.h clif.h pc.h mob.h battle.h itemdb.h script.h $(COMMON_H)
-txtobj/atcommand.o: atcommand.c atcommand.h itemdb.h pc.h map.h skill.h clif.h mob.h intif.h battle.h storage.h guild.h pet.h log.h $(COMMON_H)
-txtobj/battle.o: battle.c battle.h skill.h map.h mob.h pc.h pet.h guild.h $(COMMON_H)
-txtobj/intif.o: intif.c intif.h chrif.h clif.h party.h guild.h storage.h map.h battle.h pet.h $(COMMON_H)
-txtobj/trade.o: trade.c trade.h clif.h itemdb.h map.h pc.h npc.h $(COMMON_H)
-txtobj/party.o: party.c party.h clif.h intif.h pc.h map.h battle.h $(COMMON_H)
-txtobj/vending.o: vending.c vending.h clif.h itemdb.h map.h pc.h $(COMMON_H)
-txtobj/guild.o: guild.c guild.h storage.h battle.h clif.h intif.h pc.h npc.h map.h $(COMMON_H)
-txtobj/pet.o: pet.c pet.h map.h clif.h chrif.h intif.h pc.h itemdb.h battle.h mob.h npc.h script.h $(COMMON_H)
-txtobj/log.o: log.c log.h map.h $(COMMON_H)
-txtobj/charcommand.o: charcommand.c charcommand.h itemdb.h pc.h map.h skill.h clif.h mob.h intif.h battle.h storage.h guild.h pet.h log.h $(COMMON_H)
-
-sqlobj/map.o: map.c map.h chrif.h clif.h npc.h pc.h mob.h chat.h skill.h itemdb.h storage.h party.h pet.h atcommand.h log.h $(COMMON_H)
-sqlobj/chrif.o: chrif.c map.h battle.h chrif.h clif.h intif.h pc.h npc.h $(COMMON_H)
-sqlobj/clif.o: clif.c map.h chrif.h clif.h mob.h intif.h pc.h npc.h itemdb.h chat.h script.h storage.h party.h guild.h atcommand.h pet.h charcommand.h $(COMMON_H)
-sqlobj/pc.o: pc.c map.h clif.h intif.h pc.h npc.h mob.h itemdb.h battle.h skill.h script.h party.h guild.h pet.h trade.h storage.h chat.h vending.h log.h $(COMMON_H)
-sqlobj/status.o: status.c pc.h map.h clif.h status.h mob.h itemdb.h battle.h skill.h script.h pet.h guild.h $(COMMON_H)
-sqlobj/npc.o: npc.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h $(COMMON_H)
-sqlobj/npc_chat.o: npc_chat.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h $(COMMON_H)
-sqlobj/chat.o: chat.c map.h clif.h pc.h chat.h $(COMMON_H)
-sqlobj/path.o: path.c map.h battle.h $(COMMON_H)
-sqlobj/itemdb.o: itemdb.c map.h battle.h itemdb.h $(COMMON_H)
-sqlobj/mob.o: mob.c map.h clif.h intif.h pc.h mob.h skill.h battle.h npc.h itemdb.h log.h $(COMMON_H)
-sqlobj/script.o: script.c itemdb.h map.h pc.h mob.h clif.h intif.h npc.h script.h storage.h skill.h pet.h battle.h log.h $(COMMON_H)
-sqlobj/storage.o: storage.c itemdb.h pc.h clif.h intif.h storage.h guild.h $(COMMON_H)
-sqlobj/skill.o: skill.c skill.h map.h clif.h pc.h mob.h battle.h itemdb.h script.h log.h $(COMMON_H)
-sqlobj/atcommand.o: atcommand.c atcommand.h itemdb.h pc.h map.h skill.h clif.h mob.h intif.h battle.h storage.h guild.h pet.h log.h $(COMMON_H)
-sqlobj/battle.o: battle.c battle.h skill.h map.h mob.h pc.h pet.h guild.h $(COMMON_H)
-sqlobj/intif.o: intif.c intif.h chrif.h clif.h party.h guild.h storage.h map.h battle.h pet.h $(COMMON_H)
-sqlobj/trade.o: trade.c trade.h clif.h itemdb.h map.h pc.h npc.h log.h $(COMMON_H)
-sqlobj/party.o: party.c party.h clif.h intif.h pc.h map.h battle.h $(COMMON_H)
-sqlobj/vending.o: vending.c vending.h clif.h itemdb.h map.h pc.h log.h $(COMMON_H)
-sqlobj/guild.o: guild.c guild.h storage.h battle.h clif.h intif.h pc.h npc.h map.h $(COMMON_H)
-sqlobj/pet.o: pet.c pet.h map.h clif.h chrif.h intif.h pc.h itemdb.h battle.h mob.h npc.h script.h $(COMMON_H)
-sqlobj/mail.o: mail.c mail.h $(COMMON_H)
-sqlobj/log.o: log.c log.h map.h $(COMMON_H)
-sqlobj/charcommand.o: charcommand.c charcommand.h itemdb.h pc.h map.h skill.h clif.h mob.h intif.h battle.h storage.h guild.h pet.h log.h $(COMMON_H)
-
-clean:
- rm -rf *.o ../../map-server ../../map-server_sql sqlobj txtobj
diff --git a/src/map/Makefile.win32 b/src/map/Makefile.win32
deleted file mode 100644
index 2fa1861ac..000000000
--- a/src/map/Makefile.win32
+++ /dev/null
@@ -1,96 +0,0 @@
-# grab a copy of http://www.winimage.com/zLibDll/zlib122.zip
-# and put safely into a subdirectory someplace
-# then point ZLIBDIR at whereever you put it
-#
-
-all: txt sql
-
-txt: txtobj map-server
-
-sql: sqlobj map-server_sql
-
-txtobj:
- mkdir txtobj
-
-sqlobj:
- mkdir sqlobj
-
-ZLIBDIR = ../zlib
-PACKETDEF = -DPACKETVER=6 -DNEW_006b -D__WIN32 -DLOCALZLIB
-# OPT = /MDd /D_DEBUG
-OPT =
-LINKOPT = /debug /SUBSYSTEM:CONSOLE
-# OPT = /O2
-CFLAGS = $(OPT) /nologo /I../common /I$(ZLIBDIR) $(PACKETDEF) /D_WIN32
-
-COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/grfio.o ../common/db.o ../common/lock.o ../common/nullpo.o ../common/malloc.o ../common/showmsg.o ../common/strlib.o ../common/utils.o
-
-LIBS = "WSOCK32.LIB"
-
-# "WSOCK32.LIB" "USER32.LIB" "ADVAPI32.LIB" "MSVCRT.LIB" "OLDNAMES.LIB" "KERNEL32.LIB"
-
-TXTOBJS = txtobj/map.o txtobj/chrif.o txtobj/clif.o txtobj/pc.o txtobj/status.o txtobj/npc.o txtobj/npc_chat.o txtobj/chat.o txtobj/path.o txtobj/itemdb.o txtobj/mob.o txtobj/script.o txtobj/storage.o txtobj/skill.o txtobj/atcommand.o txtobj/charcommand.o txtobj/battle.o txtobj/intif.o txtobj/trade.o txtobj/party.o txtobj/vending.o txtobj/guild.o txtobj/pet.o txtobj/log.o $(COMMON_OBJ) $(ZLIBDIR)/inflate.o $(ZLIBDIR)/deflate.o $(ZLIBDIR)/trees.o $(ZLIBDIR)/adler32.o $(ZLIBDIR)/compress.o $(ZLIBDIR)/crc32.o $(ZLIBDIR)/inftrees.o $(ZLIBDIR)/zutil.o $(ZLIBDIR)/inffast.o
-
-SQLOBJS = sqlobj/map.o sqlobj/chrif.o sqlobj/clif.o sqlobj/pc.o sqlobj/status.o sqlobj/npc.o sqlobj/npc_chat.o sqlobj/chat.o sqlobj/path.o sqlobj/itemdb.o sqlobj/mob.o sqlobj/script.o sqlobj/storage.o sqlobj/skill.o sqlobj/atcommand.o sqlobj/charcommand.o sqlobj/battle.o sqlobj/intif.o sqlobj/trade.o sqlobj/party.o sqlobj/vending.o sqlobj/guild.o sqlobj/pet.o sqlobj/log.o $(COMMON_OBJ) $(ZLIBDIR)/inflate.o $(ZLIBDIR)/adler32.o $(ZLIBDIR)/crc32.o $(ZLIBDIR)/inftrees.o $(ZLIBDIR)/zutil.o $(ZLIBDIR)/inffast.o
-
-map-server: $(TXTOBJS)
- link $(LINKOPT) /out:../../$@.exe $(TXTOBJS) $(LIBS)
-
-map-server_sql: $(SQLOBJS)
- link $(LINKOPT) /out:../../$@.exe $> $(LIBS)
-
-txtobj/%.o: %.c
- Cl /c $(CFLAGS) -DTXT_ONLY /Fo$@ $<
-
-sqlobj/%.o: %.c
- Cl /c $(CFLAGS) /Fo$@ $<
-
-%.o: %.c
- Cl /c $(CFLAGS) /Fo$@ $<
-
-txtobj/map.o: map.c map.h chrif.h clif.h npc.h pc.h mob.h chat.h skill.h itemdb.h storage.h party.h pet.h atcommand.h ../common/core.h ../common/timer.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h
-txtobj/chrif.o: chrif.c map.h battle.h chrif.h clif.h intif.h pc.h npc.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-txtobj/clif.o: clif.c map.h chrif.h clif.h mob.h intif.h pc.h npc.h itemdb.h chat.h script.h storage.h party.h guild.h atcommand.h pet.h atcommand.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/showmsg.h
-txtobj/pc.o: pc.c map.h clif.h intif.h pc.h npc.h mob.h itemdb.h battle.h skill.h script.h party.h guild.h pet.h trade.h storage.h chat.h vending.h ../common/timer.h ../common/mmo.h ../common/db.h ../common/showmsg.h
-txtobj/npc.o: npc.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h ../common/db.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-txtobj/chat.o: chat.c map.h clif.h pc.h chat.h ../common/db.h ../common/mmo.h ../common/showmsg.h
-txtobj/path.o: path.c map.h battle.h ../common/mmo.h ../common/showmsg.h
-txtobj/itemdb.o: itemdb.c map.h battle.h itemdb.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h
-txtobj/mob.o: mob.c map.h clif.h intif.h pc.h mob.h skill.h battle.h npc.h itemdb.h ../common/timer.h ../common/socket.h ../common/mmo.h ../common/showmsg.h
-txtobj/script.o: script.c itemdb.h map.h pc.h mob.h clif.h intif.h npc.h script.h storage.h skill.h pet.h battle.h ../common/timer.h ../common/socket.h ../common/db.h ../common/mmo.h ../common/lock.h ../common/showmsg.h
-txtobj/storage.o: storage.c itemdb.h pc.h clif.h intif.h storage.h guild.h ../common/mmo.h ../common/db.h ../common/showmsg.h
-txtobj/skill.o: skill.c skill.h map.h clif.h pc.h mob.h battle.h itemdb.h script.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-txtobj/atcommand.o: atcommand.c atcommand.h itemdb.h pc.h map.h skill.h clif.h mob.h intif.h battle.h storage.h guild.h pet.h log.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-txtobj/battle.o: battle.c battle.h skill.h map.h mob.h pc.h pet.h guild.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-txtobj/intif.o: intif.c intif.h chrif.h clif.h party.h guild.h storage.h map.h battle.h pet.h ../common/socket.h ../common/mmo.h ../common/showmsg.h
-txtobj/trade.o: trade.c trade.h clif.h itemdb.h map.h pc.h npc.h ../common/mmo.h ../common/showmsg.h
-txtobj/party.o: party.c party.h clif.h intif.h pc.h map.h battle.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-txtobj/vending.o: vending.c vending.h clif.h itemdb.h map.h pc.h ../common/mmo.h ../common/showmsg.h
-txtobj/guild.o: guild.c guild.h storage.h battle.h clif.h intif.h pc.h npc.h map.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-txtobj/pet.o: pet.c pet.h map.h clif.h chrif.h intif.h pc.h itemdb.h battle.h mob.h npc.h script.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-
-sqlobj/map.o: map.c map.h chrif.h clif.h npc.h pc.h mob.h chat.h skill.h itemdb.h storage.h party.h pet.h atcommand.h log.h ../common/core.h ../common/timer.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h
-sqlobj/chrif.o: chrif.c map.h battle.h chrif.h clif.h intif.h pc.h npc.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/clif.o: clif.c map.h chrif.h clif.h mob.h intif.h pc.h npc.h itemdb.h chat.h script.h storage.h party.h guild.h atcommand.h pet.h atcommand.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/showmsg.h
-sqlobj/pc.o: pc.c map.h clif.h intif.h pc.h npc.h mob.h itemdb.h battle.h skill.h script.h party.h guild.h pet.h trade.h storage.h chat.h vending.h log.h ../common/timer.h ../common/mmo.h ../common/db.h ../common/showmsg.h
-sqlobj/npc.o: npc.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h ../common/db.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/chat.o: chat.c map.h clif.h pc.h chat.h ../common/db.h ../common/mmo.h ../common/showmsg.h
-sqlobj/path.o: path.c map.h battle.h ../common/mmo.h ../common/showmsg.h
-sqlobj/itemdb.o: itemdb.c map.h battle.h itemdb.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h
-sqlobj/mob.o: mob.c map.h clif.h intif.h pc.h mob.h skill.h battle.h npc.h itemdb.h log.h ../common/timer.h ../common/socket.h ../common/mmo.h ../common/showmsg.h
-sqlobj/script.o: script.c itemdb.h map.h pc.h mob.h clif.h intif.h npc.h script.h storage.h skill.h pet.h battle.h log.h ../common/timer.h ../common/socket.h ../common/db.h ../common/mmo.h ../common/lock.h ../common/showmsg.h
-sqlobj/storage.o: storage.c itemdb.h pc.h clif.h intif.h storage.h guild.h ../common/mmo.h ../common/db.h ../common/showmsg.h
-sqlobj/skill.o: skill.c skill.h map.h clif.h pc.h mob.h battle.h itemdb.h script.h log.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/atcommand.o: atcommand.c atcommand.h itemdb.h pc.h map.h skill.h clif.h mob.h intif.h battle.h storage.h guild.h pet.h log.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/battle.o: battle.c battle.h skill.h map.h mob.h pc.h pet.h guild.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/intif.o: intif.c intif.h chrif.h clif.h party.h guild.h storage.h map.h battle.h pet.h ../common/socket.h ../common/mmo.h ../common/showmsg.h
-sqlobj/trade.o: trade.c trade.h clif.h itemdb.h map.h pc.h npc.h log.h ../common/mmo.h ../common/showmsg.h
-sqlobj/party.o: party.c party.h clif.h intif.h pc.h map.h battle.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/vending.o: vending.c vending.h clif.h itemdb.h map.h pc.h log.h ../common/mmo.h ../common/showmsg.h
-sqlobj/guild.o: guild.c guild.h storage.h battle.h clif.h intif.h pc.h npc.h map.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/pet.o: pet.c pet.h map.h clif.h chrif.h intif.h pc.h itemdb.h battle.h mob.h npc.h script.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/mail.o: mail.c mail.h ../common/showmsg.h ../common/strlib.h ../common/utils.h
-sqlobj/log.o: log.c log.h map.h ../common/nullpo.h
-
-clean:
- rm -rf *.o ../../map-server ../../map-server_sql sqlobj txtobj
diff --git a/src/map/atcommand.c b/src/map/atcommand.c
deleted file mode 100644
index 79e3ec675..000000000
--- a/src/map/atcommand.c
+++ /dev/null
@@ -1,9229 +0,0 @@
-// $Id: atcommand.c 148 2004-09-30 14:05:37Z MouseJstr $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <math.h>
-
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/nullpo.h"
-#include "../common/mmo.h"
-#include "../common/db.h"
-#include "../common/core.h"
-
-#include "log.h"
-#include "clif.h"
-#include "chrif.h"
-#include "intif.h"
-#include "itemdb.h"
-#include "map.h"
-#include "pc.h"
-#include "status.h"
-#include "skill.h"
-#include "mob.h"
-#include "pet.h"
-#include "battle.h"
-#include "party.h"
-#include "guild.h"
-#include "atcommand.h"
-#include "script.h"
-#include "npc.h"
-#include "trade.h"
-
-#ifndef TXT_ONLY
-#include "mail.h"
-#endif
-
-#define STATE_BLIND 0x10
-
-static char command_symbol = '@'; // first char of the commands (by [Yor])
-
-#define MAX_MSG 1000
-char *msg_table[MAX_MSG]; // Server messages (0-499 reserved for GM commands, 500-999 reserved for others)
-
-#define ACMD_FUNC(x) int atcommand_ ## x (const int fd, struct map_session_data* sd, const char* command, const char* message)
-ACMD_FUNC(broadcast);
-ACMD_FUNC(localbroadcast);
-ACMD_FUNC(rura);
-ACMD_FUNC(where);
-ACMD_FUNC(jumpto);
-ACMD_FUNC(jump);
-ACMD_FUNC(who);
-ACMD_FUNC(who2);
-ACMD_FUNC(who3);
-ACMD_FUNC(whomap);
-ACMD_FUNC(whomap2);
-ACMD_FUNC(whomap3);
-ACMD_FUNC(whogm); // by Yor
-ACMD_FUNC(whozeny); // [Valaris]
-ACMD_FUNC(happyhappyjoyjoy); // [Valaris]
-ACMD_FUNC(save);
-ACMD_FUNC(load);
-ACMD_FUNC(speed);
-ACMD_FUNC(storage);
-ACMD_FUNC(guildstorage);
-ACMD_FUNC(option);
-ACMD_FUNC(hide);
-ACMD_FUNC(jobchange);
-ACMD_FUNC(die);
-ACMD_FUNC(kill);
-ACMD_FUNC(alive);
-ACMD_FUNC(kami);
-ACMD_FUNC(heal);
-ACMD_FUNC(item);
-ACMD_FUNC(item2);
-ACMD_FUNC(itemreset);
-ACMD_FUNC(itemcheck);
-ACMD_FUNC(baselevelup);
-ACMD_FUNC(joblevelup);
-ACMD_FUNC(help);
-ACMD_FUNC(gm);
-ACMD_FUNC(pvpoff);
-ACMD_FUNC(pvpon);
-ACMD_FUNC(gvgoff);
-ACMD_FUNC(gvgon);
-ACMD_FUNC(model);
-ACMD_FUNC(go);
-ACMD_FUNC(monster);
-ACMD_FUNC(monstersmall);
-ACMD_FUNC(monsterbig);
-ACMD_FUNC(spawn);
-ACMD_FUNC(killmonster);
-ACMD_FUNC(killmonster2);
-ACMD_FUNC(refine);
-ACMD_FUNC(produce);
-ACMD_FUNC(memo);
-ACMD_FUNC(gat);
-ACMD_FUNC(packet);
-ACMD_FUNC(statuspoint);
-ACMD_FUNC(skillpoint);
-ACMD_FUNC(zeny);
-ACMD_FUNC(param);
-ACMD_FUNC(guildlevelup);
-ACMD_FUNC(makeegg);
-ACMD_FUNC(hatch);
-ACMD_FUNC(petfriendly);
-ACMD_FUNC(pethungry);
-ACMD_FUNC(petrename);
-ACMD_FUNC(recall);
-ACMD_FUNC(recallall);
-ACMD_FUNC(revive);
-ACMD_FUNC(character_stats_all);
-ACMD_FUNC(character_save);
-ACMD_FUNC(night);
-ACMD_FUNC(day);
-ACMD_FUNC(doom);
-ACMD_FUNC(doommap);
-ACMD_FUNC(raise);
-ACMD_FUNC(raisemap);
-ACMD_FUNC(character_baselevel);
-ACMD_FUNC(character_joblevel);
-ACMD_FUNC(kick);
-ACMD_FUNC(kickall);
-ACMD_FUNC(allskill);
-ACMD_FUNC(questskill);
-ACMD_FUNC(charquestskill);
-ACMD_FUNC(lostskill);
-ACMD_FUNC(charlostskill);
-ACMD_FUNC(spiritball);
-ACMD_FUNC(party);
-ACMD_FUNC(guild);
-ACMD_FUNC(charskreset);
-ACMD_FUNC(charstreset);
-ACMD_FUNC(charreset);
-ACMD_FUNC(charstpoint);
-ACMD_FUNC(charmodel);
-ACMD_FUNC(charskpoint);
-ACMD_FUNC(agitstart);
-ACMD_FUNC(agitend);
-ACMD_FUNC(reloaditemdb);
-ACMD_FUNC(reloadmobdb);
-ACMD_FUNC(reloadskilldb);
-ACMD_FUNC(reloadscript);
-ACMD_FUNC(reloadgmdb); // by Yor
-ACMD_FUNC(reloadatcommand);
-ACMD_FUNC(reloadbattleconf);
-ACMD_FUNC(reloadstatusdb);
-ACMD_FUNC(reloadpcdb);
-ACMD_FUNC(mapexit);
-ACMD_FUNC(idsearch);
-ACMD_FUNC(mapinfo);
-ACMD_FUNC(dye); //** by fritz
-ACMD_FUNC(hair_style); //** by fritz
-ACMD_FUNC(hair_color); //** by fritz
-ACMD_FUNC(stat_all); //** by fritz
-ACMD_FUNC(char_change_sex); // by Yor
-ACMD_FUNC(char_block); // by Yor
-ACMD_FUNC(char_ban); // by Yor
-ACMD_FUNC(char_unblock); // by Yor
-ACMD_FUNC(char_unban); // by Yor
-ACMD_FUNC(mount_peco); // by Valaris
-ACMD_FUNC(char_mount_peco); // by Yor
-ACMD_FUNC(guildspy); // [Syrus22]
-ACMD_FUNC(partyspy); // [Syrus22]
-ACMD_FUNC(repairall); // [Valaris]
-ACMD_FUNC(guildrecall); // by Yor
-ACMD_FUNC(partyrecall); // by Yor
-ACMD_FUNC(nuke); // [Valaris]
-ACMD_FUNC(enablenpc);
-ACMD_FUNC(hidenpc);
-ACMD_FUNC(disablenpc);
-ACMD_FUNC(servertime); // by Yor
-ACMD_FUNC(chardelitem); // by Yor
-ACMD_FUNC(jail); // by Yor
-ACMD_FUNC(unjail); // by Yor
-ACMD_FUNC(disguise); // [Valaris]
-ACMD_FUNC(undisguise); // by Yor
-ACMD_FUNC(chardisguise); // Kalaspuff
-ACMD_FUNC(charundisguise); // Kalaspuff
-ACMD_FUNC(email); // by Yor
-ACMD_FUNC(effect);//by Apple
-ACMD_FUNC(character_cart_list); // by Yor
-ACMD_FUNC(addwarp); // by MouseJstr
-ACMD_FUNC(follow); // by MouseJstr
-ACMD_FUNC(skillon); // by MouseJstr
-ACMD_FUNC(skilloff); // by MouseJstr
-ACMD_FUNC(killer); // by MouseJstr
-ACMD_FUNC(npcmove); // by MouseJstr
-ACMD_FUNC(killable); // by MouseJstr
-ACMD_FUNC(charkillable); // by MouseJstr
-ACMD_FUNC(dropall); // by MouseJstr
-ACMD_FUNC(chardropall); // by MouseJstr
-ACMD_FUNC(storeall); // by MouseJstr
-ACMD_FUNC(charstoreall); // by MouseJstr
-ACMD_FUNC(skillid); // by MouseJstr
-ACMD_FUNC(useskill); // by MouseJstr
-ACMD_FUNC(summon);
-ACMD_FUNC(rain);
-ACMD_FUNC(snow);
-ACMD_FUNC(sakura);
-ACMD_FUNC(fog);
-ACMD_FUNC(leaves);
-ACMD_FUNC(adjgmlvl); // by MouseJstr
-ACMD_FUNC(adjcmdlvl); // by MouseJstr
-ACMD_FUNC(trade); // by MouseJstr
-ACMD_FUNC(send); // by davidsiaw
-ACMD_FUNC(setbattleflag); // by MouseJstr
-ACMD_FUNC(unmute); // [Valaris]
-ACMD_FUNC(clearweather); // Dexity
-ACMD_FUNC(uptime); // by MC Cameri
-ACMD_FUNC(changesex); // by MC Cameri
-ACMD_FUNC(mute); // celest
-ACMD_FUNC(refresh); // by MC Cameri
-ACMD_FUNC(petid); // by MC Cameri
-ACMD_FUNC(identify); // by MC Cameri
-ACMD_FUNC(gmotd); // Added by MC Cameri, created by davidsiaw
-ACMD_FUNC(misceffect); // by MC Cameri
-ACMD_FUNC(mobsearch);
-ACMD_FUNC(cleanmap);
-ACMD_FUNC(npctalk);
-ACMD_FUNC(pettalk);
-ACMD_FUNC(users);
-ACMD_FUNC(autoloot); // by Upa-Kun
-
-#ifndef TXT_ONLY
-ACMD_FUNC(checkmail); // [Valaris]
-ACMD_FUNC(listmail); // [Valaris]
-ACMD_FUNC(listnewmail); // [Valaris]
-ACMD_FUNC(readmail); // [Valaris]
-ACMD_FUNC(sendmail); // [Valaris]
-ACMD_FUNC(sendprioritymail); // [Valaris]
-ACMD_FUNC(deletemail); // [Valaris]
-//ACMD_FUNC(sound); // [Valaris]
-ACMD_FUNC(refreshonline); // [Valaris]
-#endif /* TXT_ONLY */
-
-ACMD_FUNC(skilltree); // by MouseJstr
-
-ACMD_FUNC(marry); // by MouseJstr
-ACMD_FUNC(divorce); // by MouseJstr
-ACMD_FUNC(rings); // by MouseJstr
-
-ACMD_FUNC(grind); // by MouseJstr
-ACMD_FUNC(grind2); // by MouseJstr
-
-#ifdef DMALLOC
-ACMD_FUNC(dmstart); // by MouseJstr
-ACMD_FUNC(dmtick); // by MouseJstr
-#endif
-
-ACMD_FUNC(jumptoid); // by Dino9021
-ACMD_FUNC(jumptoid2); // by Dino9021
-ACMD_FUNC(recallid); // by Dino9021
-ACMD_FUNC(recallid2); // by Dino9021
-ACMD_FUNC(kickid); // by Dino9021
-ACMD_FUNC(kickid2); // by Dino9021
-ACMD_FUNC(reviveid); // by Dino9021
-ACMD_FUNC(reviveid2); // by Dino9021
-ACMD_FUNC(killid); // by Dino9021
-ACMD_FUNC(killid2); // by Dino9021
-ACMD_FUNC(charkillableid); // by Dino9021
-ACMD_FUNC(charkillableid2); // by Dino9021
-ACMD_FUNC(sound);
-ACMD_FUNC(undisguiseall);
-ACMD_FUNC(disguiseall);
-ACMD_FUNC(changelook);
-ACMD_FUNC(mobinfo); //by Lupus
-ACMD_FUNC(adopt); // by Veider
-
-/*==========================================
- *AtCommandInfo atcommand_info[]\‘¢‘Ì‚Ì’è‹`
- *------------------------------------------
- */
-
-// First char of commands is configured in atcommand_athena.conf. Leave @ in this list for default value.
-// to set default level, read atcommand_athena.conf first please.
-static AtCommandInfo atcommand_info[] = {
- { AtCommand_Rura, "@rura", 40, atcommand_rura },
- { AtCommand_Warp, "@warp", 40, atcommand_rura },
- { AtCommand_Where, "@where", 1, atcommand_where },
- { AtCommand_JumpTo, "@jumpto", 20, atcommand_jumpto }, // + /shift
- { AtCommand_JumpTo, "@warpto", 20, atcommand_jumpto },
- { AtCommand_JumpTo, "@goto", 20, atcommand_jumpto },
- { AtCommand_Jump, "@jump", 40, atcommand_jump },
- { AtCommand_Who, "@who", 20, atcommand_who },
- { AtCommand_Who, "@whois", 20, atcommand_who },
- { AtCommand_Who2, "@who2", 20, atcommand_who2 },
- { AtCommand_Who3, "@who3", 20, atcommand_who3 },
- { AtCommand_WhoMap, "@whomap", 20, atcommand_whomap },
- { AtCommand_WhoMap2, "@whomap2", 20, atcommand_whomap2 },
- { AtCommand_WhoMap3, "@whomap3", 20, atcommand_whomap3 },
- { AtCommand_WhoGM, "@whogm", 20, atcommand_whogm }, // by Yor
- { AtCommand_Save, "@save", 40, atcommand_save },
- { AtCommand_Load, "@return", 40, atcommand_load },
- { AtCommand_Load, "@load", 40, atcommand_load },
- { AtCommand_Speed, "@speed", 40, atcommand_speed },
- { AtCommand_Storage, "@storage", 1, atcommand_storage },
- { AtCommand_GuildStorage, "@gstorage", 50, atcommand_guildstorage },
- { AtCommand_Option, "@option", 40, atcommand_option },
- { AtCommand_Hide, "@hide", 40, atcommand_hide }, // + /hide
- { AtCommand_JobChange, "@jobchange", 40, atcommand_jobchange },
- { AtCommand_JobChange, "@job", 40, atcommand_jobchange },
- { AtCommand_Die, "@die", 1, atcommand_die },
- { AtCommand_Kill, "@kill", 60, atcommand_kill },
- { AtCommand_Alive, "@alive", 60, atcommand_alive },
- { AtCommand_Kami, "@kami", 40, atcommand_kami },
- { AtCommand_KamiB, "@kamib", 40, atcommand_kami },
- { AtCommand_Heal, "@heal", 40, atcommand_heal },
- { AtCommand_Item, "@item", 60, atcommand_item },
- { AtCommand_Item2, "@item2", 60, atcommand_item2 },
- { AtCommand_ItemReset, "@itemreset", 40, atcommand_itemreset },
- { AtCommand_ItemCheck, "@itemcheck", 60, atcommand_itemcheck },
- { AtCommand_BaseLevelUp, "@lvup", 60, atcommand_baselevelup },
- { AtCommand_BaseLevelUp, "@blevel", 60, atcommand_baselevelup },
- { AtCommand_BaseLevelUp, "@baselvlup", 60, atcommand_baselevelup },
- { AtCommand_JobLevelUp, "@jlevel", 60, atcommand_joblevelup },
- { AtCommand_JobLevelUp, "@joblvup", 60, atcommand_joblevelup },
- { AtCommand_JobLevelUp, "@joblvlup", 60, atcommand_joblevelup },
- { AtCommand_H, "@h", 20, atcommand_help },
- { AtCommand_Help, "@help", 20, atcommand_help },
- { AtCommand_GM, "@gm", 100, atcommand_gm },
- { AtCommand_PvPOff, "@pvpoff", 40, atcommand_pvpoff },
- { AtCommand_PvPOn, "@pvpon", 40, atcommand_pvpon },
- { AtCommand_GvGOff, "@gvgoff", 40, atcommand_gvgoff },
- { AtCommand_GvGOff, "@gpvpoff", 40, atcommand_gvgoff },
- { AtCommand_GvGOn, "@gvgon", 40, atcommand_gvgon },
- { AtCommand_GvGOn, "@gpvpon", 40, atcommand_gvgon },
- { AtCommand_Model, "@model", 20, atcommand_model },
- { AtCommand_Go, "@go", 10, atcommand_go },
- { AtCommand_Spawn, "@monster", 50, atcommand_spawn },
- { AtCommand_Spawn, "@spawn", 50, atcommand_spawn },
-// { AtCommand_Spawn, "@summon", 50, atcommand_spawn },
- { AtCommand_Monster, "@monster2", 50, atcommand_monster },
- { AtCommand_MonsterSmall, "@monstersmall", 50, atcommand_monstersmall },
- { AtCommand_MonsterBig, "@monsterbig", 50, atcommand_monsterbig },
- { AtCommand_KillMonster, "@killmonster", 60, atcommand_killmonster },
- { AtCommand_KillMonster2, "@killmonster2", 40, atcommand_killmonster2 },
- { AtCommand_Refine, "@refine", 60, atcommand_refine },
- { AtCommand_Produce, "@produce", 60, atcommand_produce },
- { AtCommand_Memo, "@memo", 40, atcommand_memo },
- { AtCommand_GAT, "@gat", 99, atcommand_gat }, // debug function
- { AtCommand_Packet, "@packet", 99, atcommand_packet }, // debug function
- { AtCommand_StatusPoint, "@stpoint", 60, atcommand_statuspoint },
- { AtCommand_SkillPoint, "@skpoint", 60, atcommand_skillpoint },
- { AtCommand_Zeny, "@zeny", 60, atcommand_zeny },
- { AtCommand_Strength, "@str", 60, atcommand_param },
- { AtCommand_Agility, "@agi", 60, atcommand_param },
- { AtCommand_Vitality, "@vit", 60, atcommand_param },
- { AtCommand_Intelligence, "@int", 60, atcommand_param },
- { AtCommand_Dexterity, "@dex", 60, atcommand_param },
- { AtCommand_Luck, "@luk", 60, atcommand_param },
- { AtCommand_GuildLevelUp, "@guildlvup", 60, atcommand_guildlevelup },
- { AtCommand_GuildLevelUp, "@guildlvlup", 60, atcommand_guildlevelup },
- { AtCommand_MakeEgg, "@makeegg", 60, atcommand_makeegg },
- { AtCommand_Hatch, "@hatch", 60, atcommand_hatch },
- { AtCommand_PetFriendly, "@petfriendly", 40, atcommand_petfriendly },
- { AtCommand_PetHungry, "@pethungry", 40, atcommand_pethungry },
- { AtCommand_PetRename, "@petrename", 1, atcommand_petrename },
- { AtCommand_Recall, "@recall", 60, atcommand_recall }, // + /recall
- { AtCommand_Revive, "@revive", 60, atcommand_revive },
- { AtCommand_Night, "@night", 80, atcommand_night },
- { AtCommand_Day, "@day", 80, atcommand_day },
- { AtCommand_Doom, "@doom", 80, atcommand_doom },
- { AtCommand_DoomMap, "@doommap", 80, atcommand_doommap },
- { AtCommand_Raise, "@raise", 80, atcommand_raise },
- { AtCommand_RaiseMap, "@raisemap", 80, atcommand_raisemap },
- { AtCommand_CharacterBaseLevel, "@charbaselvl", 60, atcommand_character_baselevel },
- { AtCommand_CharacterJobLevel, "@charjlvl", 60, atcommand_character_joblevel },
- { AtCommand_Kick, "@kick", 20, atcommand_kick }, // + right click menu for GM "(name) force to quit"
- { AtCommand_KickAll, "@kickall", 99, atcommand_kickall },
- { AtCommand_AllSkill, "@allskill", 60, atcommand_allskill },
- { AtCommand_AllSkill, "@allskills", 60, atcommand_allskill },
- { AtCommand_AllSkill, "@skillall", 60, atcommand_allskill },
- { AtCommand_AllSkill, "@skillsall", 60, atcommand_allskill },
- { AtCommand_QuestSkill, "@questskill", 40, atcommand_questskill },
- { AtCommand_CharQuestSkill, "@charquestskill", 60, atcommand_charquestskill },
- { AtCommand_LostSkill, "@lostskill", 40, atcommand_lostskill },
- { AtCommand_CharLostSkill, "@charlostskill", 60, atcommand_charlostskill },
- { AtCommand_SpiritBall, "@spiritball", 40, atcommand_spiritball },
- { AtCommand_Party, "@party", 1, atcommand_party },
- { AtCommand_Guild, "@guild", 50, atcommand_guild },
- { AtCommand_AgitStart, "@agitstart", 60, atcommand_agitstart },
- { AtCommand_AgitEnd, "@agitend", 60, atcommand_agitend },
- { AtCommand_MapExit, "@mapexit", 99, atcommand_mapexit },
- { AtCommand_IDSearch, "@idsearch", 60, atcommand_idsearch },
- { AtCommand_MapMove, "@mapmove", 40, atcommand_rura }, // /mm command
- { AtCommand_Broadcast, "@broadcast", 40, atcommand_broadcast }, // /b and /nb command
- { AtCommand_LocalBroadcast, "@localbroadcast", 40, atcommand_localbroadcast }, // /lb and /nlb command
- { AtCommand_RecallAll, "@recallall", 80, atcommand_recallall },
- { AtCommand_CharSkReset, "@charskreset", 60, atcommand_charskreset },
- { AtCommand_CharStReset, "@charstreset", 60, atcommand_charstreset },
- { AtCommand_ReloadItemDB, "@reloaditemdb", 99, atcommand_reloaditemdb }, // admin command
- { AtCommand_ReloadMobDB, "@reloadmobdb", 99, atcommand_reloadmobdb }, // admin command
- { AtCommand_ReloadSkillDB, "@reloadskilldb", 99, atcommand_reloadskilldb }, // admin command
- { AtCommand_ReloadScript, "@reloadscript", 99, atcommand_reloadscript }, // admin command
- { AtCommand_ReloadGMDB, "@reloadgmdb", 99, atcommand_reloadgmdb }, // admin command
- { AtCommand_ReloadAtcommand, "@reloadatcommand", 99, atcommand_reloadatcommand },
- { AtCommand_ReloadBattleConf, "@reloadbattleconf",99, atcommand_reloadbattleconf },
- { AtCommand_ReloadStatusDB, "@reloadstatusdb", 99, atcommand_reloadstatusdb },
- { AtCommand_ReloadPcDB, "@reloadpcdb", 99, atcommand_reloadpcdb },
- { AtCommand_CharModel, "@charmodel", 50, atcommand_charmodel },
- { AtCommand_CharSKPoint, "@charskpoint", 60, atcommand_charskpoint },
- { AtCommand_CharSTPoint, "@charstpoint", 60, atcommand_charstpoint },
- { AtCommand_MapInfo, "@mapinfo", 99, atcommand_mapinfo },
- { AtCommand_Dye, "@dye", 40, atcommand_dye }, // by fritz
- { AtCommand_Dye, "@ccolor", 40, atcommand_dye }, // by fritz
- { AtCommand_Hstyle, "@hairstyle", 40, atcommand_hair_style }, // by fritz
- { AtCommand_Hstyle, "@hstyle", 40, atcommand_hair_style }, // by fritz
- { AtCommand_Hcolor, "@haircolor", 40, atcommand_hair_color }, // by fritz
- { AtCommand_Hcolor, "@hcolor", 40, atcommand_hair_color }, // by fritz
- { AtCommand_StatAll, "@statall", 60, atcommand_stat_all }, // by fritz
- { AtCommand_StatAll, "@statsall", 60, atcommand_stat_all },
- { AtCommand_StatAll, "@allstats", 60, atcommand_stat_all }, // by fritz
- { AtCommand_StatAll, "@allstat", 60, atcommand_stat_all }, // by fritz
-// { AtCommand_CharChangeSex, "@charchangesex", 60, atcommand_char_change_sex }, // by Yor
- { AtCommand_CharBlock, "@block", 60, atcommand_char_block }, // by Yor
- { AtCommand_CharBlock, "@charblock", 60, atcommand_char_block }, // by Yor
- { AtCommand_CharBan, "@ban", 60, atcommand_char_ban }, // by Yor
- { AtCommand_CharBan, "@banish", 60, atcommand_char_ban }, // by Yor
- { AtCommand_CharBan, "@charban", 60, atcommand_char_ban }, // by Yor
- { AtCommand_CharBan, "@charbanish", 60, atcommand_char_ban }, // by Yor
- { AtCommand_CharUnBlock, "@unblock", 60, atcommand_char_unblock }, // by Yor
- { AtCommand_CharUnBlock, "@charunblock", 60, atcommand_char_unblock }, // by Yor
- { AtCommand_CharUnBan, "@unban", 60, atcommand_char_unban }, // by Yor
- { AtCommand_CharUnBan, "@unbanish", 60, atcommand_char_unban }, // by Yor
- { AtCommand_CharUnBan, "@charunban", 60, atcommand_char_unban }, // by Yor
- { AtCommand_CharUnBan, "@charunbanish", 60, atcommand_char_unban }, // by Yor
- { AtCommand_MountPeco, "@mountpeco", 20, atcommand_mount_peco }, // by Valaris
- { AtCommand_CharMountPeco, "@charmountpeco", 50, atcommand_char_mount_peco }, // by Yor
- { AtCommand_GuildSpy, "@guildspy", 60, atcommand_guildspy }, // [Syrus22]
- { AtCommand_PartySpy, "@partyspy", 60, atcommand_partyspy }, // [Syrus22]
- { AtCommand_RepairAll, "@repairall", 60, atcommand_repairall }, // [Valaris]
- { AtCommand_GuildRecall, "@guildrecall", 60, atcommand_guildrecall }, // by Yor
- { AtCommand_PartyRecall, "@partyrecall", 60, atcommand_partyrecall }, // by Yor
- { AtCommand_Nuke, "@nuke", 60, atcommand_nuke }, // [Valaris]
- { AtCommand_Enablenpc, "@enablenpc", 80, atcommand_enablenpc }, // []
- { AtCommand_Hidenpc, "@hidenpc", 80, atcommand_hidenpc }, // []
- { AtCommand_Disablenpc, "@disablenpc", 80, atcommand_disablenpc }, // []
- { AtCommand_ServerTime, "@time", 0, atcommand_servertime }, // by Yor
- { AtCommand_ServerTime, "@date", 0, atcommand_servertime }, // by Yor
- { AtCommand_ServerTime, "@server_date", 0, atcommand_servertime }, // by Yor
- { AtCommand_ServerTime, "@serverdate", 0, atcommand_servertime }, // by Yor
- { AtCommand_ServerTime, "@server_time", 0, atcommand_servertime }, // by Yor
- { AtCommand_ServerTime, "@servertime", 0, atcommand_servertime }, // by Yor
- { AtCommand_CharDelItem, "@chardelitem", 60, atcommand_chardelitem }, // by Yor
- { AtCommand_Jail, "@jail", 60, atcommand_jail }, // by Yor
- { AtCommand_UnJail, "@unjail", 60, atcommand_unjail }, // by Yor
- { AtCommand_UnJail, "@discharge", 60, atcommand_unjail }, // by Yor
- { AtCommand_Disguise, "@disguise", 20, atcommand_disguise }, // [Valaris]
- { AtCommand_UnDisguise, "@undisguise", 20, atcommand_undisguise }, // by Yor
- { AtCommand_CharDisguise, "@chardisguise", 60, atcommand_chardisguise }, // Kalaspuff
- { AtCommand_CharUnDisguise, "@charundisguise", 60, atcommand_charundisguise }, // Kalaspuff
- { AtCommand_EMail, "@email", 0, atcommand_email }, // by Yor
- { AtCommand_Effect, "@effect", 40, atcommand_effect }, // by Apple
-// { AtCommand_Char_Item_List, "@charitemlist", 40, atcommand_character_item_list }, // by Yor, now #itemlist
-// { AtCommand_Char_Storage_List, "@charstoragelist", 40, atcommand_character_storage_list }, // by Yor, now #storagelist
- { AtCommand_Char_Cart_List, "@charcartlist", 40, atcommand_character_cart_list }, // by Yor
- { AtCommand_Follow, "@follow", 10, atcommand_follow }, // by MouseJstr
- { AtCommand_AddWarp, "@addwarp", 20, atcommand_addwarp }, // by MouseJstr
- { AtCommand_SkillOn, "@skillon", 20, atcommand_skillon }, // by MouseJstr
- { AtCommand_SkillOff, "@skilloff", 20, atcommand_skilloff }, // by MouseJstr
- { AtCommand_Killer, "@killer", 60, atcommand_killer }, // by MouseJstr
- { AtCommand_NpcMove, "@npcmove", 20, atcommand_npcmove }, // by MouseJstr
- { AtCommand_Killable, "@killable", 40, atcommand_killable }, // by MouseJstr
- { AtCommand_CharKillable, "@charkillable", 40, atcommand_charkillable }, // by MouseJstr
- { AtCommand_Dropall, "@dropall", 40, atcommand_dropall }, // MouseJstr
- { AtCommand_Chardropall, "@chardropall", 40, atcommand_chardropall }, // MouseJstr
- { AtCommand_Storeall, "@storeall", 40, atcommand_storeall }, // MouseJstr
- { AtCommand_Charstoreall, "@charstoreall", 40, atcommand_charstoreall }, // MouseJstr
- { AtCommand_Skillid, "@skillid", 40, atcommand_skillid }, // MouseJstr
- { AtCommand_Useskill, "@useskill", 40, atcommand_useskill }, // MouseJstr
- { AtCommand_Rain, "@rain", 99, atcommand_rain },
- { AtCommand_Snow, "@snow", 99, atcommand_snow },
- { AtCommand_Sakura, "@sakura", 99, atcommand_sakura },
- { AtCommand_Fog, "@fog", 99, atcommand_fog },
- { AtCommand_Leaves, "@leaves", 99, atcommand_leaves },
-/*
- { AtCommand_Shuffle, "@shuffle", 99, atcommand_shuffle },
- { AtCommand_Maintenance, "@maintenance", 99, atcommand_maintenance },
- { AtCommand_Misceffect, "@misceffect", 60, atcommand_misceffect },
-*/
- { AtCommand_Summon, "@summon", 60, atcommand_summon },
- { AtCommand_AdjGmLvl, "@adjgmlvl", 99, atcommand_adjgmlvl },
- { AtCommand_AdjCmdLvl, "@adjcmdlvl", 99, atcommand_adjcmdlvl },
- { AtCommand_Trade, "@trade", 60, atcommand_trade },
- { AtCommand_Send, "@send", 60, atcommand_send },
- { AtCommand_SetBattleFlag, "@setbattleflag", 60, atcommand_setbattleflag },
- { AtCommand_UnMute, "@unmute", 60, atcommand_unmute }, // [Valaris]
- { AtCommand_Clearweather, "@clearweather", 99, atcommand_clearweather }, // Dexity
- { AtCommand_UpTime, "@uptime", 0, atcommand_uptime }, // by MC Cameri
-// { AtCommand_ChangeSex, "@changesex", 1, atcommand_changesex }, // by MC Cameri
- { AtCommand_Mute, "@mute", 99, atcommand_mute }, // [celest]
- { AtCommand_Mute, "@red", 99, atcommand_mute }, // [celest]
- { AtCommand_WhoZeny, "@whozeny", 20, atcommand_whozeny }, // [Valaris]
- { AtCommand_HappyHappyJoyJoy, "@happyhappyjoyjoy",40, atcommand_happyhappyjoyjoy }, // [Valaris]
- { AtCommand_Refresh, "@refresh", 0, atcommand_refresh }, // by MC Cameri
- { AtCommand_PetId, "@petid", 40, atcommand_petid }, // by MC Cameri
- { AtCommand_Identify, "@identify", 40, atcommand_identify }, // by MC Cameri
- { AtCommand_Gmotd, "@gmotd", 0, atcommand_gmotd }, // Added by MC Cameri, created by davidsiaw
- { AtCommand_MiscEffect, "@misceffect", 50, atcommand_misceffect }, // by MC Cameri
- { AtCommand_MobSearch, "@mobsearch", 0, atcommand_mobsearch },
- { AtCommand_CleanMap, "@cleanmap", 0, atcommand_cleanmap },
- { AtCommand_NpcTalk, "@npctalk", 0, atcommand_npctalk },
- { AtCommand_PetTalk, "@pettalk", 0, atcommand_pettalk },
- { AtCommand_Users, "@users", 0, atcommand_users },
- { AtCommand_ResetState, "/reset", 40, NULL },
-
-#ifndef TXT_ONLY // sql-only commands
- { AtCommand_CheckMail, "@checkmail", 1, atcommand_listmail }, // [Valaris]
- { AtCommand_ListMail, "@listmail", 1, atcommand_listmail }, // [Valaris]
- { AtCommand_ListNewMail, "@listnewmail", 1, atcommand_listmail }, // [Valaris]
- { AtCommand_ReadMail, "@readmail", 1, atcommand_readmail }, // [Valaris]
- { AtCommand_DeleteMail, "@deletemail", 1, atcommand_readmail }, // [Valaris]
- { AtCommand_SendMail, "@sendmail", 1, atcommand_sendmail }, // [Valaris]
- { AtCommand_SendPriorityMail, "@sendprioritymail",80, atcommand_sendmail }, // [Valaris]
- { AtCommand_RefreshOnline, "@refreshonline", 99, atcommand_refreshonline }, // [Valaris]
-
-#endif /* TXT_ONLY */
- { AtCommand_SkillTree, "@skilltree", 40, atcommand_skilltree }, // [MouseJstr]
- { AtCommand_Marry, "@marry", 40, atcommand_marry }, // [MouseJstr]
- { AtCommand_Divorce, "@divorce", 40, atcommand_divorce }, // [MouseJstr]
- { AtCommand_Rings, "@rings", 40, atcommand_rings }, // [MouseJstr]
- { AtCommand_Grind, "@grind", 99, atcommand_grind }, // [MouseJstr]
- { AtCommand_Grind2, "@grind2", 99, atcommand_grind2 }, // [MouseJstr]
-
-#ifdef DMALLOC
- { AtCommand_DMStart, "@dmstart", 99, atcommand_dmstart }, // [MouseJstr]
- { AtCommand_DMTick, "@dmtick", 99, atcommand_dmtick }, // [MouseJstr]
-#endif
-
- { AtCommand_JumpToId, "@jumptoid", 20, atcommand_jumptoid }, // [Dino9021]
- { AtCommand_JumpToId, "@warptoid", 20, atcommand_jumptoid }, // [Dino9021]
- { AtCommand_JumpToId, "@gotoid", 20, atcommand_jumptoid }, // [Dino9021]
- { AtCommand_JumpToId2, "@jumptoid2", 20, atcommand_jumptoid2 }, // [Dino9021]
- { AtCommand_JumpToId2, "@warptoid2", 20, atcommand_jumptoid2 }, // [Dino9021]
- { AtCommand_JumpToId2, "@gotoid2", 20, atcommand_jumptoid2 }, // [Dino9021]
- { AtCommand_RecallId, "@recallid", 60, atcommand_recallid }, // [Dino9021]
- { AtCommand_RecallId2, "@recallid2", 60, atcommand_recallid2 }, // [Dino9021]
- { AtCommand_KickId, "@kickid", 99, atcommand_kickid }, // [Dino9021]
- { AtCommand_KickId2, "@kickid2", 99, atcommand_kickid2 }, // [Dino9021]
- { AtCommand_ReviveId, "@reviveid", 60, atcommand_reviveid }, // [Dino9021]
- { AtCommand_ReviveId2, "@reviveid2", 60, atcommand_reviveid2 }, // [Dino9021]
- { AtCommand_KillId, "@killid", 60, atcommand_killid }, // [Dino9021]
- { AtCommand_KillId2, "@killid2", 60, atcommand_killid2 }, // [Dino9021]
- { AtCommand_CharKillableId, "@charkillableid", 40, atcommand_charkillableid }, // [Dino9021]
- { AtCommand_CharKillableId2, "@charkillableid2", 40, atcommand_charkillableid2 }, // [Dino9021]
- { AtCommand_Sound, "@sound", 40, atcommand_sound },
- { AtCommand_UndisguiseAll, "@undisguiseall", 99, atcommand_undisguiseall },
- { AtCommand_DisguiseAll, "@disguiseall", 99, atcommand_disguiseall },
- { AtCommand_ChangeLook, "@changelook", 99, atcommand_changelook },
- { AtCommand_AutoLoot, "@autoloot", 10, atcommand_autoloot }, // Upa-Kun
- { AtCommand_MobInfo, "@mobinfo", 1, atcommand_mobinfo }, // [Lupus]
- { AtCommand_MobInfo, "@monsterinfo", 1, atcommand_mobinfo }, // [Lupus]
- { AtCommand_MobInfo, "@mi", 1, atcommand_mobinfo }, // [Lupus]
- { AtCommand_Adopt, "@adopt", 40, atcommand_adopt }, // [Veider]
-
-// add new commands before this line
- { AtCommand_Unknown, NULL, 1, NULL }
-};
-
-/*=========================================
- * Generic variables
- *-----------------------------------------
- */
-char atcmd_output[200];
-char atcmd_player_name[100];
-
-/*====================================================
- * This function return the name of the job (by [Yor])
- *----------------------------------------------------
- */
-char * job_name(int class_) {
- switch (class_) {
- case 0: return "Novice";
- case 1: return "Swordsman";
- case 2: return "Mage";
- case 3: return "Archer";
- case 4: return "Acolyte";
- case 5: return "Merchant";
- case 6: return "Thief";
- case 7: return "Knight";
- case 8: return "Priest";
- case 9: return "Wizard";
- case 10: return "Blacksmith";
- case 11: return "Hunter";
- case 12: return "Assassin";
- case 13: return "Knight 2";
- case 14: return "Crusader";
- case 15: return "Monk";
- case 16: return "Sage";
- case 17: return "Rogue";
- case 18: return "Alchemist";
- case 19: return "Bard";
- case 20: return "Dancer";
- case 21: return "Crusader 2";
- case 22: return "Wedding";
- case 23: return "Super Novice";
- case 4001: return "Novice High";
- case 4002: return "Swordsman High";
- case 4003: return "Mage High";
- case 4004: return "Archer High";
- case 4005: return "Acolyte High";
- case 4006: return "Merchant High";
- case 4007: return "Thief High";
- case 4008: return "Lord Knight";
- case 4009: return "High Priest";
- case 4010: return "High Wizard";
- case 4011: return "Whitesmith";
- case 4012: return "Sniper";
- case 4013: return "Assassin Cross";
- case 4014: return "Peko Knight";
- case 4015: return "Paladin";
- case 4016: return "Champion";
- case 4017: return "Professor";
- case 4018: return "Stalker";
- case 4019: return "Creator";
- case 4020: return "Clown";
- case 4021: return "Gypsy";
- case 4022: return "Peko Paladin";
- case 4023: return "Baby Novice";
- case 4024: return "Baby Swordsman";
- case 4025: return "Baby Mage";
- case 4026: return "Baby Archer";
- case 4027: return "Baby Acolyte";
- case 4028: return "Baby Merchant";
- case 4029: return "Baby Thief";
- case 4030: return "Baby Knight";
- case 4031: return "Baby Priest";
- case 4032: return "Baby Wizard";
- case 4033: return "Baby Blacksmith";
- case 4034: return "Baby Hunter";
- case 4035: return "Baby Assassin";
- case 4036: return "Baby Peco Knight";
- case 4037: return "Baby Crusader";
- case 4038: return "Baby Monk";
- case 4039: return "Baby Sage";
- case 4040: return "Baby Rogue";
- case 4041: return "Baby Alchemist";
- case 4042: return "Baby Bard";
- case 4043: return "Baby Dancer";
- case 4044: return "Baby Peco Crusader";
- case 4045: return "Super Baby";
- }
- return "Unknown Job";
-}
-
-/*==========================================
- * estr_lower (replace strlwr, non ANSI function that doesn't exist in all C compilator)
- *------------------------------------------
- */
-char *estr_lower(char *str)
-{
- int i;
-
- for (i=0; str[i]; i++)
- if ((str[i] >= 65) && (str[i] <= 90))
- str[i] += 32;
- return str;
-}
-
-// compare function for sorting high to lowest
-int hightolow_compare (const void * a, const void * b)
-{
- return ( *(int*)b - *(int*)a );
-}
-
-// compare function for sorting lowest to highest
-int lowtohigh_compare (const void * a, const void * b)
-{
- return ( *(int*)a - *(int*)b );
-}
-
-//-----------------------------------------------------------
-// Return the message string of the specified number by [Yor]
-//-----------------------------------------------------------
-char * msg_txt(int msg_number) {
- if (msg_number >= 0 && msg_number < MAX_MSG &&
- msg_table[msg_number] != NULL && msg_table[msg_number][0] != '\0')
- return msg_table[msg_number];
-
- return "??";
-}
-
-//------------------------------------------------------------
-// E-mail check: return 0 (not correct) or 1 (valid). by [Yor]
-//------------------------------------------------------------
-int e_mail_check(char *email) {
- char ch;
- char* last_arobas;
-
- // athena limits
- if (strlen(email) < 3 || strlen(email) > 39)
- return 0;
-
- // part of RFC limits (official reference of e-mail description)
- if (strchr(email, '@') == NULL || email[strlen(email)-1] == '@')
- return 0;
-
- if (email[strlen(email)-1] == '.')
- return 0;
-
- last_arobas = strrchr(email, '@');
-
- if (strstr(last_arobas, "@.") != NULL ||
- strstr(last_arobas, "..") != NULL)
- return 0;
-
- for(ch = 1; ch < 32; ch++) {
- if (strchr(last_arobas, ch) != NULL) {
- return 0;
- break;
- }
- }
-
- if (strchr(last_arobas, ' ') != NULL ||
- strchr(last_arobas, ';') != NULL)
- return 0;
-
- // all correct
- return 1;
-}
-
-/*==========================================
- * get_atcommand_level @ƒRƒ}ƒ“ƒh‚Ì•K—vƒŒƒxƒ‹‚ðŽæ“¾
- *------------------------------------------
- */
-int get_atcommand_level(const AtCommandType type) {
- int i;
-
- for (i = 0; atcommand_info[i].type != AtCommand_None; i++)
- if (atcommand_info[i].type == type)
- return atcommand_info[i].level;
-
- return 100; // 100: command can not be used
-}
-
-/*==========================================
- *is_atcommand @ƒRƒ}ƒ“ƒh‚É‘¶Ý‚·‚é‚©‚Ç‚¤‚©Šm”F‚·‚é
- *------------------------------------------
- */
-AtCommandType
-is_atcommand(const int fd, struct map_session_data* sd, const char* message, int gmlvl) {
- const char* str = message;
- int s_flag = 0;
- AtCommandInfo info;
- AtCommandType type;
-
- nullpo_retr(AtCommand_None, sd);
-
- if (!battle_config.allow_atcommand_when_mute &&
- sd->sc_count && sd->sc_data[SC_NOCHAT].timer != -1) {
- return AtCommand_Unknown;
- }
-
- if (!message || !*message)
- return AtCommand_None;
-
- memset(&info, 0, sizeof(info));
- str += strlen(sd->status.name);
- while (*str && (isspace(*str) || (s_flag == 0 && *str == ':'))) {
- if (*str == ':')
- s_flag = 1;
- str++;
- }
- if (!*str)
- return AtCommand_None;
-
- type = atcommand(sd, gmlvl > 0 ? gmlvl : pc_isGM(sd), str, &info);
- if (type != AtCommand_None) {
- char command[100];
- const char* p = str;
- memset(command, '\0', sizeof(command));
- memset(atcmd_output, '\0', sizeof(atcmd_output));
- while (*p && !isspace(*p))
- p++;
- if (p - str >= sizeof(command)) // too long
- return AtCommand_Unknown;
- strncpy(command, str, p - str);
- while (isspace(*p))
- p++;
-
- if (type == AtCommand_Unknown || info.proc == NULL) {
- sprintf(atcmd_output, msg_table[153], command); // %s is Unknown Command.
- clif_displaymessage(fd, atcmd_output);
- } else {
- if (info.proc(fd, sd, command, p) != 0) {
- // Command can not be executed
- sprintf(atcmd_output, msg_table[154], command); // %s failed.
- clif_displaymessage(fd, atcmd_output);
- }
- }
-
- return info.type;
- }
-
- return AtCommand_None;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-AtCommandType atcommand(struct map_session_data* sd, const int level, const char* message, struct AtCommandInfo* info) {
- char* p = (char *)message; // it's 'char' and not 'const char' to have possibility to modify the first character if necessary
-
- if (!info)
- return AtCommand_None;
- if (battle_config.atc_gmonly != 0 && !level) // level = pc_isGM(sd)
- return AtCommand_None;
- if (!p || !*p) {
- fprintf(stderr, "at command message is empty\n");
- return AtCommand_None;
- }
-
- if (*p == command_symbol) { // check first char.
- char command[101];
- int i = 0;
- memset(info, 0, sizeof(AtCommandInfo));
- sscanf(p, "%100s", command);
- command[sizeof(command)-1] = '\0';
-
- while (atcommand_info[i].type != AtCommand_Unknown) {
- if (strcmpi(command+1, atcommand_info[i].command+1) == 0 && level >= atcommand_info[i].level) {
- p[0] = atcommand_info[i].command[0]; // set correct first symbol for after.
- break;
- }
- i++;
- }
-
- if (atcommand_info[i].type == AtCommand_Unknown) {
- // doesn't return Unknown if player is normal player (display the text, not display: unknown command)
- if (level == 0)
- return AtCommand_None;
- else
- return AtCommand_Unknown;
- } else if((log_config.gm) && (atcommand_info[i].level >= log_config.gm)) {
- log_atcommand(sd, message);
- }
- memcpy(info, &atcommand_info[i], sizeof atcommand_info[i]);
- } else {
- return AtCommand_None;
- }
-
- return info->type;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int atkillmonster_sub(struct block_list *bl, va_list ap) {
- struct mob_data *md;
- int flag;
-
- nullpo_retr(0, ap);
- nullpo_retr(0, md=(struct mob_data *)bl);
- flag = va_arg(ap, int);
-
- if (flag)
- mob_damage(NULL, md, md->hp, 2);
- else
- mob_delete(md);
-
- return 0;
-}
-/*==========================================
- * Mob search
- *------------------------------------------
- */
-static int atmobsearch_sub(struct block_list *bl,va_list ap)
-{
- int mob_id,fd;
- static int number=0;
- struct mob_data *md;
-
- nullpo_retr(0, bl);
-
- if(!ap){
- number=0;
- return 0;
- }
- mob_id = va_arg(ap,int);
- fd = va_arg(ap,int);
-
- md = (struct mob_data *)bl;
-
- if(md && fd && (mob_id==-1 || (md->class_==mob_id))){
- snprintf(atcmd_output, sizeof atcmd_output, "%2d[%3d:%3d] %s",
- ++number,bl->x, bl->y,md->name);
- clif_displaymessage(fd, atcmd_output);
- }
- return 0;
-}
-/*==========================================
- * cleanmap
- *------------------------------------------
- */
-static int atcommand_cleanmap_sub(struct block_list *bl,va_list ap)
-{
- struct flooritem_data *fitem;
-
- nullpo_retr(0, bl);
-
- fitem = (struct flooritem_data *)bl;
- if(fitem==NULL || fitem->bl.type!=BL_ITEM){
- if(battle_config.error_log)
- printf("map_clearflooritem_timer : error\n");
- return 1;
- }
- delete_timer(fitem->cleartimer,map_clearflooritem_timer);
- if(fitem->item_data.card[0] == (short)0xff00)
- intif_delete_petdata(*((long *)(&fitem->item_data.card[1])));
- clif_clearflooritem(fitem,0);
- map_delobject(fitem->bl.id);
-
- return 0;
-}
-
-/*==========================================
- * Read Message Data
- *------------------------------------------
- */
-int msg_config_read(const char *cfgName) {
- int msg_number;
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
- static int called = 1;
-
- if ((fp = fopen(cfgName, "r")) == NULL) {
- printf("Messages file not found: %s\n", cfgName);
- return 1;
- }
-
- if ((--called) == 0)
- memset(&msg_table[0], 0, sizeof(msg_table[0]) * MAX_MSG);
- while(fgets(line, sizeof(line)-1, fp)) {
- if (line[0] == '/' && line[1] == '/')
- continue;
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2) {
- if (strcmpi(w1, "import") == 0) {
- msg_config_read(w2);
- } else {
- msg_number = atoi(w1);
- if (msg_number >= 0 && msg_number < MAX_MSG) {
- if (msg_table[msg_number] != NULL)
- aFree(msg_table[msg_number]);
- msg_table[msg_number] = (char *)aCalloc(strlen(w2) + 1, sizeof (char));
- strcpy(msg_table[msg_number],w2);
- // printf("message #%d: '%s'.\n", msg_number, msg_table[msg_number]);
- }
- }
- }
- }
- fclose(fp);
-
- return 0;
-}
-
-/*==========================================
- * Cleanup Message Data
- *------------------------------------------
- */
-void do_final_msg () {
- int i;
- for (i = 0; i < MAX_MSG; i++)
- aFree(msg_table[i]);
- return;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static AtCommandInfo* get_atcommandinfo_byname(const char* name) {
- int i;
-
- for (i = 0; atcommand_info[i].type != AtCommand_Unknown; i++)
- if (strcmpi(atcommand_info[i].command + 1, name) == 0)
- return &atcommand_info[i];
-
- return NULL;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_config_read(const char *cfgName) {
- char line[1024], w1[1024], w2[1024];
- AtCommandInfo* p;
- FILE* fp;
-
- if ((fp = fopen(cfgName, "r")) == NULL) {
- printf("At commands configuration file not found: %s\n", cfgName);
- return 1;
- }
-
- while (fgets(line, sizeof(line)-1, fp)) {
- if (line[0] == '/' && line[1] == '/')
- continue;
-
- if (sscanf(line, "%1023[^:]:%1023s", w1, w2) != 2)
- continue;
- p = get_atcommandinfo_byname(w1);
- if (p != NULL) {
- p->level = atoi(w2);
- if (p->level > 100)
- p->level = 100;
- else if (p->level < 0)
- p->level = 0;
- }
-
- if (strcmpi(w1, "import") == 0)
- atcommand_config_read(w2);
- else if (strcmpi(w1, "command_symbol") == 0 && w2[0] > 31 &&
- w2[0] != '/' && // symbol of standard ragnarok GM commands
- w2[0] != '%' && // symbol of party chat speaking
- w2[0] != '#') // symbol of charcommand
- command_symbol = w2[0];
- }
- fclose(fp);
-
- return 0;
-}
-
-
-
-/*==========================================
-// @ command processing functions
- *------------------------------------------
- */
-
-/*==========================================
- * @send (used for testing packet sends from the client)
- *------------------------------------------
- */
-int atcommand_send(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int a = atoi(message);
- if (a)
- {
- unsigned char buf[1024];
- switch(a)
- {
- case 1:
- WBUFW(buf,0)=0x18d;
- case 2:
- WBUFW(buf,0)=0x18e;
- case 3:
- WBUFW(buf,0)=0x18f;
- case 4:
- WBUFW(buf,0)=0x190;
- }
- }
- return 0;
-}
-
-// @rura
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_rura(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char map_name[100];
- int x = 0, y = 0;
- int m;
-
- nullpo_retr(-1, sd);
-
- memset(map_name, '\0', sizeof(map_name));
-
- if (!message || !*message || sscanf(message, "%99s %d %d", map_name, &x, &y) < 1) {
- clif_displaymessage(fd, "Please, enter a map (usage: @warp/@rura/@mapmove <mapname> <x> <y>).");
- return -1;
- }
-
- if (x <= 0)
- x = rand() % 399 + 1;
- if (y <= 0)
- y = rand() % 399 + 1;
-
- if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
- strcat(map_name, ".gat");
-
- if (x > 0 && x < 400 && y > 0 && y < 400) {
- m = map_mapname2mapid(map_name);
- if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, msg_table[247]);
- return -1;
- }
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, msg_table[248]);
- return -1;
- }
- if (pc_setpos(sd, map_name, x, y, 3) == 0)
- clif_displaymessage(fd, msg_table[0]); // Warped.
- else {
- clif_displaymessage(fd, msg_table[1]); // Map not found.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[2]); // Coordinates out of range.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_where(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd = NULL;
-
- nullpo_retr(-1, sd);
-
- if (!message || !*message)
- return -1;
- memset(atcmd_player_name, '\0', sizeof atcmd_player_name);
- if (sscanf(message, "%99[^\n]", atcmd_player_name) < 1)
- return -1;
- if(strncmp(sd->status.name,atcmd_player_name,24)==0)
- return -1;
-
- if ((pl_sd = map_nick2sd(atcmd_player_name)) == NULL) {
- snprintf(atcmd_output, sizeof atcmd_output, "%s %d %d",
- sd->mapname, sd->bl.x, sd->bl.y);
- clif_displaymessage(fd, atcmd_output);
- return -1;
- }
- snprintf(atcmd_output, sizeof atcmd_output, "%s %s %d %d",
- atcmd_player_name, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
- clif_displaymessage(fd, atcmd_output);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_jumpto(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd = NULL;
-
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @jumpto/@warpto/@goto <char name>).");
- return -1;
- }
-
- memset(atcmd_player_name, '\0', sizeof atcmd_player_name);
- if (sscanf(message, "%99[^\n]", atcmd_player_name) < 1)
- return -1;
- if(strncmp(sd->status.name,atcmd_player_name,24)==0) //Yourself mate? Tsk tsk tsk.
- return -1;
-
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, msg_table[247]);
- return -1;
- }
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, msg_table[248]);
- return -1;
- }
- pc_setpos(sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3);
- sprintf(atcmd_output, msg_table[4], atcmd_player_name); // Jump to %s
- clif_displaymessage(fd, atcmd_output);
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_jump(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int x = 0, y = 0;
-
- nullpo_retr(-1, sd);
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- sscanf(message, "%d %d", &x, &y);
-
- if (x <= 0)
- x = rand() % 399 + 1;
- if (y <= 0)
- y = rand() % 399 + 1;
- if (x > 0 && x < 400 && y > 0 && y < 400) {
- if (sd->bl.m >= 0 && (map[sd->bl.m].flag.nowarp || map[sd->bl.m].flag.nowarpto) && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, msg_table[248]);
- return -1;
- }
- pc_setpos(sd, sd->mapname, x, y, 3);
- sprintf(atcmd_output, msg_table[5], x, y); // Jump to %d %d
- clif_displaymessage(fd, atcmd_output);
- } else {
- clif_displaymessage(fd, msg_table[2]); // Coordinates out of range.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_who(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i, j, count;
- int pl_GM_level, GM_level;
- char match_text[100];
- char player_name[24];
-
- nullpo_retr(-1, sd);
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
- memset(match_text, '\0', sizeof(match_text));
- memset(player_name, '\0', sizeof(player_name));
-
- if (sscanf(message, "%99[^\n]", match_text) < 1)
- strcpy(match_text, "");
- for (j = 0; match_text[j]; j++)
- match_text[j] = tolower(match_text[j]);
-
- count = 0;
- GM_level = pc_isGM(sd);
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth) {
- pl_GM_level = pc_isGM(pl_sd);
- if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level
- memcpy(player_name, pl_sd->status.name, 24);
- for (j = 0; player_name[j]; j++)
- player_name[j] = tolower(player_name[j]);
- if (strstr(player_name, match_text) != NULL) { // search with no case sensitive
- if (pl_GM_level > 0)
- sprintf(atcmd_output, "(CID:%d/AID:%d) Name: %s (GM:%d) | Location: %s %d %d", pl_sd->status.char_id, pl_sd->status.account_id, pl_sd->status.name, pl_GM_level, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
- else
- sprintf(atcmd_output, "(CID:%d/AID:%d) Name: %s | Location: %s %d %d", pl_sd->status.char_id, pl_sd->status.account_id, pl_sd->status.name, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
- clif_displaymessage(fd, atcmd_output);
- count++;
- }
- }
- }
- }
-
- if (count == 0)
- clif_displaymessage(fd, msg_table[28]); // No player found.
- else if (count == 1)
- clif_displaymessage(fd, msg_table[29]); // 1 player found.
- else {
- sprintf(atcmd_output, msg_table[30], count); // %d players found.
- clif_displaymessage(fd, atcmd_output);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_who2(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i, j, count;
- int pl_GM_level, GM_level;
- char match_text[100];
- char player_name[24];
-
- nullpo_retr(-1, sd);
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
- memset(match_text, '\0', sizeof(match_text));
- memset(player_name, '\0', sizeof(player_name));
-
- if (sscanf(message, "%99[^\n]", match_text) < 1)
- strcpy(match_text, "");
- for (j = 0; match_text[j]; j++)
- match_text[j] = tolower(match_text[j]);
-
- count = 0;
- GM_level = pc_isGM(sd);
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth) {
- pl_GM_level = pc_isGM(pl_sd);
- if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level
- memcpy(player_name, pl_sd->status.name, 24);
- for (j = 0; player_name[j]; j++)
- player_name[j] = tolower(player_name[j]);
- if (strstr(player_name, match_text) != NULL) { // search with no case sensitive
- if (pl_GM_level > 0)
- sprintf(atcmd_output, "Name: %s (GM:%d) | BLvl: %d | Job: %s (Lvl: %d)", pl_sd->status.name, pl_GM_level, pl_sd->status.base_level, job_name(pl_sd->status.class_), pl_sd->status.job_level);
- else
- sprintf(atcmd_output, "Name: %s | BLvl: %d | Job: %s (Lvl: %d)", pl_sd->status.name, pl_sd->status.base_level, job_name(pl_sd->status.class_), pl_sd->status.job_level);
- clif_displaymessage(fd, atcmd_output);
- count++;
- }
- }
- }
- }
-
- if (count == 0)
- clif_displaymessage(fd, msg_table[28]); // No player found.
- else if (count == 1)
- clif_displaymessage(fd, msg_table[29]); // 1 player found.
- else {
- sprintf(atcmd_output, msg_table[30], count); // %d players found.
- clif_displaymessage(fd, atcmd_output);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_who3(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char temp0[100];
- char temp1[100];
- struct map_session_data *pl_sd;
- int i, j, count;
- int pl_GM_level, GM_level;
- char match_text[100];
- char player_name[24];
- struct guild *g;
- struct party *p;
-
- nullpo_retr(-1, sd);
-
- memset(temp0, '\0', sizeof(temp0));
- memset(temp1, '\0', sizeof(temp1));
- memset(atcmd_output, '\0', sizeof(atcmd_output));
- memset(match_text, '\0', sizeof(match_text));
- memset(player_name, '\0', sizeof(player_name));
-
- if (sscanf(message, "%99[^\n]", match_text) < 1)
- strcpy(match_text, "");
- for (j = 0; match_text[j]; j++)
- match_text[j] = tolower(match_text[j]);
-
- count = 0;
- GM_level = pc_isGM(sd);
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth) {
- pl_GM_level = pc_isGM(pl_sd);
- if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level
- memcpy(player_name, pl_sd->status.name, 24);
- for (j = 0; player_name[j]; j++)
- player_name[j] = tolower(player_name[j]);
- if (strstr(player_name, match_text) != NULL) { // search with no case sensitive
- g = guild_search(pl_sd->status.guild_id);
- if (g == NULL)
- sprintf(temp1, "None");
- else
- sprintf(temp1, "%s", g->name);
- p = party_search(pl_sd->status.party_id);
- if (p == NULL)
- sprintf(temp0, "None");
- else
- sprintf(temp0, "%s", p->name);
- if (pl_GM_level > 0)
- sprintf(atcmd_output, "Name: %s (GM:%d) | Party: '%s' | Guild: '%s'", pl_sd->status.name, pl_GM_level, temp0, temp1);
- else
- sprintf(atcmd_output, "Name: %s | Party: '%s' | Guild: '%s'", pl_sd->status.name, temp0, temp1);
- clif_displaymessage(fd, atcmd_output);
- count++;
- }
- }
- }
- }
-
- if (count == 0)
- clif_displaymessage(fd, msg_table[28]); // No player found.
- else if (count == 1)
- clif_displaymessage(fd, msg_table[29]); // 1 player found.
- else {
- sprintf(atcmd_output, msg_table[30], count); // %d players found.
- clif_displaymessage(fd, atcmd_output);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_whomap(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i, count;
- int pl_GM_level, GM_level;
- int map_id;
- char map_name[100];
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
- memset(map_name, '\0', sizeof(map_name));
-
- if (!message || !*message)
- map_id = sd->bl.m;
- else {
- sscanf(message, "%99s", map_name);
- if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
- strcat(map_name, ".gat");
- if ((map_id = map_mapname2mapid(map_name)) < 0)
- map_id = sd->bl.m;
- }
-
- count = 0;
- GM_level = pc_isGM(sd);
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth) {
- pl_GM_level = pc_isGM(pl_sd);
- if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level
- if (pl_sd->bl.m == map_id) {
- if (pl_GM_level > 0)
- sprintf(atcmd_output, "Name: %s (GM:%d) | Location: %s %d %d", pl_sd->status.name, pl_GM_level, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
- else
- sprintf(atcmd_output, "Name: %s | Location: %s %d %d", pl_sd->status.name, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
- clif_displaymessage(fd, atcmd_output);
- count++;
- }
- }
- }
- }
-
- if (count == 0)
- sprintf(atcmd_output, msg_table[54], map[map_id].name); // No player found in map '%s'.
- else if (count == 1)
- sprintf(atcmd_output, msg_table[55], map[map_id].name); // 1 player found in map '%s'.
- else {
- sprintf(atcmd_output, msg_table[56], count, map[map_id].name); // %d players found in map '%s'.
- }
- clif_displaymessage(fd, atcmd_output);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_whomap2(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i, count;
- int pl_GM_level, GM_level;
- int map_id = 0;
- char map_name[100];
-
- nullpo_retr(-1, sd);
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
- memset(map_name, '\0', sizeof(map_name));
-
- if (!message || !*message)
- map_id = sd->bl.m;
- else {
- sscanf(message, "%99s", map_name);
- if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
- strcat(map_name, ".gat");
- if ((map_id = map_mapname2mapid(map_name)) < 0)
- map_id = sd->bl.m;
- }
-
- count = 0;
- GM_level = pc_isGM(sd);
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth) {
- pl_GM_level = pc_isGM(pl_sd);
- if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level
- if (pl_sd->bl.m == map_id) {
- if (pl_GM_level > 0)
- sprintf(atcmd_output, "Name: %s (GM:%d) | BLvl: %d | Job: %s (Lvl: %d)", pl_sd->status.name, pl_GM_level, pl_sd->status.base_level, job_name(pl_sd->status.class_), pl_sd->status.job_level);
- else
- sprintf(atcmd_output, "Name: %s | BLvl: %d | Job: %s (Lvl: %d)", pl_sd->status.name, pl_sd->status.base_level, job_name(pl_sd->status.class_), pl_sd->status.job_level);
- clif_displaymessage(fd, atcmd_output);
- count++;
- }
- }
- }
- }
-
- if (count == 0)
- sprintf(atcmd_output, msg_table[54], map[map_id].name); // No player found in map '%s'.
- else if (count == 1)
- sprintf(atcmd_output, msg_table[55], map[map_id].name); // 1 player found in map '%s'.
- else {
- sprintf(atcmd_output, msg_table[56], count, map[map_id].name); // %d players found in map '%s'.
- }
- clif_displaymessage(fd, atcmd_output);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_whomap3(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char temp0[100];
- char temp1[100];
- struct map_session_data *pl_sd;
- int i, count;
- int pl_GM_level, GM_level;
- int map_id = 0;
- char map_name[100];
- struct guild *g;
- struct party *p;
-
- nullpo_retr(-1, sd);
-
- memset(temp0, '\0', sizeof(temp0));
- memset(temp1, '\0', sizeof(temp1));
- memset(atcmd_output, '\0', sizeof(atcmd_output));
- memset(map_name, '\0', sizeof(map_name));
-
- if (!message || !*message)
- map_id = sd->bl.m;
- else {
- sscanf(message, "%99s", map_name);
- if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
- strcat(map_name, ".gat");
- if ((map_id = map_mapname2mapid(map_name)) < 0)
- map_id = sd->bl.m;
- }
-
- count = 0;
- GM_level = pc_isGM(sd);
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth) {
- pl_GM_level = pc_isGM(pl_sd);
- if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level
- if (pl_sd->bl.m == map_id) {
- g = guild_search(pl_sd->status.guild_id);
- if (g == NULL)
- sprintf(temp1, "None");
- else
- sprintf(temp1, "%s", g->name);
- p = party_search(pl_sd->status.party_id);
- if (p == NULL)
- sprintf(temp0, "None");
- else
- sprintf(temp0, "%s", p->name);
- if (pl_GM_level > 0)
- sprintf(atcmd_output, "Name: %s (GM:%d) | Party: '%s' | Guild: '%s'", pl_sd->status.name, pl_GM_level, temp0, temp1);
- else
- sprintf(atcmd_output, "Name: %s | Party: '%s' | Guild: '%s'", pl_sd->status.name, temp0, temp1);
- clif_displaymessage(fd, atcmd_output);
- count++;
- }
- }
- }
- }
-
- if (count == 0)
- sprintf(atcmd_output, msg_table[54], map[map_id].name); // No player found in map '%s'.
- else if (count == 1)
- sprintf(atcmd_output, msg_table[55], map[map_id].name); // 1 player found in map '%s'.
- else {
- sprintf(atcmd_output, msg_table[56], count, map[map_id].name); // %d players found in map '%s'.
- }
- clif_displaymessage(fd, atcmd_output);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_whogm(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char temp0[100];
- char temp1[100];
- struct map_session_data *pl_sd;
- int i, j, count;
- int pl_GM_level, GM_level;
- char match_text[100];
- char player_name[24];
- struct guild *g;
- struct party *p;
-
- nullpo_retr(-1, sd);
-
- memset(temp0, '\0', sizeof(temp0));
- memset(temp1, '\0', sizeof(temp1));
- memset(atcmd_output, '\0', sizeof(atcmd_output));
- memset(match_text, '\0', sizeof(match_text));
- memset(player_name, '\0', sizeof(player_name));
-
- if (sscanf(message, "%99[^\n]", match_text) < 1)
- strcpy(match_text, "");
- for (j = 0; match_text[j]; j++)
- match_text[j] = tolower(match_text[j]);
-
- count = 0;
- GM_level = pc_isGM(sd);
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth) {
- pl_GM_level = pc_isGM(pl_sd);
- if (pl_GM_level > 0) {
- if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level
- memcpy(player_name, pl_sd->status.name, 24);
- for (j = 0; player_name[j]; j++)
- player_name[j] = tolower(player_name[j]);
- if (strstr(player_name, match_text) != NULL) { // search with no case sensitive
- sprintf(atcmd_output, "Name: %s (GM:%d) | Location: %s %d %d", pl_sd->status.name, pl_GM_level, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
- clif_displaymessage(fd, atcmd_output);
- sprintf(atcmd_output, " BLvl: %d | Job: %s (Lvl: %d)", pl_sd->status.base_level, job_name(pl_sd->status.class_), pl_sd->status.job_level);
- clif_displaymessage(fd, atcmd_output);
- g = guild_search(pl_sd->status.guild_id);
- if (g == NULL)
- sprintf(temp1, "None");
- else
- sprintf(temp1, "%s", g->name);
- p = party_search(pl_sd->status.party_id);
- if (p == NULL)
- sprintf(temp0, "None");
- else
- sprintf(temp0, "%s", p->name);
- sprintf(atcmd_output, " Party: '%s' | Guild: '%s'", temp0, temp1);
- clif_displaymessage(fd, atcmd_output);
- count++;
- }
- }
- }
- }
- }
-
- if (count == 0)
- clif_displaymessage(fd, msg_table[150]); // No GM found.
- else if (count == 1)
- clif_displaymessage(fd, msg_table[151]); // 1 GM found.
- else {
- sprintf(atcmd_output, msg_table[152], count); // %d GMs found.
- clif_displaymessage(fd, atcmd_output);
- }
-
- return 0;
-}
-
-int atcommand_whozeny(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i, j, count,c;
- char match_text[100];
- char player_name[24];
- //int zeny[clif_countusers()];
- //int counted[clif_countusers()];
- int *zeny = (int *)aCallocA(clif_countusers(), sizeof(int));
- int *counted = (int *)aCallocA(clif_countusers(), sizeof(int));
-
- nullpo_retr(-1, sd);
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
- memset(match_text, '\0', sizeof(match_text));
- memset(player_name, '\0', sizeof(player_name));
-
- if (sscanf(message, "%99[^\n]", match_text) < 1)
- strcpy(match_text, "");
- for (j = 0; match_text[j]; j++)
- match_text[j] = tolower(match_text[j]);
-
- count = 0;
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth) {
- memcpy(player_name, pl_sd->status.name, 24);
- for (j = 0; player_name[j]; j++)
- player_name[j] = tolower(player_name[j]);
- if (strstr(player_name, match_text) != NULL) { // search with no case sensitive
- zeny[count]=pl_sd->status.zeny;
- counted[i]=0;
- count++;
- }
- }
- }
-
- qsort(zeny, count, sizeof(int), hightolow_compare);
- for (c = 0; c < count && c < 50; c++) {
- if(!zeny[c])
- continue;
- for (i = 0; i < fd_max; i++) {
- if(!zeny[c])
- continue;
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth && zeny[c] && counted[i]==0) {
- if(pl_sd->status.zeny==zeny[c]) {
- sprintf(atcmd_output, "Name: %s | Zeny: %d", pl_sd->status.name, pl_sd->status.zeny);
- clif_displaymessage(fd, atcmd_output);
- zeny[c]=0;
- counted[i]=1;
- }
- }
- }
- }
-
- if (count == 0)
- clif_displaymessage(fd, msg_table[28]); // No player found.
- else if (count == 1)
- clif_displaymessage(fd, msg_table[29]); // 1 player found.
- else {
- sprintf(atcmd_output, msg_table[30], count); // %d players found.
- clif_displaymessage(fd, atcmd_output);
- }
-
- aFree(zeny);
- aFree(counted);
-
- return 0;
-}
-
-
-// cause random emote on all online players [Valaris]
-int atcommand_happyhappyjoyjoy(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i,e;
-
- nullpo_retr(-1, sd);
-
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth) {
- e=rand()%40;
- if(e==34)
- e = 0;
- clif_emotion(&pl_sd->bl,e);
- }
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_save(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
-
- pc_setsavepoint(sd, sd->mapname, sd->bl.x, sd->bl.y);
- if (sd->status.pet_id > 0 && sd->pd)
- intif_save_petdata(sd->status.account_id, &sd->pet);
- pc_makesavestatus(sd);
- chrif_save(sd);
- storage_storage_save(sd);
- clif_displaymessage(fd, msg_table[6]); // Character data respawn point saved.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_load(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int m;
-
- nullpo_retr(-1, sd);
-
- m = map_mapname2mapid(sd->status.save_point.map);
- if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, msg_table[249]);
- return -1;
- }
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, msg_table[248]);
- return -1;
- }
-
- pc_setpos(sd, sd->status.save_point.map, sd->status.save_point.x, sd->status.save_point.y, 0);
- clif_displaymessage(fd, msg_table[7]); // Warping to respawn point.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_speed(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int speed;
-
- nullpo_retr(-1, sd);
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || !*message) {
- sprintf(atcmd_output, "Please, enter a speed value (usage: @speed <%d-%d>).", MIN_WALK_SPEED, MAX_WALK_SPEED);
- clif_displaymessage(fd, atcmd_output);
- return -1;
- }
-
- speed = atoi(message);
- if (speed >= MIN_WALK_SPEED && speed <= MAX_WALK_SPEED) {
- sd->speed = speed;
- //sd->walktimer = x;
- //‚±‚Ì•¶‚ð’ljÁ by ‚ê‚
- clif_updatestatus(sd, SP_SPEED);
- clif_displaymessage(fd, msg_table[8]); // Speed changed.
- } else {
- sprintf(atcmd_output, "Please, enter a valid speed value (usage: @speed <%d-%d>).", MIN_WALK_SPEED, MAX_WALK_SPEED);
- clif_displaymessage(fd, atcmd_output);
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_storage(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct storage *stor; //changes from Freya/Yor
- nullpo_retr(-1, sd);
-
- if (sd->state.storage_flag == 1) {
- clif_displaymessage(fd, msg_table[250]);
- return -1;
- }
-
- if ((stor = account2storage2(sd->status.account_id)) != NULL && stor->storage_status == 1) {
- clif_displaymessage(fd, msg_table[250]);
- return -1;
- }
-
- storage_storageopen(sd);
-
- return 0;
-}
-
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_guildstorage(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct storage *stor; //changes from Freya/Yor
- nullpo_retr(-1, sd);
-
- if (sd->status.guild_id > 0) {
- if (sd->state.storage_flag == 1) {
- clif_displaymessage(fd, msg_table[251]);
- return -1;
- }
- if ((stor = account2storage2(sd->status.account_id)) != NULL && stor->storage_status == 1) {
- clif_displaymessage(fd, msg_table[251]);
- return -1;
- }
- storage_guild_storageopen(sd);
- } else {
- clif_displaymessage(fd, msg_table[252]);
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_option(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int param1 = 0, param2 = 0, param3 = 0;
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%d %d %d", &param1, &param2, &param3) < 1 || param1 < 0 || param2 < 0 || param3 < 0) {
- clif_displaymessage(fd, "Please, enter at least a option (usage: @option <param1:0+> <param2:0+> <param3:0+>).");
- return -1;
- }
-
- sd->opt1 = param1;
- sd->opt2 = param2;
- if (!(sd->status.option & CART_MASK) && param3 & CART_MASK) {
- clif_cart_itemlist(sd);
- clif_cart_equiplist(sd);
- clif_updatestatus(sd, SP_CARTINFO);
- }
- sd->status.option = param3;
- // fix pecopeco display
- if (sd->status.class_ == 13 || sd->status.class_ == 21 || sd->status.class_ == 4014 || sd->status.class_ == 4022) {
- if (!pc_isriding(sd)) { // sd have the new value...
- if (sd->status.class_ == 13)
- sd->status.class_ = sd->view_class = 7;
- else if (sd->status.class_ == 21)
- sd->status.class_ = sd->view_class = 14;
- else if (sd->status.class_ == 4014)
- sd->status.class_ = sd->view_class = 4008;
- else if (sd->status.class_ == 4022)
- sd->status.class_ = sd->view_class = 4015;
- }
- } else {
- if (pc_isriding(sd)) { // sd have the new value...
- if (sd->disguise > 0) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] (code added by [Yor])
- sd->status.option &= ~0x0020;
- } else {
- if (sd->status.class_ == 7)
- sd->status.class_ = sd->view_class = 13;
- else if (sd->status.class_ == 14)
- sd->status.class_ = sd->view_class = 21;
- else if (sd->status.class_ == 4008)
- sd->status.class_ = sd->view_class = 4014;
- else if (sd->status.class_ == 4015)
- sd->status.class_ = sd->view_class = 4022;
- else
- sd->status.option &= ~0x0020;
- }
- }
- }
-
- clif_changeoption(&sd->bl);
- status_calc_pc(sd, 0);
- clif_displaymessage(fd, msg_table[9]); // Options changed.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_hide(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- if (sd->status.option & OPTION_HIDE) {
- sd->status.option &= ~OPTION_HIDE;
- clif_displaymessage(fd, msg_table[10]); // Invisible: Off
- } else {
- sd->status.option |= OPTION_HIDE;
- clif_displaymessage(fd, msg_table[11]); // Invisible: On
- }
- clif_changeoption(&sd->bl);
-
- return 0;
-}
-
-/*==========================================
- * “]E‚·‚é upper‚ðŽw’è‚·‚é‚Æ“]¶‚â—{Žq‚É‚à‚È‚ê‚é
- *------------------------------------------
- */
-int atcommand_jobchange(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int job = 0, upper = 0;
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%d %d", &job, &upper) < 1) {
-
- int i, found = 0;
- const struct { char name[16]; int id; } jobs[] = {
- { "novice", 0 },
- { "swordsman", 1 },
- { "mage", 2 },
- { "archer", 3 },
- { "acolyte", 4 },
- { "merchant", 5 },
- { "thief", 6 },
- { "knight", 7 },
- { "priest", 8 },
- { "priestess", 8 },
- { "wizard", 9 },
- { "blacksmith", 10 },
- { "hunter", 11 },
- { "assassin", 12 },
- { "crusader", 14 },
- { "monk", 15 },
- { "sage", 16 },
- { "rogue", 17 },
- { "alchemist", 18 },
- { "bard", 19 },
- { "dancer", 20 },
- { "super novice", 23 },
- { "supernovice", 23 },
- { "high novice", 4001 },
- { "swordsman high", 4002 },
- { "mage high", 4003 },
- { "archer high", 4004 },
- { "acolyte high", 4005 },
- { "merchant high", 4006 },
- { "thief high", 4007 },
- { "lord knight", 4008 },
- { "high priest", 4009 },
- { "high priestess", 4009 },
- { "high wizard", 4010 },
- { "whitesmith", 4011 },
- { "sniper", 4012 },
- { "assassin cross", 4013 },
- { "paladin", 4015 },
- { "champion", 4016 },
- { "professor", 4017 },
- { "stalker", 4018 },
- { "creator", 4019 },
- { "clown", 4020 },
- { "gypsy", 4021 },
- { "baby novice", 4023 },
- { "baby swordsman", 4024 },
- { "baby mage", 4025 },
- { "baby archer", 4026 },
- { "baby acolyte", 4027 },
- { "baby merchant", 4028 },
- { "baby thief", 4029 },
- { "baby knight", 4030 },
- { "baby priest", 4031 },
- { "baby priestess", 4031 },
- { "baby wizard", 4032 },
- { "baby blacksmith",4033 },
- { "baby hunter", 4034 },
- { "baby assassin", 4035 },
- { "baby crusader", 4037 },
- { "baby monk", 4038 },
- { "baby sage", 4039 },
- { "baby rogue", 4040 },
- { "baby alchemist", 4041 },
- { "baby bard", 4042 },
- { "baby dancer", 4043 },
- { "super baby", 4045 },
- };
-
- for (i=0; i < (int)(sizeof(jobs) / sizeof(jobs[0])); i++) {
- if (strncmpi(message, jobs[i].name, 16) == 0) {
- job = jobs[i].id;
- upper = 0;
- found = 1;
- break;
- }
- }
-
- if (!found) {
- clif_displaymessage(fd, "Please, enter job ID (usage: @job/@jobchange <job ID>).");
- return -1;
- }
- }
-
- if (job == 37 ||job == 45)
- return 0;
-
- if ((job >= 0 && job < MAX_PC_CLASS)) {
- int j;
-
- // fix pecopeco display
- if ((job != 13 && job != 21 && job != 4014 && job != 4022)) {
- if (pc_isriding(sd)) {
- if (sd->status.class_ == 13)
- sd->status.class_ = sd->view_class = 7;
- if (sd->status.class_ == 21)
- sd->status.class_ = sd->view_class = 14;
- if (sd->status.class_ == 4014)
- sd->status.class_ = sd->view_class = 4008;
- if (sd->status.class_ == 4022)
- sd->status.class_ = sd->view_class = 4015;
- sd->status.option &= ~0x0020;
- clif_changeoption(&sd->bl);
- status_calc_pc(sd, 0);
- }
- } else {
- if (!pc_isriding(sd)) {
- if (job == 13)
- job = 7;
- if (job == 21)
- job = 14;
- if (job == 4014)
- job = 4008;
- if (job == 4022)
- job = 4015;
- }
- }
- for (j=0; j < MAX_INVENTORY; j++) {
- if(sd->status.inventory[j].nameid>0 && sd->status.inventory[j].equip!=0)
- pc_unequipitem(sd, j, 3);
- }
- if (pc_jobchange(sd, job, upper) == 0)
- clif_displaymessage(fd, msg_table[12]); // Your job has been changed.
- else {
- clif_displaymessage(fd, msg_table[155]); // Impossible to change your job.
- return -1;
- }
- } else {
- clif_displaymessage(fd, "Please, enter a valid job ID (usage: @job/@jobchange <job ID>).");
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_die(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- clif_specialeffect(&sd->bl,450,1);
- pc_damage(NULL, sd, sd->status.hp + 1);
- clif_displaymessage(fd, msg_table[13]); // A pity! You've died.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_kill(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @kill <char name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can kill only lower or same level
- pc_damage(NULL, pl_sd, pl_sd->status.hp + 1);
- clif_displaymessage(fd, msg_table[14]); // Character killed.
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_alive(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- if (pc_isdead(sd)) {
- sd->status.hp = sd->status.max_hp;
- sd->status.sp = sd->status.max_sp;
- clif_skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1);
- pc_setstand(sd);
- if (battle_config.pc_invincible_time > 0)
- pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
- clif_updatestatus(sd, SP_HP);
- clif_updatestatus(sd, SP_SP);
- clif_resurrection(&sd->bl, 1);
- clif_displaymessage(fd, msg_table[16]); // You've been revived! It's a miracle!
- return 0;
- }
- return -1;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_kami(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || !*message) {
- clif_displaymessage(fd, "Please, enter a message (usage: @kami <message>).");
- return -1;
- }
-
- sscanf(message, "%199[^\n]", atcmd_output);
- intif_GMmessage(atcmd_output, strlen(atcmd_output) + 1, (*(command + 5) == 'b') ? 0x10 : 0);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_heal(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int hp = 0, sp = 0; // [Valaris] thanks to fov
- nullpo_retr(-1, sd);
-
- sscanf(message, "%d %d", &hp, &sp);
-
- if (hp == 0 && sp == 0) {
- hp = sd->status.max_hp - sd->status.hp;
- sp = sd->status.max_sp - sd->status.sp;
- } else {
- if (hp > 0 && (hp > sd->status.max_hp || hp > (sd->status.max_hp - sd->status.hp))) // fix positiv overflow
- hp = sd->status.max_hp - sd->status.hp;
- else if (hp < 0 && (hp < -sd->status.max_hp || hp < (1 - sd->status.hp))) // fix negativ overflow
- hp = 1 - sd->status.hp;
- if (sp > 0 && (sp > sd->status.max_sp || sp > (sd->status.max_sp - sd->status.sp))) // fix positiv overflow
- sp = sd->status.max_sp - sd->status.sp;
- else if (sp < 0 && (sp < -sd->status.max_sp || sp < (1 - sd->status.sp))) // fix negativ overflow
- sp = 1 - sd->status.sp;
- }
-
- if (hp > 0) // display like heal
- clif_heal(fd, SP_HP, hp);
- else if (hp < 0) // display like damage
- clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, -hp, 0 , 4, 0);
- if (sp > 0) // no display when we lost SP
- clif_heal(fd, SP_SP, sp);
-
- if (hp != 0 || sp != 0) {
- pc_heal(sd, hp, sp);
- if (hp >= 0 && sp >= 0)
- clif_displaymessage(fd, msg_table[17]); // HP, SP recovered.
- else
- clif_displaymessage(fd, msg_table[156]); // HP or/and SP modified.
- } else {
- clif_displaymessage(fd, msg_table[157]); // HP and SP are already with the good value.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @item command (usage: @item <name/id_of_item> <quantity>) (modified by [Yor] for pet_egg)
- *------------------------------------------
- */
-int atcommand_item(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char item_name[100];
- int number = 0, item_id, flag;
- struct item item_tmp;
- struct item_data *item_data;
- int get_count, i, pet_id;
- nullpo_retr(-1, sd);
-
- memset(item_name, '\0', sizeof(item_name));
-
- if (!message || !*message || sscanf(message, "%99s %d", item_name, &number) < 1) {
- clif_displaymessage(fd, "Please, enter an item name/id (usage: @item <item name or ID> [quantity]).");
- return -1;
- }
-
- if (number <= 0)
- number = 1;
-
- item_id = 0;
- if ((item_data = itemdb_searchname(item_name)) != NULL ||
- (item_data = itemdb_exists(atoi(item_name))) != NULL)
- item_id = item_data->nameid;
-
- if (item_id >= 500) {
- get_count = number;
- // check pet egg
- pet_id = search_petDB_index(item_id, PET_EGG);
- if (item_data->type == 4 || item_data->type == 5 ||
- item_data->type == 7 || item_data->type == 8) {
- get_count = 1;
- }
- for (i = 0; i < number; i += get_count) {
- // if pet egg
- if (pet_id >= 0) {
- sd->catch_target_class = pet_db[pet_id].class_;
- intif_create_pet(sd->status.account_id, sd->status.char_id,
- (short)pet_db[pet_id].class_, (short)mob_db[pet_db[pet_id].class_].lv,
- (short)pet_db[pet_id].EggID, 0, (short)pet_db[pet_id].intimate,
- 100, 0, 1, pet_db[pet_id].jname);
- // if not pet egg
- } else {
- memset(&item_tmp, 0, sizeof(item_tmp));
- item_tmp.nameid = item_id;
- item_tmp.identify = 1;
- if ((flag = pc_additem((struct map_session_data*)sd, &item_tmp, get_count)))
- clif_additem((struct map_session_data*)sd, 0, 0, flag);
- }
- }
- clif_displaymessage(fd, msg_table[18]); // Item created.
- } else {
- clif_displaymessage(fd, msg_table[19]); // Invalid item ID or name.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_item2(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct item item_tmp;
- struct item_data *item_data;
- char item_name[100];
- int item_id, number = 0;
- int identify = 0, refine = 0, attr = 0;
- int c1 = 0, c2 = 0, c3 = 0, c4 = 0;
- int flag;
- int loop, get_count, i;
- nullpo_retr(-1, sd);
-
- memset(item_name, '\0', sizeof(item_name));
-
- if (!message || !*message || sscanf(message, "%99s %d %d %d %d %d %d %d %d", item_name, &number, &identify, &refine, &attr, &c1, &c2, &c3, &c4) < 9) {
- clif_displaymessage(fd, "Please, enter all informations (usage: @item2 <item name or ID> <quantity>");
- clif_displaymessage(fd, " <Identify_flag> <refine> <attribut> <Card1> <Card2> <Card3> <Card4>).");
- return -1;
- }
-
- if (number <= 0)
- number = 1;
-
- item_id = 0;
- if ((item_data = itemdb_searchname(item_name)) != NULL ||
- (item_data = itemdb_exists(atoi(item_name))) != NULL)
- item_id = item_data->nameid;
-
- if (item_id > 500) {
- loop = 1;
- get_count = number;
- if (item_data->type == 4 || item_data->type == 5 ||
- item_data->type == 7 || item_data->type == 8) {
- loop = number;
- get_count = 1;
- if (item_data->type == 7) {
- identify = 1;
- refine = 0;
- }
- if (item_data->type == 8)
- refine = 0;
- if (refine > 10)
- refine = 10;
- } else {
- identify = 1;
- refine = attr = 0;
- }
- for (i = 0; i < loop; i++) {
- memset(&item_tmp, 0, sizeof(item_tmp));
- item_tmp.nameid = item_id;
- item_tmp.identify = identify;
- item_tmp.refine = refine;
- item_tmp.attribute = attr;
- item_tmp.card[0] = c1;
- item_tmp.card[1] = c2;
- item_tmp.card[2] = c3;
- item_tmp.card[3] = c4;
- if ((flag = pc_additem(sd, &item_tmp, get_count)))
- clif_additem(sd, 0, 0, flag);
- }
- clif_displaymessage(fd, msg_table[18]); // Item created.
- } else {
- clif_displaymessage(fd, msg_table[19]); // Invalid item ID or name.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_itemreset(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i;
- nullpo_retr(-1, sd);
-
- for (i = 0; i < MAX_INVENTORY; i++) {
- if (sd->status.inventory[i].amount && sd->status.inventory[i].equip == 0)
- pc_delitem(sd, i, sd->status.inventory[i].amount, 0);
- }
- clif_displaymessage(fd, msg_table[20]); // All of your items have been removed.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_itemcheck(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- pc_checkitem(sd);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_baselevelup(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int level, i;
- nullpo_retr(-1, sd);
-
- if (!message || !*message || (level = atoi(message)) == 0) {
- clif_displaymessage(fd, "Please, enter a level adjustement (usage: @lvup/@blevel/@baselvlup <number of levels>).");
- return -1;
- }
-
- if (level > 0) {
- if (sd->status.base_level == battle_config.maximum_level) { // check for max level by Valaris
- clif_displaymessage(fd, msg_table[47]); // Base level can't go any higher.
- return -1;
- } // End Addition
- if ((unsigned int)level > battle_config.maximum_level || (unsigned int)level > (battle_config.maximum_level - sd->status.base_level)) // fix positiv overflow
- level = battle_config.maximum_level - sd->status.base_level;
- for (i = 1; i <= level; i++)
- sd->status.status_point += (sd->status.base_level + i + 14) / 5;
- sd->status.base_level += level;
- clif_updatestatus(sd, SP_BASELEVEL);
- clif_updatestatus(sd, SP_NEXTBASEEXP);
- clif_updatestatus(sd, SP_STATUSPOINT);
- status_calc_pc(sd, 0);
- pc_heal(sd, sd->status.max_hp, sd->status.max_sp);
- clif_misceffect(&sd->bl, 0);
- clif_displaymessage(fd, msg_table[21]); // Base level raised.
- } else {
- if (sd->status.base_level == 1) {
- clif_displaymessage(fd, msg_table[158]); // Base level can't go any lower.
- return -1;
- }
- if (level < -(int)battle_config.maximum_level || level < (1 - (int)sd->status.base_level)) // fix negativ overflow
- level = 1 - sd->status.base_level;
- if (sd->status.status_point > 0) {
- for (i = 0; i > level; i--)
- sd->status.status_point -= (sd->status.base_level + i + 14) / 5;
- if (sd->status.status_point < 0)
- sd->status.status_point = 0;
- clif_updatestatus(sd, SP_STATUSPOINT);
- } // to add: remove status points from stats
- sd->status.base_level += level;
- clif_updatestatus(sd, SP_BASELEVEL);
- clif_updatestatus(sd, SP_NEXTBASEEXP);
- status_calc_pc(sd, 0);
- clif_displaymessage(fd, msg_table[22]); // Base level lowered.
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_joblevelup(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- unsigned int up_level = 50;
- int level;
- struct pc_base_job s_class;
- nullpo_retr(-1, sd);
- s_class = pc_calc_base_job(sd->status.class_);
-
- if (!message || !*message || (level = atoi(message)) == 0) {
- clif_displaymessage(fd, "Please, enter a level adjustement (usage: @joblvup/@jlevel/@joblvlup <number of levels>).");
- return -1;
- }
-
- if (s_class.job == 0)
- up_level -= 40;
- // super novices can go up to 99 [celest]
- else if (s_class.job == 23)
- up_level += 49;
- else if (sd->status.class_ > 4007 && sd->status.class_ < 4023)
- up_level += 20;
-
- if (level > 0) {
- if (sd->status.job_level == up_level) {
- clif_displaymessage(fd, msg_table[23]); // Job level can't go any higher.
- return -1;
- }
- if ((unsigned int)level > up_level || (unsigned int)level > (up_level - sd->status.job_level)) // fix positiv overflow
- level = up_level - sd->status.job_level;
- sd->status.job_level += level;
- clif_updatestatus(sd, SP_JOBLEVEL);
- clif_updatestatus(sd, SP_NEXTJOBEXP);
- sd->status.skill_point += level;
- clif_updatestatus(sd, SP_SKILLPOINT);
- status_calc_pc(sd, 0);
- clif_misceffect(&sd->bl, 1);
- clif_displaymessage(fd, msg_table[24]); // Job level raised.
- } else {
- if (sd->status.job_level == 1) {
- clif_displaymessage(fd, msg_table[159]); // Job level can't go any lower.
- return -1;
- }
- if (level < -(int)up_level || level < (1 - (int)sd->status.job_level)) // fix negativ overflow
- level = 1 - sd->status.job_level;
- sd->status.job_level += level;
- clif_updatestatus(sd, SP_JOBLEVEL);
- clif_updatestatus(sd, SP_NEXTJOBEXP);
- if (sd->status.skill_point > 0) {
- sd->status.skill_point += level;
- if (sd->status.skill_point < 0)
- sd->status.skill_point = 0;
- clif_updatestatus(sd, SP_SKILLPOINT);
- } // to add: remove status points from skills
- status_calc_pc(sd, 0);
- clif_displaymessage(fd, msg_table[25]); // Job level lowered.
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_help(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char buf[2048], w1[2048], w2[2048];
- int i, gm_level;
- FILE* fp;
- nullpo_retr(-1, sd);
-
- memset(buf, '\0', sizeof(buf));
-
- if ((fp = fopen(help_txt, "r")) != NULL) {
- clif_displaymessage(fd, msg_table[26]); // Help commands:
- gm_level = pc_isGM(sd);
- while(fgets(buf, sizeof(buf) - 1, fp) != NULL) {
- if (buf[0] == '/' && buf[1] == '/')
- continue;
- for (i = 0; buf[i] != '\0'; i++) {
- if (buf[i] == '\r' || buf[i] == '\n') {
- buf[i] = '\0';
- break;
- }
- }
- if (sscanf(buf, "%2047[^:]:%2047[^\n]", w1, w2) < 2)
- clif_displaymessage(fd, buf);
- else if (gm_level >= atoi(w1))
- clif_displaymessage(fd, w2);
- }
- fclose(fp);
- } else {
- clif_displaymessage(fd, msg_table[27]); // File help.txt not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_gm(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char password[100];
- nullpo_retr(-1, sd);
-
- memset(password, '\0', sizeof(password));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", password) < 1) {
- clif_displaymessage(fd, "Please, enter a password (usage: @gm <password>).");
- return -1;
- }
-
- if (pc_isGM(sd)) { // a GM can not use this function. only a normal player (become gm is not for gm!)
- clif_displaymessage(fd, msg_table[50]); // You already have some GM powers.
- return -1;
- } else
- chrif_changegm(sd->status.account_id, password, strlen(password) + 1);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_pvpoff(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
- nullpo_retr(-1, sd);
-
- if (battle_config.pk_mode) { //disable command if server is in PK mode [Valaris]
- clif_displaymessage(fd, msg_table[52]); // This option cannot be used in PK Mode.
- return -1;
- }
-
- if (map[sd->bl.m].flag.pvp) {
- map[sd->bl.m].flag.pvp = 0;
- clif_send0199(sd->bl.m, 0);
- for (i = 0; i < fd_max; i++) { //l”•ªƒ‹[ƒv
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth) {
- if (sd->bl.m == pl_sd->bl.m) {
- clif_pvpset(pl_sd, 0, 0, 2);
- if (pl_sd->pvp_timer != -1) {
- delete_timer(pl_sd->pvp_timer, pc_calc_pvprank_timer);
- pl_sd->pvp_timer = -1;
- }
- }
- }
- }
- clif_displaymessage(fd, msg_table[31]); // PvP: Off.
- } else {
- clif_displaymessage(fd, msg_table[160]); // PvP is already Off.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_pvpon(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
- nullpo_retr(-1, sd);
-
- if (battle_config.pk_mode) { //disable command if server is in PK mode [Valaris]
- clif_displaymessage(fd, msg_table[52]); // This option cannot be used in PK Mode.
- return -1;
- }
-
- if (!map[sd->bl.m].flag.pvp && !map[sd->bl.m].flag.nopvp) {
- map[sd->bl.m].flag.pvp = 1;
- clif_send0199(sd->bl.m, 1);
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth) {
- if (sd->bl.m == pl_sd->bl.m && pl_sd->pvp_timer == -1) {
- pl_sd->pvp_timer = add_timer(gettick() + 200,
- pc_calc_pvprank_timer, pl_sd->bl.id, 0);
- pl_sd->pvp_rank = 0;
- pl_sd->pvp_lastusers = 0;
- pl_sd->pvp_point = 5;
- }
- }
- }
- clif_displaymessage(fd, msg_table[32]); // PvP: On.
- } else {
- clif_displaymessage(fd, msg_table[161]); // PvP is already On.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_gvgoff(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- if (map[sd->bl.m].flag.gvg) {
- map[sd->bl.m].flag.gvg = 0;
- clif_send0199(sd->bl.m, 0);
- clif_displaymessage(fd, msg_table[33]); // GvG: Off.
- } else {
- clif_displaymessage(fd, msg_table[162]); // GvG is already Off.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_gvgon(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- if (!map[sd->bl.m].flag.gvg) {
- map[sd->bl.m].flag.gvg = 1;
- clif_send0199(sd->bl.m, 3);
- clif_displaymessage(fd, msg_table[34]); // GvG: On.
- } else {
- clif_displaymessage(fd, msg_table[163]); // GvG is already On.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_model(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int hair_style = 0, hair_color = 0, cloth_color = 0;
- nullpo_retr(-1, sd);
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || !*message || sscanf(message, "%d %d %d", &hair_style, &hair_color, &cloth_color) < 1) {
- sprintf(atcmd_output, "Please, enter at least a value (usage: @model <hair ID: %d-%d> <hair color: %d-%d> <clothes color: %d-%d>).",
- MIN_HAIR_STYLE, MAX_HAIR_STYLE, MIN_HAIR_COLOR, MAX_HAIR_COLOR, MIN_CLOTH_COLOR, MAX_CLOTH_COLOR);
- clif_displaymessage(fd, atcmd_output);
- return -1;
- }
-
- if (hair_style >= MIN_HAIR_STYLE && hair_style <= MAX_HAIR_STYLE &&
- hair_color >= MIN_HAIR_COLOR && hair_color <= MAX_HAIR_COLOR &&
- cloth_color >= MIN_CLOTH_COLOR && cloth_color <= MAX_CLOTH_COLOR) {
- //•ž‚ÌF•ÏX
- if (cloth_color != 0 && sd->status.sex == 1 && (sd->status.class_ == 12 || sd->status.class_ == 17)) {
- //•ž‚ÌF–¢ŽÀ‘•E‚Ì”»’è
- clif_displaymessage(fd, msg_table[35]); // You can't use this command with this class.
- return -1;
- } else {
- pc_changelook(sd, LOOK_HAIR, hair_style);
- pc_changelook(sd, LOOK_HAIR_COLOR, hair_color);
- pc_changelook(sd, LOOK_CLOTHES_COLOR, cloth_color);
- clif_displaymessage(fd, msg_table[36]); // Appearence changed.
- }
- } else {
- clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @dye && @ccolor
- *------------------------------------------
- */
-int atcommand_dye(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
- int cloth_color = 0;
- nullpo_retr(-1, sd);
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || !*message || sscanf(message, "%d", &cloth_color) < 1) {
- sprintf(atcmd_output, "Please, enter a clothes color (usage: @dye/@ccolor <clothes color: %d-%d>).", MIN_CLOTH_COLOR, MAX_CLOTH_COLOR);
- clif_displaymessage(fd, atcmd_output);
- return -1;
- }
-
- if (cloth_color >= MIN_CLOTH_COLOR && cloth_color <= MAX_CLOTH_COLOR) {
- pc_changelook(sd, LOOK_CLOTHES_COLOR, cloth_color);
- clif_displaymessage(fd, msg_table[36]); // Appearence changed.
- } else {
- clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @hairstyle && @hstyle
- *------------------------------------------
- */
-int atcommand_hair_style(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
- int hair_style = 0;
- nullpo_retr(-1, sd);
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || !*message || sscanf(message, "%d", &hair_style) < 1) {
- sprintf(atcmd_output, "Please, enter a hair style (usage: @hairstyle/@hstyle <hair ID: %d-%d>).", MIN_HAIR_STYLE, MAX_HAIR_STYLE);
- clif_displaymessage(fd, atcmd_output);
- return -1;
- }
-
- if (hair_style >= MIN_HAIR_STYLE && hair_style <= MAX_HAIR_STYLE) {
- if (hair_style != 0 && sd->status.sex == 1 && (sd->status.class_ == 12 || sd->status.class_ == 17)) {
- clif_displaymessage(fd, msg_table[35]); // You can't use this command with this class.
- return -1;
- } else {
- pc_changelook(sd, LOOK_HAIR, hair_style);
- clif_displaymessage(fd, msg_table[36]); // Appearence changed.
- }
- } else {
- clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @charhairstyle by [MouseJstr]
- *------------------------------------------
- */
-int
-atcommand_charhairstyle(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- return 0;
-}
-
-/*==========================================
- * @haircolor && @hcolor
- *------------------------------------------
- */
-int atcommand_hair_color(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
- int hair_color = 0;
- nullpo_retr(-1, sd);
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || !*message || sscanf(message, "%d", &hair_color) < 1) {
- sprintf(atcmd_output, "Please, enter a hair color (usage: @haircolor/@hcolor <hair color: %d-%d>).", MIN_HAIR_COLOR, MAX_HAIR_COLOR);
- clif_displaymessage(fd, atcmd_output);
- return -1;
- }
-
- if (hair_color >= MIN_HAIR_COLOR && hair_color <= MAX_HAIR_COLOR) {
- if (hair_color != 0 && sd->status.sex == 1 && (sd->status.class_ == 12 || sd->status.class_ == 17)) {
- clif_displaymessage(fd, msg_table[35]); // You can't use this command with this class.
- return -1;
- } else {
- pc_changelook(sd, LOOK_HAIR_COLOR, hair_color);
- clif_displaymessage(fd, msg_table[36]); // Appearence changed.
- }
- } else {
- clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @go [city_number/city_name]: improved by [yor] to add city names and help
- *------------------------------------------
- */
-int atcommand_go(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i;
- int town;
- char map_name[100];
- int m;
-
- const struct { char map[16]; int x, y; } data[] = {
- { "prontera.gat", 156, 191 }, // 0=Prontera
- { "morocc.gat", 156, 93 }, // 1=Morroc
- { "geffen.gat", 119, 59 }, // 2=Geffen
- { "payon.gat", 162, 233 }, // 3=Payon
- { "alberta.gat", 192, 147 }, // 4=Alberta
- { "izlude.gat", 128, 114 }, // 5=Izlude
- { "aldebaran.gat",140, 131 }, // 6=Al de Baran
- { "xmas.gat", 147, 134 }, // 7=Lutie
- { "comodo.gat", 209, 143 }, // 8=Comodo
- { "yuno.gat", 157, 51 }, // 9=Yuno
- { "amatsu.gat", 198, 84 }, // 10=Amatsu
- { "gonryun.gat", 160, 120 }, // 11=Gon Ryun
- { "umbala.gat", 89, 157 }, // 12=Umbala
- { "niflheim.gat", 21, 153 }, // 13=Niflheim
- { "louyang.gat", 217, 40 }, // 14=Lou Yang
- { "new_1-1.gat", 53, 111 }, // 15=Start point
- { "sec_pri.gat", 23, 61 }, // 16=Prison
- { "jawaii.gat", 249, 127 }, // 17=Jawaii
- { "ayothaya.gat", 151, 117 }, // 18=Ayothaya
- };
-
- nullpo_retr(-1, sd);
-
- if(map[sd->bl.m].flag.nogo) {
- clif_displaymessage(sd->fd,"You can not use @go on this map.");
- return 0;
- }
-
- memset(map_name, '\0', sizeof(map_name));
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- // get the number
- town = atoi(message);
-
- // if no value, display all value
- if (!message || !*message || sscanf(message, "%99s", map_name) < 1 || town < -3 || town >= (int)(sizeof(data) / sizeof(data[0]))) {
- clif_displaymessage(fd, msg_table[38]); // Invalid location number or name.
- clif_displaymessage(fd, msg_table[82]); // Please, use one of this number/name:
- clif_displaymessage(fd, "-3=(Memo point 2) 4=Alberta 11=Gon Ryun");
- clif_displaymessage(fd, "-2=(Memo point 1) 5=Izlude 12=Umbala");
- clif_displaymessage(fd, "-1=(Memo point 0) 6=Al de Baran 13=Niflheim");
- clif_displaymessage(fd, " 0=Prontera 7=Lutie 14=Lou Yang");
- clif_displaymessage(fd, " 1=Morroc 8=Comodo 15=Start point");
- clif_displaymessage(fd, " 2=Geffen 9=Yuno 16=Prison");
- clif_displaymessage(fd, " 3=Payon 10=Amatsu 17=Jawaii");
- clif_displaymessage(fd, " 18=Ayothaya");
- return -1;
- } else {
- // get possible name of the city and add .gat if not in the name
- map_name[sizeof(map_name)-1] = '\0';
- for (i = 0; map_name[i]; i++)
- map_name[i] = tolower(map_name[i]);
- if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
- strcat(map_name, ".gat");
- // try to see if it's a name, and not a number (try a lot of possibilities, write errors and abbreviations too)
- if (strncmp(map_name, "prontera.gat", 3) == 0) { // 3 first characters
- town = 0;
- } else if (strncmp(map_name, "morocc.gat", 3) == 0) { // 3 first characters
- town = 1;
- } else if (strncmp(map_name, "geffen.gat", 3) == 0) { // 3 first characters
- town = 2;
- } else if (strncmp(map_name, "payon.gat", 3) == 0 || // 3 first characters
- strncmp(map_name, "paion.gat", 3) == 0) { // writing error (3 first characters)
- town = 3;
- } else if (strncmp(map_name, "alberta.gat", 3) == 0) { // 3 first characters
- town = 4;
- } else if (strncmp(map_name, "izlude.gat", 3) == 0 || // 3 first characters
- strncmp(map_name, "islude.gat", 3) == 0) { // writing error (3 first characters)
- town = 5;
- } else if (strncmp(map_name, "aldebaran.gat", 3) == 0 || // 3 first characters
- strcmp(map_name, "al.gat") == 0) { // al (de baran)
- town = 6;
- } else if (strncmp(map_name, "lutie.gat", 3) == 0 || // name of the city, not name of the map (3 first characters)
- strcmp(map_name, "christmas.gat") == 0 || // name of the symbol
- strncmp(map_name, "xmas.gat", 3) == 0 || // 3 first characters
- strncmp(map_name, "x-mas.gat", 3) == 0) { // writing error (3 first characters)
- town = 7;
- } else if (strncmp(map_name, "comodo.gat", 3) == 0) { // 3 first characters
- town = 8;
- } else if (strncmp(map_name, "yuno.gat", 3) == 0) { // 3 first characters
- town = 9;
- } else if (strncmp(map_name, "amatsu.gat", 3) == 0 || // 3 first characters
- strncmp(map_name, "ammatsu.gat", 3) == 0) { // writing error (3 first characters)
- town = 10;
- } else if (strncmp(map_name, "gonryun.gat", 3) == 0) { // 3 first characters
- town = 11;
- } else if (strncmp(map_name, "umbala.gat", 3) == 0) { // 3 first characters
- town = 12;
- } else if (strncmp(map_name, "niflheim.gat", 3) == 0) { // 3 first characters
- town = 13;
- } else if (strncmp(map_name, "louyang.gat", 3) == 0) { // 3 first characters
- town = 14;
- } else if (strncmp(map_name, "new_1-1.gat", 3) == 0 || // 3 first characters (or "newbies")
- strncmp(map_name, "startpoint.gat", 3) == 0 || // name of the position (3 first characters)
- strncmp(map_name, "begining.gat", 3) == 0) { // name of the position (3 first characters)
- town = 15;
- } else if (strncmp(map_name, "sec_pri.gat", 3) == 0 || // 3 first characters
- strncmp(map_name, "prison.gat", 3) == 0 || // name of the position (3 first characters)
- strncmp(map_name, "jails.gat", 3) == 0) { // name of the position
- town = 16;
- } else if (strncmp(map_name, "jawaii.gat", 3) == 0 || // 3 first characters
- strncmp(map_name, "jawai.gat", 3) == 0) { // writing error (3 first characters)
- town = 17;
- } else if (strncmp(map_name, "ayothaya.gat", 4) == 0 || // 3 first characters
- strncmp(map_name, "ayotaya.gat", 4) == 0) { // writing error (3 first characters)
- town = 18;
- }
-
- if (town >= -3 && town <= -1) {
- if (sd->status.memo_point[-town-1].map[0]) {
- m = map_mapname2mapid(sd->status.memo_point[-town-1].map);
- if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, msg_table[247]);
- return -1;
- }
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, msg_table[248]);
- return -1;
- }
- if (pc_setpos(sd, sd->status.memo_point[-town-1].map, sd->status.memo_point[-town-1].x, sd->status.memo_point[-town-1].y, 3) == 0) {
- clif_displaymessage(fd, msg_table[0]); // Warped.
- } else {
- clif_displaymessage(fd, msg_table[1]); // Map not found.
- return -1;
- }
- } else {
- sprintf(atcmd_output, msg_table[164], -town-1); // Your memo point #%d doesn't exist.
- clif_displaymessage(fd, atcmd_output);
- return -1;
- }
- } else if (town >= 0 && town < (int)(sizeof(data) / sizeof(data[0]))) {
- m = map_mapname2mapid((char *)data[town].map);
- if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, msg_table[247]);
- return -1;
- }
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, msg_table[248]);
- return -1;
- }
- if (pc_setpos(sd, (char *)data[town].map, data[town].x, data[town].y, 3) == 0) {
- clif_displaymessage(fd, msg_table[0]); // Warped.
- } else {
- clif_displaymessage(fd, msg_table[1]); // Map not found.
- return -1;
- }
- } else { // if you arrive here, you have an error in town variable when reading of names
- clif_displaymessage(fd, msg_table[38]); // Invalid location number or name.
- return -1;
- }
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_monster(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char name[100];
- char monster[100];
- int mob_id;
- int number = 0;
- int x = 0, y = 0;
- int count;
- int i, j, k;
- int mx, my, range;
- nullpo_retr(-1, sd);
-
- memset(name, '\0', sizeof(name));
- memset(monster, '\0', sizeof(monster));
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || !*message ||
- (sscanf(message, "\"%[^\"]\" %99s %d %d %d", name, monster, &number, &x, &y) < 2 &&
- sscanf(message, "%99s \"%[^\"]\" %d %d %d", monster, name, &number, &x, &y) < 2 &&
- sscanf(message, "%99s %99s %d %d %d", name, monster, &number, &x, &y) < 2)) {
- clif_displaymessage(fd, msg_table[80]); // Give a display name and monster name/id please.
- return -1;
- }
-
- if ((mob_id = mobdb_searchname(monster)) == 0) // check name first (to avoid possible name begining by a number)
- mob_id = mobdb_checkid(atoi(monster));
-
- if (mob_id == 0) {
- clif_displaymessage(fd, msg_table[40]); // Invalid monster ID or name.
- return -1;
- }
-
- if (mob_id == 1288) {
- clif_displaymessage(fd, msg_table[83]); // Cannot spawn emperium.
- return -1;
- }
-
- if (number <= 0)
- number = 1;
-
- if (strlen(name) < 1)
- strcpy(name, "--ja--");
-
- // If value of atcommand_spawn_quantity_limit directive is greater than or equal to 1 and quantity of monsters is greater than value of the directive
- if (battle_config.atc_spawn_quantity_limit >= 1 && number > battle_config.atc_spawn_quantity_limit)
- number = battle_config.atc_spawn_quantity_limit;
-
- if (battle_config.etc_log)
- printf("%s monster='%s' name='%s' id=%d count=%d (%d,%d)\n", command, monster, name, mob_id, number, x, y);
-
- count = 0;
- range = (int)sqrt(number) / 2;
- range = range * 2 + 5; // calculation of an odd number (+ 4 area around)
- for (i = 0; i < number; i++) {
- j = 0;
- k = 0;
- while(j++ < 8 && k == 0) { // try 8 times to spawn the monster (needed for close area)
- if (x <= 0)
- mx = sd->bl.x + (rand() % range - (range / 2));
- else
- mx = x;
- if (y <= 0)
- my = sd->bl.y + (rand() % range - (range / 2));
- else
- my = y;
- k = mob_once_spawn((struct map_session_data*)sd, "this", mx, my, name, mob_id, 1, "");
- }
- count += (k != 0) ? 1 : 0;
- }
-
- if (count != 0)
- if (number == count)
- clif_displaymessage(fd, msg_table[39]); // All monster summoned!
- else {
- sprintf(atcmd_output, msg_table[240], count); // %d monster(s) summoned!
- clif_displaymessage(fd, atcmd_output);
- }
- else {
- clif_displaymessage(fd, msg_table[40]); // Invalid monster ID or name.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_spawn(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message) {
- char name[100];
- char monster[100];
- int mob_id;
- int number = 0;
- int x = 0, y = 0;
- int count;
- int i, j, k;
- int mx, my, range;
-
- nullpo_retr(-1, sd);
- memset(name, '\0', sizeof(name));
- memset(monster, '\0', sizeof(monster));
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || !*message ||
- (sscanf(message, "\"%[^\"]\" %99s %d %d %d", name, monster, &number, &x, &y) < 2 &&
- sscanf(message, "%99s \"%[^\"]\" %d %d %d", monster, name, &number, &x, &y) < 2 &&
- sscanf(message, "%99s %d %99s %d %d", monster, &number, name, &x, &y) < 1)) {
- clif_displaymessage(fd, msg_table[143]); // Give a monster name/id please.
- return -1;
- }
-
- // If monster identifier/name argument is a name
- if ((mob_id = mobdb_searchname(monster)) == 0) // check name first (to avoid possible name begining by a number)
- mob_id = mobdb_checkid(atoi(monster));
-
- if (mob_id == 0) {
- clif_displaymessage(fd, msg_table[40]); // Invalid monster ID or name.
- return -1;
- }
-
- if (mob_id == 1288) {
- clif_displaymessage(fd, msg_table[83]); // Cannot spawn emperium.
- return -1;
- }
-
- if (number <= 0)
- number = 1;
-
- if (strlen(name) < 1)
- strcpy(name, "--ja--");
-
- // If value of atcommand_spawn_quantity_limit directive is greater than or equal to 1 and quantity of monsters is greater than value of the directive
- if (battle_config.atc_spawn_quantity_limit >= 1 && number > battle_config.atc_spawn_quantity_limit)
- number = battle_config.atc_spawn_quantity_limit;
-
- if (battle_config.etc_log)
- printf("%s monster='%s' name='%s' id=%d count=%d (%d,%d)\n", command, monster, name, mob_id, number, x, y);
-
- count = 0;
- range = (int)sqrt(number) / 2;
- range = range * 2 + 5; // calculation of an odd number (+ 4 area around)
- for (i = 0; i < number; i++) {
- j = 0;
- k = 0;
- while(j++ < 8 && k == 0) { // try 8 times to spawn the monster (needed for close area)
- if (x <= 0)
- mx = sd->bl.x + (rand() % range - (range / 2));
- else
- mx = x;
- if (y <= 0)
- my = sd->bl.y + (rand() % range - (range / 2));
- else
- my = y;
- k = mob_once_spawn((struct map_session_data*)sd, "this", mx, my, name, mob_id, 1, "");
- }
- count += (k != 0) ? 1 : 0;
- }
-
- if (count != 0)
- if (number == count)
- clif_displaymessage(fd, msg_table[39]); // All monster summoned!
- else {
- sprintf(atcmd_output, msg_table[240], count); // %d monster(s) summoned!
- clif_displaymessage(fd, atcmd_output);
- }
- else {
- clif_displaymessage(fd, msg_table[40]); // Invalid monster ID or name.
- return -1;
- }
-
- return 0;
-}
-// small monster spawning [Valaris]
-int atcommand_monstersmall(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message) {
- char name[100] = "";
- char monster[100] = "";
- int mob_id = 0;
- int number = 0;
- int x = 0;
- int y = 0;
- int count;
- int i;
-
- nullpo_retr(-1, sd);
-
- if (!message || !*message) {
- clif_displaymessage(fd, "Give a monster name/id please.");
- return 0;
- }
-
- if (sscanf(message, "\"%[^\"]\" %99s %d %d %d", name, monster, &number, &x, &y) < 2 &&
- sscanf(message, "%99s \"%[^\"]\" %d %d %d", monster, name, &number, &x, &y) < 2 &&
- sscanf(message, "%99s %d %99s %d %d", monster, &number, name, &x, &y) < 1) {
- clif_displaymessage(fd, "Give a monster name/id please.");
- return 0;
- }
-
- // If monster identifier/name argument is a name
- if ((mob_id = mobdb_searchname(monster)) == 0) // check name first (to avoid possible name begining by a number)
- mob_id = atoi(monster);
-
- if (mob_id == 0) {
- clif_displaymessage(fd, "Monster name hasn't been found.");
- return 0;
- }
-
- if (mob_id == 1288) {
- clif_displaymessage(fd, "Cannot spawn emperium.");
- return 0;
- }
-
- if (mob_id > 2000) {
- clif_displaymessage(fd, "Invalid monster ID"); // Invalid Monster ID.
- return 0;
- }
-
- if (number <= 0)
- number = 1;
-
- if (strlen(name) < 1)
- strcpy(name, "--ja--");
-
- // If value of atcommand_spawn_quantity_limit directive is greater than or equal to 1 and quantity of monsters is greater than value of the directive
- if (battle_config.atc_spawn_quantity_limit >= 1 && number > battle_config.atc_spawn_quantity_limit)
- number = battle_config.atc_spawn_quantity_limit;
-
- count = 0;
- for (i = 0; i < number; i++) {
- int mx, my;
- if (x <= 0)
- mx = sd->bl.x + (rand() % 11 - 5);
- else
- mx = x;
- if (y <= 0)
- my = sd->bl.y + (rand() % 11 - 5);
- else
- my = y;
- count += (mob_once_spawn((struct map_session_data*)sd, "this", mx, my, name, mob_id+2000, 1, "") != 0) ? 1 : 0;
- }
-
- if (count != 0)
- clif_displaymessage(fd, msg_table[39]); // Monster Summoned!!
- else
- clif_displaymessage(fd, msg_table[40]); // Invalid Monster ID.
-
- return 0;
-}
-// big monster spawning [Valaris]
-int atcommand_monsterbig(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message) {
- char name[100] = "";
- char monster[100] = "";
- int mob_id = 0;
- int number = 0;
- int x = 0;
- int y = 0;
- int count;
- int i;
-
- nullpo_retr(-1, sd);
-
- if (!message || !*message) {
- clif_displaymessage(fd, "Give a monster name/id please.");
- return 0;
- }
-
- if (sscanf(message, "\"%[^\"]\" %99s %d %d %d", name, monster, &number, &x, &y) < 2 &&
- sscanf(message, "%99s \"%[^\"]\" %d %d %d", monster, name, &number, &x, &y) < 2 &&
- sscanf(message, "%99s %d %99s %d %d", monster, &number, name, &x, &y) < 1) {
- clif_displaymessage(fd, "Give a monster name/id please.");
- return 0;
- }
-
- // If monster identifier/name argument is a name
- if ((mob_id = mobdb_searchname(monster)) == 0) // check name first (to avoid possible name begining by a number)
- mob_id = atoi(monster);
-
- if (mob_id == 0) {
- clif_displaymessage(fd, "Monster name hasn't been found.");
- return 0;
- }
-
- if (mob_id == 1288) {
- clif_displaymessage(fd, "Cannot spawn emperium.");
- return 0;
- }
-
- if (mob_id > 2000) {
- clif_displaymessage(fd, "Invalid monster ID"); // Invalid Monster ID.
- return 0;
- }
-
- if (number <= 0)
- number = 1;
-
- if (strlen(name) < 1)
- strcpy(name, "--ja--");
-
- // If value of atcommand_spawn_quantity_limit directive is greater than or equal to 1 and quantity of monsters is greater than value of the directive
- if (battle_config.atc_spawn_quantity_limit >= 1 && number > battle_config.atc_spawn_quantity_limit)
- number = battle_config.atc_spawn_quantity_limit;
-
- count = 0;
- for (i = 0; i < number; i++) {
- int mx, my;
- if (x <= 0)
- mx = sd->bl.x + (rand() % 11 - 5);
- else
- mx = x;
- if (y <= 0)
- my = sd->bl.y + (rand() % 11 - 5);
- else
- my = y;
- count += (mob_once_spawn((struct map_session_data*)sd, "this", mx, my, name, mob_id+4000, 1, "") != 0) ? 1 : 0;
- }
-
- if (count != 0)
- clif_displaymessage(fd, msg_table[39]); // Monster Summoned!!
- else
- clif_displaymessage(fd, msg_table[40]); // Invalid Monster ID.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void atcommand_killmonster_sub(
- const int fd, struct map_session_data* sd, const char* message,
- const int drop)
-{
- int map_id;
- char map_name[100];
-
- if (!sd) return;
-
- memset(map_name, '\0', sizeof(map_name));
-
- if (!message || !*message || sscanf(message, "%99s", map_name) < 1)
- map_id = sd->bl.m;
- else {
- if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
- strcat(map_name, ".gat");
- if ((map_id = map_mapname2mapid(map_name)) < 0)
- map_id = sd->bl.m;
- }
-
- map_foreachinarea(atkillmonster_sub, map_id, 0, 0, map[map_id].xs, map[map_id].ys, BL_MOB, drop);
-
- clif_displaymessage(fd, msg_table[165]); // All monsters killed!
-
- return;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_killmonster(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- if (!sd) return 0;
- atcommand_killmonster_sub(fd, sd, message, 1);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_killmonster2(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- if (!sd) return 0;
- atcommand_killmonster_sub(fd, sd, message, 0);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_refine(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i, position = 0, refine = 0, current_position, final_refine;
- int count;
- nullpo_retr(-1, sd);
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || !*message || sscanf(message, "%d %d", &position, &refine) < 2) {
- clif_displaymessage(fd, "Please, enter a position and a amount (usage: @refine <equip position> <+/- amount>).");
- return -1;
- }
-
- if (refine < -10)
- refine = -10;
- else if (refine > 10)
- refine = 10;
- else if (refine == 0)
- refine = 1;
-
- count = 0;
- for (i = 0; i < MAX_INVENTORY; i++) {
- if (sd->status.inventory[i].nameid && // ŠY“–ŒÂŠ‚Ì‘•”õ‚ð¸˜B‚·‚é
- (sd->status.inventory[i].equip & position ||
- (sd->status.inventory[i].equip && !position))) {
- final_refine = sd->status.inventory[i].refine + refine;
- if (final_refine > 10)
- final_refine = 10;
- else if (final_refine < 0)
- final_refine = 0;
- if (sd->status.inventory[i].refine != final_refine) {
- sd->status.inventory[i].refine = final_refine;
- current_position = sd->status.inventory[i].equip;
- pc_unequipitem(sd, i, 3);
- clif_refine(fd, sd, 0, i, sd->status.inventory[i].refine);
- clif_delitem(sd, i, 1);
- clif_additem(sd, i, 1, 0);
- pc_equipitem(sd, i, current_position);
- clif_misceffect((struct block_list*)&sd->bl, 3);
- count++;
- }
- }
- }
-
- if (count == 0)
- clif_displaymessage(fd, msg_table[166]); // No item has been refined!
- else if (count == 1)
- clif_displaymessage(fd, msg_table[167]); // 1 item has been refined!
- else {
- sprintf(atcmd_output, msg_table[168], count); // %d items have been refined!
- clif_displaymessage(fd, atcmd_output);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_produce(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char item_name[100];
- int item_id, attribute = 0, star = 0;
- int flag = 0;
- struct item_data *item_data;
- struct item tmp_item;
- nullpo_retr(-1, sd);
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
- memset(item_name, '\0', sizeof(item_name));
-
- if (!message || !*message || sscanf(message, "%99s %d %d", item_name, &attribute, &star) < 1) {
- clif_displaymessage(fd, "Please, enter at least an item name/id (usage: @produce <equip name or equip ID> <element> <# of very's>).");
- return -1;
- }
-
- item_id = 0;
- if ((item_data = itemdb_searchname(item_name)) != NULL ||
- (item_data = itemdb_exists(atoi(item_name))) != NULL)
- item_id = item_data->nameid;
-
- if (itemdb_exists(item_id) &&
- (item_id <= 500 || item_id > 1099) &&
- (item_id < 4001 || item_id > 4148) &&
- (item_id < 7001 || item_id > 10019) &&
- itemdb_isequip(item_id)) {
- if (attribute < MIN_ATTRIBUTE || attribute > MAX_ATTRIBUTE)
- attribute = ATTRIBUTE_NORMAL;
- if (star < MIN_STAR || star > MAX_STAR)
- star = 0;
- memset(&tmp_item, 0, sizeof tmp_item);
- tmp_item.nameid = item_id;
- tmp_item.amount = 1;
- tmp_item.identify = 1;
- tmp_item.card[0] = 0x00ff;
- tmp_item.card[1] = ((star * 5) << 8) + attribute;
- *((unsigned long *)(&tmp_item.card[2])) = sd->char_id;
- clif_produceeffect(sd, 0, item_id); // »‘¢ƒGƒtƒFƒNƒgƒpƒPƒbƒg
- clif_misceffect(&sd->bl, 3); // ‘¼l‚ɂଌ÷‚ð’Ê’m
- if ((flag = pc_additem(sd, &tmp_item, 1)))
- clif_additem(sd, 0, 0, flag);
- } else {
- if (battle_config.error_log)
- printf("@produce NOT WEAPON [%d]\n", item_id);
- if (item_id != 0 && itemdb_exists(item_id))
- sprintf(atcmd_output, msg_table[169], item_id, item_data->name); // This item (%d: '%s') is not an equipment.
- else
- sprintf(atcmd_output, msg_table[170]); // This item is not an equipment.
- clif_displaymessage(fd, atcmd_output);
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * Sub-function to display actual memo points
- *------------------------------------------
- */
-void atcommand_memo_sub(struct map_session_data* sd) {
- int i;
-
- if (!sd) return;
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- clif_displaymessage(sd->fd, "Your actual memo positions are (except respawn point):");
- for (i = MIN_PORTAL_MEMO; i <= MAX_PORTAL_MEMO; i++) {
- if (sd->status.memo_point[i].map[0])
- sprintf(atcmd_output, "%d - %s (%d,%d)", i, sd->status.memo_point[i].map, sd->status.memo_point[i].x, sd->status.memo_point[i].y);
- else
- sprintf(atcmd_output, msg_table[171], i); // %d - void
- clif_displaymessage(sd->fd, atcmd_output);
- }
-
- return;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_memo(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int position = 0;
- nullpo_retr(-1, sd);
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || !*message || sscanf(message, "%d", &position) < 1)
- atcommand_memo_sub(sd);
- else {
- if (position >= MIN_PORTAL_MEMO && position <= MAX_PORTAL_MEMO) {
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, msg_table[253]);
- return -1;
- }
- if (sd->status.memo_point[position].map[0]) {
- sprintf(atcmd_output, msg_table[172], position, sd->status.memo_point[position].map, sd->status.memo_point[position].x, sd->status.memo_point[position].y); // You replace previous memo position %d - %s (%d,%d).
- clif_displaymessage(fd, atcmd_output);
- }
- memcpy(sd->status.memo_point[position].map, map[sd->bl.m].name, 24);
- sd->status.memo_point[position].x = sd->bl.x;
- sd->status.memo_point[position].y = sd->bl.y;
- clif_skill_memo(sd, 0);
- if (pc_checkskill(sd, AL_WARP) <= (position + 1))
- clif_displaymessage(fd, msg_table[173]); // Note: you don't have the 'Warp' skill level to use it.
- atcommand_memo_sub(sd);
- } else {
- sprintf(atcmd_output, "Please, enter a valid position (usage: @memo <memo_position:%d-%d>).", MIN_PORTAL_MEMO, MAX_PORTAL_MEMO);
- clif_displaymessage(fd, atcmd_output);
- atcommand_memo_sub(sd);
- return -1;
- }
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_gat(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int y;
- nullpo_retr(-1, sd);
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- for (y = 2; y >= -2; y--) {
- sprintf(atcmd_output, "%s (x= %d, y= %d) %02X %02X %02X %02X %02X",
- map[sd->bl.m].name, sd->bl.x - 2, sd->bl.y + y,
- map_getcell(sd->bl.m, sd->bl.x - 2, sd->bl.y + y, CELL_GETTYPE),
- map_getcell(sd->bl.m, sd->bl.x - 1, sd->bl.y + y, CELL_GETTYPE),
- map_getcell(sd->bl.m, sd->bl.x, sd->bl.y + y, CELL_GETTYPE),
- map_getcell(sd->bl.m, sd->bl.x + 1, sd->bl.y + y, CELL_GETTYPE),
- map_getcell(sd->bl.m, sd->bl.x + 2, sd->bl.y + y, CELL_GETTYPE));
-
- clif_displaymessage(fd, atcmd_output);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_packet(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int x = 0, y = 0;
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%d %d", &x, &y) < 2) {
- clif_displaymessage(fd, "Please, enter a status type/flag (usage: @packet <status type> <flag>).");
- return -1;
- }
-
- clif_status_change(&sd->bl, x, y);
-
- return 0;
-}
-
-/*==========================================
- * @stpoint (Rewritten by [Yor])
- *------------------------------------------
- */
-int atcommand_statuspoint(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int point, new_status_point;
-
- if (!message || !*message || (point = atoi(message)) == 0) {
- clif_displaymessage(fd, "Please, enter a number (usage: @stpoint <number of points>).");
- return -1;
- }
-
- new_status_point = (int)sd->status.status_point + point;
- if (point > 0 && (point > 0x7FFF || new_status_point > 0x7FFF)) // fix positiv overflow
- new_status_point = 0x7FFF;
- else if (point < 0 && (point < -0x7FFF || new_status_point < 0)) // fix negativ overflow
- new_status_point = 0;
-
- if (new_status_point != (int)sd->status.status_point) {
- sd->status.status_point = (short)new_status_point;
- clif_updatestatus(sd, SP_STATUSPOINT);
- clif_displaymessage(fd, msg_table[174]); // Number of status points changed!
- } else {
- if (point < 0)
- clif_displaymessage(fd, msg_table[41]); // Impossible to decrease the number/value.
- else
- clif_displaymessage(fd, msg_table[149]); // Impossible to increase the number/value.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @skpoint (Rewritten by [Yor])
- *------------------------------------------
- */
-int atcommand_skillpoint(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int point, new_skill_point;
- nullpo_retr(-1, sd);
-
- if (!message || !*message || (point = atoi(message)) == 0) {
- clif_displaymessage(fd, "Please, enter a number (usage: @skpoint <number of points>).");
- return -1;
- }
-
- new_skill_point = (int)sd->status.skill_point + point;
- if (point > 0 && (point > 0x7FFF || new_skill_point > 0x7FFF)) // fix positiv overflow
- new_skill_point = 0x7FFF;
- else if (point < 0 && (point < -0x7FFF || new_skill_point < 0)) // fix negativ overflow
- new_skill_point = 0;
-
- if (new_skill_point != (int)sd->status.skill_point) {
- sd->status.skill_point = (short)new_skill_point;
- clif_updatestatus(sd, SP_SKILLPOINT);
- clif_displaymessage(fd, msg_table[175]); // Number of skill points changed!
- } else {
- if (point < 0)
- clif_displaymessage(fd, msg_table[41]); // Impossible to decrease the number/value.
- else
- clif_displaymessage(fd, msg_table[149]); // Impossible to increase the number/value.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @zeny (Rewritten by [Yor])
- *------------------------------------------
- */
-int atcommand_zeny(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int zeny, new_zeny;
- nullpo_retr(-1, sd);
-
- if (!message || !*message || (zeny = atoi(message)) == 0) {
- clif_displaymessage(fd, "Please, enter an amount (usage: @zeny <amount>).");
- return -1;
- }
-
- new_zeny = sd->status.zeny + zeny;
- if (zeny > 0 && (zeny > MAX_ZENY || new_zeny > MAX_ZENY)) // fix positiv overflow
- new_zeny = MAX_ZENY;
- else if (zeny < 0 && (zeny < -MAX_ZENY || new_zeny < 0)) // fix negativ overflow
- new_zeny = 0;
-
- if (new_zeny != sd->status.zeny) {
- sd->status.zeny = new_zeny;
- clif_updatestatus(sd, SP_ZENY);
- clif_displaymessage(fd, msg_table[176]); // Number of zenys changed!
- } else {
- if (zeny < 0)
- clif_displaymessage(fd, msg_table[41]); // Impossible to decrease the number/value.
- else
- clif_displaymessage(fd, msg_table[149]); // Impossible to increase the number/value.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_param(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i, index, value = 0, new_value;
- const char* param[] = { "@str", "@agi", "@vit", "@int", "@dex", "@luk", NULL };
- short* status[] = {
- &sd->status.str, &sd->status.agi, &sd->status.vit,
- &sd->status.int_, &sd->status.dex, &sd->status.luk
- };
- nullpo_retr(-1, sd);
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || !*message || sscanf(message, "%d", &value) < 1 || value == 0) {
- sprintf(atcmd_output, "Please, enter a valid value (usage: @str,@agi,@vit,@int,@dex,@luk <+/-adjustement>).");
- clif_displaymessage(fd, atcmd_output);
- return -1;
- }
-
- index = -1;
- for (i = 0; param[i] != NULL; i++) {
- if (strcmpi(command, param[i]) == 0) {
- index = i;
- break;
- }
- }
- if (index < 0 || index > MAX_STATUS_TYPE) { // normaly impossible...
- sprintf(atcmd_output, "Please, enter a valid value (usage: @str,@agi,@vit,@int,@dex,@luk <+/-adjustement>).");
- clif_displaymessage(fd, atcmd_output);
- return -1;
- }
-
- new_value = (int)*status[index] + value;
- if (value > 0 && ((unsigned int)value > battle_config.max_parameter || (unsigned int)new_value > battle_config.max_parameter)) // fix positiv overflow
- new_value = battle_config.max_parameter;
- else if (value < 0 && (value < -(int)battle_config.max_parameter || new_value < 1)) // fix negativ overflow
- new_value = 1;
-
- if (new_value != (int)*status[index]) {
- *status[index] = new_value;
- clif_updatestatus(sd, SP_STR + index);
- clif_updatestatus(sd, SP_USTR + index);
- status_calc_pc(sd, 0);
- clif_displaymessage(fd, msg_table[42]); // Stat changed.
- } else {
- if (value < 0)
- clif_displaymessage(fd, msg_table[41]); // Impossible to decrease the number/value.
- else
- clif_displaymessage(fd, msg_table[149]); // Impossible to increase the number/value.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-//** Stat all by fritz (rewritten by [Yor])
-int atcommand_stat_all(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int index, count, value = 0, new_value;
- short* status[] = {
- &sd->status.str, &sd->status.agi, &sd->status.vit,
- &sd->status.int_, &sd->status.dex, &sd->status.luk
- };
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%d", &value) < 1 || value == 0)
- value = battle_config.max_parameter;
-
- count = 0;
- for (index = 0; index < (int)(sizeof(status) / sizeof(status[0])); index++) {
-
- new_value = (int)*status[index] + value;
- if (value > 0 && ((unsigned int)value > battle_config.max_parameter || (unsigned int)new_value > battle_config.max_parameter)) // fix positiv overflow
- new_value = battle_config.max_parameter;
- else if (value < 0 && (value < -(int)battle_config.max_parameter || new_value < 1)) // fix negativ overflow
- new_value = 1;
-
- if (new_value != (int)*status[index]) {
- *status[index] = new_value;
- clif_updatestatus(sd, SP_STR + index);
- clif_updatestatus(sd, SP_USTR + index);
- status_calc_pc(sd, 0);
- count++;
- }
- }
-
- if (count > 0) // if at least 1 stat modified
- clif_displaymessage(fd, msg_table[84]); // All stats changed!
- else {
- if (value < 0)
- clif_displaymessage(fd, msg_table[177]); // Impossible to decrease a stat.
- else
- clif_displaymessage(fd, msg_table[178]); // Impossible to increase a stat.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_guildlevelup(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int level = 0;
- short added_level;
- struct guild *guild_info;
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%d", &level) < 1 || level == 0) {
- clif_displaymessage(fd, "Please, enter a valid level (usage: @guildlvup/@guildlvlup <# of levels>).");
- return -1;
- }
-
- if (sd->status.guild_id <= 0 || (guild_info = guild_search(sd->status.guild_id)) == NULL) {
- clif_displaymessage(fd, msg_table[43]); // You're not in a guild.
- return -1;
- }
- if (strcmp(sd->status.name, guild_info->master) != 0) {
- clif_displaymessage(fd, msg_table[44]); // You're not the master of your guild.
- return -1;
- }
-
- added_level = (short)level;
- if (level > 0 && (level > MAX_GUILDLEVEL || added_level > ((short)MAX_GUILDLEVEL - guild_info->guild_lv))) // fix positiv overflow
- added_level = (short)MAX_GUILDLEVEL - guild_info->guild_lv;
- else if (level < 0 && (level < -MAX_GUILDLEVEL || added_level < (1 - guild_info->guild_lv))) // fix negativ overflow
- added_level = 1 - guild_info->guild_lv;
-
- if (added_level != 0) {
- intif_guild_change_basicinfo(guild_info->guild_id, GBI_GUILDLV, &added_level, 2);
- clif_displaymessage(fd, msg_table[179]); // Guild level changed.
- } else {
- clif_displaymessage(fd, msg_table[45]); // Guild level change failed.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_makeegg(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct item_data *item_data;
- int id, pet_id;
- nullpo_retr(-1, sd);
-
- if (!message || !*message) {
- clif_displaymessage(fd, "Please, enter a monter/egg name/id (usage: @makeegg <pet_id>).");
- return -1;
- }
-
- if ((item_data = itemdb_searchname(message)) != NULL) // for egg name
- id = item_data->nameid;
- else if ((id = mobdb_searchname(message)) == 0) // for monster name
- id = atoi(message);
-
- pet_id = search_petDB_index(id, PET_CLASS);
- if (pet_id < 0)
- pet_id = search_petDB_index(id, PET_EGG);
- if (pet_id >= 0) {
- sd->catch_target_class = pet_db[pet_id].class_;
- intif_create_pet(
- sd->status.account_id, sd->status.char_id,
- (short)pet_db[pet_id].class_, (short)mob_db[pet_db[pet_id].class_].lv,
- (short)pet_db[pet_id].EggID, 0, (short)pet_db[pet_id].intimate,
- 100, 0, 1, pet_db[pet_id].jname);
- } else {
- clif_displaymessage(fd, msg_table[180]); // The monter/egg name/id doesn't exist.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_hatch(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- if (sd->status.pet_id <= 0)
- clif_sendegg(sd);
- else {
- clif_displaymessage(fd, msg_table[181]); // You already have a pet.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_petfriendly(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int friendly;
- int t;
- nullpo_retr(-1, sd);
-
- if (!message || !*message || (friendly = atoi(message)) < 0) {
- clif_displaymessage(fd, "Please, enter a valid value (usage: @petfriendly <0-1000>).");
- return -1;
- }
-
- if (sd->status.pet_id > 0 && sd->pd) {
- if (friendly >= 0 && friendly <= 1000) {
- if (friendly != sd->pet.intimate) {
- t = sd->pet.intimate;
- sd->pet.intimate = friendly;
- clif_send_petstatus(sd);
- if (battle_config.pet_status_support) {
- if ((sd->pet.intimate > 0 && t <= 0) ||
- (sd->pet.intimate <= 0 && t > 0)) {
- if (sd->bl.prev != NULL)
- status_calc_pc(sd, 0);
- else
- status_calc_pc(sd, 2);
- }
- }
- clif_displaymessage(fd, msg_table[182]); // Pet friendly value changed!
- } else {
- clif_displaymessage(fd, msg_table[183]); // Pet friendly is already the good value.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[184]); // Sorry, but you have no pet.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_pethungry(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int hungry;
- nullpo_retr(-1, sd);
-
- if (!message || !*message || (hungry = atoi(message)) < 0) {
- clif_displaymessage(fd, "Please, enter a valid number (usage: @pethungry <0-100>).");
- return -1;
- }
-
- if (sd->status.pet_id > 0 && sd->pd) {
- if (hungry >= 0 && hungry <= 100) {
- if (hungry != sd->pet.hungry) {
- sd->pet.hungry = hungry;
- clif_send_petstatus(sd);
- clif_displaymessage(fd, msg_table[185]); // Pet hungry value changed!
- } else {
- clif_displaymessage(fd, msg_table[186]); // Pet hungry is already the good value.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[184]); // Sorry, but you have no pet.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_petrename(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- if (sd->status.pet_id > 0 && sd->pd) {
- if (sd->pet.rename_flag != 0) {
- sd->pet.rename_flag = 0;
- intif_save_petdata(sd->status.account_id, &sd->pet);
- clif_send_petstatus(sd);
- clif_displaymessage(fd, msg_table[187]); // You can now rename your pet.
- } else {
- clif_displaymessage(fd, msg_table[188]); // You can already rename your pet.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[184]); // Sorry, but you have no pet.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int
-atcommand_recall(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd = NULL;
-
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @recall <char name>).");
- return -1;
- }
-
- memset(atcmd_player_name, '\0', sizeof atcmd_player_name);
- if(sscanf(message, "%99[^\n]", atcmd_player_name) < 1)
- return -1;
- if(strncmp(sd->status.name,atcmd_player_name,24)==0)
- return -1;
-
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can recall only lower or same level
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp somenone to your actual map.");
- return -1;
- }
- if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp this player from its actual map.");
- return -1;
- }
- pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2);
- sprintf(atcmd_output, msg_table[46], atcmd_player_name); // %s recalled!
- clif_displaymessage(fd, atcmd_output);
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_revive(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @revive <char name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- if (pc_isdead(pl_sd)) {
- pl_sd->status.hp = pl_sd->status.max_hp;
- clif_skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1);
- pc_setstand(pl_sd);
- if (battle_config.pc_invincible_time > 0)
- pc_setinvincibletimer(pl_sd, battle_config.pc_invincible_time);
- clif_updatestatus(pl_sd, SP_HP);
- clif_updatestatus(pl_sd, SP_SP);
- clif_resurrection(&pl_sd->bl, 1);
- clif_displaymessage(fd, msg_table[51]); // Character revived.
- return 0;
- }
- return -1;
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * charchangesex command (usage: charchangesex <player_name>)
- *------------------------------------------
- */
-int atcommand_char_change_sex(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charchangesex <name>).");
- return -1;
- }
-
- // check player name
- if (strlen(atcmd_player_name) < 4) {
- clif_displaymessage(fd, msg_table[86]); // Sorry, but a player name have at least 4 characters.
- return -1;
- } else if (strlen(atcmd_player_name) > 23) {
- clif_displaymessage(fd, msg_table[87]); // Sorry, but a player name have 23 characters maximum.
- return -1;
- } else {
- chrif_char_ask_name(sd->status.account_id, atcmd_player_name, 5, 0, 0, 0, 0, 0, 0); // type: 5 - changesex
- clif_displaymessage(fd, msg_table[88]); // Character name sends to char-server to ask it.
- }
-
- return 0;
-}
-
-/*==========================================
- * charblock command (usage: charblock <player_name>)
- * This command do a definitiv ban on a player
- *------------------------------------------
- */
-int atcommand_char_block(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charblock/@block <name>).");
- return -1;
- }
-
- // check player name
- if (strlen(atcmd_player_name) < 4) {
- clif_displaymessage(fd, msg_table[86]); // Sorry, but a player name have at least 4 characters.
- return -1;
- } else if (strlen(atcmd_player_name) > 23) {
- clif_displaymessage(fd, msg_table[87]); // Sorry, but a player name have 23 characters maximum.
- return -1;
- } else {
- chrif_char_ask_name(sd->status.account_id, atcmd_player_name, 1, 0, 0, 0, 0, 0, 0); // type: 1 - block
- clif_displaymessage(fd, msg_table[88]); // Character name sends to char-server to ask it.
- }
-
- return 0;
-}
-
-/*==========================================
- * charban command (usage: charban <time> <player_name>)
- * This command do a limited ban on a player
- * Time is done as follows:
- * Adjustment value (-1, 1, +1, etc...)
- * Modified element:
- * a or y: year
- * m: month
- * j or d: day
- * h: hour
- * mn: minute
- * s: second
- * <example> @ban +1m-2mn1s-6y test_player
- * this example adds 1 month and 1 second, and substracts 2 minutes and 6 years at the same time.
- *------------------------------------------
- */
-int atcommand_char_ban(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char * modif_p;
- int year, month, day, hour, minute, second, value;
- nullpo_retr(-1, sd);
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || !*message || sscanf(message, "%s %99[^\n]", atcmd_output, atcmd_player_name) < 2) {
- clif_displaymessage(fd, "Please, enter ban time and a player name (usage: @charban/@ban/@banish/@charbanish <time> <name>).");
- return -1;
- }
-
- atcmd_output[sizeof(atcmd_output)-1] = '\0';
-
- modif_p = atcmd_output;
- year = month = day = hour = minute = second = 0;
- while (modif_p[0] != '\0') {
- value = atoi(modif_p);
- if (value == 0)
- modif_p++;
- else {
- if (modif_p[0] == '-' || modif_p[0] == '+')
- modif_p++;
- while (modif_p[0] >= '0' && modif_p[0] <= '9')
- modif_p++;
- if (modif_p[0] == 's') {
- second = value;
- modif_p++;
- } else if (modif_p[0] == 'm' && modif_p[1] == 'n') {
- minute = value;
- modif_p = modif_p + 2;
- } else if (modif_p[0] == 'h') {
- hour = value;
- modif_p++;
- } else if (modif_p[0] == 'd' || modif_p[0] == 'j') {
- day = value;
- modif_p++;
- } else if (modif_p[0] == 'm') {
- month = value;
- modif_p++;
- } else if (modif_p[0] == 'y' || modif_p[0] == 'a') {
- year = value;
- modif_p++;
- } else if (modif_p[0] != '\0') {
- modif_p++;
- }
- }
- }
- if (year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 && second == 0) {
- clif_displaymessage(fd, msg_table[85]); // Invalid time for ban command.
- return -1;
- }
-
- // check player name
- if (strlen(atcmd_player_name) < 4) {
- clif_displaymessage(fd, msg_table[86]); // Sorry, but a player name have at least 4 characters.
- return -1;
- } else if (strlen(atcmd_player_name) > 23) {
- clif_displaymessage(fd, msg_table[87]); // Sorry, but a player name have 23 characters maximum.
- return -1;
- } else {
- chrif_char_ask_name(sd->status.account_id, atcmd_player_name, 2, year, month, day, hour, minute, second); // type: 2 - ban
- clif_displaymessage(fd, msg_table[88]); // Character name sends to char-server to ask it.
- }
-
- return 0;
-}
-
-/*==========================================
- * charunblock command (usage: charunblock <player_name>)
- *------------------------------------------
- */
-int atcommand_char_unblock(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charunblock <player_name>).");
- return -1;
- }
-
- // check player name
- if (strlen(atcmd_player_name) < 4) {
- clif_displaymessage(fd, msg_table[86]); // Sorry, but a player name have at least 4 characters.
- return -1;
- } else if (strlen(atcmd_player_name) > 23) {
- clif_displaymessage(fd, msg_table[87]); // Sorry, but a player name have 23 characters maximum.
- return -1;
- } else {
- // send answer to login server via char-server
- chrif_char_ask_name(sd->status.account_id, atcmd_player_name, 3, 0, 0, 0, 0, 0, 0); // type: 3 - unblock
- clif_displaymessage(fd, msg_table[88]); // Character name sends to char-server to ask it.
- }
-
- return 0;
-}
-
-/*==========================================
- * charunban command (usage: charunban <player_name>)
- *------------------------------------------
- */
-int atcommand_char_unban(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charunban <player_name>).");
- return -1;
- }
-
- // check player name
- if (strlen(atcmd_player_name) < 4) {
- clif_displaymessage(fd, msg_table[86]); // Sorry, but a player name have at least 4 characters.
- return -1;
- } else if (strlen(atcmd_player_name) > 23) {
- clif_displaymessage(fd, msg_table[87]); // Sorry, but a player name have 23 characters maximum.
- return -1;
- } else {
- // send answer to login server via char-server
- chrif_char_ask_name(sd->status.account_id, atcmd_player_name, 4, 0, 0, 0, 0, 0, 0); // type: 4 - unban
- clif_displaymessage(fd, msg_table[88]); // Character name sends to char-server to ask it.
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_night(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
- nullpo_retr(-1, sd);
-
- if (night_flag != 1) {
- night_flag = 1; // 0=day, 1=night [Yor]
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth && !map[sd->bl.m].flag.indoors) {
- //pl_sd->opt2 |= STATE_BLIND;
- //clif_changeoption(&pl_sd->bl);
- if (battle_config.night_darkness_level > 0)
- clif_specialeffect(&pl_sd->bl, 474 + battle_config.night_darkness_level, 0);
- else {
- //clif_specialeffect(&pl_sd->bl, 483, 0); // default darkness level
- pl_sd->opt2 |= STATE_BLIND;
- clif_changeoption(&pl_sd->bl);
- }
- clif_displaymessage(pl_sd->fd, msg_table[59]); // Night has fallen.
- }
- }
- } else {
- clif_displaymessage(fd, msg_table[89]); // Sorry, it's already the night. Impossible to execute the command.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_day(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
- nullpo_retr(-1, sd);
-
- if (night_flag != 0) {
- night_flag = 0; // 0=day, 1=night [Yor]
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth) {
- if (battle_config.night_darkness_level > 0)
- clif_refresh (pl_sd);
- else {
- pl_sd->opt2 &= ~STATE_BLIND;
- clif_changeoption(&pl_sd->bl);
- }
- clif_displaymessage(pl_sd->fd, msg_table[60]); // Day has arrived.
- }
- }
- } else {
- clif_displaymessage(fd, msg_table[90]); // Sorry, it's already the day. Impossible to execute the command.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_doom(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
- nullpo_retr(-1, sd);
- clif_specialeffect(&sd->bl,450,2);
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth && i != fd &&
- pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can doom only lower or same gm level
- pc_damage(NULL, pl_sd, pl_sd->status.hp + 1);
- clif_displaymessage(pl_sd->fd, msg_table[61]); // The holy messenger has given judgement.
- }
- }
- clif_displaymessage(fd, msg_table[62]); // Judgement was made.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_doommap(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
- nullpo_retr(-1, sd);
- clif_specialeffect(&sd->bl,450,3);
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth && i != fd && sd->bl.m == pl_sd->bl.m &&
- pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can doom only lower or same gm level
- pc_damage(NULL, pl_sd, pl_sd->status.hp + 1);
-// clif_specialeffect(&pl_sd->bl,450,1);
- clif_displaymessage(pl_sd->fd, msg_table[61]); // The holy messenger has given judgement.
- }
- }
- clif_displaymessage(fd, msg_table[62]); // Judgement was made.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static void atcommand_raise_sub(struct map_session_data* sd)
-{
- if (sd && sd->state.auth && pc_isdead(sd)) {
- clif_skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1);
- sd->status.hp = sd->status.max_hp;
- sd->status.sp = sd->status.max_sp;
- pc_setstand(sd);
- clif_updatestatus(sd, SP_HP);
- clif_updatestatus(sd, SP_SP);
- clif_resurrection(&sd->bl, 1);
- if (battle_config.pc_invincible_time > 0)
- pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
- clif_displaymessage(sd->fd, msg_table[63]); // Mercy has been shown.
- }
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_raise(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i;
- nullpo_retr(-1, sd);
-
- for (i = 0; i < fd_max; i++) {
- if (session[i])
- atcommand_raise_sub((struct map_session_data *) session[i]->session_data);
- }
- clif_displaymessage(fd, msg_table[64]); // Mercy has been granted.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_raisemap(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
-
- nullpo_retr(-1, sd);
-
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth && sd->bl.m == pl_sd->bl.m)
- atcommand_raise_sub(pl_sd);
- }
- clif_displaymessage(fd, msg_table[64]); // Mercy has been granted.
-
- return 0;
-}
-
-/*==========================================
- * atcommand_character_baselevel @charbaselvl‚Å‘ÎÛƒLƒƒƒ‰‚̃Œƒxƒ‹‚ðã‚°‚é
- *------------------------------------------
-*/
-int atcommand_character_baselevel(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int level = 0, i;
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || !*message || sscanf(message, "%d %99[^\n]", &level, atcmd_player_name) < 2 || level == 0) {
- clif_displaymessage(fd, "Please, enter a level adjustement and a player name (usage: @charbaselvl <#> <nickname>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change base level only lower or same gm level
-
- if (level > 0) {
- if (pl_sd->status.base_level == battle_config.maximum_level) { // check for max level by Valaris
- clif_displaymessage(fd, msg_table[91]); // Character's base level can't go any higher.
- return 0;
- } // End Addition
- if ((unsigned int)level > battle_config.maximum_level || (unsigned int)level > (battle_config.maximum_level - pl_sd->status.base_level)) // fix positiv overflow
- level = battle_config.maximum_level - pl_sd->status.base_level;
- for (i = 1; i <= level; i++)
- pl_sd->status.status_point += (pl_sd->status.base_level + i + 14) / 5;
- pl_sd->status.base_level += level;
- clif_updatestatus(pl_sd, SP_BASELEVEL);
- clif_updatestatus(pl_sd, SP_NEXTBASEEXP);
- clif_updatestatus(pl_sd, SP_STATUSPOINT);
- status_calc_pc(pl_sd, 0);
- pc_heal(pl_sd, pl_sd->status.max_hp, pl_sd->status.max_sp);
- clif_misceffect(&pl_sd->bl, 0);
- clif_displaymessage(fd, msg_table[65]); // Character's base level raised.
- } else {
- if (pl_sd->status.base_level == 1) {
- clif_displaymessage(fd, msg_table[193]); // Character's base level can't go any lower.
- return -1;
- }
- if (level < -(int)battle_config.maximum_level || level < (1 - (int)pl_sd->status.base_level)) // fix negativ overflow
- level = 1 - pl_sd->status.base_level;
- if (pl_sd->status.status_point > 0) {
- for (i = 0; i > level; i--)
- pl_sd->status.status_point -= (pl_sd->status.base_level + i + 14) / 5;
- if (pl_sd->status.status_point < 0)
- pl_sd->status.status_point = 0;
- clif_updatestatus(pl_sd, SP_STATUSPOINT);
- } // to add: remove status points from stats
- pl_sd->status.base_level += level;
- clif_updatestatus(pl_sd, SP_BASELEVEL);
- clif_updatestatus(pl_sd, SP_NEXTBASEEXP);
- status_calc_pc(pl_sd, 0);
- clif_displaymessage(fd, msg_table[66]); // Character's base level lowered.
- }
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0; //³íI—¹
-}
-
-/*==========================================
- * atcommand_character_joblevel @charjoblvl‚Å‘ÎÛƒLƒƒƒ‰‚ÌJobƒŒƒxƒ‹‚ðã‚°‚é
- *------------------------------------------
- */
-int atcommand_character_joblevel(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- unsigned int max_level = 50;
- int level = 0;
- //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
- struct pc_base_job pl_s_class;
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || !*message || sscanf(message, "%d %99[^\n]", &level, atcmd_player_name) < 2 || level == 0) {
- clif_displaymessage(fd, "Please, enter a level adjustement and a player name (usage: @charjlvl <#> <nickname>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- pl_s_class = pc_calc_base_job(pl_sd->status.class_);
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change job level only lower or same gm level
- if (pl_s_class.job == 0)
- max_level -= 40;
- // super novices can go up to 99 [celest]
- else if (pl_s_class.job == 23)
- max_level += 49;
- else if (pl_sd->status.class_ > 4007 && pl_sd->status.class_ < 4023)
- max_level += 20;
-
- if (level > 0) {
- if (pl_sd->status.job_level == max_level) {
- clif_displaymessage(fd, msg_table[67]); // Character's job level can't go any higher.
- return -1;
- }
- if (pl_sd->status.job_level + level > max_level)
- level = max_level - pl_sd->status.job_level;
- pl_sd->status.job_level += level;
- clif_updatestatus(pl_sd, SP_JOBLEVEL);
- clif_updatestatus(pl_sd, SP_NEXTJOBEXP);
- pl_sd->status.skill_point += level;
- clif_updatestatus(pl_sd, SP_SKILLPOINT);
- status_calc_pc(pl_sd, 0);
- clif_misceffect(&pl_sd->bl, 1);
- clif_displaymessage(fd, msg_table[68]); // character's job level raised.
- } else {
- if (pl_sd->status.job_level == 1) {
- clif_displaymessage(fd, msg_table[194]); // Character's job level can't go any lower.
- return -1;
- }
- if (pl_sd->status.job_level + level < 1)
- level = 1 - pl_sd->status.job_level;
- pl_sd->status.job_level += level;
- clif_updatestatus(pl_sd, SP_JOBLEVEL);
- clif_updatestatus(pl_sd, SP_NEXTJOBEXP);
- if (pl_sd->status.skill_point > 0) {
- pl_sd->status.skill_point += level;
- if (pl_sd->status.skill_point < 0)
- pl_sd->status.skill_point = 0;
- clif_updatestatus(pl_sd, SP_SKILLPOINT);
- } // to add: remove status points from skills
- status_calc_pc(pl_sd, 0);
- clif_displaymessage(fd, msg_table[69]); // Character's job level lowered.
- }
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_kick(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @kick <charname>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) // you can kick only lower or same gm level
- clif_GM_kick(sd, pl_sd, 1);
- else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_kickall(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
- nullpo_retr(-1, sd);
-
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth &&
- pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can kick only lower or same gm level
- if (sd->status.account_id != pl_sd->status.account_id)
- clif_GM_kick(sd, pl_sd, 0);
- }
- }
-
- clif_displaymessage(fd, msg_table[195]); // All players have been kicked!
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_allskill(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- pc_allskillup(sd); // all skills
- sd->status.skill_point = 0; // 0 skill points
- clif_updatestatus(sd, SP_SKILLPOINT); // update
- clif_displaymessage(fd, msg_table[76]); // You have received all skills.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_questskill(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int skill_id;
- nullpo_retr(-1, sd);
-
- if (!message || !*message || (skill_id = atoi(message)) < 0) {
- clif_displaymessage(fd, "Please, enter a quest skill number (usage: @questskill <#:0+>).");
- return -1;
- }
-
- if (skill_id >= 0 && skill_id < MAX_SKILL_DB) {
- if (skill_get_inf2(skill_id) & 0x01) {
- if (pc_checkskill(sd, skill_id) == 0) {
- pc_skill(sd, skill_id, 1, 0);
- clif_displaymessage(fd, msg_table[70]); // You have learned the skill.
- } else {
- clif_displaymessage(fd, msg_table[196]); // You already have this quest skill.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[197]); // This skill number doesn't exist or isn't a quest skill.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[198]); // This skill number doesn't exist.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_charquestskill(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int skill_id = 0;
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || !*message || sscanf(message, "%d %99[^\n]", &skill_id, atcmd_player_name) < 2 || skill_id < 0) {
- clif_displaymessage(fd, "Please, enter a quest skill number and a player name (usage: @charquestskill <#:0+> <char_name>).");
- return -1;
- }
-
- if (skill_id >= 0 && skill_id < MAX_SKILL_DB) {
- if (skill_get_inf2(skill_id) & 0x01) {
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- if (pc_checkskill(pl_sd, skill_id) == 0) {
- pc_skill(pl_sd, skill_id, 1, 0);
- clif_displaymessage(fd, msg_table[199]); // This player has learned the skill.
- } else {
- clif_displaymessage(fd, msg_table[200]); // This player already has this quest skill.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[197]); // This skill number doesn't exist or isn't a quest skill.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[198]); // This skill number doesn't exist.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_lostskill(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int skill_id;
- nullpo_retr(-1, sd);
-
- if (!message || !*message || (skill_id = atoi(message)) < 0) {
- clif_displaymessage(fd, "Please, enter a quest skill number (usage: @lostskill <#:0+>).");
- return -1;
- }
-
- if (skill_id >= 0 && skill_id < MAX_SKILL) {
- if (skill_get_inf2(skill_id) & 0x01) {
- if (pc_checkskill(sd, skill_id) > 0) {
- sd->status.skill[skill_id].lv = 0;
- sd->status.skill[skill_id].flag = 0;
- clif_skillinfoblock(sd);
- clif_displaymessage(fd, msg_table[71]); // You have forgotten the skill.
- } else {
- clif_displaymessage(fd, msg_table[201]); // You don't have this quest skill.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[197]); // This skill number doesn't exist or isn't a quest skill.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[198]); // This skill number doesn't exist.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_charlostskill(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int skill_id = 0;
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || !*message || sscanf(message, "%d %99[^\n]", &skill_id, atcmd_player_name) < 2 || skill_id < 0) {
- clif_displaymessage(fd, "Please, enter a quest skill number and a player name (usage: @charlostskill <#:0+> <char_name>).");
- return -1;
- }
-
- if (skill_id >= 0 && skill_id < MAX_SKILL) {
- if (skill_get_inf2(skill_id) & 0x01) {
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- if (pc_checkskill(pl_sd, skill_id) > 0) {
- pl_sd->status.skill[skill_id].lv = 0;
- pl_sd->status.skill[skill_id].flag = 0;
- clif_skillinfoblock(pl_sd);
- clif_displaymessage(fd, msg_table[202]); // This player has forgotten the skill.
- } else {
- clif_displaymessage(fd, msg_table[203]); // This player doesn't have this quest skill.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[197]); // This skill number doesn't exist or isn't a quest skill.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[198]); // This skill number doesn't exist.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_spiritball(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int number;
- nullpo_retr(-1, sd);
-
- if (!message || !*message || (number = atoi(message)) < 0) {
- clif_displaymessage(fd, "Please, enter a spirit ball number (usage: @spiritball <number: 0-1000>).");
- return -1;
- }
-
- // set max number to avoid server/client crash (500 create big balls of several balls: no visial difference with more)
- if (number > 500)
- number = 500;
-
- if (number >= 0 && number <= 0x7FFF) {
- if (sd->spiritball != number || number > 499) {
- if (sd->spiritball > 0)
- pc_delspiritball(sd, sd->spiritball, 1);
- sd->spiritball = number;
- clif_spiritball(sd);
- // no message, player can look the difference
- if (number > 1000)
- clif_displaymessage(fd, msg_table[204]); // WARNING: more than 1000 spiritballs can CRASH your server and/or client!
- } else {
- clif_displaymessage(fd, msg_table[205]); // You already have this number of spiritballs.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_party(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char party[100];
- nullpo_retr(-1, sd);
-
- memset(party, '\0', sizeof(party));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", party) < 1) {
- clif_displaymessage(fd, "Please, enter a party name (usage: @party <party_name>).");
- return -1;
- }
-
- party_create(sd, party, 0, 0);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_guild(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char guild[100];
- int prev;
- nullpo_retr(-1, sd);
-
- memset(guild, '\0', sizeof(guild));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", guild) < 1) {
- clif_displaymessage(fd, "Please, enter a guild name (usage: @guild <guild_name>).");
- return -1;
- }
-
- prev = battle_config.guild_emperium_check;
- battle_config.guild_emperium_check = 0;
- guild_create(sd, guild);
- battle_config.guild_emperium_check = prev;
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_agitstart(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- if (agit_flag == 1) {
- clif_displaymessage(fd, msg_table[73]); // Already it has started siege warfare.
- return -1;
- }
-
- agit_flag = 1;
- guild_agit_start();
- clif_displaymessage(fd, msg_table[72]); // Guild siege warfare start!
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_agitend(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- if (agit_flag == 0) {
- clif_displaymessage(fd, msg_table[75]); // Siege warfare hasn't started yet.
- return -1;
- }
-
- agit_flag = 0;
- guild_agit_end();
- clif_displaymessage(fd, msg_table[74]); // Guild siege warfare end!
-
- return 0;
-}
-
-/*==========================================
- * @mapexit‚Ń}ƒbƒvƒT[ƒo[‚ðI—¹‚³‚¹‚é
- *------------------------------------------
- */
-int atcommand_mapexit(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
- nullpo_retr(-1, sd);
-
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth) {
- if (sd->status.account_id != pl_sd->status.account_id)
- clif_GM_kick(sd, pl_sd, 0);
- }
- }
- clif_GM_kick(sd, sd, 0);
-
- flush_fifos();
-
- runflag = 0;
-
- return 0;
-}
-
-/*==========================================
- * idsearch <part_of_name>: revrited by [Yor]
- *------------------------------------------
- */
-int atcommand_idsearch(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char item_name[100];
- unsigned int i, match;
- struct item_data *item;
- nullpo_retr(-1, sd);
-
- memset(item_name, '\0', sizeof(item_name));
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || !*message || sscanf(message, "%99s", item_name) < 0) {
- clif_displaymessage(fd, "Please, enter a part of item name (usage: @idsearch <part_of_item_name>).");
- return -1;
- }
-
- sprintf(atcmd_output, msg_table[77], item_name); // The reference result of '%s' (name: id):
- clif_displaymessage(fd, atcmd_output);
- match = 0;
- for(i = 0; i < 20000; i++) {
- if ((item = itemdb_exists(i)) != NULL && strstr(item->jname, item_name) != NULL) {
- match++;
- sprintf(atcmd_output, msg_table[78], item->jname, item->nameid); // %s: %d
- clif_displaymessage(fd, atcmd_output);
- }
- }
- sprintf(atcmd_output, msg_table[79], match); // It is %d affair above.
- clif_displaymessage(fd, atcmd_output);
-
- return 0;
-}
-
-/*==========================================
- * Character Skill Reset
- *------------------------------------------
- */
-int atcommand_charskreset(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charskreset <charname>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can reset skill points only lower or same gm level
- pc_resetskill(pl_sd);
- sprintf(atcmd_output, msg_table[206], atcmd_player_name); // '%s' skill points reseted!
- clif_displaymessage(fd, atcmd_output);
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * Character Stat Reset
- *------------------------------------------
- */
-int atcommand_charstreset(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charstreset <charname>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can reset stats points only lower or same gm level
- pc_resetstate(pl_sd);
- sprintf(atcmd_output, msg_table[207], atcmd_player_name); // '%s' stats points reseted!
- clif_displaymessage(fd, atcmd_output);
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * Character Model by chbrules
- *------------------------------------------
- */
-int atcommand_charmodel(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int hair_style = 0, hair_color = 0, cloth_color = 0;
- struct map_session_data *pl_sd;
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || !*message || sscanf(message, "%d %d %d %99[^\n]", &hair_style, &hair_color, &cloth_color, atcmd_player_name) < 4 || hair_style < 0 || hair_color < 0 || cloth_color < 0) {
- sprintf(atcmd_output, "Please, enter a valid model and a player name (usage: @charmodel <hair ID: %d-%d> <hair color: %d-%d> <clothes color: %d-%d> <name>).",
- MIN_HAIR_STYLE, MAX_HAIR_STYLE, MIN_HAIR_COLOR, MAX_HAIR_COLOR, MIN_CLOTH_COLOR, MAX_CLOTH_COLOR);
- clif_displaymessage(fd, atcmd_output);
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- if (hair_style >= MIN_HAIR_STYLE && hair_style <= MAX_HAIR_STYLE &&
- hair_color >= MIN_HAIR_COLOR && hair_color <= MAX_HAIR_COLOR &&
- cloth_color >= MIN_CLOTH_COLOR && cloth_color <= MAX_CLOTH_COLOR) {
-
- if (cloth_color != 0 &&
- pl_sd->status.sex == 1 &&
- (pl_sd->status.class_ == 12 || pl_sd->status.class_ == 17)) {
- clif_displaymessage(fd, msg_table[35]); // You can't use this command with this class.
- return -1;
- } else {
- pc_changelook(pl_sd, LOOK_HAIR, hair_style);
- pc_changelook(pl_sd, LOOK_HAIR_COLOR, hair_color);
- pc_changelook(pl_sd, LOOK_CLOTHES_COLOR, cloth_color);
- clif_displaymessage(fd, msg_table[36]); // Appearence changed.
- }
- } else {
- clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * Character Skill Point (Rewritten by [Yor])
- *------------------------------------------
- */
-int atcommand_charskpoint(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int new_skill_point;
- int point = 0;
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || !*message || sscanf(message, "%d %99[^\n]", &point, atcmd_player_name) < 2 || point == 0) {
- clif_displaymessage(fd, "Please, enter a number and a player name (usage: @charskpoint <amount> <name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- new_skill_point = (int)pl_sd->status.skill_point + point;
- if (point > 0 && (point > 0x7FFF || new_skill_point > 0x7FFF)) // fix positiv overflow
- new_skill_point = 0x7FFF;
- else if (point < 0 && (point < -0x7FFF || new_skill_point < 0)) // fix negativ overflow
- new_skill_point = 0;
- if (new_skill_point != (int)pl_sd->status.skill_point) {
- pl_sd->status.skill_point = new_skill_point;
- clif_updatestatus(pl_sd, SP_SKILLPOINT);
- clif_displaymessage(fd, msg_table[209]); // Character's number of skill points changed!
- } else {
- if (point < 0)
- clif_displaymessage(fd, msg_table[41]); // Impossible to decrease the number/value.
- else
- clif_displaymessage(fd, msg_table[149]); // Impossible to increase the number/value.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * Character Status Point (rewritten by [Yor])
- *------------------------------------------
- */
-int atcommand_charstpoint(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int new_status_point;
- int point = 0;
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || !*message || sscanf(message, "%d %99[^\n]", &point, atcmd_player_name) < 2 || point == 0) {
- clif_displaymessage(fd, "Please, enter a number and a player name (usage: @charstpoint <amount> <name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- new_status_point = (int)pl_sd->status.status_point + point;
- if (point > 0 && (point > 0x7FFF || new_status_point > 0x7FFF)) // fix positiv overflow
- new_status_point = 0x7FFF;
- else if (point < 0 && (point < -0x7FFF || new_status_point < 0)) // fix negativ overflow
- new_status_point = 0;
- if (new_status_point != (int)pl_sd->status.status_point) {
- pl_sd->status.status_point = new_status_point;
- clif_updatestatus(pl_sd, SP_STATUSPOINT);
- clif_displaymessage(fd, msg_table[210]); // Character's number of status points changed!
- } else {
- if (point < 0)
- clif_displaymessage(fd, msg_table[41]); // Impossible to decrease the number/value.
- else
- clif_displaymessage(fd, msg_table[149]); // Impossible to increase the number/value.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * Recall All Characters Online To Your Location
- *------------------------------------------
- */
-int atcommand_recallall(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
- int count;
- nullpo_retr(-1, sd);
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp somenone to your actual map.");
- return -1;
- }
-
- count = 0;
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth && sd->status.account_id != pl_sd->status.account_id &&
- pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can recall only lower or same level
- if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd))
- count++;
- else
- pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2);
- }
- }
-
- clif_displaymessage(fd, msg_table[92]); // All characters recalled!
- if (count) {
- sprintf(atcmd_output, "Because you are not authorised to warp from some maps, %d player(s) have not been recalled.", count);
- clif_displaymessage(fd, atcmd_output);
- }
-
- return 0;
-}
-
-/*==========================================
- * Recall online characters of a guild to your location
- *------------------------------------------
- */
-int atcommand_guildrecall(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
- char guild_name[100];
- struct guild *g;
- int count;
- nullpo_retr(-1, sd);
-
- memset(guild_name, '\0', sizeof(guild_name));
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", guild_name) < 1) {
- clif_displaymessage(fd, "Please, enter a guild name/id (usage: @guildrecall <guild_name/id>).");
- return -1;
- }
-
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp somenone to your actual map.");
- return -1;
- }
-
- if ((g = guild_searchname(guild_name)) != NULL || // name first to avoid error when name begin with a number
- (g = guild_search(atoi(message))) != NULL) {
- count = 0;
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth &&
- sd->status.account_id != pl_sd->status.account_id &&
- pl_sd->status.guild_id == g->guild_id) {
- if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd))
- count++;
- else
- pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2);
- }
- }
- sprintf(atcmd_output, msg_table[93], g->name); // All online characters of the %s guild are near you.
- clif_displaymessage(fd, atcmd_output);
- if (count) {
- sprintf(atcmd_output, "Because you are not authorised to warp from some maps, %d player(s) have not been recalled.", count);
- clif_displaymessage(fd, atcmd_output);
- }
- } else {
- clif_displaymessage(fd, msg_table[94]); // Incorrect name/ID, or no one from the guild is online.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * Recall online characters of a party to your location
- *------------------------------------------
- */
-int atcommand_partyrecall(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i;
- struct map_session_data *pl_sd;
- char party_name[100];
- struct party *p;
- int count;
- nullpo_retr(-1, sd);
-
- memset(party_name, '\0', sizeof(party_name));
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", party_name) < 1) {
- clif_displaymessage(fd, "Please, enter a party name/id (usage: @partyrecall <party_name/id>).");
- return -1;
- }
-
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp somenone to your actual map.");
- return -1;
- }
-
- if ((p = party_searchname(party_name)) != NULL || // name first to avoid error when name begin with a number
- (p = party_search(atoi(message))) != NULL) {
- count = 0;
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth &&
- sd->status.account_id != pl_sd->status.account_id &&
- pl_sd->status.party_id == p->party_id) {
- if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd))
- count++;
- else
- pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2);
- }
- }
- sprintf(atcmd_output, msg_table[95], p->name); // All online characters of the %s party are near you.
- clif_displaymessage(fd, atcmd_output);
- if (count) {
- sprintf(atcmd_output, "Because you are not authorised to warp from some maps, %d player(s) have not been recalled.", count);
- clif_displaymessage(fd, atcmd_output);
- }
- } else {
- clif_displaymessage(fd, msg_table[96]); // Incorrect name or ID, or no one from the party is online.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_reloaditemdb(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- itemdb_reload();
- clif_displaymessage(fd, msg_table[97]); // Item database reloaded.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_reloadmobdb(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- mob_reload();
- read_petdb();
- clif_displaymessage(fd, msg_table[98]); // Monster database reloaded.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_reloadskilldb(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- skill_reload();
- clif_displaymessage(fd, msg_table[99]); // Skill database reloaded.
-
- return 0;
-}
-
-/*==========================================
- * @reloadatcommand
- * atcommand_athena.conf ‚̃Šƒ[ƒh
- *------------------------------------------
- */
-int
-atcommand_reloadatcommand(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- atcommand_config_read(ATCOMMAND_CONF_FILENAME);
- clif_displaymessage(fd, msg_table[254]);
- return 0;
-}
-/*==========================================
- * @reloadbattleconf
- * battle_athena.conf ‚̃Šƒ[ƒh
- *------------------------------------------
- */
-int
-atcommand_reloadbattleconf(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- battle_config_read(BATTLE_CONF_FILENAME);
- clif_displaymessage(fd, msg_table[255]);
- return 0;
-}
-/*==========================================
- * @reloadstatusdb
- * job_db1.txt job_db2.txt job_db2-2.txt
- * refine_db.txt size_fix.txt
- * ‚̃Šƒ[ƒh
- *------------------------------------------
- */
-int
-atcommand_reloadstatusdb(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- status_readdb();
- clif_displaymessage(fd, msg_table[256]);
- return 0;
-}
-/*==========================================
- * @reloadpcdb
- * exp.txt skill_tree.txt attr_fix.txt
- * ‚̃Šƒ[ƒh
- *------------------------------------------
- */
-int
-atcommand_reloadpcdb(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- pc_readdb();
- clif_displaymessage(fd, msg_table[257]);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void rehash(void)
-{
- int map_id;
-
- for (map_id = 0; map_id < map_num; map_id++) {
- map_foreachinarea(cleanup_sub, map_id, 0, 0, map[map_id].xs, map[map_id].ys, BL_MOB);
- map_foreachinarea(cleanup_sub, map_id, 0, 0, map[map_id].xs, map[map_id].ys, BL_NPC);
- }
-}
-int atcommand_reloadscript(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- atcommand_broadcast( fd, sd, "@broadcast", "eAthena Server is Rehashing..." );
- atcommand_broadcast( fd, sd, "@broadcast", "You will feel a bit of lag at this point !" );
-
- rehash();
-
- atcommand_broadcast( fd, sd, "@broadcast", "Reloading NPCs..." );
- //do_init_npc();
- do_init_script();
- npc_reload();
- npc_event_do_oninit();
-
- clif_displaymessage(fd, msg_table[100]); // Scripts reloaded.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_reloadgmdb( // by [Yor]
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- chrif_reloadGMdb();
-
- clif_displaymessage(fd, msg_table[101]); // Login-server asked to reload GM accounts and their level.
-
- return 0;
-}
-
-/*==========================================
- * @mapinfo <map name> [0-3] by MC_Cameri
- * => Shows information about the map [map name]
- * 0 = no additional information
- * 1 = Show users in that map and their location
- * 2 = Shows NPCs in that map
- * 3 = Shows the shops/chats in that map (not implemented)
- *------------------------------------------
- */
-int atcommand_mapinfo(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- struct npc_data *nd = NULL;
- struct chat_data *cd = NULL;
- char direction[12];
- int m_id, i, chat_num, list = 0;
- nullpo_retr(-1, sd);
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
- memset(direction, '\0', sizeof(direction));
-
- sscanf(message, "%d %99[^\n]", &list, atcmd_player_name);
-
- if (list < 0 || list > 3) {
- clif_displaymessage(fd, "Please, enter at least a valid list number (usage: @mapinfo <0-3> [map]).");
- return -1;
- }
-
- if (atcmd_player_name[0] == '\0')
- strcpy(atcmd_player_name, sd->mapname);
- if (strstr(atcmd_player_name, ".gat") == NULL && strstr(atcmd_player_name, ".afm") == NULL && strlen(atcmd_player_name) < 13) // 16 - 4 (.gat)
- strcat(atcmd_player_name, ".gat");
-
- if ((m_id = map_mapname2mapid(atcmd_player_name)) < 0) {
- clif_displaymessage(fd, msg_table[1]); // Map not found.
- return -1;
- }
-
- clif_displaymessage(fd, "------ Map Info ------");
- sprintf(atcmd_output, "Map Name: %s", atcmd_player_name);
- clif_displaymessage(fd, atcmd_output);
- sprintf(atcmd_output, "Players In Map: %d", map[m_id].users);
- clif_displaymessage(fd, atcmd_output);
- sprintf(atcmd_output, "NPCs In Map: %d", map[m_id].npc_num);
- clif_displaymessage(fd, atcmd_output);
- chat_num = 0;
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth &&
- (cd = (struct chat_data*)map_id2bl(pl_sd->chatID))) {
- chat_num++;
- }
- }
- sprintf(atcmd_output, "Chats In Map: %d", chat_num);
- clif_displaymessage(fd, atcmd_output);
- clif_displaymessage(fd, "------ Map Flags ------");
- sprintf(atcmd_output, "Player vs Player: %s | No Guild: %s | No Party: %s",
- (map[m_id].flag.pvp) ? "True" : "False",
- (map[m_id].flag.pvp_noguild) ? "True" : "False",
- (map[m_id].flag.pvp_noparty) ? "True" : "False");
- clif_displaymessage(fd, atcmd_output);
- sprintf(atcmd_output, "Guild vs Guild: %s | No Party: %s", (map[m_id].flag.gvg) ? "True" : "False", (map[m_id].flag.gvg_noparty) ? "True" : "False");
- clif_displaymessage(fd, atcmd_output);
- sprintf(atcmd_output, "No Dead Branch: %s", (map[m_id].flag.nobranch) ? "True" : "False");
- clif_displaymessage(fd, atcmd_output);
- sprintf(atcmd_output, "No Memo: %s", (map[m_id].flag.nomemo) ? "True" : "False");
- clif_displaymessage(fd, atcmd_output);
- sprintf(atcmd_output, "No Penalty: %s", (map[m_id].flag.nopenalty) ? "True" : "False");
- clif_displaymessage(fd, atcmd_output);
- sprintf(atcmd_output, "No Return: %s", (map[m_id].flag.noreturn) ? "True" : "False");
- clif_displaymessage(fd, atcmd_output);
- sprintf(atcmd_output, "No Save: %s", (map[m_id].flag.nosave) ? "True" : "False");
- clif_displaymessage(fd, atcmd_output);
- sprintf(atcmd_output, "No Teleport: %s", (map[m_id].flag.noteleport) ? "True" : "False");
- clif_displaymessage(fd, atcmd_output);
- sprintf(atcmd_output, "No Monster Teleport: %s", (map[m_id].flag.monster_noteleport) ? "True" : "False");
- clif_displaymessage(fd, atcmd_output);
- sprintf(atcmd_output, "No Zeny Penalty: %s", (map[m_id].flag.nozenypenalty) ? "True" : "False");
- clif_displaymessage(fd, atcmd_output);
-
- switch (list) {
- case 0:
- // Do nothing. It's list 0, no additional display.
- break;
- case 1:
- clif_displaymessage(fd, "----- Players in Map -----");
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth && strcmp(pl_sd->mapname, atcmd_player_name) == 0) {
- sprintf(atcmd_output, "Player '%s' (session #%d) | Location: %d,%d",
- pl_sd->status.name, i, pl_sd->bl.x, pl_sd->bl.y);
- clif_displaymessage(fd, atcmd_output);
- }
- }
- break;
- case 2:
- clif_displaymessage(fd, "----- NPCs in Map -----");
- for (i = 0; i < map[m_id].npc_num;) {
- nd = map[m_id].npc[i];
- switch(nd->dir) {
- case 0: strcpy(direction, "North"); break;
- case 1: strcpy(direction, "North West"); break;
- case 2: strcpy(direction, "West"); break;
- case 3: strcpy(direction, "South West"); break;
- case 4: strcpy(direction, "South"); break;
- case 5: strcpy(direction, "South East"); break;
- case 6: strcpy(direction, "East"); break;
- case 7: strcpy(direction, "North East"); break;
- case 9: strcpy(direction, "North"); break;
- default: strcpy(direction, "Unknown"); break;
- }
- sprintf(atcmd_output, "NPC %d: %s | Direction: %s | Sprite: %d | Location: %d %d",
- ++i, nd->name, direction, nd->class_, nd->bl.x, nd->bl.y);
- clif_displaymessage(fd, atcmd_output);
- }
- break;
- case 3:
- clif_displaymessage(fd, "----- Chats in Map -----");
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth &&
- (cd = (struct chat_data*)map_id2bl(pl_sd->chatID)) &&
- strcmp(pl_sd->mapname, atcmd_player_name) == 0 &&
- cd->usersd[0] == pl_sd) {
- sprintf(atcmd_output, "Chat %d: %s | Player: %s | Location: %d %d",
- i, cd->title, pl_sd->status.name, cd->bl.x, cd->bl.y);
- clif_displaymessage(fd, atcmd_output);
- sprintf(atcmd_output, " Users: %d/%d | Password: %s | Public: %s",
- cd->users, cd->limit, cd->pass, (cd->pub) ? "Yes" : "No");
- clif_displaymessage(fd, atcmd_output);
- }
- }
- break;
- default: // normally impossible to arrive here
- clif_displaymessage(fd, "Please, enter at least a valid list number (usage: @mapinfo <0-3> [map]).");
- return -1;
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_mount_peco(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- if (sd->disguise > 0) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
- clif_displaymessage(fd, msg_table[212]); // Cannot mount a Peco while in disguise.
- return -1;
- }
-
- if (!pc_isriding(sd)) { // if actually no peco
- if (sd->status.class_ == 7 || sd->status.class_ == 14 || sd->status.class_ == 4008 || sd->status.class_ == 4015) {
- if (sd->status.class_ == 7)
- sd->status.class_ = sd->view_class = 13;
- else if (sd->status.class_ == 14)
- sd->status.class_ = sd->view_class = 21;
- else if (sd->status.class_ == 4008)
- sd->status.class_ = sd->view_class = 4014;
- else if (sd->status.class_ == 4015)
- sd->status.class_ = sd->view_class = 4022;
- pc_setoption(sd, sd->status.option | 0x0020);
- clif_displaymessage(fd, msg_table[102]); // Mounted Peco.
- } else {
- clif_displaymessage(fd, msg_table[213]); // You can not mount a peco with your job.
- return -1;
- }
- } else {
- if (sd->status.class_ == 13)
- sd->status.class_ = sd->view_class = 7;
- else if (sd->status.class_ == 21)
- sd->status.class_ = sd->view_class = 14;
- else if (sd->status.class_ == 4014)
- sd->status.class_ = sd->view_class = 4008;
- else if (sd->status.class_ == 4022)
- sd->status.class_ = sd->view_class = 4015;
- pc_setoption(sd, sd->status.option & ~0x0020);
- clif_displaymessage(fd, msg_table[214]); // Unmounted Peco.
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_char_mount_peco(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charmountpeco <char_name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- if (pl_sd->disguise > 0) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
- clif_displaymessage(fd, msg_table[215]); // This player cannot mount a Peco while in disguise.
- return -1;
- }
-
- if (!pc_isriding(pl_sd)) { // if actually no peco
- if (pl_sd->status.class_ == 7 || pl_sd->status.class_ == 14 || pl_sd->status.class_ == 4008 || pl_sd->status.class_ == 4015) {
- if (pl_sd->status.class_ == 7)
- pl_sd->status.class_ = pl_sd->view_class = 13;
- else if (pl_sd->status.class_ == 14)
- pl_sd->status.class_ = pl_sd->view_class = 21;
- else if (pl_sd->status.class_ == 4008)
- pl_sd->status.class_ = pl_sd->view_class = 4014;
- else if (pl_sd->status.class_ == 4015)
- pl_sd->status.class_ = pl_sd->view_class = 4022;
- pc_setoption(pl_sd, pl_sd->status.option | 0x0020);
- clif_displaymessage(fd, msg_table[216]); // Now, this player mounts a peco.
- } else {
- clif_displaymessage(fd, msg_table[217]); // This player can not mount a peco with his/her job.
- return -1;
- }
- } else {
- if (pl_sd->status.class_ == 13)
- pl_sd->status.class_ = pl_sd->view_class = 7;
- else if (pl_sd->status.class_ == 21)
- pl_sd->status.class_ = pl_sd->view_class = 14;
- else if (pl_sd->status.class_ == 4014)
- pl_sd->status.class_ = pl_sd->view_class = 4008;
- else if (pl_sd->status.class_ == 4022)
- pl_sd->status.class_ = pl_sd->view_class = 4015;
- pc_setoption(pl_sd, pl_sd->status.option & ~0x0020);
- clif_displaymessage(fd, msg_table[218]); // Now, this player has not more peco.
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *Spy Commands by Syrus22
- *------------------------------------------
- */
-int atcommand_guildspy(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char guild_name[100];
- struct guild *g;
- nullpo_retr(-1, sd);
-
- memset(guild_name, '\0', sizeof(guild_name));
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", guild_name) < 1) {
- clif_displaymessage(fd, "Please, enter a guild name/id (usage: @guildspy <guild_name/id>).");
- return -1;
- }
-
- if ((g = guild_searchname(guild_name)) != NULL || // name first to avoid error when name begin with a number
- (g = guild_search(atoi(message))) != NULL) {
- if (sd->guildspy == g->guild_id) {
- sd->guildspy = 0;
- sprintf(atcmd_output, msg_table[103], g->name); // No longer spying on the %s guild.
- clif_displaymessage(fd, atcmd_output);
- } else {
- sd->guildspy = g->guild_id;
- sprintf(atcmd_output, msg_table[104], g->name); // Spying on the %s guild.
- clif_displaymessage(fd, atcmd_output);
- }
- } else {
- clif_displaymessage(fd, msg_table[94]); // Incorrect name/ID, or no one from the guild is online.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_partyspy(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char party_name[100];
- struct party *p;
- nullpo_retr(-1, sd);
-
- memset(party_name, '\0', sizeof(party_name));
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", party_name) < 1) {
- clif_displaymessage(fd, "Please, enter a party name/id (usage: @partyspy <party_name/id>).");
- return -1;
- }
-
- if ((p = party_searchname(party_name)) != NULL || // name first to avoid error when name begin with a number
- (p = party_search(atoi(message))) != NULL) {
- if (sd->partyspy == p->party_id) {
- sd->partyspy = 0;
- sprintf(atcmd_output, msg_table[105], p->name); // No longer spying on the %s party.
- clif_displaymessage(fd, atcmd_output);
- } else {
- sd->partyspy = p->party_id;
- sprintf(atcmd_output, msg_table[106], p->name); // Spying on the %s party.
- clif_displaymessage(fd, atcmd_output);
- }
- } else {
- clif_displaymessage(fd, msg_table[96]); // Incorrect name or ID, or no one from the party is online.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @repairall [Valaris]
- *------------------------------------------
- */
-int atcommand_repairall(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int count, i;
- nullpo_retr(-1, sd);
-
- count = 0;
- for (i = 0; i < MAX_INVENTORY; i++) {
- if (sd->status.inventory[i].nameid && sd->status.inventory[i].attribute == 1) {
- sd->status.inventory[i].attribute = 0;
- clif_produceeffect(sd, 0, sd->status.inventory[i].nameid);
- count++;
- }
- }
-
- if (count > 0) {
- clif_misceffect(&sd->bl, 3);
- clif_equiplist(sd);
- clif_displaymessage(fd, msg_table[107]); // All items have been repaired.
- } else {
- clif_displaymessage(fd, msg_table[108]); // No item need to be repaired.
- return -1;
- }
-
- return 0;
-}
-
-// Removed @nuke for now in favor of alchemist marine sphere skill [Valaris]
-int atcommand_nuke(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @nuke <char name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can kill only lower or same GM level
- skill_castend_damage_id(&pl_sd->bl, &pl_sd->bl, NPC_SELFDESTRUCTION, 99, gettick(), 0);
- clif_displaymessage(fd, msg_table[109]); // Player has been nuked!
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_enablenpc(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char NPCname[100];
- nullpo_retr(-1, sd);
-
- memset(NPCname, '\0', sizeof(NPCname));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", NPCname) < 1) {
- clif_displaymessage(fd, "Please, enter a NPC name (usage: @enablenpc <NPC_name>).");
- return -1;
- }
-
- if (npc_name2id(NPCname) != NULL) {
- npc_enable(NPCname, 1);
- clif_displaymessage(fd, msg_table[110]); // Npc Enabled.
- } else {
- clif_displaymessage(fd, msg_table[111]); // This NPC doesn't exist.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_hidenpc(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char NPCname[100];
- nullpo_retr(-1, sd);
-
- memset(NPCname, '\0', sizeof(NPCname));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", NPCname) < 1) {
- clif_displaymessage(fd, "Please, enter a NPC name (usage: @npcoff <NPC_name>).");
- return -1;
- }
-
- if (npc_name2id(NPCname) != NULL) {
- npc_enable(NPCname, 0);
- clif_displaymessage(fd, msg_table[112]); // Npc Disabled.
- } else {
- clif_displaymessage(fd, msg_table[111]); // This NPC doesn't exist.
- return -1;
- }
-
- return 0;
-}
-
-int atcommand_disablenpc(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct npc_data *nd;
- char NPCname[100];
- nullpo_retr(-1, sd);
-
- memset(NPCname, '\0', sizeof(NPCname));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", NPCname) < 1) {
- clif_displaymessage(fd, "Please, enter a NPC name (usage: @npcoff <NPC_name>).");
- return -1;
- }
-
- if ((nd = npc_name2id(NPCname)) != NULL) {
- npc_unload(nd);
- clif_displaymessage(fd, msg_table[112]); // Npc Disabled.
- } else {
- clif_displaymessage(fd, msg_table[111]); // This NPC doesn't exist.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * time in txt for time command (by [Yor])
- *------------------------------------------
- */
-char * txt_time(unsigned int duration) {
- int days, hours, minutes, seconds;
- char temp[256];
- static char temp1[256];
-
- memset(temp, '\0', sizeof(temp));
- memset(temp1, '\0', sizeof(temp1));
-
- if (duration < 0)
- duration = 0;
-
- days = duration / (60 * 60 * 24);
- duration = duration - (60 * 60 * 24 * days);
- hours = duration / (60 * 60);
- duration = duration - (60 * 60 * hours);
- minutes = duration / 60;
- seconds = duration - (60 * minutes);
-
- if (days < 2)
- sprintf(temp, msg_table[219], days); // %d day
- else
- sprintf(temp, msg_table[220], days); // %d days
- if (hours < 2)
- sprintf(temp1, msg_table[221], temp, hours); // %s %d hour
- else
- sprintf(temp1, msg_table[222], temp, hours); // %s %d hours
- if (minutes < 2)
- sprintf(temp, msg_table[223], temp1, minutes); // %s %d minute
- else
- sprintf(temp, msg_table[224], temp1, minutes); // %s %d minutes
- if (seconds < 2)
- sprintf(temp1, msg_table[225], temp, seconds); // %s and %d second
- else
- sprintf(temp1, msg_table[226], temp, seconds); // %s and %d seconds
-
- return temp1;
-}
-
-/*==========================================
- * @time/@date/@server_date/@serverdate/@server_time/@servertime: Display the date/time of the server (by [Yor]
- * Calculation management of GM modification (@day/@night GM commands) is done
- *------------------------------------------
- */
-int atcommand_servertime(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct TimerData * timer_data;
- struct TimerData * timer_data2;
- time_t time_server; // variable for number of seconds (used with time() function)
- struct tm *datetime; // variable for time in structure ->tm_mday, ->tm_sec, ...
- char temp[256];
- nullpo_retr(-1, sd);
-
- memset(temp, '\0', sizeof(temp));
-
- time(&time_server); // get time in seconds since 1/1/1970
- datetime = localtime(&time_server); // convert seconds in structure
- // like sprintf, but only for date/time (Sunday, November 02 2003 15:12:52)
- strftime(temp, sizeof(temp)-1, msg_table[230], datetime); // Server time (normal time): %A, %B %d %Y %X.
- clif_displaymessage(fd, temp);
-
- if (battle_config.night_duration == 0 && battle_config.day_duration == 0) {
- if (night_flag == 0)
- clif_displaymessage(fd, msg_table[231]); // Game time: The game is in permanent daylight.
- else
- clif_displaymessage(fd, msg_table[232]); // Game time: The game is in permanent night.
- } else if (battle_config.night_duration == 0)
- if (night_flag == 1) { // we start with night
- timer_data = get_timer(day_timer_tid);
- sprintf(temp, msg_table[233], txt_time((timer_data->tick - gettick()) / 1000)); // Game time: The game is actualy in night for %s.
- clif_displaymessage(fd, temp);
- clif_displaymessage(fd, msg_table[234]); // Game time: After, the game will be in permanent daylight.
- } else
- clif_displaymessage(fd, msg_table[231]); // Game time: The game is in permanent daylight.
- else if (battle_config.day_duration == 0)
- if (night_flag == 0) { // we start with day
- timer_data = get_timer(night_timer_tid);
- sprintf(temp, msg_table[235], txt_time((timer_data->tick - gettick()) / 1000)); // Game time: The game is actualy in daylight for %s.
- clif_displaymessage(fd, temp);
- clif_displaymessage(fd, msg_table[236]); // Game time: After, the game will be in permanent night.
- } else
- clif_displaymessage(fd, msg_table[232]); // Game time: The game is in permanent night.
- else {
- if (night_flag == 0) {
- timer_data = get_timer(night_timer_tid);
- timer_data2 = get_timer(day_timer_tid);
- sprintf(temp, msg_table[235], txt_time((timer_data->tick - gettick()) / 1000)); // Game time: The game is actualy in daylight for %s.
- clif_displaymessage(fd, temp);
- if (timer_data->tick > timer_data2->tick)
- sprintf(temp, msg_table[237], txt_time((timer_data->interval - abs(timer_data->tick - timer_data2->tick)) / 1000)); // Game time: After, the game will be in night for %s.
- else
- sprintf(temp, msg_table[237], txt_time(abs(timer_data->tick - timer_data2->tick) / 1000)); // Game time: After, the game will be in night for %s.
- clif_displaymessage(fd, temp);
- sprintf(temp, msg_table[238], txt_time(timer_data->interval / 1000)); // Game time: A day cycle has a normal duration of %s.
- clif_displaymessage(fd, temp);
- } else {
- timer_data = get_timer(day_timer_tid);
- timer_data2 = get_timer(night_timer_tid);
- sprintf(temp, msg_table[233], txt_time((timer_data->tick - gettick()) / 1000)); // Game time: The game is actualy in night for %s.
- clif_displaymessage(fd, temp);
- if (timer_data->tick > timer_data2->tick)
- sprintf(temp, msg_table[239], txt_time((timer_data->interval - abs(timer_data->tick - timer_data2->tick)) / 1000)); // Game time: After, the game will be in daylight for %s.
- else
- sprintf(temp, msg_table[239], txt_time(abs(timer_data->tick - timer_data2->tick) / 1000)); // Game time: After, the game will be in daylight for %s.
- clif_displaymessage(fd, temp);
- sprintf(temp, msg_table[238], txt_time(timer_data->interval / 1000)); // Game time: A day cycle has a normal duration of %s.
- clif_displaymessage(fd, temp);
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * @chardelitem <item_name_or_ID> <quantity> <player> (by [Yor]
- * removes <quantity> item from a character
- * item can be equiped or not.
- * Inspired from a old command created by RoVeRT
- *------------------------------------------
- */
-int atcommand_chardelitem(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- char item_name[100];
- int i, number = 0, item_id, item_position, count;
- struct item_data *item_data;
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
- memset(item_name, '\0', sizeof(item_name));
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || !*message || sscanf(message, "%s %d %99[^\n]", item_name, &number, atcmd_player_name) < 3 || number < 1) {
- clif_displaymessage(fd, "Please, enter an item name/id, a quantity and a player name (usage: @chardelitem <item_name_or_ID> <quantity> <player>).");
- return -1;
- }
-
- item_id = 0;
- if ((item_data = itemdb_searchname(item_name)) != NULL ||
- (item_data = itemdb_exists(atoi(item_name))) != NULL)
- item_id = item_data->nameid;
-
- if (item_id > 500) {
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can kill only lower or same level
- item_position = pc_search_inventory(pl_sd, item_id);
- if (item_position >= 0) {
- count = 0;
- for(i = 0; i < number && item_position >= 0; i++) {
- pc_delitem(pl_sd, item_position, 1, 0);
- count++;
- item_position = pc_search_inventory(pl_sd, item_id); // for next loop
- }
- sprintf(atcmd_output, msg_table[113], count); // %d item(s) removed by a GM.
- clif_displaymessage(pl_sd->fd, atcmd_output);
- if (number == count)
- sprintf(atcmd_output, msg_table[114], count); // %d item(s) removed from the player.
- else
- sprintf(atcmd_output, msg_table[115], count, count, number); // %d item(s) removed. Player had only %d on %d items.
- clif_displaymessage(fd, atcmd_output);
- } else {
- clif_displaymessage(fd, msg_table[116]); // Character does not have the item.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[19]); // Invalid item ID or name.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @jail <char_name> by [Yor]
- * Special warp! No check with nowarp and nowarpto flag
- *------------------------------------------
- */
-int atcommand_jail(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int x, y;
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @jail <char_name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can jail only lower or same GM
- switch(rand() % 2) {
- case 0:
- x = 24;
- y = 75;
- break;
- default:
- x = 49;
- y = 75;
- break;
- }
- if (pc_setpos(pl_sd, "sec_pri.gat", x, y, 3) == 0) {
- pc_setsavepoint(pl_sd, "sec_pri.gat", x, y); // Save Char Respawn Point in the jail room [Lupus]
- clif_displaymessage(pl_sd->fd, msg_table[117]); // GM has send you in jails.
- clif_displaymessage(fd, msg_table[118]); // Player warped in jails.
- } else {
- clif_displaymessage(fd, msg_table[1]); // Map not found.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @unjail/@discharge <char_name> by [Yor]
- * Special warp! No check with nowarp and nowarpto flag
- *------------------------------------------
- */
-int atcommand_unjail(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @unjail/@discharge <char_name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can jail only lower or same GM
- if (pl_sd->bl.m != map_mapname2mapid("sec_pri.gat")) {
- clif_displaymessage(fd, msg_table[119]); // This player is not in jails.
- return -1;
- } else if (pc_setpos(pl_sd, "prontera.gat", 0, 0, 3) == 0) { //old coords: 156,191
- pc_setsavepoint(pl_sd, "prontera.gat", 0, 0); // Save char respawn point in Prontera
- clif_displaymessage(pl_sd->fd, msg_table[120]); // GM has discharge you.
- clif_displaymessage(fd, msg_table[121]); // Player warped to Prontera.
- } else {
- clif_displaymessage(fd, msg_table[1]); // Map not found.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @disguise <mob_id> by [Valaris] (simplified by [Yor])
- *------------------------------------------
- */
-int atcommand_disguise(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int mob_id = 0;
- nullpo_retr(-1, sd);
-
- if (!message || !*message) {
- clif_displaymessage(fd, "Please, enter a Monster/NPC name/id (usage: @disguise <monster_name_or_monster_ID>).");
- return -1;
- }
-
- if ((mob_id = mobdb_searchname(message)) == 0) // check name first (to avoid possible name begining by a number)
- mob_id = atoi(message);
-
- if ((mob_id >= 46 && mob_id <= 125) || (mob_id >= 700 && mob_id <= 718) || // NPC
- (mob_id >= 721 && mob_id <= 755) || (mob_id >= 757 && mob_id <= 811) || // NPC
- (mob_id >= 813 && mob_id <= 834) || // NPC
- (mob_id > 1000 && mob_id < 1582)) { // monsters
- if (pc_isriding(sd)) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
- clif_displaymessage(fd, msg_table[227]); // Cannot wear disguise while riding a Peco.
- return -1;
- }
- sd->disguiseflag = 1; // set to override items with disguise script [Valaris]
- sd->disguise = mob_id;
- pc_setpos(sd, sd->mapname, sd->bl.x, sd->bl.y, 3);
- clif_displaymessage(fd, msg_table[122]); // Disguise applied.
- } else {
- clif_displaymessage(fd, msg_table[123]); // Monster/NPC name/id hasn't been found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * DisguiseAll
- *------------------------------------------
- */
-
-int atcommand_disguiseall(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int mob_id=0, i=0;
- struct map_session_data *pl_sd;
- nullpo_retr(-1, sd);
-
- if (!message || !*message) {
- clif_displaymessage(fd, "Please, enter a Monster/NPC name/id (usage: @disguiseall <monster_name_or_monster_ID>).");
- return -1;
- }
-
- if ((mob_id = mobdb_searchname(message)) == 0) // check name first (to avoid possible name begining by a number)
- mob_id = atoi(message);
-
- if ((mob_id >= 46 && mob_id <= 125) || (mob_id >= 700 && mob_id <= 718) || // NPC
- (mob_id >= 721 && mob_id <= 755) || (mob_id >= 757 && mob_id <= 811) || // NPC
- (mob_id >= 813 && mob_id <= 834) || // NPC
- (mob_id > 1000 && mob_id < 1582)) { // monsters
- for(i=0; i < fd_max; i++) {
- if(session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth) {
- if(pc_isriding(pl_sd)) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
- clif_displaymessage(fd, msg_table[227]); // Cannot wear disguise while riding a Peco.
- } else {
- pl_sd->disguiseflag = 1; // set to override items with disguise script [Valaris]
- pl_sd->disguise = mob_id;
- pc_setpos(pl_sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3);
- }
- }
- }
- clif_displaymessage(fd, msg_table[122]); // Disguise applied.
- } else {
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @undisguise by [Yor]
- *------------------------------------------
- */
-int atcommand_undisguise(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- if (sd->disguise) {
- clif_clearchar(&sd->bl, 9);
- sd->disguise = 0;
- pc_setpos(sd, sd->mapname, sd->bl.x, sd->bl.y, 3);
- clif_displaymessage(fd, msg_table[124]); // Undisguise applied.
- } else {
- clif_displaymessage(fd, msg_table[125]); // You're not disguised.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * UndisguiseAll
- *------------------------------------------
- */
-int atcommand_undisguiseall(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
- nullpo_retr(-1, sd);
-
- for(i=0; i < fd_max; i++) {
- if(session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth && pl_sd->disguise) {
- clif_clearchar(&pl_sd->bl, 9);
- pl_sd->disguise = 0;
- pc_setpos(pl_sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3);
- }
- }
- clif_displaymessage(fd, msg_table[124]); // Undisguise applied.
-
- return 0;
-}
-
-/*==========================================
- * @broadcast by [Valaris]
- *------------------------------------------
- */
-int atcommand_broadcast(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || !*message) {
- clif_displaymessage(fd, "Please, enter a message (usage: @broadcast <message>).");
- return -1;
- }
-
- sprintf(atcmd_output, "%s : %s", sd->status.name, message);
- intif_GMmessage(atcmd_output, strlen(atcmd_output) + 1, 0);
-
- return 0;
-}
-
-/*==========================================
- * @localbroadcast by [Valaris]
- *------------------------------------------
- */
-int atcommand_localbroadcast(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || !*message) {
- clif_displaymessage(fd, "Please, enter a message (usage: @localbroadcast <message>).");
- return -1;
- }
-
- sprintf(atcmd_output, "%s : %s", sd->status.name, message);
-
- clif_GMmessage(&sd->bl, atcmd_output, strlen(atcmd_output) + 1, 1); // 1: ALL_SAMEMAP
-
- return 0;
-}
-
-/*==========================================
- * @chardisguise <mob_id> <character> by Kalaspuff (based off Valaris' and Yor's work)
- *------------------------------------------
- */
-int atcommand_chardisguise(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int mob_id;
- char mob_name[100];
- struct map_session_data* pl_sd;
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
- memset(mob_name, '\0', sizeof(mob_name));
-
- if (!message || !*message || sscanf(message, "%s %99[^\n]", mob_name, atcmd_player_name) < 2) {
- clif_displaymessage(fd, "Please, enter a Monster/NPC name/id and a player name (usage: @chardisguise <monster_name_or_monster_ID> <char name>).");
- return -1;
- }
-
- if ((mob_id = mobdb_searchname(mob_name)) == 0) // check name first (to avoid possible name begining by a number)
- mob_id = atoi(mob_name);
-
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can disguise only lower or same level
- if ((mob_id >= 46 && mob_id <= 125) || (mob_id >= 700 && mob_id <= 718) || // NPC
- (mob_id >= 721 && mob_id <= 755) || (mob_id >= 757 && mob_id <= 811) || // NPC
- (mob_id >= 813 && mob_id <= 834) || // NPC
- (mob_id > 1000 && mob_id < 1521)) { // monsters
- if (pc_isriding(pl_sd)) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
- clif_displaymessage(fd, msg_table[228]); // Character cannot wear disguise while riding a Peco.
- return -1;
- }
- pl_sd->disguiseflag = 1; // set to override items with disguise script [Valaris]
- pl_sd->disguise = mob_id;
- pc_setpos(pl_sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3);
- clif_displaymessage(fd, msg_table[140]); // Character's disguise applied.
- } else {
- clif_displaymessage(fd, msg_table[123]); // Monster/NPC name/id hasn't been found.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @charundisguise <character> by Kalaspuff (based off Yor's work)
- *------------------------------------------
- */
-int atcommand_charundisguise(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data* pl_sd;
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charundisguise <char name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can undisguise only lower or same level
- if (pl_sd->disguise) {
- clif_clearchar(&pl_sd->bl, 9);
- pl_sd->disguise = 0;
- pc_setpos(pl_sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3);
- clif_displaymessage(fd, msg_table[141]); // Character's undisguise applied.
- } else {
- clif_displaymessage(fd, msg_table[142]); // Character is not disguised.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @email <actual@email> <new@email> by [Yor]
- *------------------------------------------
- */
-int atcommand_email(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char actual_email[100];
- char new_email[100];
- nullpo_retr(-1, sd);
-
- memset(actual_email, '\0', sizeof(actual_email));
- memset(new_email, '\0', sizeof(new_email));
-
- if (!message || !*message || sscanf(message, "%99s %99s", actual_email, new_email) < 2) {
- clif_displaymessage(fd, "Please enter 2 emails (usage: @email <actual@email> <new@email>).");
- return -1;
- }
-
- if (e_mail_check(actual_email) == 0) {
- clif_displaymessage(fd, msg_table[144]); // Invalid actual email. If you have default e-mail, give a@a.com.
- return -1;
- } else if (e_mail_check(new_email) == 0) {
- clif_displaymessage(fd, msg_table[145]); // Invalid new email. Please enter a real e-mail.
- return -1;
- } else if (strcmpi(new_email, "a@a.com") == 0) {
- clif_displaymessage(fd, msg_table[146]); // New email must be a real e-mail.
- return -1;
- } else if (strcmpi(actual_email, new_email) == 0) {
- clif_displaymessage(fd, msg_table[147]); // New email must be different of the actual e-mail.
- return -1;
- } else {
- chrif_changeemail(sd->status.account_id, actual_email, new_email);
- clif_displaymessage(fd, msg_table[148]); // Information sended to login-server via char-server.
- }
-
- return 0;
-}
-
-/*==========================================
- *@effect
- *------------------------------------------
- */
-int atcommand_effect(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int type = 0, flag = 0, i;
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%d %d", &type,&flag) < 2) {
- clif_displaymessage(fd, "Please, enter at least a option (usage: @effect <type+>).");
- return -1;
- }
- if(flag <=0){
- clif_specialeffect(&sd->bl, type, flag);
- clif_displaymessage(fd, msg_table[229]); // Your effect has changed.
- }
- else{
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth) {
- clif_specialeffect(&pl_sd->bl, type, flag);
- clif_displaymessage(pl_sd->fd, msg_table[229]); // Your effect has changed.
- }
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * @charcartlist <character>: Displays the items list of a player's cart.
- *------------------------------------------
- */
-int
-atcommand_character_cart_list(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char outputtmp[200];
- struct map_session_data *pl_sd;
- struct item_data *item_data, *item_temp;
- int i, j, count, counter, counter2;
- nullpo_retr(-1, sd);
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
- memset(atcmd_output, '\0', sizeof(atcmd_output));
- memset(outputtmp, '\0', sizeof(outputtmp));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charitemlist <char name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can look items only lower or same level
- counter = 0;
- count = 0;
- for (i = 0; i < MAX_CART; i++) {
- if (pl_sd->status.cart[i].nameid > 0 && (item_data = itemdb_search(pl_sd->status.cart[i].nameid)) != NULL) {
- counter = counter + pl_sd->status.cart[i].amount;
- count++;
- if (count == 1) {
- sprintf(atcmd_output, "------ Cart items list of '%s' ------", pl_sd->status.name);
- clif_displaymessage(fd, atcmd_output);
- }
- if (pl_sd->status.cart[i].refine)
- sprintf(atcmd_output, "%d %s %+d (%s %+d, id: %d)", pl_sd->status.cart[i].amount, item_data->name, pl_sd->status.cart[i].refine, item_data->jname, pl_sd->status.cart[i].refine, pl_sd->status.cart[i].nameid);
- else
- sprintf(atcmd_output, "%d %s (%s, id: %d)", pl_sd->status.cart[i].amount, item_data->name, item_data->jname, pl_sd->status.cart[i].nameid);
- clif_displaymessage(fd, atcmd_output);
- memset(atcmd_output, '\0', sizeof(atcmd_output));
- counter2 = 0;
- for (j = 0; j < item_data->slot; j++) {
- if (pl_sd->status.cart[i].card[j]) {
- if ( (item_temp = itemdb_search(pl_sd->status.cart[i].card[j])) != NULL) {
- if (atcmd_output[0] == '\0')
- sprintf(outputtmp, " -> (card(s): #%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname);
- else
- sprintf(outputtmp, "#%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname);
- strcat(atcmd_output, outputtmp);
- }
- }
- }
- if (atcmd_output[0] != '\0') {
- atcmd_output[strlen(atcmd_output) - 2] = ')';
- atcmd_output[strlen(atcmd_output) - 1] = '\0';
- clif_displaymessage(fd, atcmd_output);
- }
- }
- }
- if (count == 0)
- clif_displaymessage(fd, "No item found in the cart of this player.");
- else {
- sprintf(atcmd_output, "%d item(s) found in %d kind(s) of items.", counter, count);
- clif_displaymessage(fd, atcmd_output);
- }
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @killer by MouseJstr
- * enable killing players even when not in pvp
- *------------------------------------------
- */
-int
-atcommand_killer(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- sd->special_state.killer = !sd->special_state.killer;
-
- if(sd->special_state.killer)
- clif_displaymessage(fd, msg_table[241]);
- else
- clif_displaymessage(fd, msg_table[242]);
-
- return 0;
-}
-
-/*==========================================
- * @killable by MouseJstr
- * enable other people killing you
- *------------------------------------------
- */
-int
-atcommand_killable(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- sd->special_state.killable = !sd->special_state.killable;
-
- if(sd->special_state.killable)
- clif_displaymessage(fd, msg_table[242]);
- else
- clif_displaymessage(fd, msg_table[241]);
-
- return 0;
-}
-
-/*==========================================
- * @charkillable by MouseJstr
- * enable another player to be killed
- *------------------------------------------
- */
-int
-atcommand_charkillable(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd = NULL;
- nullpo_retr(-1, sd);
-
- if (!message || !*message)
- return -1;
-
- if((pl_sd=map_nick2sd((char *) message)) == NULL)
- return -1;
-
- pl_sd->special_state.killable = !pl_sd->special_state.killable;
-
- if(pl_sd->special_state.killable)
- clif_displaymessage(fd, "The player is now killable");
- else
- clif_displaymessage(fd, "The player is no longer killable");
-
- return 0;
-}
-
-
-/*==========================================
- * @skillon by MouseJstr
- * turn skills on for the map
- *------------------------------------------
- */
-int
-atcommand_skillon(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- map[sd->bl.m].flag.noskill = 0;
- clif_displaymessage(fd, msg_table[244]);
- return 0;
-}
-
-/*==========================================
- * @skilloff by MouseJstr
- * Turn skills off on the map
- *------------------------------------------
- */
-int
-atcommand_skilloff(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- map[sd->bl.m].flag.noskill = 1;
- clif_displaymessage(fd, msg_table[243]);
- return 0;
-}
-
-/*==========================================
- * @npcmove by MouseJstr
- *
- * move a npc
- *------------------------------------------
- */
-int
-atcommand_npcmove(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int x = 0, y = 0;
- struct npc_data *nd = 0;
- nullpo_retr(-1, sd);
-
-
- if (!message || !*message)
- return -1;
-
- memset(atcmd_player_name, '\0', sizeof atcmd_player_name);
-
- if (sscanf(message, "%d %d %99[^\n]", &x, &y, atcmd_player_name) < 3) {
- clif_displaymessage(fd, "Usage: @npcmove <X> <Y> <npc_name>");
- return -1;
- }
-
- nullpo_retr(-1, (nd = npc_name2id(atcmd_player_name)));
-
- npc_enable(atcmd_player_name, 0);
- nd->bl.x = x;
- nd->bl.y = y;
- npc_enable(atcmd_player_name, 1);
-
- return 0;
-}
-
-/*==========================================
- * @addwarp by MouseJstr
- *
- * Create a new static warp point.
- *------------------------------------------
- */
-int
-atcommand_addwarp(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char w1[64], w3[64], w4[64];
- int x,y,ret;
- nullpo_retr(-1, sd);
-
- if (!message || !*message)
- return -1;
-
- if (sscanf(message, "%99s %d %d[^\n]", atcmd_player_name, &x, &y ) < 3)
- return -1;
-
- sprintf(w1,"%s,%d,%d", sd->mapname, sd->bl.x, sd->bl.y);
- sprintf(w3,"%s%d%d%d%d", atcmd_player_name,sd->bl.x, sd->bl.y, x, y);
- sprintf(w4,"1,1,%s.gat,%d,%d", atcmd_player_name, x, y);
-
- ret = npc_parse_warp(w1, "warp", w3, w4);
-
- sprintf(atcmd_output, "New warp NPC => %s",w3);
-
- clif_displaymessage(fd, atcmd_output);
-
- return ret;
-}
-
-/*==========================================
- * @follow by [MouseJstr]
- *
- * Follow a player .. staying no more then 5 spaces away
- *------------------------------------------
- */
-int
-atcommand_follow(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd = NULL;
- nullpo_retr(-1, sd);
-
- if (!message || !*message)
- return -1;
- if((pl_sd=map_nick2sd((char *) message)) != NULL)
- pc_follow(sd, pl_sd->bl.id);
- else
- return 1;
- return 0;
-}
-
-
-/*==========================================
- * @dropall by [MouseJstr]
- *
- * Drop all your possession on the ground
- *------------------------------------------
- */
-int
-atcommand_dropall(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i;
- nullpo_retr(-1, sd);
- for (i = 0; i < MAX_INVENTORY; i++) {
- if (sd->status.inventory[i].amount) {
- if(sd->status.inventory[i].equip != 0)
- pc_unequipitem(sd, i, 3);
- pc_dropitem(sd, i, sd->status.inventory[i].amount);
- }
- }
- return 0;
-}
-/*==========================================
- * @chardropall by [MouseJstr]
- *
- * Throw all the characters possessions on the ground. Normally
- * done in response to them being disrespectful of a GM
- *------------------------------------------
- */
-int
-atcommand_chardropall(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i;
- struct map_session_data *pl_sd = NULL;
- nullpo_retr(-1, sd);
-
- if (!message || !*message)
- return -1;
- if((pl_sd=map_nick2sd((char *) message)) == NULL)
- return -1;
- for (i = 0; i < MAX_INVENTORY; i++) {
- if (pl_sd->status.inventory[i].amount) {
- if(pl_sd->status.inventory[i].equip != 0)
- pc_unequipitem(pl_sd, i, 3);
- pc_dropitem(pl_sd, i, pl_sd->status.inventory[i].amount);
- }
- }
-
- clif_displaymessage(pl_sd->fd, "Ever play 52 card pickup?");
- clif_displaymessage(fd, "It is done");
- //clif_displaymessage(fd, "It is offical.. your a jerk");
-
- return 0;
-}
-/*==========================================
- * @storeall by [MouseJstr]
- *
- * Put everything into storage to simplify your inventory to make
- * debugging easie
- *------------------------------------------
- */
-int
-atcommand_storeall(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i;
- nullpo_retr(-1, sd);
- if (storage_storageopen(sd) == 1) {
- clif_displaymessage(fd, "run this command again..");
- return 0;
- }
- for (i = 0; i < MAX_INVENTORY; i++) {
- if (sd->status.inventory[i].amount) {
- if(sd->status.inventory[i].equip != 0)
- pc_unequipitem(sd, i, 3);
- storage_storageadd(sd, i, sd->status.inventory[i].amount);
- }
- }
- storage_storageclose(sd);
-
- clif_displaymessage(fd, "It is done");
- return 0;
-}
-/*==========================================
- * @charstoreall by [MouseJstr]
- *
- * A way to screw with players who piss you off
- *------------------------------------------
- */
-int
-atcommand_charstoreall(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i;
- struct map_session_data *pl_sd = NULL;
- nullpo_retr(-1, sd);
-
- if (!message || !*message)
- return -1;
- if((pl_sd=map_nick2sd((char *) message)) == NULL)
- return -1;
-
- if (storage_storageopen(pl_sd) == 1) {
- clif_displaymessage(fd, "Had to open the characters storage window...");
- clif_displaymessage(fd, "run this command again..");
- return 0;
- }
- for (i = 0; i < MAX_INVENTORY; i++) {
- if (pl_sd->status.inventory[i].amount) {
- if(pl_sd->status.inventory[i].equip != 0)
- pc_unequipitem(pl_sd, i, 3);
- storage_storageadd(pl_sd, i, sd->status.inventory[i].amount);
- }
- }
- storage_storageclose(pl_sd);
-
- clif_displaymessage(pl_sd->fd, "Everything you own has been put away for safe keeping.");
- clif_displaymessage(pl_sd->fd, "go to the nearest kafka to retrieve it..");
- clif_displaymessage(pl_sd->fd, " -- the management");
-
- clif_displaymessage(fd, "It is done");
-
- return 0;
-}
-/*==========================================
- * @skillid by [MouseJstr]
- *
- * lookup a skill by name
- *------------------------------------------
- */
-int
-atcommand_skillid(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int skillen = 0, idx = 0;
- nullpo_retr(-1, sd);
- if (!message || !*message)
- return -1;
- skillen = strlen(message);
- while (skill_names[idx].id != 0) {
- if ((strnicmp(skill_names[idx].name, message, skillen) == 0) ||
- (strnicmp(skill_names[idx].desc, message, skillen) == 0)) {
- sprintf(atcmd_output, "skill %d: %s", skill_names[idx].id, skill_names[idx].desc);
- clif_displaymessage(fd, atcmd_output);
- }
- idx++;
- }
- return 0;
-}
-
-/*==========================================
- * @useskill by [MouseJstr]
- *
- * A way of using skills without having to find them in the skills menu
- *------------------------------------------
- */
-int
-atcommand_useskill(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd = NULL;
- int skillnum;
- int skilllv;
- int inf;
- char target[255];
- nullpo_retr(-1, sd);
-
- if (!message || !*message)
- return -1;
- if(sscanf(message, "%d %d %99[^\n]", &skillnum, &skilllv, target) != 3) {
- clif_displaymessage(fd, "Usage: @useskill <skillnum> <skillv> <target>");
- return -1;
- }
- if((pl_sd=map_nick2sd(target)) == NULL) {
- return -1;
- }
-
- inf = skill_get_inf(skillnum);
-
- if ((inf == 2) || (inf == 1))
- skill_use_pos(sd, pl_sd->bl.x, pl_sd->bl.y, skillnum, skilllv);
- else
- skill_use_id(sd, pl_sd->bl.id, skillnum, skilllv);
-
- return 0;
-}
-
-/*==========================================
- * @skilltree by [MouseJstr]
- *
- * prints the skill tree for a player required to get to a skill
- *------------------------------------------
- */
-int
-atcommand_skilltree(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd = NULL;
- int skillnum, skillidx = -1;
- int meets = 1, j, c=0, s=0;
- struct pc_base_job s_class;
- char target[255], *tbl;
- struct skill_tree_entry *ent;
- nullpo_retr(-1, sd);
-
- if (!message || !*message)
- return -1;
-
- if(sscanf(message, "%d %[^\r\n]", &skillnum, target) != 2) {
- clif_displaymessage(fd, "Usage: @skilltree <skillnum> <target>");
- return -1;
- }
- if((pl_sd=map_nick2sd(target)) == NULL)
- return -1;
-
- s_class = pc_calc_base_job(pl_sd->status.class_);
- c = s_class.job;
- s = s_class.upper;
-
- c = pc_calc_skilltree_normalize_job(c, pl_sd);
-
- tbl = job_name(c);
-
- sprintf(atcmd_output, "Player is using %s %s skill tree (%d basic points)",
- s_class.upper ? "upper" : "lower",
- tbl, pc_checkskill(pl_sd, 1));
- clif_displaymessage(fd, atcmd_output);
-
- for (j = 0; skill_tree[s][c][j].id != 0; j++) {
- if (skill_tree[s][c][j].id == skillnum) {
- skillidx = j;
- break;
- }
- }
-
- if (skillidx == -1) {
- sprintf(atcmd_output, "I do not believe the player can use that skill");
- clif_displaymessage(fd, atcmd_output);
- return 0;
- }
-
- ent = &skill_tree[s][c][skillidx];
-
- for(j=0;j<5;j++)
- if( ent->need[j].id &&
- pc_checkskill(sd,ent->need[j].id) < ent->need[j].lv)
- {
- int idx = 0;
- char *desc;
- while (skill_names[idx].id != 0 && skill_names[idx].id != ent->need[j].id)
- idx++;
- if (skill_names[idx].id == 0)
- desc = "Unknown skill";
- else
- desc = skill_names[idx].desc;
- sprintf(atcmd_output, "player requires level %d of skill %s",
- ent->need[j].lv, desc);
- clif_displaymessage(fd, atcmd_output);
- meets = 0;
- }
-
- if (meets == 1) {
- sprintf(atcmd_output, "I believe the player meets all the requirements for that skill");
- clif_displaymessage(fd, atcmd_output);
- }
-
- return 0;
-}
-
-/*==========================================
- * @marry by [MouseJstr], fixed by Lupus
- *
- * Marry two players
- *------------------------------------------
- */
-int
-atcommand_marry(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd1 = NULL;
- struct map_session_data *pl_sd2 = NULL;
- char player1[255], player2[255];
-
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%[^,],%[^\r\n]", player1, player2) != 2) {
- clif_displaymessage(fd, "Usage: @marry <player1>,<player2>.");
- return -1;
- }
-
- if((pl_sd1=map_nick2sd((char *) player1)) == NULL) {
- sprintf(player2, "Cannot find player '%s' online", player1);
- clif_displaymessage(fd, player2);
- return -1;
- }
-
- if((pl_sd2=map_nick2sd((char *) player2)) == NULL) {
- sprintf(player1, "Cannot find player '%s' online", player2);
- clif_displaymessage(fd, player1);
- return -1;
- }
-
- if (pc_marriage(pl_sd1, pl_sd2) == 0) {
- clif_displaymessage(fd, "They are married.. wish them well");
- clif_wedding_effect(&sd->bl); //wedding effect and music [Lupus]
- return 0;
- }
- return -1;
-}
-
-/*==========================================
- * @divorce by [MouseJstr], fixed by [Lupus]
- *
- * divorce two players
- *------------------------------------------
- */
-int
-atcommand_divorce(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd = NULL;
-
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%[^\r\n]", atcmd_player_name) != 1) {
- clif_displaymessage(fd, "Usage: @divorce <player>.");
- return -1;
- }
-
- if((pl_sd=map_nick2sd((char *) atcmd_player_name)) != NULL) {
- if (pc_divorce(pl_sd) != 0) {
- sprintf(atcmd_output, "The divorce has failed.. Cannot find player '%s' or his(her) partner online.", atcmd_player_name);
- clif_displaymessage(fd, atcmd_output);
- return -1;
- } else {
- sprintf(atcmd_output, "'%s' and his(her) partner are now divorced.", atcmd_player_name);
- clif_displaymessage(fd, atcmd_output);
- return 0;
- }
- }
- sprintf(atcmd_output, "Cannot find player '%s' online", atcmd_player_name);
- clif_displaymessage(fd, atcmd_output);
- return -1;
-}
-
-/*==========================================
- * @rings by [MouseJstr]
- *
- * Give two players rings
- *------------------------------------------
- */
-int
-atcommand_rings(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct item item_tmp;
- int flag;
-
- memset(&item_tmp, 0, sizeof(item_tmp));
-
- item_tmp.nameid = 2634;
- item_tmp.identify = 1;
-
- if ((flag = pc_additem((struct map_session_data*)sd, &item_tmp, 1)))
- clif_additem((struct map_session_data*)sd, 0, 0, flag);
-
- item_tmp.nameid = 2635;
- item_tmp.identify = 1;
- if ((flag = pc_additem((struct map_session_data*)sd, &item_tmp, 1)))
- clif_additem((struct map_session_data*)sd, 0, 0, flag);
-
- clif_displaymessage(fd, "You have rings! Give them to the lovers.");
-
- return 0;
-}
-
-#ifdef DMALLOC
-unsigned long dmark_;
-int
-atcommand_dmstart(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- dmark_ = dmalloc_mark();
-
- clif_displaymessage(fd, "debug mark set");
-
- return 0;
-}
-
-int
-atcommand_dmtick(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- dmalloc_log_changed ( dmark_, 1, 0, 1 ) ;
- dmark_ = dmalloc_mark();
- clif_displaymessage(fd, "malloc changes logged");
-
- return 0;
-}
-#endif
-
-/*==========================================
- * @grind by [MouseJstr]
- *------------------------------------------
- */
-int
-atcommand_grind(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd = NULL;
- int skillnum;
- int inf;
- char target[255];
- nullpo_retr(-1, sd);
-
- if (!message || !*message)
- return -1;
- if(sscanf(message, "%s", target) != 1) {
- clif_displaymessage(fd, "Usage: @grind <target>");
- return -1;
- }
- if((pl_sd=map_nick2sd(target)) == NULL)
- return -1;
-
- for (skillnum = 1; skillnum < 500; skillnum++) {
- sd->status.sp = sd->status.max_sp;
- atcommand_alive(fd, sd, command, message);
-
- inf = skill_get_inf(skillnum);
-
- if ((inf == 2) || (inf == 1))
- skill_use_pos(sd, pl_sd->bl.x+5, pl_sd->bl.y+5, skillnum, 1);
- else
- skill_use_id(sd, pl_sd->bl.id, skillnum, 1);
- }
-
- return 0;
-}
-
-/*==========================================
- * @grind2 by [MouseJstr]
- *------------------------------------------
- */
-int
-atcommand_grind2(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i, x, y, id;
-
- for (i = 1000; i <2000; i++) {
- x = sd->bl.x + (rand() % 10 - 5);
- y = sd->bl.y + (rand() % 10 - 5);
- id = mob_once_spawn(sd, "this", x, y, "--ja--", i, 1, "");
- }
-
- return 0;
-}
-
-/*==========================================
- * @changelook by [Celest]
- *------------------------------------------
- */
-int
-atcommand_changelook(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i, j = 0, k = 0;
- int pos[6] = { LOOK_HEAD_TOP,LOOK_HEAD_MID,LOOK_HEAD_BOTTOM,LOOK_WEAPON,LOOK_SHIELD,LOOK_SHOES };
-
- if((i = sscanf(message, "%d %d", &j, &k)) < 1) {
- clif_displaymessage(fd, "Usage: @changelook [<position>] <view id> -- [] = optional");
- clif_displaymessage(fd, "Position: 1-Top 2-Middle 3-Bottom 4-Weapon 5-Shield");
- return -1;
- } else if (i == 2) {
- if (j < 1) j = 1;
- else if (j > 6) j = 6; // 6 = Shoes - for beta clients only perhaps
- j = pos[j - 1];
- } else if (i == 1) { // position not defined, use HEAD_TOP as default
- k = j; // swap
- j = LOOK_HEAD_TOP;
- }
-
- clif_changelook(&sd->bl,j,k);
-
- return 0;
-}
-
-/*==========================================
- *Turns on/off AutoLoot for a specific player
- *------------------------------------------
- *by Upa-Kun
- */
-int
-atcommand_autoloot(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- if (sd->autoloot)
- {
- sd->autoloot = 0;
- clif_displaymessage(fd, "Autoloot is now off.");
- }
- else
- {
- sd->autoloot = 1;
- clif_displaymessage(fd, "Autoloot is now on.");
- }
- return 0;
-}
-
-
-/*==========================================
- * It is made to rain.
- *------------------------------------------
- */
-int
-atcommand_rain(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int effno = 0;
- nullpo_retr(-1, sd);
- effno = 161;
- if (map[sd->bl.m].flag.rain) {
- map[sd->bl.m].flag.rain=0;
- clif_displaymessage(fd, "The rain has stopped.");
- } else {
- map[sd->bl.m].flag.rain=1;
- clif_specialeffect(&sd->bl,effno,2);
- clif_displaymessage(fd, "It is made to rain.");
- }
- return 0;
-}
-/*==========================================
- * It is made to snow.
- *------------------------------------------
- */
-int
-atcommand_snow(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int effno = 0;
- effno = 162;
- nullpo_retr(-1, sd);
- if (map[sd->bl.m].flag.snow) {
- map[sd->bl.m].flag.snow=0;
- clif_displaymessage(fd, "Snow has stopped falling.");
- } else {
- map[sd->bl.m].flag.snow=1;
- clif_specialeffect(&sd->bl,effno,2);
- clif_displaymessage(fd, "It is made to snow.");
- }
-
- return 0;
-}
-
-/*==========================================
- * Cherry tree snowstorm is made to fall. (Sakura)
- *------------------------------------------
- */
-int
-atcommand_sakura(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int effno = 0;
- effno = 163;
- nullpo_retr(-1, sd);
- if (map[sd->bl.m].flag.sakura) {
- map[sd->bl.m].flag.sakura=0;
- clif_displaymessage(fd, "Cherry tree leaves is made to fall.");
- } else {
- map[sd->bl.m].flag.sakura=1;
- clif_specialeffect(&sd->bl,effno,2);
- clif_displaymessage(fd, "Cherry tree leaves is made to fall.");
- }
- return 0;
-}
-
-/*==========================================
- * Fog hangs over.
- *------------------------------------------
- */
-int
-atcommand_fog(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int effno = 0;
- effno = 233;
- nullpo_retr(-1, sd);
- if (map[sd->bl.m].flag.fog) {
- map[sd->bl.m].flag.fog=0;
- clif_displaymessage(fd, "The fog has gone.");
- } else {
- map[sd->bl.m].flag.fog=1;
- clif_specialeffect(&sd->bl,effno,2);
- clif_displaymessage(fd, "Fog hangs over.");
- }
-
- return 0;
-}
-
-/*==========================================
- * Fallen leaves fall.
- *------------------------------------------
- */
-int
-atcommand_leaves(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int effno = 0;
- effno = 333;
- nullpo_retr(-1, sd);
- if (map[sd->bl.m].flag.leaves) {
- map[sd->bl.m].flag.leaves=0;
- clif_displaymessage(fd, "Leaves no longer fall.");
- } else {
- map[sd->bl.m].flag.leaves=1;
- clif_specialeffect(&sd->bl,effno,2);
- clif_displaymessage(fd, "Fallen leaves fall.");
- }
-
- return 0;
-}
-
-/*==========================================
- * Clearing Weather Effects by Dexity
- *------------------------------------------
- */
-int
-atcommand_clearweather(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- //int effno = 0;
- nullpo_retr(-1, sd);
- map[sd->bl.m].flag.rain=0;
- map[sd->bl.m].flag.snow=0;
- map[sd->bl.m].flag.sakura=0;
- map[sd->bl.m].flag.fog=0;
- map[sd->bl.m].flag.leaves=0;
- //clif_specialeffect(&sd->bl,effno,2); // not required. [celest]
- return 0;
-}
-
-/*===============================================================
- * Sound Command - plays a sound for everyone! [Codemaster]
- *---------------------------------------------------------------
- */
-int
-atcommand_sound(
- const int fd, struct map_session_data *sd,
- const char *command, const char *message)
-{
- char sound_file[100];
-
- if(!message || !*message || sscanf(message, "%99[^\n]", sound_file) < 1) {
- clif_displaymessage(fd, "Please, enter a sound filename. (usage: @sound <filename>)");
- return -1;
- }
-
- memset(sound_file, '\0', sizeof(sound_file));
- if(sscanf(message, "%99[^\n]", sound_file) < 1)
- return -1;
-
- if(strstr(sound_file, ".wav") == NULL)
- strcat(sound_file, ".wav");
-
- clif_soundeffectall(&sd->bl, sound_file,0);
-
- return 0;
-}
-
-/*==========================================
- * MOB Search
- *------------------------------------------
- */
-int
-atcommand_mobsearch(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char mob_name[100];
- int mob_id,map_id = 0;
-
- nullpo_retr(-1, sd);
-
- if (sscanf(message, "%99[^\n]", mob_name) < 0)
- return -1;
-
- if ((mob_id = atoi(mob_name)) == 0)
- mob_id = mobdb_searchname(mob_name);
- if(mob_id !=-1 && (mob_id <= 1000 || mob_id >= 2000)){
- snprintf(atcmd_output, sizeof atcmd_output, "Invalid mob id %s!",mob_name);
- clif_displaymessage(fd, atcmd_output);
- return 0;
- }
- if(mob_id == atoi(mob_name) && mob_db[mob_id].jname)
- strcpy(mob_name,mob_db[mob_id].jname); // --ja--
-// strcpy(mob_name,mob_db[mob_id].name); // --en--
-
- map_id = sd->bl.m;
-
- snprintf(atcmd_output, sizeof atcmd_output, "Mob Search... %s %s",
- mob_name, sd->mapname);
- clif_displaymessage(fd, atcmd_output);
-
- map_foreachinarea(atmobsearch_sub, map_id, 0, 0,
- map[map_id].xs, map[map_id].ys, BL_MOB, mob_id, fd);
-
- atmobsearch_sub(&sd->bl,0); // ”Ô†ƒŠƒZƒbƒg
-
- return 0;
-}
-/*==========================================
- * ƒhƒƒbƒvƒAƒCƒeƒ€‚Ì‘|œ
- *------------------------------------------
- */
-int
-atcommand_cleanmap(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i=0;
- map_foreachinarea(atcommand_cleanmap_sub,sd->bl.m,
- sd->bl.x-AREA_SIZE*2,sd->bl.y-AREA_SIZE*2,
- sd->bl.x+AREA_SIZE*2,sd->bl.y+AREA_SIZE*2,
- BL_ITEM,sd,&i);
- clif_displaymessage(fd, "All dropped items have been cleaned up.");
- return 0;
-}
-
-/*==========================================
- * NPC/PET‚ɘb‚³‚¹‚é
- *------------------------------------------
- */
-int
-atcommand_npctalk(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char name[100],mes[100];
- struct npc_data *nd;
-
- if (sscanf(message, "%s %99[^\n]", name, mes) < 2)
- return -1;
-
- if (!(nd = npc_name2id(name)))
- return -1;
-
- clif_message(&nd->bl, mes);
- return 0;
-}
-int
-atcommand_pettalk(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char mes[100],temp[100];
- struct pet_data *pd;
-
- nullpo_retr(-1, sd);
-
- if(!sd->status.pet_id || !(pd=sd->pd))
- return -1;
-
- if (sscanf(message, "%99[^\n]", mes) < 1)
- return -1;
-
- snprintf(temp, sizeof temp ,"%s : %s",sd->pet.name,mes);
- clif_message(&pd->bl, temp);
-
- return 0;
-}
-
-/*==========================================
- * @users
- * ƒT[ƒo[“à‚Ìl”ƒ}ƒbƒv‚ð•\Ž¦‚³‚¹‚é
- * Žè”²‚«‚Ì‚½‚߉˜‚­‚È‚Á‚Ä‚¢‚é‚Ì‚ÍŽd—l‚Å‚·B
- *------------------------------------------
- */
-
-static struct dbt *users_db;
-static int users_all;
-
-static int atcommand_users_sub1(struct map_session_data* sd,va_list va) {
- int users = (int)strdb_search(users_db,sd->mapname) + 1;
- users_all++;
- strdb_insert(users_db,sd->mapname,(void *)users);
- return 0;
-}
-
-static int atcommand_users_sub2(void* key,void* val,va_list va) {
- char buf[256];
- struct map_session_data* sd = va_arg(va,struct map_session_data*);
- sprintf(buf,"%s : %d (%d%%)",(char *)key,(int)val,(int)val * 100 / users_all);
- clif_displaymessage(sd->fd,buf);
- return 0;
-}
-
-int
-atcommand_users(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char buf[256];
- users_all = 0;
- users_db = strdb_init(24);
- clif_foreachclient(atcommand_users_sub1);
- strdb_foreach(users_db,atcommand_users_sub2,sd);
- sprintf(buf,"all : %d",users_all);
- clif_displaymessage(fd,buf);
- strdb_final(users_db,NULL);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int
-atcommand_summon(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char name[100];
- int mob_id = 0;
- int x = 0;
- int y = 0;
- int id = 0;
- struct mob_data *md;
- unsigned int tick=gettick();
-
- nullpo_retr(-1, sd);
-
- if (!message || !*message)
- return -1;
- if (sscanf(message, "%99s", name) < 1)
- return -1;
-
- if ((mob_id = atoi(name)) == 0)
- mob_id = mobdb_searchname(name);
- if(mob_id == 0)
- return -1;
-
- x = sd->bl.x + (rand() % 10 - 5);
- y = sd->bl.y + (rand() % 10 - 5);
-
- id = mob_once_spawn(sd,"this", x, y, "--ja--", mob_id, 1, "");
- if((md=(struct mob_data *)map_id2bl(id))){
- md->master_id=sd->bl.id;
- md->state.special_mob_ai=1;
- md->mode=mob_db[md->class_].mode|0x04;
- md->deletetimer=add_timer(tick+60000,mob_timer_delete,id,0);
- clif_misceffect2(&md->bl,344);
- }
- clif_skill_poseffect(&sd->bl,AM_CALLHOMUN,1,x,y,tick);
-
- return 0;
-}
-
-
-/*==========================================
- * @adjcmdlvl by [MouseJstr]
- *
- * Temp adjust the GM level required to use a GM command
- *
- * Used during beta testing to allow players to use GM commands
- * for short periods of time
- *------------------------------------------
- */
-int
-atcommand_adjcmdlvl(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i, newlev;
- char cmd[100];
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%d %s", &newlev, cmd) != 2) {
- clif_displaymessage(fd, "Usage: @adjcmdlvl <lvl> <command>.");
- return -1;
- }
-
- for (i = 0; atcommand_info[i].type != AtCommand_None; i++)
- if (strcmpi(cmd, atcommand_info[i].command+1) == 0) {
- atcommand_info[i].level = newlev;
- clif_displaymessage(fd, "@command level changed.");
- return 0;
- }
-
- clif_displaymessage(fd, "@command not found.");
- return -1;
-}
-
-/*==========================================
- * @adjgmlvl by [MouseJstr]
- *
- * Create a temp GM
- *
- * Used during beta testing to allow players to use GM commands
- * for short periods of time
- *------------------------------------------
- */
-int
-atcommand_adjgmlvl(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int newlev;
- char user[100];
- struct map_session_data *pl_sd;
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%d %[^\r\n]", &newlev, user) != 2) {
- clif_displaymessage(fd, "Usage: @adjgmlvl <lvl> <user>.");
- return -1;
- }
-
- if((pl_sd=map_nick2sd((char *) user)) == NULL)
- return -1;
-
- pc_set_gm_level(pl_sd->status.account_id, newlev);
-
- return 0;
-}
-
-
-/*==========================================
- * @trade by [MouseJstr]
- *
- * Open a trade window with a remote player
- *
- * If I have to jump to a remote player one more time, I am
- * gonna scream!
- *------------------------------------------
- */
-int
-atcommand_trade(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd = NULL;
- nullpo_retr(-1, sd);
-
- if (!message || !*message)
- return -1;
- if((pl_sd=map_nick2sd((char *) message)) != NULL) {
- trade_traderequest(sd, pl_sd->bl.id);
- return 0;
- }
- return -1;
-}
-
-/*==========================================
- * @setbattleflag by [MouseJstr]
- *
- * set a battle_config flag without having to reboot
- */
-int
-atcommand_setbattleflag(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char flag[128], value[128];
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%s %s", flag, value) != 2) {
- clif_displaymessage(fd, "Usage: @setbattleflag <flag> <value>.");
- return -1;
- }
-
- if (battle_set_value(flag, value) == 0)
- clif_displaymessage(fd, "unknown battle_config flag");
- else
- clif_displaymessage(fd, "battle_config set as requested");
-
- return 0;
-}
-
-
-/*===========================
- * @unmute [Valaris]
- *===========================
-*/
-int atcommand_unmute(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd = NULL;
- nullpo_retr(-1, sd);
- if (!message || !*message)
- return -1;
-
- if((pl_sd=map_nick2sd((char *) message)) != NULL) {
- if(pl_sd->sc_data[SC_NOCHAT].timer!=-1) {
- pl_sd->status.manner = 0; // have to set to 0 first [celest]
- status_change_end(&pl_sd->bl,SC_NOCHAT,-1);
- clif_displaymessage(sd->fd,"Player unmuted");
- }
- else
- clif_displaymessage(sd->fd,"Player is not muted");
- }
-
- return 0;
-}
-
-/*==========================================
- * @uptime by MC Cameri
- *------------------------------------------
- */
-int
-atcommand_uptime(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- long seconds = 0, day = 24*60*60, hour = 60*60,
- minute = 60, days = 0, hours = 0, minutes = 0;
- nullpo_retr(-1, sd);
-
- seconds = (gettick()-ticks)/CLOCKS_PER_SEC;
- days = seconds/day;
- seconds -= (seconds/day>0)?(seconds/day)*day:0;
- hours = seconds/hour;
- seconds -= (seconds/hour>0)?(seconds/hour)*hour:0;
- minutes = seconds/minute;
- seconds -= (seconds/minute>0)?(seconds/minute)*minute:0;
-
- snprintf(atcmd_output, sizeof(atcmd_output), msg_table[245], days, hours, minutes, seconds);
-
- clif_displaymessage(fd,atcmd_output);
-
- return 0;
-}
-
-/*==========================================
- * @changesex <sex>
- * => Changes one's sex. Argument sex can be
- * 0 or 1, m or f, male or female.
- *------------------------------------------
- */
-int
-atcommand_changesex(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- chrif_char_ask_name(sd->status.account_id,sd->status.name, 5,0,0,0,0,0,0);
- return 0;
-}
-
-/*================================================
- * @mute - Mutes a player for a set amount of time
- *------------------------------------------------
- */
-int atcommand_mute(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd = NULL;
- int manner;
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%d %99[^\n]", &manner, atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Usage: @mute <time> <character name>.");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(atcmd_player_name)) != NULL) {
- pl_sd->status.manner -= manner;
- if(pl_sd->status.manner < 0)
- status_change_start(&pl_sd->bl,SC_NOCHAT,0,0,0,0,0,0);
- }
- else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @refresh (like @jumpto <<yourself>>)
- *------------------------------------------
- */
-int atcommand_refresh(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
- //pc_setpos(sd, sd->mapname, sd->bl.x, sd->bl.y, 3);
- clif_refresh(sd);
- return 0;
-}
-
-/*==========================================
- * @petid <part of pet name>
- * => Displays a list of matching pets.
- *------------------------------------------
- */
-int
-atcommand_petid(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char searchtext[100];
- char temp0[100];
- char temp1[100];
- int cnt = 0, i = 0;
-
- nullpo_retr(-1, sd);
-
- if (!message || !*message)
- return -1;
- if (sscanf(message, "%99s", searchtext) < 1)
- return -1;
- estr_lower(searchtext);
- snprintf(temp0, sizeof(temp0), "Search results for: %s", searchtext);
- clif_displaymessage(fd,temp0);
- while (i < MAX_PET_DB) {
- strcpy(temp1,pet_db[i].name);
- strcpy(temp1, estr_lower(temp1));
- strcpy(temp0,pet_db[i].jname);
- strcpy(temp0, estr_lower(temp1));
- if (strstr(temp1, searchtext) || strstr(temp0, searchtext) ) {
- snprintf(temp0, sizeof(temp0), "ID: %i -- Name: %s", pet_db[i].class_,
- pet_db[i].jname);
- if (cnt >= 100) { // Only if there are custom pets
- clif_displaymessage(fd, "Be more specific, can't send more than"
- " 100 results.");
- } else {
- clif_displaymessage(fd, temp0);
- }
- cnt++;
- }
- i++;
- }
- snprintf(temp0, sizeof(temp0),"%i pets have '%s' in their name.", cnt, searchtext);
- clif_displaymessage(fd, temp0);
- return 0;
-}
-
-/*==========================================
- * @identify
- * => GM's magnifier.
- *------------------------------------------
- */
-int
-atcommand_identify(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i,num;
-
- nullpo_retr(-1, sd);
-
- for(i=num=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid > 0 && sd->status.inventory[i].identify!=1){
- num++;
- }
- }
- if (num > 0) {
- clif_item_identify_list(sd);
- } else {
- clif_displaymessage(fd,"There are no items to appraise.");
- }
- return 0;
-}
-
-/*==========================================
- * @gmotd (Global MOTD)
- * by davidsiaw :P
- *------------------------------------------
- */
-int
-atcommand_gmotd(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char buf[256];
- FILE *fp;
- nullpo_retr(-1, sd);
- if( (fp = fopen(motd_txt, "r"))!=NULL){
- while (fgets(buf, 250, fp) != NULL){
- int i;
- for( i=0; buf[i]; i++){
- if( buf[i]=='\r' || buf[i]=='\n'){
- buf[i]=0;
- break;
- }
- }
- intif_GMmessage(buf,strlen(buf)+1,8);
- }
- fclose(fp);
- }
- return 0;
-}
-
-int atcommand_misceffect(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int effect = 0;
- nullpo_retr(-1, sd);
- if (!message || !*message)
- return -1;
- if (sscanf(message, "%d", &effect) < 1)
- return -1;
- clif_misceffect(&sd->bl,effect);
-
- return 0;
-}
-
-int charid2sessionid(int charid)
-{
- int i;
- int session_id=0;
- struct map_session_data *pl_sd = NULL;
-
- for(i=0;i<fd_max;i++){
- if(session[i] && (pl_sd= (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth){
- if (pl_sd->status.char_id==charid) { session_id = i; break; }
- }
- }
-
- return session_id;
-}
-
-int accountid2sessionid(int accountid)
-{
- int i;
- int session_id=0;
- struct map_session_data *pl_sd = NULL;
-
- for(i=0;i<fd_max;i++){
- if(session[i] && (pl_sd= (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth){
- if (pl_sd->status.account_id==accountid) { session_id = i; break; }
- }
- }
-
- return session_id;
-}
-
-
-/*==========================================
- * Jump to a player by PID number
- * Original by Dino9021
- * Added in by nsstrunks
- *------------------------------------------
- */
-
-int atcommand_jumptoid(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int cid=0;
- int session_id=0;
- struct map_session_data *pl_sd;
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || (cid = atoi(message)) == 0 || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player CID (usage: @jumptoid/@warptoid/@gotoid <char id>).");
- return -1;
- }
-
- cid=atoi(message);
-
- if ((session_id=charid2sessionid(cid))!=0)
- {
- if ((pl_sd = (struct map_session_data *) session[session_id]->session_data) != NULL) {
- if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, msg_table[247]);
- return -1;
- }
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, msg_table[248]);
- return -1;
- }
- pc_setpos(sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3);
- sprintf(atcmd_output, msg_table[4], pl_sd->status.name); // Jump to %s
- clif_displaymessage(fd, atcmd_output);
- } else {
- clif_displaymessage(fd, msg_table[154]); // Character not found.
- return -1;
- }
- }
- else
- {
- clif_displaymessage(fd,msg_table[3]);
- }
- //printf("Session_id = %d, cid = %d\n",session_id,cid);
-
- return 0;
-}
-
-/*==========================================
- * Jump to a player by PID number
- * Original by Dino9021
- * Added in by nsstrunks
- *------------------------------------------
- */
-
-int atcommand_jumptoid2(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int aid=0;
- int session_id=0;
- struct map_session_data *pl_sd;
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || (aid = atoi(message)) == 0 || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player AID (usage: @jumptoid/@warptoid/@gotoid <account id>).");
- return -1;
- }
-
- aid=atoi(message);
-
- if ((session_id=accountid2sessionid(aid))!=0)
- {
- if ((pl_sd = (struct map_session_data *) session[session_id]->session_data) != NULL) {
- if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, msg_table[247]);
- return -1;
- }
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, msg_table[248]);
- return -1;
- }
- pc_setpos(sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3);
- sprintf(atcmd_output, msg_table[4], pl_sd->status.name); // Jump to %s
- clif_displaymessage(fd, atcmd_output);
- } else {
- clif_displaymessage(fd, msg_table[154]); // Character not found.
- return -1;
- }
- }
- else
- {
- clif_displaymessage(fd,msg_table[3]);
- }
- //printf("Session_id = %d, aid = %d\n",session_id,aid);
-
- return 0;
-}
-
-/*==========================================
- * Recall a player by PID number
- * Original by Dino9021
- * Added in by nsstrunks
- *------------------------------------------
- */
-int atcommand_recallid(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int cid=0;
- int session_id=0;
- struct map_session_data *pl_sd;
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || (cid = atoi(message)) == 0 || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player CID (usage: @recallid <char id>).");
- return -1;
- }
-
- cid=atoi(message);
-
- if ((session_id=charid2sessionid(cid))!=0)
- {
- if ((pl_sd = (struct map_session_data *) session[session_id]->session_data) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can recall only lower or same level
- if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, msg_table[247]);
- return -1;
- }
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, msg_table[248]);
- return -1;
- }
- pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2);
- sprintf(atcmd_output, msg_table[46], pl_sd->status.name); // Jump to %s
- clif_displaymessage(fd, atcmd_output);
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[154]); // Character not found.
- return -1;
- }
- }
- else
- {
- clif_displaymessage(fd,msg_table[3]);
- }
- //printf("Session_id = %d, cid = %d\n",session_id,cid);
-
- return 0;
-}
-
-/*==========================================
- * Recall a player by PID number
- * Original by Dino9021
- * Added in by nsstrunks
- *------------------------------------------
- */
-int atcommand_recallid2(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int aid=0;
- int session_id=0;
- struct map_session_data *pl_sd;
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
- memset(atcmd_output, '\0', sizeof(atcmd_output));
-
- if (!message || (aid = atoi(message)) == 0 || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player AID (usage: @recallid2 <account id>).");
- return -1;
- }
-
- aid=atoi(message);
-
- if ((session_id=accountid2sessionid(aid))!=0)
- {
- if ((pl_sd = (struct map_session_data *) session[session_id]->session_data) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can recall only lower or same level
- if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, msg_table[247]);
- return -1;
- }
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, msg_table[248]);
- return -1;
- }
- pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2);
- sprintf(atcmd_output, msg_table[46], pl_sd->status.name); // Jump to %s
- clif_displaymessage(fd, atcmd_output);
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[154]); // Character not found.
- return -1;
- }
- }
- else
- {
- clif_displaymessage(fd,msg_table[3]);
- }
- //printf("Session_id = %d, aid = %d\n",session_id,aid);
-
- return 0;
-}
-
-/*==========================================
- * Kick a player by PID number
- * Original by Dino9021
- * Added in by nsstrunks
- *------------------------------------------
- */
-int atcommand_kickid(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int cid=0;
- int session_id=0;
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || (cid = atoi(message)) == 0 || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player CID (usage: @kickid <char id>).");
- return -1;
- }
-
- cid=atoi(message);
-
- if ((session_id=charid2sessionid(cid))!=0)
- {
- if ((pl_sd = (struct map_session_data *) session[session_id]->session_data) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) // you can kick only lower or same gm level
- clif_GM_kick(sd, pl_sd, 1);
- else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- }
- else
- {
- clif_displaymessage(fd,msg_table[3]);
- }
- //printf("Session_id = %d, cid = %d\n",session_id,cid);
-
- return 0;
-}
-
-/*==========================================
- * Kick a player by PID number
- * Original by Dino9021
- * Added in by nsstrunks
- *------------------------------------------
- */
-int atcommand_kickid2(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int aid=0;
- int session_id=0;
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || (aid = atoi(message)) == 0 || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player AID (usage: @kickid2 <account id>).");
- return -1;
- }
-
- aid=atoi(message);
-
- if ((session_id=accountid2sessionid(aid))!=0)
- {
- if ((pl_sd = (struct map_session_data *) session[session_id]->session_data) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) // you can kick only lower or same gm level
- clif_GM_kick(sd, pl_sd, 1);
- else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- }
- else
- {
- clif_displaymessage(fd,msg_table[3]);
- }
- //printf("Session_id = %d, aid = %d\n",session_id,aid);
-
- return 0;
-}
-
-/*==========================================
- * Revive a player by PID number
- * Original by Dino9021
- * Added in by nsstrunks
- *------------------------------------------
- */
-int atcommand_reviveid(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int cid=0;
- int session_id=0;
- struct map_session_data *pl_sd;
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || (cid = atoi(message)) == 0 || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player CID (usage: @reviveid <char id>).");
- return -1;
- }
-
- cid=atoi(message);
-
- if ((session_id=charid2sessionid(cid))!=0)
- {
- if ((pl_sd = (struct map_session_data *) session[session_id]->session_data) != NULL) {
- pl_sd->status.hp = pl_sd->status.max_hp;
- pc_setstand(pl_sd);
- if (battle_config.pc_invincible_time > 0)
- pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
- clif_updatestatus(pl_sd, SP_HP);
- clif_updatestatus(pl_sd, SP_SP);
- clif_resurrection(&pl_sd->bl, 1);
- clif_displaymessage(fd, msg_table[51]); // Character revived.
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- }
- else
- {
- clif_displaymessage(fd,msg_table[3]);
- }
- //printf("Session_id = %d, cid = %d\n",session_id,cid);
-
-
- return 0;
-}
-
-/*==========================================
- * Revive a player by PID number
- * Original by Dino9021
- * Added in by nsstrunks
- *------------------------------------------
- */
-int atcommand_reviveid2(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int aid=0;
- int session_id=0;
- struct map_session_data *pl_sd;
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || (aid = atoi(message)) == 0 || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player AID (usage: @reviveid2 <account id>).");
- return -1;
- }
-
- aid=atoi(message);
-
- if ((session_id=accountid2sessionid(aid))!=0)
- {
- if ((pl_sd = (struct map_session_data *) session[session_id]->session_data) != NULL) {
- pl_sd->status.hp = pl_sd->status.max_hp;
- pc_setstand(pl_sd);
- if (battle_config.pc_invincible_time > 0)
- pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
- clif_updatestatus(pl_sd, SP_HP);
- clif_updatestatus(pl_sd, SP_SP);
- clif_resurrection(&pl_sd->bl, 1);
- clif_displaymessage(fd, msg_table[51]); // Character revived.
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- }
- else
- {
- clif_displaymessage(fd,msg_table[3]);
- }
- //printf("Session_id = %d, aid = %d\n",session_id,aid);
-
-
- return 0;
-}
-
-/*==========================================
- * Kill a player by PID number
- * Original by Dino9021
- * Added in by nsstrunks
- *------------------------------------------
- */
-int atcommand_killid(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int cid=0;
- int session_id=0;
- struct map_session_data *pl_sd;
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || (cid = atoi(message)) == 0 || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player CID (usage: @killid <char id>).");
- return -1;
- }
-
- cid=atoi(message);
-
- if ((session_id=charid2sessionid(cid))!=0)
- {
- if ((pl_sd = (struct map_session_data *) session[session_id]->session_data) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can kill only lower or same level
- pc_damage(NULL, pl_sd, pl_sd->status.hp + 1);
- clif_displaymessage(fd, msg_table[14]); // Character killed.
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- }
- else
- {
- clif_displaymessage(fd,msg_table[3]);
- }
- //printf("Session_id = %d, cid = %d\n",session_id,cid);
-
- return 0;
-}
-
-/*==========================================
- * Kill a player by PID number
- * Original by Dino9021
- * Added in by nsstrunks
- *------------------------------------------
- */
-int atcommand_killid2(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int aid=0;
- int session_id=0;
- struct map_session_data *pl_sd;
-
- memset(atcmd_player_name, '\0', sizeof(atcmd_player_name));
-
- if (!message || (aid = atoi(message)) == 0 || !*message || sscanf(message, "%99[^\n]", atcmd_player_name) < 1) {
- clif_displaymessage(fd, "Please, enter a player AID (usage: @killid2 <account id>).");
- return -1;
- }
-
- aid=atoi(message);
-
- if ((session_id=accountid2sessionid(aid))!=0)
- {
- if ((pl_sd = (struct map_session_data *) session[session_id]->session_data) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can kill only lower or same level
- pc_damage(NULL, pl_sd, pl_sd->status.hp + 1);
- clif_displaymessage(fd, msg_table[14]); // Character killed.
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- }
- else
- {
- clif_displaymessage(fd,msg_table[3]);
- }
- //printf("Session_id = %d, aid = %d\n",session_id,aid);
-
- return 0;
-}
-
-/*==========================================
- * Make a player killable, by PID
- * Original by Dino9021
- * Added in by nsstrunks
- *------------------------------------------
- */
-int
-atcommand_charkillableid(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd = NULL;
- int cid=0;
- int session_id=0;
-
- if (!message || (cid = atoi(message)) == 0 || !*message)
- return -1;
-
- cid=atoi(message);
-
- if ((session_id=charid2sessionid(cid))!=0)
- {
- if((pl_sd= (struct map_session_data *) session[session_id]->session_data) == NULL)
- return -1;
-
- pl_sd->special_state.killable = !pl_sd->special_state.killable;
-
- if(pl_sd->special_state.killable)
- clif_displaymessage(fd, "The player is now killable");
- else
- clif_displaymessage(fd, "The player is no longer killable");
- }
- else
- {
- clif_displaymessage(fd,msg_table[3]);
- }
- //printf("Session_id = %d, cid = %d\n",session_id,cid);
- return 0;
-}
-
-
-/*==========================================
- * Make a player killable, by PID
- * Original by Dino9021
- * Added in by nsstrunks
- *------------------------------------------
- */
-int
-atcommand_charkillableid2(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd = NULL;
- int aid=0;
- int session_id=0;
-
- if (!message || (aid = atoi(message)) == 0 || !*message)
- return -1;
-
- aid=atoi(message);
-
- if ((session_id=accountid2sessionid(aid))!=0)
- {
- if((pl_sd= (struct map_session_data *) session[session_id]->session_data) == NULL)
- return -1;
-
- pl_sd->special_state.killable = !pl_sd->special_state.killable;
-
- if(pl_sd->special_state.killable)
- clif_displaymessage(fd, "The player is now killable");
- else
- clif_displaymessage(fd, "The player is no longer killable");
- }
- else
- {
- clif_displaymessage(fd,msg_table[3]);
- }
- //printf("Session_id = %d, aid = %d\n",session_id,aid);
- return 0;
-}
-
-#ifndef TXT_ONLY /* Begin SQL-Only commands */
-
-/*==========================================
- * Mail System commands by [Valaris]
- *------------------------------------------
- */
-int atcommand_listmail(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- if(!battle_config.mail_system)
- return 0;
-
- nullpo_retr(-1, sd);
-
- if(strlen(command)==12)
- mail_check(sd,3);
- else if(strlen(command)==9)
- mail_check(sd,2);
- else
- mail_check(sd,1);
- return 0;
-}
-
-int atcommand_readmail(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- if(!battle_config.mail_system)
- return 0;
-
- nullpo_retr(-1, sd);
-
- if (!message || !*message) {
- clif_displaymessage(sd->fd,"You must specify a message number.");
- return 0;
- }
-
- if(strlen(command)==11)
- mail_delete(sd,atoi(message));
- else
- mail_read(sd,atoi(message));
-
- return 0;
-}
-
-int atcommand_sendmail(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char name[24],text[80];
-
- if(!battle_config.mail_system)
- return 0;
-
- nullpo_retr(-1, sd);
-
- if (!message || !*message) {
- clif_displaymessage(sd->fd,"You must specify a recipient and a message.");
- return 0;
- }
-
- if ((sscanf(message, "\"%[^\"]\" %79[^\n]", name, text) < 2) &&
- (sscanf(message, "%23s %79[^\n]", name, text) < 2)) {
- clif_displaymessage(sd->fd,"You must specify a recipient and a message.");
- return 0;
- }
-
- if(strlen(command)==17)
- mail_send(sd,name,text,1);
- else
- mail_send(sd,name,text,0);
-
- return 0;
-}
-
-/*==========================================
- * Refresh online command for SQL [Valaris]
- * Will refresh and check online column of
- * players and set correctly.
- *------------------------------------------
- */
-int atcommand_refreshonline(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
-
- char_online_check();
-
- return 0;
-}
-
-#endif /* end sql only */
-
-/*==========================================
- * Show Monster DB Info v 1.0
- * originally by [Lupus] eAthena
- *------------------------------------------
- */
-int atcommand_mobinfo(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- unsigned char msize[3][7] = {"Small", "Medium", "Large"};
- unsigned char mrace[12][11] = {"Formless", "Undead", "Beast", "Plant", "Insect", "Fish", "Demon", "Demi-Human", "Angel", "Dragon", "Boss", "Non-Boss"};
- unsigned char melement[11][8] = {"None", "Neutral", "Water", "Earth", "Fire", "Wind", "Poison", "Holy", "Dark", "Ghost", "Undead"};
- char atcmd_output2[200];
- struct item_data *item_data;
- struct mob_db *mob;
- int mob_id;
- int i, j;
-
- memset(atcmd_output, '\0', sizeof(atcmd_output));
- memset(atcmd_output2, '\0', sizeof(atcmd_output2));
-
- if (!message || !*message) {
- clif_displaymessage(fd, "Please, enter a Monster/NPC name/id (usage: @mobinfo <monster_name_or_monster_ID>).");
- return -1;
- }
-
- // If monster identifier/name argument is a name
- if ((mob_id = mobdb_searchname(message)) == 0) // check name first (to avoid possible name begining by a number)
- mob_id = mobdb_checkid(atoi(message));
-
- if (mob_id == 0) {
- clif_displaymessage(fd, msg_table[40]); // Invalid monster ID or name.
- return -1;
- }
-
- mob = &mob_db[mob_id];
-
- // stats
- if (mob->mexp)
- sprintf(atcmd_output, "Monster (MVP): '%s'/'%s' (%d)", mob->name, mob->jname, mob_id);
- else
- sprintf(atcmd_output, "Monster: '%s'/'%s' (%d)", mob->name, mob->jname, mob_id);
- clif_displaymessage(fd, atcmd_output);
- sprintf(atcmd_output, " Level:%d HP:%d SP:%d Base EXP:%d Job EXP:%d", mob->lv, mob->max_hp, mob->max_sp, mob->base_exp, mob->job_exp);
- clif_displaymessage(fd, atcmd_output);
- sprintf(atcmd_output, " DEF:%d MDEF:%d STR:%d AGI:%d VIT:%d INT:%d DEX:%d LUK:%d", mob->def, mob->mdef, mob->str, mob->agi, mob->vit, mob->int_, mob->dex, mob->luk);
- clif_displaymessage(fd, atcmd_output);
- if (mob->element < 20) {
- //Element - None, Level 0
- i = 0;
- j = 0;
- } else {
- i = mob->element % 20 + 1;
- j = mob->element / 20;
- }
- sprintf(atcmd_output, " ATK:%d~%d Range:%d~%d~%d Size:%s Race: %s Element: %s (Lv:%d)", mob->atk1, mob->atk2, mob->range, mob->range2 , mob->range3, msize[mob->size], mrace[mob->race], melement[i], j);
- clif_displaymessage(fd, atcmd_output);
- // drops
- clif_displaymessage(fd, " Drops:");
- strcpy(atcmd_output, " ");
- j = 0;
- for (i = 0; i < 10; i++) {
- if (mob->dropitem[i].nameid <= 0 || (item_data = itemdb_search(mob->dropitem[i].nameid)) == NULL)
- continue;
- if (mob->dropitem[i].p > 0) {
- sprintf(atcmd_output2, " - %s %02.02f%%", item_data->name, (float)mob->dropitem[i].p / 100);
- strcat(atcmd_output, atcmd_output2);
- if (++j % 3 == 0) {
- clif_displaymessage(fd, atcmd_output);
- strcpy(atcmd_output, " ");
- }
- }
- }
- if (j == 0)
- clif_displaymessage(fd, "This monster has no drop.");
- else if (j % 3 != 0)
- clif_displaymessage(fd, atcmd_output);
- // mvp
- if (mob->mexp) {
- sprintf(atcmd_output, " MVP Bonus EXP:%d %02.02f%%", mob->mexp, (float)mob->mexpper / 100);
- clif_displaymessage(fd, atcmd_output);
- strcpy(atcmd_output, " MVP Items:");
- j = 0;
- for (i = 0; i < 3; i++) {
- if (mob->mvpitem[i].nameid <= 0 || (item_data = itemdb_search(mob->mvpitem[i].nameid)) == NULL)
- continue;
- if (mob->mvpitem[i].p > 0) {
- j++;
- if (j == 1)
- sprintf(atcmd_output2, " %s %02.02f%%", item_data->name, (float)mob->mvpitem[i].p / 100);
- else
- sprintf(atcmd_output2, " - %s %02.02f%%", item_data->name, (float)mob->mvpitem[i].p / 100);
- strcat(atcmd_output, atcmd_output2);
- }
- }
- if (j == 0)
- clif_displaymessage(fd, "This monster has no MVP drop.");
- else
- clif_displaymessage(fd, atcmd_output);
- }
-
- return 0;
-}
-
-/*==========================================
- * @adopt by [Veider]
- *
- * adopt a novice
- *------------------------------------------
- */
-int
-atcommand_adopt(const int fd, struct map_session_data* sd,
-const char* command, const char* message)
-{
- struct map_session_data *pl_sd1 = NULL;
- struct map_session_data *pl_sd2 = NULL;
- struct map_session_data *pl_sd3 = NULL;
- char player1[255], player2[255], player3[255];
-
- nullpo_retr(-1, sd);
-
- if (!message || !*message)
- return -1;
-
- if (sscanf(message, "%[^,],%[^,],%[^\r\n]", player1, player2, player3) != 3) {
- clif_displaymessage(fd, "usage: @adopt <player1> <player2> <player3>.");
- return -1;
- }
-
- printf("Adopting: --%s--%s--%s--\n",player1,player2,player3);
-
- if((pl_sd1=map_nick2sd((char *) player1)) == NULL) {
- sprintf(player2, "Cannot find player %s online", player1);
- clif_displaymessage(fd, player2);
- return -1;
- }
-
- if((pl_sd2=map_nick2sd((char *) player2)) == NULL) {
- sprintf(player1, "Cannot find player %s online", player2);
- clif_displaymessage(fd, player1);
- return -1;
- }
-
- if((pl_sd3=map_nick2sd((char *) player3)) == NULL) {
- sprintf(player1, "Cannot find player %s online", player3);
- clif_displaymessage(fd, player1);
- return -1;
- }
-
- if((pl_sd1->status.base_level < 70) || (pl_sd2->status.base_level < 70)){
- clif_displaymessage(fd, "They are too young to be parents!");
- return -1;
- }
-
- if (pc_adoption(pl_sd1, pl_sd2, pl_sd3) == 0) {
- clif_displaymessage(fd, "They are family.. wish them luck");
- return 0;
- }
- else
- return -1;
-}
-
diff --git a/src/map/atcommand.h b/src/map/atcommand.h
deleted file mode 100644
index 1160dccb7..000000000
--- a/src/map/atcommand.h
+++ /dev/null
@@ -1,292 +0,0 @@
-// $Id: atcommand.h 148 2004-09-30 14:05:37Z MouseJstr $
-#ifndef _ATCOMMAND_H_
-#define _ATCOMMAND_H_
-
-enum AtCommandType {
- AtCommand_None = -1,
- AtCommand_Broadcast = 0,
- AtCommand_LocalBroadcast,
- AtCommand_MapMove,
- AtCommand_ResetState,
- AtCommand_RuraP,
- AtCommand_Rura,
- AtCommand_Warp,
- AtCommand_Where,
- AtCommand_JumpTo,
- AtCommand_Jump,
- AtCommand_Who,
- AtCommand_Who2,
- AtCommand_Who3,
- AtCommand_WhoMap,
- AtCommand_WhoMap2,
- AtCommand_WhoMap3,
- AtCommand_WhoGM,
- AtCommand_Save,
- AtCommand_Load,
- AtCommand_Speed,
- AtCommand_Storage,
- AtCommand_GuildStorage,
- AtCommand_Option,
- AtCommand_Hide,
- AtCommand_JobChange,
- AtCommand_JobChange2,
- AtCommand_JobChange3,
- AtCommand_Die,
- AtCommand_Kill,
- AtCommand_Alive,
- AtCommand_Kami,
- AtCommand_KamiB,
- AtCommand_Heal,
- AtCommand_Item,
- AtCommand_Item2,
- AtCommand_ItemReset,
- AtCommand_ItemCheck,
- AtCommand_BaseLevelUp,
- AtCommand_JobLevelUp,
- AtCommand_H,
- AtCommand_Help,
- AtCommand_GM,
- AtCommand_PvPOff,
- AtCommand_PvPOn,
- AtCommand_GvGOff,
- AtCommand_GvGOn,
- AtCommand_Model,
- AtCommand_Go,
- AtCommand_Spawn,
- AtCommand_Monster,
- AtCommand_MonsterSmall,
- AtCommand_MonsterBig,
- AtCommand_KillMonster,
- AtCommand_KillMonster2,
- AtCommand_Refine,
- AtCommand_Produce,
- AtCommand_Memo,
- AtCommand_GAT,
- AtCommand_Packet,
- AtCommand_StatusPoint,
- AtCommand_SkillPoint,
- AtCommand_Zeny,
- AtCommand_Param,
- AtCommand_Strength,
- AtCommand_Agility,
- AtCommand_Vitality,
- AtCommand_Intelligence,
- AtCommand_Dexterity,
- AtCommand_Luck,
- AtCommand_GuildLevelUp,
- AtCommand_MakeEgg,
- AtCommand_PetFriendly,
- AtCommand_PetHungry,
- AtCommand_PetRename,
-// AtCommand_CharPetRename, // by Yor, Now #petrename
- AtCommand_Recall,
-// AtCommand_CharacterJob, // Now #jobchange
- AtCommand_Revive,
-// AtCommand_CharacterStats, // Now #stats
- AtCommand_CharacterStatsAll,
-// AtCommand_CharacterOption, // Now #option
-// AtCommand_CharacterSave, // Now #save
- AtCommand_CharacterLoad,
- AtCommand_Night,
- AtCommand_Day,
- AtCommand_Doom,
- AtCommand_DoomMap,
- AtCommand_Raise,
- AtCommand_RaiseMap,
- AtCommand_CharacterBaseLevel,
- AtCommand_CharacterJobLevel,
- AtCommand_Kick,
- AtCommand_KickAll,
- AtCommand_AllSkill,
- AtCommand_QuestSkill,
- AtCommand_CharQuestSkill,
- AtCommand_LostSkill,
- AtCommand_CharLostSkill,
- AtCommand_SpiritBall,
- AtCommand_Party,
- AtCommand_Guild,
- AtCommand_AgitStart,
- AtCommand_AgitEnd,
- AtCommand_MapExit,
- AtCommand_IDSearch,
- AtCommand_CharSkReset,
- AtCommand_CharStReset,
- //by chbrules
- AtCommand_CharModel,
- AtCommand_CharSKPoint,
- AtCommand_CharSTPoint,
-// AtCommand_CharZeny, //now #zeny
- AtCommand_RecallAll,
- AtCommand_ReloadItemDB,
- AtCommand_ReloadMobDB,
- AtCommand_ReloadSkillDB,
- AtCommand_ReloadScript,
- AtCommand_ReloadGMDB,
- AtCommand_ReloadAtcommand,
- AtCommand_ReloadBattleConf,
- AtCommand_ReloadStatusDB,
- AtCommand_ReloadPcDB,
- AtCommand_MapInfo,
- AtCommand_Dye,
- AtCommand_Hstyle,
- AtCommand_Hcolor,
- AtCommand_StatAll,
- AtCommand_CharChangeSex, // by Yor
- AtCommand_CharBlock, // by Yor
- AtCommand_CharBan, // by Yor
- AtCommand_CharUnBlock, // by Yor
- AtCommand_CharUnBan, // by Yor
- AtCommand_MountPeco, // by Valaris
- AtCommand_CharMountPeco, // by Yor
- AtCommand_GuildSpy, // [Syrus22]
- AtCommand_PartySpy, // [Syrus22]
- AtCommand_RepairAll, // [Valaris]
- AtCommand_GuildRecall, // by Yor
- AtCommand_PartyRecall, // by Yor
- AtCommand_Nuke, // [Valaris]
- AtCommand_Enablenpc,
- AtCommand_Hidenpc,
- AtCommand_Disablenpc,
- AtCommand_ServerTime, // by Yor
- AtCommand_CharDelItem, // by Yor
- AtCommand_Jail, // by Yor
- AtCommand_UnJail, // by Yor
- AtCommand_Disguise, // [Valaris]
- AtCommand_UnDisguise, // by Yor
- AtCommand_CharDisguise, // Kalaspuff
- AtCommand_CharUnDisguise, // Kalaspuff
- AtCommand_EMail, // by Yor
- AtCommand_Hatch,
- AtCommand_Effect, // by Apple
-// AtCommand_Char_Item_List, // by Yor, now #itemlist
-// AtCommand_Char_Storage_List, // by Yor, now #storagelist
- AtCommand_Char_Cart_List, // by Yor
- AtCommand_AddWarp, // by MouseJstr
- AtCommand_Follow, // by MouseJstr
- AtCommand_SkillOn, // by MouseJstr
- AtCommand_SkillOff, // by MouseJstr
- AtCommand_Killer, // by MouseJstr
- AtCommand_NpcMove, // by MouseJstr
- AtCommand_Killable, // by MouseJstr
- AtCommand_CharKillable, // by MouseJstr
-// AtCommand_Chareffect, // by MouseJstr, now #effect
- AtCommand_Dropall, // by MouseJstr
- AtCommand_Chardropall, // by MouseJstr
- AtCommand_Storeall, // by MouseJstr
- AtCommand_Charstoreall, // by MouseJstr
- AtCommand_Skillid, // by MouseJstr
- AtCommand_Useskill, // by MouseJstr
- AtCommand_Summon,
- AtCommand_Rain,
- AtCommand_Snow,
- AtCommand_Sakura,
- AtCommand_Fog,
- AtCommand_Leaves,
- AtCommand_AdjGmLvl, // MouseJstr
- AtCommand_AdjCmdLvl, // MouseJstr
- AtCommand_Trade, // MouseJstr
- AtCommand_Send,
- AtCommand_SetBattleFlag,
- AtCommand_UnMute,
- AtCommand_Clearweather, // by Dexity
- AtCommand_UpTime, // by MC Cameri
- AtCommand_ChangeSex, // by MC Cameri
- AtCommand_Mute, // [celest]
- AtCommand_WhoZeny, // [Valaris] <-- LOL...(MC Cameri) worth it.
- AtCommand_HappyHappyJoyJoy, // [Valaris]
- AtCommand_Refresh, // by MC Cameri
- AtCommand_PetId, // by MC Cameri
- AtCommand_Identify, // by MC Cameri
- AtCommand_Gmotd, // Added by MC Cameri, created by davidsiaw
- AtCommand_MiscEffect, // by MC Cameri
- AtCommand_MobSearch,
- AtCommand_CleanMap,
- AtCommand_NpcTalk,
- AtCommand_PetTalk,
- AtCommand_Users,
-
- // SQL-only commands start
-#ifndef TXT_ONLY
- AtCommand_CheckMail, // [Valaris]
- AtCommand_ListMail, // [Valaris]
- AtCommand_ListNewMail, // [Valaris]
- AtCommand_ReadMail, // [Valaris]
- AtCommand_SendMail, // [Valaris]
- AtCommand_DeleteMail, // [Valaris]
- AtCommand_SendPriorityMail, // [Valaris]
-// AtCommand_Sound, // [Valaris]
- AtCommand_RefreshOnline, // [Valaris]
- // SQL-only commands end
-#endif
- AtCommand_SkillTree, // by MouseJstr
- AtCommand_Marry, // by MouseJstr
- AtCommand_Divorce, // by MouseJstr
- AtCommand_Rings, // by MouseJstr
- AtCommand_Grind, // by MouseJstr
- AtCommand_Grind2, // by MouseJstr
-
- AtCommand_DMStart, // by MouseJstr
- AtCommand_DMTick, // by MouseJstr
-
- AtCommand_JumpToId, // by Dino9021
- AtCommand_JumpToId2, // by Dino9021
- AtCommand_RecallId, // by Dino9021
- AtCommand_RecallId2, // by Dino9021
- AtCommand_KickId, // by Dino9021
- AtCommand_KickId2, // by Dino9021
- AtCommand_ReviveId, // by Dino9021
- AtCommand_ReviveId2, // by Dino9021
- AtCommand_KillId, // by Dino9021
- AtCommand_KillId2, // by Dino9021
- AtCommand_CharKillableId, // by Dino9021
- AtCommand_CharKillableId2, // by Dino9021
- AtCommand_Sound,
- AtCommand_UndisguiseAll,
- AtCommand_DisguiseAll,
- AtCommand_ChangeLook,
- AtCommand_AutoLoot, //by Upa-Kun
- AtCommand_MobInfo, //by Lupus
- AtCommand_Adopt, // by Veider
-
- // end
- AtCommand_Unknown,
- AtCommand_MAX
-};
-
-typedef enum AtCommandType AtCommandType;
-
-typedef struct AtCommandInfo {
- AtCommandType type;
- const char* command;
- int level;
- int (*proc)(const int, struct map_session_data*,
- const char* command, const char* message);
-} AtCommandInfo;
-
-AtCommandType
-is_atcommand(const int fd, struct map_session_data* sd, const char* message, int gmlvl);
-
-AtCommandType atcommand(
- struct map_session_data *sd,
- const int level, const char* message, AtCommandInfo* info);
-int get_atcommand_level(const AtCommandType type);
-
-char * msg_txt(int msg_number); // [Yor]
-
-int atcommand_item(const int fd, struct map_session_data* sd,const char* command, const char* message); // [Valaris]
-int atcommand_rura(const int fd, struct map_session_data* sd,const char* command, const char* message); // [Yor]
-int atcommand_spawn(const int fd, struct map_session_data* sd, const char* command, const char* message); // [Valaris]
-int atcommand_jumpto(const int fd, struct map_session_data* sd, const char* command, const char* message); // [Yor]
-int atcommand_recall(const int fd, struct map_session_data* sd, const char* command, const char* message); // [Yor]
-
-int atcommand_config_read(const char *cfgName);
-int msg_config_read(const char *cfgName);
-void do_final_msg();
-
-char *estr_lower(char *str);
-
-char * job_name(int class_);
-int e_mail_check(char *email);
-
-#endif
-
diff --git a/src/map/battle.c b/src/map/battle.c
deleted file mode 100644
index 077e5fc9b..000000000
--- a/src/map/battle.c
+++ /dev/null
@@ -1,4629 +0,0 @@
-// $Id: battle.c,v 1.10 2004/09/29 21:08:17 Akitasha Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-
-#include "battle.h"
-
-#include "timer.h"
-#include "nullpo.h"
-#include "malloc.h"
-
-#include "map.h"
-#include "pc.h"
-#include "status.h"
-#include "skill.h"
-#include "mob.h"
-#include "itemdb.h"
-#include "clif.h"
-#include "pet.h"
-#include "guild.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-int attr_fix_table[4][10][10];
-
-struct Battle_Config battle_config;
-
-/*==========================================
- * “ñ“_ŠÔ‚Ì‹——£‚ð•Ô‚·
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-static int distance(int x0,int y0,int x1,int y1)
-{
- int dx,dy;
-
- dx=abs(x0-x1);
- dy=abs(y0-y1);
- return dx>dy ? dx : dy;
-}
-
-/*==========================================
- * Ž©•ª‚ðƒƒbƒN‚µ‚Ä‚¢‚é‘ÎÛ‚Ì”‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int battle_counttargeted(struct block_list *bl,struct block_list *src,int target_lv)
-{
- nullpo_retr(0, bl);
- if(bl->type == BL_PC)
- return pc_counttargeted((struct map_session_data *)bl,src,target_lv);
- else if(bl->type == BL_MOB)
- return mob_counttargeted((struct mob_data *)bl,src,target_lv);
- return 0;
-}
-
-// ƒ_ƒ[ƒW‚Ì’x‰„
-struct battle_delay_damage_ {
- struct block_list *src;
- int target;
- int damage;
- int flag;
-};
-int battle_delay_damage_sub(int tid,unsigned int tick,int id,int data)
-{
- struct battle_delay_damage_ *dat=(struct battle_delay_damage_ *)data;
- struct block_list *target=map_id2bl(dat->target);
- if( dat && map_id2bl(id)==dat->src && target && target->prev!=NULL)
- battle_damage(dat->src,target,dat->damage,dat->flag);
- aFree(dat);
- return 0;
-}
-int battle_delay_damage(unsigned int tick,struct block_list *src,struct block_list *target,int damage,int flag)
-{
- struct battle_delay_damage_ *dat = (struct battle_delay_damage_*)aCalloc(1,sizeof(struct battle_delay_damage_));
-
- nullpo_retr(0, src);
- nullpo_retr(0, target);
-
-
- dat->src=src;
- dat->target=target->id;
- dat->damage=damage;
- dat->flag=flag;
- add_timer(tick,battle_delay_damage_sub,src->id,(int)dat);
- return 0;
-}
-
-// ŽÀÛ‚ÉHP‚ð‘€ì
-int battle_damage(struct block_list *bl,struct block_list *target,int damage,int flag)
-{
- struct map_session_data *sd=NULL;
- struct status_change *sc_data=status_get_sc_data(target);
- short *sc_count;
- int i;
-
- nullpo_retr(0, target); //bl‚ÍNULL‚ŌĂ΂ê‚邱‚Æ‚ª‚ ‚é‚Ì‚Å‘¼‚Ń`ƒFƒbƒN
-
- if(damage==0 || target->type == BL_PET)
- return 0;
-
- if(target->prev == NULL)
- return 0;
-
- if(bl) {
- if(bl->prev==NULL)
- return 0;
-
- if(bl->type==BL_PC)
- sd=(struct map_session_data *)bl;
- }
-
- if(damage<0)
- return battle_heal(bl,target,-damage,0,flag);
-
- if(!flag && (sc_count=status_get_sc_count(target))!=NULL && *sc_count>0){
- // “€Œ‹AΉ»A‡–°‚ðÁ‹Ž
- if(sc_data[SC_FREEZE].timer!=-1)
- status_change_end(target,SC_FREEZE,-1);
- if(sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0)
- status_change_end(target,SC_STONE,-1);
- if(sc_data[SC_SLEEP].timer!=-1)
- status_change_end(target,SC_SLEEP,-1);
- }
-
- if(target->type==BL_MOB){ // MOB
- struct mob_data *md=(struct mob_data *)target;
- if(md && md->skilltimer!=-1 && md->state.skillcastcancel) // ‰r¥–WŠQ
- skill_castcancel(target,0);
- return mob_damage(bl,md,damage,0);
- }
- else if(target->type==BL_PC){ // PC
-
- struct map_session_data *tsd=(struct map_session_data *)target;
-
- if(tsd && tsd->sc_data && tsd->sc_data[SC_DEVOTION].val1){ // ƒfƒBƒ{[ƒVƒ‡ƒ“‚ð‚©‚¯‚ç‚ê‚Ä‚¢‚é
- struct map_session_data *md = map_id2sd(tsd->sc_data[SC_DEVOTION].val1);
- if(md && skill_devotion3(&md->bl,target->id)){
- skill_devotion(md,target->id);
- }
- else if(md && bl)
- for(i=0;i<5;i++)
- if(md->dev.val1[i] == target->id){
- clif_damage(bl,&md->bl, gettick(), 0, 0,
- damage, 0 , 0, 0);
- pc_damage(&md->bl,md,damage);
-
- return 0;
- }
- }
-
- if(tsd && tsd->skilltimer!=-1){ // ‰r¥–WŠQ
- // ƒtƒFƒ“ƒJ[ƒh‚â–WŠQ‚³‚ê‚È‚¢ƒXƒLƒ‹‚©‚ÌŒŸ¸
- if( (!tsd->special_state.no_castcancel || map[bl->m].flag.gvg) && tsd->state.skillcastcancel &&
- !tsd->special_state.no_castcancel2)
- skill_castcancel(target,0);
- }
-
- return pc_damage(bl,tsd,damage);
-
- }
- else if(target->type==BL_SKILL)
- return skill_unit_ondamaged((struct skill_unit *)target,bl,damage,gettick());
- return 0;
-}
-int battle_heal(struct block_list *bl,struct block_list *target,int hp,int sp,int flag)
-{
- nullpo_retr(0, target); //bl‚ÍNULL‚ŌĂ΂ê‚邱‚Æ‚ª‚ ‚é‚Ì‚Å‘¼‚Ń`ƒFƒbƒN
-
- if(target->type == BL_PET)
- return 0;
- if( target->type ==BL_PC && pc_isdead((struct map_session_data *)target) )
- return 0;
- if(hp==0 && sp==0)
- return 0;
-
- if(hp<0)
- return battle_damage(bl,target,-hp,flag);
-
- if(target->type==BL_MOB)
- return mob_heal((struct mob_data *)target,hp);
- else if(target->type==BL_PC)
- return pc_heal((struct map_session_data *)target,hp,sp);
- return 0;
-}
-
-// UŒ‚’âŽ~
-int battle_stopattack(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB)
- return mob_stopattack((struct mob_data*)bl);
- else if(bl->type==BL_PC)
- return pc_stopattack((struct map_session_data*)bl);
- else if(bl->type==BL_PET)
- return pet_stopattack((struct pet_data*)bl);
- return 0;
-}
-// ˆÚ“®’âŽ~
-int battle_stopwalking(struct block_list *bl,int type)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB)
- return mob_stop_walking((struct mob_data*)bl,type);
- else if(bl->type==BL_PC)
- return pc_stop_walking((struct map_session_data*)bl,type);
- else if(bl->type==BL_PET)
- return pet_stop_walking((struct pet_data*)bl,type);
- return 0;
-}
-
-
-/*==========================================
- * ƒ_ƒ[ƒW‚Ì‘®«C³
- *------------------------------------------
- */
-int battle_attr_fix(int damage,int atk_elem,int def_elem)
-{
- int def_type= def_elem%10, def_lv=def_elem/10/2;
-
- if( atk_elem<0 || atk_elem>9 || def_type<0 || def_type>9 ||
- def_lv<1 || def_lv>4){ // ‘® «’l‚ª‚¨‚©‚µ‚¢‚Ì‚Å‚Æ‚è‚ ‚¦‚¸‚»‚Ì‚Ü‚Ü•Ô‚·
- if(battle_config.error_log)
- printf("battle_attr_fix: unknown attr type: atk=%d def_type=%d def_lv=%d\n",atk_elem,def_type,def_lv);
- return damage;
- }
-
- return damage*attr_fix_table[def_lv-1][atk_elem][def_type]/100;
-}
-
-
-/*==========================================
- * ƒ_ƒ[ƒWÅIŒvŽZ
- *------------------------------------------
- */
-int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,int div_,int skill_num,int skill_lv,int flag)
-{
- struct map_session_data *sd=NULL;
- struct mob_data *md=NULL;
- struct status_change *sc_data,*sc;
- short *sc_count;
- int class_;
-
- nullpo_retr(0, bl);
-
- class_ = status_get_class(bl);
- if(bl->type==BL_MOB) md=(struct mob_data *)bl;
- else sd=(struct map_session_data *)bl;
-
- sc_data=status_get_sc_data(bl);
- sc_count=status_get_sc_count(bl);
-
- if(sc_count!=NULL && *sc_count>0){
- if (sc_data[SC_SAFETYWALL].timer!=-1 && damage>0 && flag&BF_WEAPON &&
- flag&BF_SHORT && skill_num != NPC_GUIDEDATTACK) {
- // ƒZ[ƒtƒeƒBƒEƒH[ƒ‹
- struct skill_unit *unit;
- unit = (struct skill_unit *)sc_data[SC_SAFETYWALL].val2;
- if (unit) {
- if (unit->group && (--unit->group->val2)<=0)
- skill_delunit(unit);
- damage=0;
- } else {
- status_change_end(bl,SC_SAFETYWALL,-1);
- }
- }
- if(sc_data[SC_PNEUMA].timer!=-1 && damage>0 &&
- ((flag&BF_WEAPON && flag&BF_LONG && skill_num != NPC_GUIDEDATTACK) ||
- (flag&BF_MISC && (skill_num == HT_BLITZBEAT || skill_num == SN_FALCONASSAULT)) ||
- (flag&BF_MAGIC && skill_num == ASC_BREAKER))){ // [DracoRPG]
- // ƒjƒ…[ƒ}
- damage=0;
- }
-
- if(sc_data[SC_ROKISWEIL].timer!=-1 && damage>0 &&
- flag&BF_MAGIC ){
- // ƒjƒ…[ƒ}
- damage=0;
- }
-
- if(sc_data[SC_AETERNA].timer!=-1 && damage>0){ // ƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi
- damage<<=1;
- status_change_end( bl,SC_AETERNA,-1 );
- }
-
- //‘®«ê‚̃_ƒ[ƒW‘‰Á
- if(sc_data[SC_VOLCANO].timer!=-1){ // ƒ{ƒ‹ƒP[ƒm
- if(flag&BF_SKILL && skill_get_pl(skill_num)==3)
- //damage += damage*sc_data[SC_VOLCANO].val4/100;
- damage += damage * enchant_eff[sc_data[SC_VOLCANO].val1-1] /100;
- else if(!flag&BF_SKILL && status_get_attack_element(bl)==3)
- //damage += damage*sc_data[SC_VOLCANO].val4/100;
- damage += damage * enchant_eff[sc_data[SC_VOLCANO].val1-1] /100;
- }
-
- if(sc_data[SC_VIOLENTGALE].timer!=-1){ // ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹
- if(flag&BF_SKILL && skill_get_pl(skill_num)==4)
- //damage += damage*sc_data[SC_VIOLENTGALE].val4/100;
- damage += damage * enchant_eff[sc_data[SC_VIOLENTGALE].val1-1] /100;
- else if(!flag&BF_SKILL && status_get_attack_element(bl)==4)
- //damage += damage*sc_data[SC_VIOLENTGALE].val4/100;
- damage += damage * enchant_eff[sc_data[SC_VIOLENTGALE].val1-1] /100;
- }
-
- if(sc_data[SC_DELUGE].timer!=-1){ // ƒfƒŠƒ…[ƒW
- if(flag&BF_SKILL && skill_get_pl(skill_num)==1)
- //damage += damage*sc_data[SC_DELUGE].val4/100;
- damage += damage * enchant_eff[sc_data[SC_DELUGE].val1-1] /100;
- else if(!flag&BF_SKILL && status_get_attack_element(bl)==1)
- //damage += damage*sc_data[SC_DELUGE].val4/100;
- damage += damage * enchant_eff[sc_data[SC_DELUGE].val1-1] /100;
- }
-
- if(sc_data[SC_ENERGYCOAT].timer!=-1 && damage>0 && flag&BF_WEAPON){ // ƒGƒiƒW[ƒR[ƒg
- if(sd){
- if(sd->status.sp>0){
- int per = sd->status.sp * 5 / (sd->status.max_sp + 1);
- sd->status.sp -= sd->status.sp * (per * 5 + 10) / 1000;
- if( sd->status.sp < 0 ) sd->status.sp = 0;
- damage -= damage * ((per+1) * 6) / 100;
- clif_updatestatus(sd,SP_SP);
- }
- if(sd->status.sp<=0)
- status_change_end( bl,SC_ENERGYCOAT,-1 );
- }
- else
- damage -= damage * (sc_data[SC_ENERGYCOAT].val1 * 6) / 100;
- }
-
- if(sc_data[SC_KYRIE].timer!=-1 && damage > 0){ // ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“
- sc=&sc_data[SC_KYRIE];
- sc->val2-=damage;
- if(flag&BF_WEAPON){
- if(sc->val2>=0) damage=0;
- else damage=-sc->val2;
- }
- if((--sc->val3)<=0 || (sc->val2<=0) || skill_num == AL_HOLYLIGHT)
- status_change_end(bl, SC_KYRIE, -1);
- }
-
- if(sc_data[SC_BASILICA].timer!=-1 && damage > 0){
- // ƒjƒ…[ƒ}
- damage=0;
- }
- if(sc_data[SC_LANDPROTECTOR].timer!=-1 && damage>0 && flag&BF_MAGIC){
- // ƒjƒ…[ƒ}
- damage=0;
- }
-
- if(sc_data[SC_AUTOGUARD].timer != -1 && damage > 0 && flag&BF_WEAPON) {
- if(rand()%100 < sc_data[SC_AUTOGUARD].val2) {
- int delay;
-
- damage = 0;
- clif_skill_nodamage(bl,bl,CR_AUTOGUARD,sc_data[SC_AUTOGUARD].val1,1);
- // different delay depending on skill level [celest]
- if (sc_data[SC_AUTOGUARD].val1 <= 5)
- delay = 300;
- else if (sc_data[SC_AUTOGUARD].val1 > 5 && sc_data[SC_AUTOGUARD].val1 <= 9)
- delay = 200;
- else
- delay = 100;
- if(sd)
- sd->canmove_tick = gettick() + delay;
- else if(md)
- md->canmove_tick = gettick() + delay;
- }
- }
-// -- moonsoul (chance to block attacks with new Lord Knight skill parrying)
-//
- if(sc_data[SC_PARRYING].timer != -1 && damage > 0 && flag&BF_WEAPON) {
- if(rand()%100 < sc_data[SC_PARRYING].val2) {
- damage = 0;
- clif_skill_nodamage(bl,bl,LK_PARRYING,sc_data[SC_PARRYING].val1,1);
- }
- }
- // ƒŠƒWƒFƒNƒgƒ\[ƒh
- if(sc_data[SC_REJECTSWORD].timer!=-1 && damage > 0 && flag&BF_WEAPON &&
- // Fixed the condition check [Aalye]
- (src->type==BL_MOB || (src->type==BL_PC && (((struct map_session_data *)src)->status.weapon == 1 ||
- ((struct map_session_data *)src)->status.weapon == 2 ||
- ((struct map_session_data *)src)->status.weapon == 3)))){
- if(rand()%100 < (15*sc_data[SC_REJECTSWORD].val1)){ //”½ŽËŠm—¦‚Í15*Lv
- damage = damage*50/100;
- clif_damage(bl,src,gettick(),0,0,damage,0,0,0);
- battle_damage(bl,src,damage,0);
- //ƒ_ƒ[ƒW‚ð—^‚¦‚½‚Ì‚Í—Ç‚¢‚ñ‚¾‚ªA‚±‚±‚©‚ç‚Ç‚¤‚µ‚Ä•\Ž¦‚·‚é‚ñ‚¾‚©‚í‚©‚ñ‚Ë‚¥
- //ƒGƒtƒFƒNƒg‚à‚±‚ê‚Å‚¢‚¢‚Ì‚©‚í‚©‚ñ‚Ë‚¥
- clif_skill_nodamage(bl,bl,ST_REJECTSWORD,sc_data[SC_REJECTSWORD].val1,1);
- if((--sc_data[SC_REJECTSWORD].val2)<=0)
- status_change_end(bl, SC_REJECTSWORD, -1);
- }
- }
- if(sc_data[SC_SPIDERWEB].timer!=-1 && damage > 0) // [Celest]
- if ((flag&BF_SKILL && skill_get_pl(skill_num)==3) ||
- (!flag&BF_SKILL && status_get_attack_element(src)==3)) {
- damage<<=1;
- status_change_end(bl, SC_SPIDERWEB, -1);
- }
-
- if(sc_data[SC_FOGWALL].timer != -1 && flag&BF_MAGIC)
- if(rand()%100 < 75)
- damage = 0;
- }
-
- if(class_ == 1288 || class_ == 1287 || class_ == 1286 || class_ == 1285) {
-// if(class_ == 1288) {
- if(class_ == 1288 && (flag&BF_SKILL || skill_num == ASC_BREAKER || skill_num == PA_SACRIFICE))
- damage=0;
- if(src->type == BL_PC) {
- struct guild *g=guild_search(((struct map_session_data *)src)->status.guild_id);
- struct guild_castle *gc=guild_mapname2gc(map[bl->m].name);
- if(!((struct map_session_data *)src)->status.guild_id)
- damage=0;
- if(gc && agit_flag==0 && class_ != 1288) // guardians cannot be damaged during non-woe [Valaris]
- damage=0; // end woe check [Valaris]
- if(g == NULL)
- damage=0;//ƒMƒ‹ƒh–¢‰Á“ü‚È‚çƒ_ƒ[ƒW–³‚µ
- else if((gc != NULL) && guild_isallied(g, gc))
- damage=0;//Ž©è—̃Mƒ‹ƒh‚̃Gƒ“ƒy‚È‚çƒ_ƒ[ƒW–³‚µ
- else if(g && guild_checkskill(g,GD_APPROVAL) <= 0)
- damage=0;//³‹KƒMƒ‹ƒh³”F‚ª‚È‚¢‚ƃ_ƒ[ƒW–³‚µ
- else if (battle_config.guild_max_castles != 0 && guild_checkcastles(g)>=battle_config.guild_max_castles)
- damage = 0; // [MouseJstr]
- else if (g && gc && guild_check_alliance(gc->guild_id, g->guild_id, 0) == 1)
- return 0;
- }
- else damage = 0;
- }
-
- if(map[bl->m].flag.gvg && damage > 0) { //GvG
- if(bl->type == BL_MOB){ //defense‚ª‚ ‚ê‚΃_ƒ[ƒW‚ªŒ¸‚é‚炵‚¢H
- struct guild_castle *gc=guild_mapname2gc(map[bl->m].name);
- if (gc) damage -= damage*(gc->defense/100)*(battle_config.castle_defense_rate/100);
- }
- if(flag&BF_WEAPON) {
- if(flag&BF_SHORT)
- damage=damage*battle_config.gvg_short_damage_rate/100;
- if(flag&BF_LONG)
- damage=damage*battle_config.gvg_long_damage_rate/100;
- }
- if(flag&BF_MAGIC)
- damage = damage*battle_config.gvg_magic_damage_rate/100;
- if(flag&BF_MISC)
- damage=damage*battle_config.gvg_misc_damage_rate/100;
- if(damage < 1) damage = 1;
- }
-
- if(battle_config.skill_min_damage || flag&BF_MISC) {
- if(div_ < 255) {
- if(damage > 0 && damage < div_)
- damage = div_;
- }
- else if(damage > 0 && damage < 3)
- damage = 3;
- }
-
- if( md!=NULL && md->hp>0 && damage > 0 ) // ”½Œ‚‚È‚Ç‚ÌMOBƒXƒLƒ‹”»’è
- mobskill_event(md,flag);
-
- return damage;
-}
-
-/*==========================================
- * HP/SP‹zŽû‚ÌŒvŽZ
- *------------------------------------------
- */
-int battle_calc_drain(int damage, int rate, int per, int val)
-{
- int diff = 0;
-
- if (damage <= 0 || rate <= 0)
- return 0;
-
- if (per && rand()%100 < rate) {
- diff = (damage * per) / 100;
- if (diff == 0) {
- if (per > 0)
- diff = 1;
- else
- diff = -1;
- }
- }
-
- if (val && rand()%100 < rate) {
- diff += val;
- }
- return diff;
-}
-
-/*==========================================
- * C—ûƒ_ƒ[ƒW
- *------------------------------------------
- */
-int battle_addmastery(struct map_session_data *sd,struct block_list *target,int dmg,int type)
-{
- int damage,skill;
- int race=status_get_race(target);
- int weapon;
- damage = 0;
-
- nullpo_retr(0, sd);
-
- // ƒf[ƒ‚ƒ“ƒxƒCƒ“(+3 ` +30) vs •sŽ€ or ˆ«–‚ (Ž€l‚ÍŠÜ‚ß‚È‚¢H)
- if((skill = pc_checkskill(sd,AL_DEMONBANE)) > 0 && (battle_check_undead(race,status_get_elem_type(target)) || race==6) )
- damage += (skill*(int)(3+(sd->status.base_level+1)*0.05)); // submitted by orn
- //damage += (skill * 3);
-
- // ƒr[ƒXƒgƒxƒCƒ“(+4 ` +40) vs “®•¨ or ©’Ž
- if((skill = pc_checkskill(sd,HT_BEASTBANE)) > 0 && (race==2 || race==4) )
- damage += (skill * 4);
-
- if(type == 0)
- weapon = sd->weapontype1;
- else
- weapon = sd->weapontype2;
- switch(weapon)
- {
- case 0x01: // ’ZŒ• Knife
- case 0x02: // 1HS
- {
- // Œ•C—û(+4 ` +40) •ÐŽèŒ• ’ZŒ•ŠÜ‚Þ
- if((skill = pc_checkskill(sd,SM_SWORD)) > 0) {
- damage += (skill * 4);
- }
- break;
- }
- case 0x03: // 2HS
- {
- // —¼ŽèŒ•C—û(+4 ` +40) —¼ŽèŒ•
- if((skill = pc_checkskill(sd,SM_TWOHAND)) > 0) {
- damage += (skill * 4);
- }
- break;
- }
- case 0x04: // 1HL
- case 0x05: // 2HL
- {
- // ‘„C—û(+4 ` +40,+5 ` +50) ‘„
- if((skill = pc_checkskill(sd,KN_SPEARMASTERY)) > 0) {
- if(!pc_isriding(sd))
- damage += (skill * 4); // ƒyƒR‚Éæ‚Á‚Ä‚È‚¢
- else
- damage += (skill * 5); // ƒyƒR‚Éæ‚Á‚Ä‚é
- }
- break;
- }
- case 0x06: // •ÐŽè•€
- case 0x07: // Axe by Tato
- {
- if((skill = pc_checkskill(sd,AM_AXEMASTERY)) > 0) {
- damage += (skill * 3);
- }
- break;
- }
- case 0x08: // ƒƒCƒX
- {
- // ƒƒCƒXC—û(+3 ` +30) ƒƒCƒX
- if((skill = pc_checkskill(sd,PR_MACEMASTERY)) > 0) {
- damage += (skill * 3);
- }
- break;
- }
- case 0x09: // ‚È‚µ?
- break;
- case 0x0a: // ñ
- break;
- case 0x0b: // ‹|
- break;
- case 0x00: // ‘fŽè Bare Hands
- case 0x0c: // Knuckles
- {
- // “SŒ(+3 ` +30) ‘fŽè,ƒiƒbƒNƒ‹
- if((skill = pc_checkskill(sd,MO_IRONHAND)) > 0) {
- damage += (skill * 3);
- }
- break;
- }
- case 0x0d: // Musical Instrument
- {
- // ŠyŠí‚Ì—ûK(+3 ` +30) ŠyŠí
- if((skill = pc_checkskill(sd,BA_MUSICALLESSON)) > 0) {
- damage += (skill * 3);
- }
- break;
- }
- case 0x0e: // Dance Mastery
- {
- // Dance Lesson Skill Effect(+3 damage for every lvl = +30) •Ú
- if((skill = pc_checkskill(sd,DC_DANCINGLESSON)) > 0) {
- damage += (skill * 3);
- }
- break;
- }
- case 0x0f: // Book
- {
- // Advance Book Skill Effect(+3 damage for every lvl = +30) {
- if((skill = pc_checkskill(sd,SA_ADVANCEDBOOK)) > 0) {
- damage += (skill * 3);
- }
- break;
- }
- case 0x10: // Katars
- {
- // ƒJƒ^[ƒ‹C—û(+3 ` +30) ƒJƒ^[ƒ‹
- if((skill = pc_checkskill(sd,AS_KATAR)) > 0) {
- //ƒ\ƒjƒbƒNƒuƒ[Žž‚͕ʈ—i1Œ‚‚É•t‚«1/8“K‰ž)
- damage += (skill * 3);
- }
- break;
- }
- }
- damage = dmg + damage;
- return (damage);
-}
-
-static struct Damage battle_calc_pet_weapon_attack(
- struct block_list *src,struct block_list *target,int skill_num,int skill_lv,int wflag)
-{
- struct pet_data *pd = (struct pet_data *)src;
- struct mob_data *tmd=NULL;
- int hitrate,flee,cri = 0,atkmin,atkmax;
- int luk,target_count = 1;
- int def1 = status_get_def(target);
- int def2 = status_get_def2(target);
- int t_vit = status_get_vit(target);
- struct Damage wd;
- int damage,damage2=0,type,div_,blewcount=skill_get_blewcount(skill_num,skill_lv);
- int flag,dmg_lv=0;
- int t_mode=0,t_race=0,t_size=1,s_race=0,s_ele=0;
- struct status_change *t_sc_data;
- int div_flag=0; // 0: total damage is to be divided by div_
- // 1: damage is distributed,and has to be multiplied by div_ [celest]
-
- //return‘O‚̈—‚ª‚ ‚é‚Ì‚Åî•ño—Í•”‚Ì‚Ý•ÏX
- if( target == NULL || pd == NULL ){ //src‚Í“à—e‚É’¼ÚG‚ê‚Ä‚¢‚È‚¢‚̂ŃXƒ‹[‚µ‚Ä‚Ý‚é
- nullpo_info(NLP_MARK);
- memset(&wd,0,sizeof(wd));
- return wd;
- }
-
- s_race=status_get_race(src);
- s_ele=status_get_attack_element(src);
-
- // ƒ^[ƒQƒbƒg
- if(target->type == BL_MOB)
- tmd=(struct mob_data *)target;
- else {
- memset(&wd,0,sizeof(wd));
- return wd;
- }
- t_race=status_get_race( target );
- t_size=status_get_size( target );
- t_mode=status_get_mode( target );
- t_sc_data=status_get_sc_data( target );
-
- flag=BF_SHORT|BF_WEAPON|BF_NORMAL; // UŒ‚‚ÌŽí—Þ‚ÌÝ’è
-
- // ‰ñ”𗦌vŽZA‰ñ”ð”»’è‚ÍŒã‚Å
- flee = status_get_flee(target);
- if(battle_config.agi_penalty_type > 0 || battle_config.vit_penalty_type > 0)
- target_count += battle_counttargeted(target,src,battle_config.agi_penalty_count_lv);
- if(battle_config.agi_penalty_type > 0) {
- if(target_count >= battle_config.agi_penalty_count) {
- if(battle_config.agi_penalty_type == 1)
- flee = (flee * (100 - (target_count - (battle_config.agi_penalty_count - 1))*battle_config.agi_penalty_num))/100;
- else if(battle_config.agi_penalty_type == 2)
- flee -= (target_count - (battle_config.agi_penalty_count - 1))*battle_config.agi_penalty_num;
- if(flee < 1) flee = 1;
- }
- }
- hitrate=status_get_hit(src) - flee + 80;
-
- type=0; // normal
- if (skill_num > 0) {
- div_ = skill_get_num(skill_num,skill_lv);
- if (div_ < 1) div_ = 1; //Avoid the rare case where the db says div_ is 0 and below
- }
- else div_ = 1; // single attack
-
- luk=status_get_luk(src);
-
- if(battle_config.pet_str)
- damage = status_get_baseatk(src);
- else
- damage = 0;
-
- if(skill_num==HW_MAGICCRASHER){ /* ƒ}ƒWƒbƒNƒNƒ‰ƒbƒVƒƒ[‚ÍMATK‚ʼn£‚é */
- atkmin = status_get_matk1(src);
- atkmax = status_get_matk2(src);
- }else{
- atkmin = status_get_atk(src);
- atkmax = status_get_atk2(src);
- }
- if(mob_db[pd->class_].range>3 )
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
-
- if(atkmin > atkmax) atkmin = atkmax;
-
- cri = status_get_critical(src);
- cri -= status_get_luk(target) * 2; // luk/5*10 => target_luk*2 not target_luk*3
- if(battle_config.enemy_critical_rate != 100) {
- cri = cri*battle_config.enemy_critical_rate/100;
- if(cri < 1)
- cri = 1;
- }
- if(t_sc_data) {
- if (t_sc_data[SC_SLEEP].timer!=-1)
- cri <<=1;
- if(t_sc_data[SC_JOINTBEAT].timer != -1 &&
- t_sc_data[SC_JOINTBEAT].val2 == 6) // Always take crits with Neck broken by Joint Beat [DracoRPG]
- cri = 1000;
- }
-
- if(skill_num == 0 && battle_config.enemy_critical && (rand() % 1000) < cri)
- {
- damage += atkmax;
- type = 0x0a;
- }
- else {
- int vitbonusmax;
-
- if(atkmax > atkmin)
- damage += atkmin + rand() % (atkmax-atkmin + 1);
- else
- damage += atkmin ;
- // ƒXƒLƒ‹C³‚PiUŒ‚—Í”{‰»Œnj
- // ƒI[ƒo[ƒgƒ‰ƒXƒg(+5% ` +25%),‘¼UŒ‚ŒnƒXƒLƒ‹‚Ìꇂ±‚±‚Å•â³
- // ƒoƒbƒVƒ…,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN,
- // ƒ{[ƒŠƒ“ƒOƒoƒbƒVƒ…,ƒXƒsƒAƒu[ƒƒ‰ƒ“,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA,ƒXƒsƒAƒXƒ^ƒbƒu,
- // ƒƒ}[ƒiƒCƒg,ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“
- // ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO,ƒAƒ[ƒVƒƒƒ[,ƒ`ƒƒ[ƒWƒAƒ[,
- // ƒ\ƒjƒbƒNƒuƒ[
- if(skill_num>0){
- int i;
- if( (i=skill_get_pl(skill_num))>0 )
- s_ele=i;
-
- flag=(flag&~BF_SKILLMASK)|BF_SKILL;
- switch( skill_num ){
- case SM_BASH: // ƒoƒbƒVƒ…
- damage = damage*(100+ 30*skill_lv)/100;
- hitrate = (hitrate*(100+5*skill_lv))/100;
- break;
- case SM_MAGNUM: // ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN
- damage = damage*(wflag > 1 ? 5*skill_lv+115 : 30*skill_lv+100)/100;
- hitrate = (hitrate*(100+10*skill_lv))/100;
- break;
- case MC_MAMMONITE: // ƒƒ}[ƒiƒCƒg
- damage = damage*(100+ 50*skill_lv)/100;
- break;
- case AC_DOUBLE: // ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO
- damage = damage*(180+ 20*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case AC_SHOWER: // ƒAƒ[ƒVƒƒƒ[
- damage = damage*(75 + 5*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case AC_CHARGEARROW: // ƒ`ƒƒ[ƒWƒAƒ[
- damage = damage*150/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case KN_PIERCE: // ƒsƒA[ƒX
- damage = damage*(100+ 10*skill_lv)/100;
- hitrate = hitrate*(100+5*skill_lv)/100;
- div_=t_size+1;
- div_flag = 1;
- break;
- case KN_SPEARSTAB: // ƒXƒsƒAƒXƒ^ƒu
- damage = damage*(100+ 15*skill_lv)/100;
- break;
- case KN_SPEARBOOMERANG: // ƒXƒsƒAƒu[ƒƒ‰ƒ“
- damage = damage*(100+ 50*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case KN_BRANDISHSPEAR: // ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA
- damage = damage*(100+ 20*skill_lv)/100;
- if(skill_lv>3 && wflag==1) damage2+=damage/2;
- if(skill_lv>6 && wflag==1) damage2+=damage/4;
- if(skill_lv>9 && wflag==1) damage2+=damage/8;
- if(skill_lv>6 && wflag==2) damage2+=damage/2;
- if(skill_lv>9 && wflag==2) damage2+=damage/4;
- if(skill_lv>9 && wflag==3) damage2+=damage/2;
- damage +=damage2;
- break;
- case KN_BOWLINGBASH: // ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…
- damage = damage*(100+ 50*skill_lv)/100;
- blewcount=0;
- break;
- case AS_GRIMTOOTH:
- damage = damage*(100+ 20*skill_lv)/100;
- break;
- case AS_POISONREACT: // celest
- s_ele = 0;
- damage = damage*(100+ 30*skill_lv)/100;
- break;
- case AS_SONICBLOW: // ƒ\ƒjƒbƒNƒuƒƒE
- damage = damage*(300+ 50*skill_lv)/100;
- break;
- case TF_SPRINKLESAND: // »‚Ü‚«
- damage = damage*125/100;
- break;
- case MC_CARTREVOLUTION: // ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“
- damage = (damage*150)/100;
- break;
- // ˆÈ‰ºMOB
- case NPC_COMBOATTACK: // ‘½’iUŒ‚
- div_flag = 1;
- break;
- case NPC_RANDOMATTACK: // ƒ‰ƒ“ƒ_ƒ€ATKUŒ‚
- damage = damage*(50+rand()%150)/100;
- break;
- // ‘®«UŒ‚i“K“–j
- case NPC_WATERATTACK:
- case NPC_GROUNDATTACK:
- case NPC_FIREATTACK:
- case NPC_WINDATTACK:
- case NPC_POISONATTACK:
- case NPC_HOLYATTACK:
- case NPC_DARKNESSATTACK:
- case NPC_UNDEADATTACK:
- case NPC_TELEKINESISATTACK:
- div_= pd->skillduration; // [Valaris]
- break;
- case NPC_GUIDEDATTACK:
- hitrate = 1000000;
- break;
- case NPC_RANGEATTACK:
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case NPC_PIERCINGATT:
- flag=(flag&~BF_RANGEMASK)|BF_SHORT;
- break;
- case RG_BACKSTAP: // ƒoƒbƒNƒXƒ^ƒu
- damage = damage*(300+ 40*skill_lv)/100;
- hitrate = 1000000;
- break;
- case RG_RAID: // ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN
- damage = damage*(100+ 40*skill_lv)/100;
- break;
- case RG_INTIMIDATE: // ƒCƒ“ƒeƒBƒ~ƒfƒCƒg
- damage = damage*(100+ 30*skill_lv)/100;
- break;
- case CR_SHIELDCHARGE: // ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW
- damage = damage*(100+ 20*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_SHORT;
- s_ele = 0;
- break;
- case CR_SHIELDBOOMERANG: // ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“
- damage = damage*(100+ 30*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- s_ele = 0;
- break;
- case CR_HOLYCROSS: // ƒz[ƒŠ[ƒNƒƒX
- damage = damage*(100+ 35*skill_lv)/100;
- break;
- case CR_GRANDCROSS:
- hitrate= 1000000;
- break;
- case AM_DEMONSTRATION: // ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“
- hitrate= 1000000;
- damage = damage*(100+ 20*skill_lv)/100;
- damage2 = damage2*(100+ 20*skill_lv)/100;
- break;
- case AM_ACIDTERROR: // ƒAƒVƒbƒhƒeƒ‰[
- hitrate = 1000000;
- damage = damage*(100+ 40*skill_lv)/100;
- damage2 = damage2*(100+ 40*skill_lv)/100;
- break;
- case MO_FINGEROFFENSIVE: //Žw’e
- damage = damage * (125 + 25 * skill_lv) / 100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG; //orn
- break;
- case MO_INVESTIGATE: // ”­ ™¤
- if(def1 < 1000000)
- damage = damage*(100+ 75*skill_lv)/100 * (def1 + def2)/50;
- hitrate = 1000000;
- s_ele = 0;
- break;
- case MO_EXTREMITYFIST: // ˆ¢C—…”e–PŒ
- damage = damage * 8 + 250 + (skill_lv * 150);
- hitrate = 1000000;
- s_ele = 0;
- break;
- case MO_CHAINCOMBO: // ˜A‘Ŷ
- damage = damage*(150+ 50*skill_lv)/100;
- break;
- case MO_COMBOFINISH: // –Ò—´Œ
- damage = damage*(240+ 60*skill_lv)/100;
- break;
- case DC_THROWARROW: // –‚¿
- damage = damage*(60+ 40 * skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case BA_MUSICALSTRIKE: // ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN
- damage = damage*(60+ 40 * skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case CH_TIGERFIST: // •šŒÕŒ
- damage = damage*(40+ 100*skill_lv)/100;
- break;
- case CH_CHAINCRUSH: // ˜A’Œ•öŒ‚
- damage = damage*(400+ 100*skill_lv)/100;
- break;
- case CH_PALMSTRIKE: // –ÒŒÕd”hŽR
- damage = damage*(200+ 100*skill_lv)/100;
- break;
- case LK_SPIRALPIERCE: /* ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX */
- damage = damage*(100+ 50*skill_lv)/100; //‘‰Á—Ê‚ª•ª‚©‚ç‚È‚¢‚Ì‚Å“K“–‚É
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- if(target->type == BL_PC)
- ((struct map_session_data *)target)->canmove_tick = gettick() + 1000;
- else if(target->type == BL_MOB)
- ((struct mob_data *)target)->canmove_tick = gettick() + 1000;
- break;
- case LK_HEADCRUSH: /* ƒwƒbƒhƒNƒ‰ƒbƒVƒ… */
- damage = damage*(100+ 40*skill_lv)/100;
- break;
- case LK_JOINTBEAT: /* ƒWƒ‡ƒCƒ“ƒgƒr[ƒg */
- damage = damage*(50+ 10*skill_lv)/100;
- break;
- case ASC_METEORASSAULT: /* ƒƒeƒIƒAƒTƒ‹ƒg */
- damage = damage*(40+ 40*skill_lv)/100;
- break;
- case SN_SHARPSHOOTING: /* ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO */
- damage += damage*(30*skill_lv)/100;
- break;
- case CG_ARROWVULCAN: /* ƒAƒ[ƒoƒ‹ƒJƒ“ */
- damage = damage*(200+100*skill_lv)/100;
- break;
- case AS_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[ */
- damage = damage*(200+20*skill_lv)/100;
- hitrate = 1000000;
- break;
- }
- if (div_flag && div_ > 1) { // [Skotlex]
- damage *= div_;
- damage2 *= div_;
- }
- }
-
- if( skill_num!=NPC_CRITICALSLASH ){
- // ‘Î Û‚Ì–hŒä—Í‚É‚æ‚éƒ_ƒ[ƒW‚ÌŒ¸­
- // ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“i‚±‚±‚Å‚¢‚¢‚Ì‚©‚ÈHj
- if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && skill_num != AM_ACIDTERROR && def1 < 1000000 ) { //DEF, VIT–³Ž‹
- int t_def;
- target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penalty_count_lv);
- if(battle_config.vit_penalty_type > 0) {
- if(target_count >= battle_config.vit_penalty_count) {
- if(battle_config.vit_penalty_type == 1) {
- def1 = (def1 * (100 - (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num))/100;
- def2 = (def2 * (100 - (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num))/100;
- t_vit = (t_vit * (100 - (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num))/100;
- }
- else if(battle_config.vit_penalty_type == 2) {
- def1 -= (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num;
- def2 -= (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num;
- t_vit -= (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num;
- }
- if(def1 < 0) def1 = 0;
- if(def2 < 1) def2 = 1;
- if(t_vit < 1) t_vit = 1;
- }
- }
- t_def = def2*8/10;
- vitbonusmax = (t_vit/20)*(t_vit/20)-1;
- if(battle_config.pet_defense_type) {
- damage = damage - (def1 * battle_config.pet_defense_type) - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
- }
- else{
- damage = damage * (100 - def1) /100 - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
- }
- }
- }
- }
-
- // 0–¢–ž‚¾‚Á‚½ê‡1‚É•â³
- if(damage<1) damage=1;
-
- // ‰ñ”ðC³
- if( hitrate < 1000000 && t_sc_data ) { // •K’†UŒ‚
- if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
- hitrate -= 75;
- if (t_sc_data[SC_SLEEP].timer!=-1 || // ‡–°‚Í•K’†
- t_sc_data[SC_STAN].timer!=-1 || // ƒXƒ^ƒ“‚Í•K’†
- t_sc_data[SC_FREEZE].timer!=-1 ||
- (t_sc_data[SC_STONE].timer!=-1 && t_sc_data[SC_STONE].val2==0)) // “€Œ‹‚Í•K’†
- hitrate = 1000000;
- }
- if(hitrate < 1000000)
- hitrate = ( (hitrate>95)?95: ((hitrate<5)?5:hitrate) );
- if(type == 0 && rand()%100 >= hitrate) {
- damage = damage2 = 0;
- dmg_lv = ATK_FLEE;
- } else {
- dmg_lv = ATK_DEF;
- }
-
-
- if(t_sc_data) {
- int cardfix=100;
- if(t_sc_data[SC_DEFENDER].timer != -1 && flag&BF_LONG)
- cardfix=cardfix*(100-t_sc_data[SC_DEFENDER].val2)/100;
- if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
- cardfix=cardfix*50/100;
- if(cardfix != 100)
- damage=damage*cardfix/100;
- }
- if(damage < 0) damage = 0;
-
- // ‘® «‚Ì“K—p
- if(skill_num != 0 || s_ele != 0 || !battle_config.pet_attack_attr_none)
- damage=battle_attr_fix(damage, s_ele, status_get_element(target) );
-
- if(skill_num==PA_PRESSURE) /* ƒvƒŒƒbƒVƒƒ[ •K’†? */
- damage = 500+300*skill_lv;
-
- // ƒCƒ“ƒxƒiƒ€C³
- if(skill_num==TF_POISON){
- damage = battle_attr_fix(damage + 15*skill_lv, s_ele, status_get_element(target) );
- }
- if(skill_num==MC_CARTREVOLUTION){
- damage = battle_attr_fix(damage, 0, status_get_element(target) );
- }
-
- // Š®‘S‰ñ”ð‚Ì”»’è
- if(battle_config.enemy_perfect_flee) {
- if(skill_num == 0 && tmd!=NULL && rand()%1000 < status_get_flee2(target) ){
- damage=0;
- type=0x0b;
- dmg_lv = ATK_LUCKY;
- }
- }
-
-// if(def1 >= 1000000 && damage > 0)
- if(t_mode&0x40 && damage > 0)
- damage = 1;
-
- if(skill_num != CR_GRANDCROSS)
- damage=battle_calc_damage(src,target,damage,div_,skill_num,skill_lv,flag);
-
- wd.damage=damage;
- wd.damage2=0;
- wd.type=type;
- wd.div_=div_;
- wd.amotion=status_get_amotion(src);
- if(skill_num == KN_AUTOCOUNTER)
- wd.amotion >>= 1;
- wd.dmotion=status_get_dmotion(target);
- wd.blewcount=blewcount;
- wd.flag=flag;
- wd.dmg_lv=dmg_lv;
-
- return wd;
-}
-
-static struct Damage battle_calc_mob_weapon_attack(
- struct block_list *src,struct block_list *target,int skill_num,int skill_lv,int wflag)
-{
- struct map_session_data *tsd=NULL;
- struct mob_data* md=(struct mob_data *)src,*tmd=NULL;
- int hitrate,flee,cri = 0,atkmin,atkmax;
- int luk,target_count = 1;
- int def1 = status_get_def(target);
- int def2 = status_get_def2(target);
- int t_vit = status_get_vit(target);
- struct Damage wd;
- int damage,damage2=0,type,div_,blewcount=skill_get_blewcount(skill_num,skill_lv);
- int flag,skill,ac_flag = 0,dmg_lv = 0;
- int t_mode=0,t_race=0,t_size=1,s_race=0,s_ele=0,s_size=0,s_race2=0;
- struct status_change *sc_data,*t_sc_data;
- short *sc_count;
- short *option, *opt1, *opt2;
- int div_flag=0; // 0: total damage is to be divided by div_
- // 1: damage is distributed,and has to be multiplied by div_ [celest]
-
- //return‘O‚̈—‚ª‚ ‚é‚Ì‚Åî•ño—Í•”‚Ì‚Ý•ÏX
- if( src == NULL || target == NULL || md == NULL ){
- nullpo_info(NLP_MARK);
- memset(&wd,0,sizeof(wd));
- return wd;
- }
-
- s_race = status_get_race(src);
- s_ele = status_get_attack_element(src);
- s_size = status_get_size(src);
- sc_data = status_get_sc_data(src);
- sc_count = status_get_sc_count(src);
- option = status_get_option(src);
- opt1 = status_get_opt1(src);
- opt2 = status_get_opt2(src);
- s_race2 = status_get_race2(src);
-
- // ƒ^[ƒQƒbƒg
- if(target->type == BL_PC)
- tsd = (struct map_session_data *)target;
- else if(target->type == BL_MOB)
- tmd = (struct mob_data *)target;
- t_race = status_get_race( target );
- t_size = status_get_size( target );
- t_mode = status_get_mode( target );
- t_sc_data = status_get_sc_data( target );
-
- if(skill_num == 0 || (target->type == BL_PC && battle_config.pc_auto_counter_type&2) ||
- (target->type == BL_MOB && battle_config.monster_auto_counter_type&2)) {
- if(skill_num != CR_GRANDCROSS && t_sc_data && t_sc_data[SC_AUTOCOUNTER].timer != -1) {
- int dir = map_calc_dir(src,target->x,target->y),t_dir = status_get_dir(target);
- int dist = distance(src->x,src->y,target->x,target->y);
- if(dist <= 0 || map_check_dir(dir,t_dir) ) {
- memset(&wd,0,sizeof(wd));
- t_sc_data[SC_AUTOCOUNTER].val3 = 0;
- t_sc_data[SC_AUTOCOUNTER].val4 = 1;
- if(sc_data && sc_data[SC_AUTOCOUNTER].timer == -1) {
- int range = status_get_range(target);
- if((target->type == BL_PC && ((struct map_session_data *)target)->status.weapon != 11 && dist <= range+1) ||
- (target->type == BL_MOB && range <= 3 && dist <= range+1) )
- t_sc_data[SC_AUTOCOUNTER].val3 = src->id;
- }
- return wd;
- }
- else ac_flag = 1;
- } else if(skill_num != CR_GRANDCROSS && t_sc_data && t_sc_data[SC_POISONREACT].timer != -1) { // poison react [Celest]
- t_sc_data[SC_POISONREACT].val3 = 0;
- t_sc_data[SC_POISONREACT].val4 = 1;
- t_sc_data[SC_POISONREACT].val3 = src->id;
- }
- }
- flag=BF_SHORT|BF_WEAPON|BF_NORMAL; // UŒ‚‚ÌŽí—Þ‚ÌÝ’è
-
- // ‰ñ”𗦌vŽZA‰ñ”ð”»’è‚ÍŒã‚Å
- flee = status_get_flee(target);
- if(battle_config.agi_penalty_type > 0 || battle_config.vit_penalty_type > 0)
- target_count += battle_counttargeted(target,src,battle_config.agi_penalty_count_lv);
- if(battle_config.agi_penalty_type > 0) {
- if(target_count >= battle_config.agi_penalty_count) {
- if(battle_config.agi_penalty_type == 1)
- flee = (flee * (100 - (target_count - (battle_config.agi_penalty_count - 1))*battle_config.agi_penalty_num))/100;
- else if(battle_config.agi_penalty_type == 2)
- flee -= (target_count - (battle_config.agi_penalty_count - 1))*battle_config.agi_penalty_num;
- if(flee < 1) flee = 1;
- }
- }
- hitrate=status_get_hit(src) - flee + 80;
-
- type=0; // normal
- if (skill_num > 0) {
- div_ = skill_get_num(skill_num,skill_lv);
- if (div_ < 1) div_ = 1; //Avoid the rare case where the db says div_ is 0 and below
- } else div_ = 1; // single attack
-
- luk=status_get_luk(src);
-
- if(battle_config.enemy_str)
- damage = status_get_baseatk(src);
- else
- damage = 0;
- if(skill_num==HW_MAGICCRASHER){ /* ƒ}ƒWƒbƒNƒNƒ‰ƒbƒVƒƒ[‚ÍMATK‚ʼn£‚é */
- atkmin = status_get_matk1(src);
- atkmax = status_get_matk2(src);
- }else{
- atkmin = status_get_atk(src);
- atkmax = status_get_atk2(src);
- }
- if(mob_db[md->class_].range>3 )
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
-
- if(atkmin > atkmax) atkmin = atkmax;
-
- if(sc_data != NULL && sc_data[SC_MAXIMIZEPOWER].timer!=-1 ){ // ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[
- atkmin=atkmax;
- }
-
- cri = status_get_critical(src);
- cri -= status_get_luk(target) * 3;
- if(battle_config.enemy_critical_rate != 100) {
- cri = cri*battle_config.enemy_critical_rate/100;
- if(cri < 1)
- cri = 1;
- }
- if(t_sc_data) {
- if (t_sc_data[SC_SLEEP].timer!=-1 ) // ‡–°’†‚̓NƒŠƒeƒBƒJƒ‹‚ª”{‚É
- cri <<=1;
- if(t_sc_data[SC_JOINTBEAT].timer != -1 &&
- t_sc_data[SC_JOINTBEAT].val2 == 6) // Always take crits with Neck broken by Joint Beat [DracoRPG]
- cri = 1000;
- }
-
- if(ac_flag) cri = 1000;
-
- if(skill_num == KN_AUTOCOUNTER) {
- if(!(battle_config.monster_auto_counter_type&1))
- cri = 1000;
- else
- cri <<= 1;
- }
-
- if(tsd && tsd->critical_def)
- cri = cri * (100 - tsd->critical_def) / 100;
-
- if((skill_num == 0 || skill_num == KN_AUTOCOUNTER) && skill_lv >= 0 && battle_config.enemy_critical && (rand() % 1000) < cri) // ”»’èiƒXƒLƒ‹‚Ìꇂ͖³Ž‹j
- // “G‚Ì”»’è
- {
- damage += atkmax;
- type = 0x0a;
- }
- else {
- int vitbonusmax;
-
- if(atkmax > atkmin)
- damage += atkmin + rand() % (atkmax-atkmin + 1);
- else
- damage += atkmin ;
- // ƒXƒLƒ‹C³‚PiUŒ‚—Í”{‰»Œnj
- // ƒI[ƒo[ƒgƒ‰ƒXƒg(+5% ` +25%),‘¼UŒ‚ŒnƒXƒLƒ‹‚Ìꇂ±‚±‚Å•â³
- // ƒoƒbƒVƒ…,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN,
- // ƒ{[ƒŠƒ“ƒOƒoƒbƒVƒ…,ƒXƒsƒAƒu[ƒƒ‰ƒ“,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA,ƒXƒsƒAƒXƒ^ƒbƒu,
- // ƒƒ}[ƒiƒCƒg,ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“
- // ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO,ƒAƒ[ƒVƒƒƒ[,ƒ`ƒƒ[ƒWƒAƒ[,
- // ƒ\ƒjƒbƒNƒuƒ[
- if(sc_data){ //ó‘ÔˆÙí’†‚̃_ƒ[ƒW’ljÁ
- if(sc_data[SC_OVERTHRUST].timer!=-1) // ƒI[ƒo[ƒgƒ‰ƒXƒg
- damage += damage*(5*sc_data[SC_OVERTHRUST].val1)/100;
- if(sc_data[SC_TRUESIGHT].timer!=-1) // ƒgƒDƒ‹[ƒTƒCƒg
- damage += damage*(2*sc_data[SC_TRUESIGHT].val1)/100;
- if(sc_data[SC_BERSERK].timer!=-1) // ƒo[ƒT[ƒN
- damage += damage*2;
- if(sc_data && sc_data[SC_AURABLADE].timer!=-1) //[DracoRPG]
- damage += sc_data[SC_AURABLADE].val1 * 20;
- }
-
- if(skill_num>0){
- int i;
- if( (i=skill_get_pl(skill_num))>0 )
- s_ele=i;
-
- flag=(flag&~BF_SKILLMASK)|BF_SKILL;
- switch( skill_num ){
- case SM_BASH: // ƒoƒbƒVƒ…
- damage = damage*(100+ 30*skill_lv)/100;
- hitrate = (hitrate*(100+5*skill_lv))/100;
- break;
- case SM_MAGNUM: // ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN
- damage = damage*(wflag > 1 ? 5*skill_lv+115 : 30*skill_lv+100)/100;
- hitrate = (hitrate*(100+10*skill_lv))/100;
- break;
- case MC_MAMMONITE: // ƒƒ}[ƒiƒCƒg
- damage = damage*(100+ 50*skill_lv)/100;
- break;
- case AC_DOUBLE: // ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO
- damage = damage*(180+ 20*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case AC_SHOWER: // ƒAƒ[ƒVƒƒƒ[
- damage = damage*(75 + 5*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case AC_CHARGEARROW: // ƒ`ƒƒ[ƒWƒAƒ[
- damage = damage*150/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case KN_PIERCE: // ƒsƒA[ƒX
- damage = damage*(100+ 10*skill_lv)/100;
- hitrate = hitrate*(100+5*skill_lv)/100;
- div_ = t_size+1;
- div_flag = 1;
- break;
- case KN_SPEARSTAB: // ƒXƒsƒAƒXƒ^ƒu
- damage = damage*(100+ 15*skill_lv)/100;
- break;
- case KN_SPEARBOOMERANG: // ƒXƒsƒAƒu[ƒƒ‰ƒ“
- damage = damage*(100+ 50*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case KN_BRANDISHSPEAR: // ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA
- damage = damage*(100+ 20*skill_lv)/100;
- if(skill_lv>3 && wflag==1) damage2+=damage/2;
- if(skill_lv>6 && wflag==1) damage2+=damage/4;
- if(skill_lv>9 && wflag==1) damage2+=damage/8;
- if(skill_lv>6 && wflag==2) damage2+=damage/2;
- if(skill_lv>9 && wflag==2) damage2+=damage/4;
- if(skill_lv>9 && wflag==3) damage2+=damage/2;
- damage +=damage2;
- break;
- case KN_BOWLINGBASH: // ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…
- damage = damage*(100+ 50*skill_lv)/100;
- blewcount=0;
- break;
- case KN_AUTOCOUNTER:
- if(battle_config.monster_auto_counter_type&1)
- hitrate += 20;
- else
- hitrate = 1000000;
- flag=(flag&~BF_SKILLMASK)|BF_NORMAL;
- break;
- case AS_GRIMTOOTH:
- damage = damage*(100+ 20*skill_lv)/100;
- break;
- case AS_POISONREACT: // celest
- s_ele = 0;
- damage = damage*(100+ 30*skill_lv)/100;
- break;
- case AS_SONICBLOW: // ƒ\ƒjƒbƒNƒuƒƒE
- damage = damage*(300+ 50*skill_lv)/100;
- break;
- case TF_SPRINKLESAND: // »‚Ü‚«
- damage = damage*125/100;
- break;
- case MC_CARTREVOLUTION: // ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“
- damage = (damage*150)/100;
- break;
- // ˆÈ‰ºMOB
- case NPC_COMBOATTACK: // ‘½’iUŒ‚
- div_flag = 1;
- break;
- case NPC_RANDOMATTACK: // ƒ‰ƒ“ƒ_ƒ€ATKUŒ‚
- damage = damage*(50+rand()%150)/100;
- break;
- // ‘®«UŒ‚i“K“–j
- case NPC_WATERATTACK:
- case NPC_GROUNDATTACK:
- case NPC_FIREATTACK:
- case NPC_WINDATTACK:
- case NPC_POISONATTACK:
- case NPC_HOLYATTACK:
- case NPC_DARKNESSATTACK:
- case NPC_UNDEADATTACK:
- case NPC_TELEKINESISATTACK:
- damage = damage*(100+25*(skill_lv-1))/100;
- break;
- case NPC_GUIDEDATTACK:
- hitrate = 1000000;
- break;
- case NPC_RANGEATTACK:
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case NPC_PIERCINGATT:
- flag=(flag&~BF_RANGEMASK)|BF_SHORT;
- break;
- case RG_BACKSTAP: // ƒoƒbƒNƒXƒ^ƒu
- damage = damage*(300+ 40*skill_lv)/100;
- hitrate = 1000000;
- break;
- case RG_RAID: // ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN
- damage = damage*(100+ 40*skill_lv)/100;
- break;
- case RG_INTIMIDATE: // ƒCƒ“ƒeƒBƒ~ƒfƒCƒg
- damage = damage*(100+ 30*skill_lv)/100;
- break;
- case CR_SHIELDCHARGE: // ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW
- damage = damage*(100+ 20*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_SHORT;
- s_ele = 0;
- break;
- case CR_SHIELDBOOMERANG: // ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“
- damage = damage*(100+ 30*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- s_ele = 0;
- break;
- case CR_HOLYCROSS: // ƒz[ƒŠ[ƒNƒƒX
- damage = damage*(100+ 35*skill_lv)/100;
- break;
- case CR_GRANDCROSS:
- hitrate= 1000000;
- break;
- case AM_DEMONSTRATION: // ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“
- hitrate = 1000000;
- damage = damage*(100+ 20*skill_lv)/100;
- damage2 = damage2*(100+ 20*skill_lv)/100;
- break;
- case AM_ACIDTERROR: // ƒAƒVƒbƒhƒeƒ‰[
- hitrate = 1000000;
- damage = damage*(100+ 40*skill_lv)/100;
- damage2 = damage2*(100+ 40*skill_lv)/100;
- break;
- case MO_FINGEROFFENSIVE: //Žw’e
- damage = damage * (125 + 25 * skill_lv) / 100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG; //orn
- break;
- case MO_INVESTIGATE: // ”­ ™¤
- if(def1 < 1000000)
- damage = damage*(100+ 75*skill_lv)/100 * (def1 + def2)/50;
- hitrate = 1000000;
- s_ele = 0;
- break;
- case MO_EXTREMITYFIST: // ˆ¢C—…”e–PŒ
- damage = damage * 8 + 250 + (skill_lv * 150);
- hitrate = 1000000;
- s_ele = 0;
- break;
- case MO_CHAINCOMBO: // ˜A‘Ŷ
- damage = damage*(150+ 50*skill_lv)/100;
- break;
- case BA_MUSICALSTRIKE: // ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN
- damage = damage*(60+ 40 * skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case DC_THROWARROW: // –‚¿
- damage = damage*(60+ 40 * skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case MO_COMBOFINISH: // –Ò—´Œ
- damage = damage*(240+ 60*skill_lv)/100;
- break;
- case CH_TIGERFIST: // •šŒÕŒ
- damage = damage*(40+ 100*skill_lv)/100;
- break;
- case CH_CHAINCRUSH: // ˜A’Œ•öŒ‚
- damage = damage*(400+ 100*skill_lv)/100;
- break;
- case CH_PALMSTRIKE: // –ÒŒÕd”hŽR
- damage = damage*(200+ 100*skill_lv)/100;
- break;
- case LK_SPIRALPIERCE: /* ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX */
- damage = damage*(100+ 50*skill_lv)/100; //‘‰Á—Ê‚ª•ª‚©‚ç‚È‚¢‚Ì‚Å“K“–‚É
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- if(tsd)
- tsd->canmove_tick = gettick() + 1000;
- else if(tmd)
- tmd->canmove_tick = gettick() + 1000;
- break;
- case LK_HEADCRUSH: /* ƒwƒbƒhƒNƒ‰ƒbƒVƒ… */
- damage = damage*(100+ 40*skill_lv)/100;
- break;
- case LK_JOINTBEAT: /* ƒWƒ‡ƒCƒ“ƒgƒr[ƒg */
- damage = damage*(50+ 10*skill_lv)/100;
- break;
- case ASC_METEORASSAULT: /* ƒƒeƒIƒAƒTƒ‹ƒg */
- damage = damage*(40+ 40*skill_lv)/100;
- break;
- case SN_SHARPSHOOTING: /* ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO */
- damage += damage*(30*skill_lv)/100;
- break;
- case CG_ARROWVULCAN: /* ƒAƒ[ƒoƒ‹ƒJƒ“ */
- damage = damage*(200+100*skill_lv)/100;
- break;
- case AS_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[ */
- damage = damage*(200+20*skill_lv)/100;
- hitrate = 1000000;
- break;
- }
- if (div_flag && div_ > 1) { // [Skotlex]
- damage *= div_;
- damage2 *= div_;
- }
- }
-
- if( skill_num!=NPC_CRITICALSLASH ){
- // ‘Î Û‚Ì–hŒä—Í‚É‚æ‚éƒ_ƒ[ƒW‚ÌŒ¸­
- // ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“i‚±‚±‚Å‚¢‚¢‚Ì‚©‚ÈHj
- if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && skill_num != AM_ACIDTERROR && def1 < 1000000) { //DEF, VIT–³Ž‹
- int t_def;
- target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penalty_count_lv);
- if(battle_config.vit_penalty_type > 0) {
- if(target_count >= battle_config.vit_penalty_count) {
- if(battle_config.vit_penalty_type == 1) {
- def1 = (def1 * (100 - (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num))/100;
- def2 = (def2 * (100 - (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num))/100;
- t_vit = (t_vit * (100 - (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num))/100;
- }
- else if(battle_config.vit_penalty_type == 2) {
- def1 -= (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num;
- def2 -= (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num;
- t_vit -= (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num;
- }
- if(def1 < 0) def1 = 0;
- if(def2 < 1) def2 = 1;
- if(t_vit < 1) t_vit = 1;
- }
- }
- t_def = def2*8/10;
- if(battle_check_undead(s_race,status_get_elem_type(src)) || s_race==6)
- if(tsd && (skill=pc_checkskill(tsd,AL_DP)) > 0 )
- t_def += skill* (int) (3 + (tsd->status.base_level+1)*0.04); // submitted by orn
- //t_def += skill*3;
-
- vitbonusmax = (t_vit/20)*(t_vit/20)-1;
- if(battle_config.monster_defense_type) {
- damage = damage - (def1 * battle_config.monster_defense_type) - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
- }
- else{
- damage = damage * (100 - def1) /100 - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
- }
- }
- }
- }
-
- // 0–¢–ž‚¾‚Á‚½ê‡1‚É•â³
- if(damage<1) damage=1;
-
- // ‰ñ”ðC³
- if( hitrate < 1000000 && t_sc_data ) { // •K’†UŒ‚
- if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
- hitrate -= 75;
- if (t_sc_data[SC_SLEEP].timer!=-1 || // ‡–°‚Í•K’†
- t_sc_data[SC_STAN].timer!=-1 || // ƒXƒ^ƒ“‚Í•K’†
- t_sc_data[SC_FREEZE].timer!=-1 ||
- (t_sc_data[SC_STONE].timer!=-1 && t_sc_data[SC_STONE].val2==0)) // “€Œ‹‚Í•K’†
- hitrate = 1000000;
- }
- if(hitrate < 1000000)
- hitrate = ( (hitrate>95)?95: ((hitrate<5)?5:hitrate) );
- if(type == 0 && rand()%100 >= hitrate) {
- damage = damage2 = 0;
- dmg_lv = ATK_FLEE;
- } else {
- dmg_lv = ATK_DEF;
- }
-
- if(tsd){
- int cardfix=100,i;
- cardfix=cardfix*(100-tsd->subele[s_ele])/100; // ‘® «‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
- cardfix=cardfix*(100-tsd->subrace[s_race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
- cardfix=cardfix*(100-tsd->subsize[s_size])/100;
- cardfix=cardfix*(100-tsd->subrace2[s_race2])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
- if(mob_db[md->class_].mode & 0x20)
- cardfix=cardfix*(100-tsd->subrace[10])/100;
- else
- cardfix=cardfix*(100-tsd->subrace[11])/100;
- for(i=0;i<tsd->add_def_class_count;i++) {
- if(tsd->add_def_classid[i] == md->class_) {
- cardfix=cardfix*(100-tsd->add_def_classrate[i])/100;
- break;
- }
- }
- for(i=0;i<tsd->add_damage_class_count2;i++) {
- if(tsd->add_damage_classid2[i] == md->class_) {
- cardfix=cardfix*(100+tsd->add_damage_classrate2[i])/100;
- break;
- }
- }
- if(flag&BF_LONG)
- cardfix=cardfix*(100-tsd->long_attack_def_rate)/100;
- if(flag&BF_SHORT)
- cardfix=cardfix*(100-tsd->near_attack_def_rate)/100;
- damage=damage*cardfix/100;
- }
- if(t_sc_data) {
- int cardfix=100;
- if(t_sc_data[SC_DEFENDER].timer != -1 && flag&BF_LONG)
- cardfix=cardfix*(100-t_sc_data[SC_DEFENDER].val2)/100;
- if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
- cardfix=cardfix*50/100;
- if(cardfix != 100)
- damage=damage*cardfix/100;
- }
- if(t_sc_data && t_sc_data[SC_ASSUMPTIO].timer != -1){ //ƒAƒVƒƒƒ“ƒvƒeƒBƒI
- if(!map[target->m].flag.pvp)
- damage=damage/3;
- else
- damage=damage/2;
- }
-
- if(damage < 0) damage = 0;
-
- // ‘® «‚Ì“K—p
- if (!((battle_config.mob_ghostring_fix == 1) &&
- (status_get_elem_type(target) == 8) &&
- (target->type==BL_PC))) // [MouseJstr]
- if(skill_num != 0 || s_ele != 0 || !battle_config.mob_attack_attr_none)
- damage=battle_attr_fix(damage, s_ele, status_get_element(target) );
-
- //if(sc_data && sc_data[SC_AURABLADE].timer!=-1) /* ƒI[ƒ‰ƒuƒŒ[ƒh •K’† */
- // damage += sc_data[SC_AURABLADE].val1 * 10;
- if(skill_num==PA_PRESSURE) /* ƒvƒŒƒbƒVƒƒ[ •K’†? */
- damage = 500+300*skill_lv;
-
- // ƒCƒ“ƒxƒiƒ€C³
- if(skill_num==TF_POISON){
- damage = battle_attr_fix(damage + 15*skill_lv, s_ele, status_get_element(target) );
- }
- if(skill_num==MC_CARTREVOLUTION){
- damage = battle_attr_fix(damage, 0, status_get_element(target) );
- }
-
- // Š®‘S‰ñ”ð‚Ì”»’è
- if(skill_num == 0 && tsd!=NULL && rand()%1000 < status_get_flee2(target) ){
- damage=0;
- type=0x0b;
- dmg_lv = ATK_LUCKY;
- }
-
- if(battle_config.enemy_perfect_flee) {
- if(skill_num == 0 && tmd!=NULL && rand()%1000 < status_get_flee2(target) ){
- damage=0;
- type=0x0b;
- dmg_lv = ATK_LUCKY;
- }
- }
-
-// if(def1 >= 1000000 && damage > 0)
- if(t_mode&0x40 && damage > 0)
- damage = 1;
-
- if( tsd && tsd->special_state.no_weapon_damage)
- damage = 0;
-
- if(skill_num != CR_GRANDCROSS)
- damage=battle_calc_damage(src,target,damage,div_,skill_num,skill_lv,flag);
-
- wd.damage=damage;
- wd.damage2=0;
- wd.type=type;
- wd.div_=div_;
- wd.amotion=status_get_amotion(src);
- if(skill_num == KN_AUTOCOUNTER)
- wd.amotion >>= 1;
- wd.dmotion=status_get_dmotion(target);
- wd.blewcount=blewcount;
- wd.flag=flag;
- wd.dmg_lv=dmg_lv;
- return wd;
-}
-/*
- * =========================================================================
- * PC‚Ì•Ší‚É‚æ‚éUŒ‚
- *-------------------------------------------------------------------------
- */
-static struct Damage battle_calc_pc_weapon_attack(
- struct block_list *src,struct block_list *target,int skill_num,int skill_lv,int wflag)
-{
- struct map_session_data *sd=(struct map_session_data *)src,*tsd=NULL;
- struct mob_data *tmd=NULL;
- int hitrate,flee,cri = 0,atkmin,atkmax;
- int dex,luk,target_count = 1;
- int no_cardfix=0;
- int def1 = status_get_def(target);
- int def2 = status_get_def2(target);
- int t_vit = status_get_vit(target);
- struct Damage wd;
- int damage,damage2,damage3=0,damage4=0,type,div_,blewcount=skill_get_blewcount(skill_num,skill_lv);
- int flag,skill,dmg_lv = 0;
- int t_mode=0,t_race=0,t_size=1,s_race=7,s_ele=0,s_size=1;
- int t_race2=0;
- struct status_change *sc_data,*t_sc_data;
- short *sc_count;
- short *option, *opt1, *opt2;
- int atkmax_=0, atkmin_=0, s_ele_; //“ñ“—¬—p
- int watk,watk_,cardfix,t_ele;
- int da=0,i,t_class,ac_flag = 0;
- int idef_flag=0,idef_flag_=0;
- int div_flag=0; // 0: total damage is to be divided by div_
- // 1: damage is distributed,and has to be multiplied by div_ [celest]
-
- //return‘O‚̈—‚ª‚ ‚é‚Ì‚Åî•ño—Í•”‚Ì‚Ý•ÏX
- if( src == NULL || target == NULL || sd == NULL ){
- nullpo_info(NLP_MARK);
- memset(&wd,0,sizeof(wd));
- return wd;
- }
-
-
- // ƒAƒ^ƒbƒJ[
- s_race=status_get_race(src); //Ží‘°
- s_ele=status_get_attack_element(src); //‘®«
- s_ele_=status_get_attack_element2(src); //¶Žè‘®«
- s_size=status_get_size(src);
- sc_data=status_get_sc_data(src); //ƒXƒe[ƒ^ƒXˆÙí
- sc_count=status_get_sc_count(src); //ƒXƒe[ƒ^ƒXˆÙí‚Ì”
- option=status_get_option(src); //‘é‚Æ‚©ƒyƒR‚Æ‚©ƒJ[ƒg‚Æ‚©
- opt1=status_get_opt1(src); //Ή»A“€Œ‹AƒXƒ^ƒ“A‡–°AˆÃˆÅ
- opt2=status_get_opt2(src); //“ÅAŽô‚¢A’¾–ÙAˆÃˆÅH
- t_race2=status_get_race2(target);
-
- if(skill_num != CR_GRANDCROSS) //ƒOƒ‰ƒ“ƒhƒNƒƒX‚Å‚È‚¢‚È‚ç
- sd->state.attack_type = BF_WEAPON; //UŒ‚ƒ^ƒCƒv‚Í•ŠíUŒ‚
-
- // ƒ^[ƒQƒbƒg
- if(target->type==BL_PC) //‘ÎÛ‚ªPC‚È‚ç
- tsd=(struct map_session_data *)target; //tsd‚É‘ã“ü(tmd‚ÍNULL)
- else if(target->type==BL_MOB) //‘ÎÛ‚ªMob‚È‚ç
- tmd=(struct mob_data *)target; //tmd‚É‘ã“ü(tsd‚ÍNULL)
- t_race=status_get_race( target ); //‘ÎÛ‚ÌŽí‘°
- t_ele=status_get_elem_type(target); //‘ÎÛ‚Ì‘®«
- t_size=status_get_size( target ); //‘Îۂ̃TƒCƒY
- t_mode=status_get_mode( target ); //‘ÎÛ‚ÌMode
- t_sc_data=status_get_sc_data( target ); //‘Îۂ̃Xƒe[ƒ^ƒXˆÙí
-
-//ƒI[ƒgƒJƒEƒ“ƒ^[ˆ—‚±‚±‚©‚ç
- if(skill_num == 0 || (target->type == BL_PC && battle_config.pc_auto_counter_type&2) ||
- (target->type == BL_MOB && battle_config.monster_auto_counter_type&2)) {
- if(skill_num != CR_GRANDCROSS && t_sc_data && t_sc_data[SC_AUTOCOUNTER].timer != -1) { //ƒOƒ‰ƒ“ƒhƒNƒƒX‚Å‚È‚­A‘ÎÛ‚ªƒI[ƒgƒJƒEƒ“ƒ^[ó‘Ô‚Ìê‡
- int dir = map_calc_dir(src,target->x,target->y),t_dir = status_get_dir(target);
- int dist = distance(src->x,src->y,target->x,target->y);
- if(dist <= 0 || map_check_dir(dir,t_dir) ) { //‘ÎÛ‚Æ‚Ì‹——£‚ª0ˆÈ‰ºA‚Ü‚½‚Í‘Îۂ̳–ÊH
- memset(&wd,0,sizeof(wd));
- t_sc_data[SC_AUTOCOUNTER].val3 = 0;
- t_sc_data[SC_AUTOCOUNTER].val4 = 1;
- if(sc_data && sc_data[SC_AUTOCOUNTER].timer == -1) { //Ž©•ª‚ªƒI[ƒgƒJƒEƒ“ƒ^[ó‘Ô
- int range = status_get_range(target);
- if((target->type == BL_PC && ((struct map_session_data *)target)->status.weapon != 11 && dist <= range+1) || //‘ÎÛ‚ªPC‚Å•Ší‚ª‹|–î‚Å‚È‚­ŽË’ö“à
- (target->type == BL_MOB && range <= 3 && dist <= range+1) ) //‚Ü‚½‚Í‘ÎÛ‚ªMob‚ÅŽË’ö‚ª3ˆÈ‰º‚ÅŽË’ö“à
- t_sc_data[SC_AUTOCOUNTER].val3 = src->id;
- }
- return wd; //ƒ_ƒ[ƒW\‘¢‘Ì‚ð•Ô‚µ‚ÄI—¹
- }
- else ac_flag = 1;
- } else if(skill_num != CR_GRANDCROSS && t_sc_data && t_sc_data[SC_POISONREACT].timer != -1) { // poison react [Celest]
- t_sc_data[SC_POISONREACT].val3 = 0;
- t_sc_data[SC_POISONREACT].val4 = 1;
- t_sc_data[SC_POISONREACT].val3 = src->id;
- }
- }
-//ƒI[ƒgƒJƒEƒ“ƒ^[ˆ—‚±‚±‚Ü‚Å
-
- flag=BF_SHORT|BF_WEAPON|BF_NORMAL; // UŒ‚‚ÌŽí—Þ‚ÌÝ’è
-
- // ‰ñ”𗦌vŽZA‰ñ”ð”»’è‚ÍŒã‚Å
- flee = status_get_flee(target);
- if(battle_config.agi_penalty_type > 0 || battle_config.vit_penalty_type > 0) //AGIAVITƒyƒiƒ‹ƒeƒBݒ肪—LŒø
- target_count += battle_counttargeted(target,src,battle_config.agi_penalty_count_lv); //‘ÎÛ‚Ì”‚ðŽZo
- if(battle_config.agi_penalty_type > 0) {
- if(target_count >= battle_config.agi_penalty_count) { //ƒyƒiƒ‹ƒeƒBÝ’è‚æ‚è‘ÎÛ‚ª‘½‚¢
- if(battle_config.agi_penalty_type == 1) //‰ñ”𗦂ªagi_penalty_num%‚¸‚ÂŒ¸­
- flee = (flee * (100 - (target_count - (battle_config.agi_penalty_count - 1))*battle_config.agi_penalty_num))/100;
- else if(battle_config.agi_penalty_type == 2) //‰ñ”𗦂ªagi_penalty_num•ªŒ¸­
- flee -= (target_count - (battle_config.agi_penalty_count - 1))*battle_config.agi_penalty_num;
- if(flee < 1) flee = 1; //‰ñ”𗦂ÍÅ’á‚Å‚à1
- }
- }
- hitrate=status_get_hit(src) - flee + 80; //–½’†—¦ŒvŽZ
-
- type=0; // normal
- if (skill_num > 0) {
- div_=skill_get_num(skill_num,skill_lv);
- if (div_ < 1) div_ = 1; //Avoid the rare case where the db says div_ is 0 and below
- } else div_ = 1; // single attack
-
- dex=status_get_dex(src); //DEX
- luk=status_get_luk(src); //LUK
- watk = status_get_atk(src); //ATK
- watk_ = status_get_atk_(src); //ATK¶Žè
-
- if(skill_num==HW_MAGICCRASHER){ /* ƒ}ƒWƒbƒNƒNƒ‰ƒbƒVƒƒ[‚ÍMATK‚ʼn£‚é */
- damage = damage2 = status_get_matk1(src); //damega,damega2‰“oêAbase_atk‚̎擾
- }else{
- damage = damage2 = status_get_baseatk(&sd->bl); //damega,damega2‰“oêAbase_atk‚̎擾
- }
- atkmin = atkmin_ = dex; //Å’áATK‚ÍDEX‚ʼnŠú‰»H
- sd->state.arrow_atk = 0; //arrow_atk‰Šú‰»
- if(sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]])
- atkmin = atkmin*(80 + sd->inventory_data[sd->equip_index[9]]->wlv*20)/100;
- if(sd->equip_index[8] >= 0 && sd->inventory_data[sd->equip_index[8]])
- atkmin_ = atkmin_*(80 + sd->inventory_data[sd->equip_index[8]]->wlv*20)/100;
- if(sd->status.weapon == 11) { //•Ší‚ª‹|–î‚Ìê‡
- atkmin = watk * ((atkmin<watk)? atkmin:watk)/100; //‹|—pÅ’áATKŒvŽZ
- flag=(flag&~BF_RANGEMASK)|BF_LONG; //‰“‹——£UŒ‚ƒtƒ‰ƒO‚ð—LŒø
- if(sd->arrow_ele > 0) //‘®«–î‚È‚ç‘®«‚ð–î‚Ì‘®«‚É•ÏX
- s_ele = sd->arrow_ele;
- sd->state.arrow_atk = 1; //arrow_atk—LŒø‰»
- }
-
- // ƒTƒCƒYC³
- // ƒyƒR‹R悵‚Ä‚¢‚ÄA‘„‚ÅUŒ‚‚µ‚½ê‡‚Í’†Œ^‚̃TƒCƒYC³‚ð100‚É‚·‚é
- // ƒEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“,ƒhƒŒƒCƒNC
- if(((sd->special_state.no_sizefix) || (pc_isriding(sd) && (sd->status.weapon==4 || sd->status.weapon==5) && t_size==1) || skill_num == MO_EXTREMITYFIST)){ //ƒyƒR‹R悵‚Ä‚¢‚ÄA‘„‚Å’†Œ^‚ðUŒ‚
- atkmax = watk;
- atkmax_ = watk_;
- } else {
- atkmax = (watk * sd->atkmods[ t_size ]) / 100;
- atkmin = (atkmin * sd->atkmods[ t_size ]) / 100;
- atkmax_ = (watk_ * sd->atkmods_[ t_size ]) / 100;
- atkmin_ = (atkmin_ * sd->atkmods[ t_size ]) / 100;
- }
- if( (sc_data != NULL && sc_data[SC_WEAPONPERFECTION].timer!=-1) || (sd->special_state.no_sizefix)) { // ƒEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“ || ƒhƒŒƒCƒNƒJ[ƒh
- atkmax = watk;
- atkmax_ = watk_;
- }
-
- if(atkmin > atkmax && !(sd->state.arrow_atk)) atkmin = atkmax; //‹|‚ÍŒႪã‰ñ‚éꇂ ‚è
- if(atkmin_ > atkmax_) atkmin_ = atkmax_;
-
- if(sc_data != NULL && sc_data[SC_MAXIMIZEPOWER].timer!=-1 ){ // ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[
- atkmin=atkmax;
- atkmin_=atkmax_;
- }
-
- //ƒ_ƒuƒ‹ƒAƒ^ƒbƒN”»’è
- if(sd->weapontype1 == 0x01) {
- if(skill_num == 0 && skill_lv >= 0 && (skill = pc_checkskill(sd,TF_DOUBLE)) > 0)
- da = (rand()%100 < (skill*5)) ? 1:0;
- }
-
- //ŽO’i¶
- //if(skill_num == 0 && skill_lv >= 0 && (skill = pc_checkskill(sd,MO_TRIPLEATTACK)) > 0 && sd->status.weapon <= 16 && !sd->state.arrow_atk) {
- if(skill_num == 0 && (skill = pc_checkskill(sd,MO_TRIPLEATTACK)) > 0 && sd->status.weapon <= 16) { // triple blow works with bows ^^ [celest]
- da = (rand()%100 < (30 - skill)) ? 2:0;
- }
-
- if(sd->double_rate > 0 && da == 0 && skill_num == 0)
- da = (rand()%100 < sd->double_rate) ? 1:0;
-
- // ‰ß踘Bƒ{[ƒiƒX
- if(sd->overrefine>0 )
- damage+=(rand()%sd->overrefine)+1;
- if(sd->overrefine_>0 )
- damage2+=(rand()%sd->overrefine_)+1;
-
- if(da == 0){ //ƒ_ƒuƒ‹ƒAƒ^ƒbƒN‚ª”­“®‚µ‚Ä‚¢‚È‚¢
- // ƒNƒŠƒeƒBƒJƒ‹ŒvŽZ
- cri = status_get_critical(src);
- cri += sd->critaddrace[t_race];
-
- if(sd->state.arrow_atk)
- cri += sd->arrow_cri;
- if(sd->status.weapon == 16)
- // ƒJƒ^[ƒ‹‚Ìê‡AƒNƒŠƒeƒBƒJƒ‹‚ð”{‚É
- cri <<=1;
- cri -= status_get_luk(target) * 3;
- if(t_sc_data) {
- if (t_sc_data[SC_SLEEP].timer!=-1 ) // ‡–°’†‚̓NƒŠƒeƒBƒJƒ‹‚ª”{‚É
- cri <<=1;
- if(t_sc_data[SC_JOINTBEAT].timer != -1 &&
- t_sc_data[SC_JOINTBEAT].val2 == 6) // Always take crits with Neck broken by Joint Beat [DracoRPG]
- cri = 1000;
- }
- if(ac_flag) cri = 1000;
-
- if(skill_num == KN_AUTOCOUNTER) {
- if(!(battle_config.pc_auto_counter_type&1))
- cri = 1000;
- else
- cri <<= 1;
- }
- if(skill_num == SN_SHARPSHOOTING)
- cri += 200;
- }
-
- if(tsd && tsd->critical_def)
- cri = cri * (100-tsd->critical_def) / 100;
-
- if(da == 0 && (skill_num==0 || skill_num == KN_AUTOCOUNTER || skill_num == SN_SHARPSHOOTING) && //ƒ_ƒuƒ‹ƒAƒ^ƒbƒN‚ª”­“®‚µ‚Ä‚¢‚È‚¢
- (rand() % 1000) < cri) // ”»’èiƒXƒLƒ‹‚Ìꇂ͖³Ž‹j
- {
- damage += atkmax;
- damage2 += atkmax_;
- if(sd->atk_rate != 100 || sd->weapon_atk_rate != 0) {
- if (sd->status.weapon < 16) {
- damage = (damage * (sd->atk_rate + sd->weapon_atk_rate[sd->status.weapon]))/100;
- damage2 = (damage2 * (sd->atk_rate + sd->weapon_atk_rate[sd->status.weapon]))/100;
- }
- }
- if(sd->state.arrow_atk)
- damage += sd->arrow_atk;
-
- damage += damage * sd->crit_atk_rate / 100;
-
- type = 0x0a;
-
-/* if(def1 < 1000000) {
- if(sd->def_ratio_atk_ele & (1<<t_ele) || sd->def_ratio_atk_race & (1<<t_race)) {
- damage = (damage * (def1 + def2))/100;
- idef_flag = 1;
- }
- if(sd->def_ratio_atk_ele_ & (1<<t_ele) || sd->def_ratio_atk_race_ & (1<<t_race)) {
- damage2 = (damage2 * (def1 + def2))/100;
- idef_flag_ = 1;
- }
- if(t_mode & 0x20) {
- if(!idef_flag && sd->def_ratio_atk_race & (1<<10)) {
- damage = (damage * (def1 + def2))/100;
- idef_flag = 1;
- }
- if(!idef_flag_ && sd->def_ratio_atk_race_ & (1<<10)) {
- damage2 = (damage2 * (def1 + def2))/100;
- idef_flag_ = 1;
- }
- }
- else {
- if(!idef_flag && sd->def_ratio_atk_race & (1<<11)) {
- damage = (damage * (def1 + def2))/100;
- idef_flag = 1;
- }
- if(!idef_flag_ && sd->def_ratio_atk_race_ & (1<<11)) {
- damage2 = (damage2 * (def1 + def2))/100;
- idef_flag_ = 1;
- }
- }
- }*/
- }
- else {
- int vitbonusmax;
-
- if(atkmax > atkmin)
- damage += atkmin + rand() % (atkmax-atkmin + 1);
- else
- damage += atkmin ;
- if(atkmax_ > atkmin_)
- damage2 += atkmin_ + rand() % (atkmax_-atkmin_ + 1);
- else
- damage2 += atkmin_ ;
- if(sd->atk_rate != 100 || sd->weapon_atk_rate != 0) {
- if (sd->status.weapon < 16) {
- damage = (damage * (sd->atk_rate + sd->weapon_atk_rate[sd->status.weapon]))/100;
- damage2 = (damage2 * (sd->atk_rate + sd->weapon_atk_rate[sd->status.weapon]))/100;
- }
- }
-
- if(sd->state.arrow_atk) {
- if(sd->arrow_atk > 0)
- damage += rand()%(sd->arrow_atk+1);
- hitrate += sd->arrow_hit;
- }
-
- if(skill_num != MO_INVESTIGATE && def1 < 1000000) {
- if(sd->def_ratio_atk_ele & (1<<t_ele) || sd->def_ratio_atk_race & (1<<t_race)) {
- damage = (damage * (def1 + def2))/100;
- idef_flag = 1;
- }
- if(sd->def_ratio_atk_ele_ & (1<<t_ele) || sd->def_ratio_atk_race_ & (1<<t_race)) {
- damage2 = (damage2 * (def1 + def2))/100;
- idef_flag_ = 1;
- }
- if(t_mode & 0x20) {
- if(!idef_flag && sd->def_ratio_atk_race & (1<<10)) {
- damage = (damage * (def1 + def2))/100;
- idef_flag = 1;
- }
- if(!idef_flag_ && sd->def_ratio_atk_race_ & (1<<10)) {
- damage2 = (damage2 * (def1 + def2))/100;
- idef_flag_ = 1;
- }
- }
- else {
- if(!idef_flag && sd->def_ratio_atk_race & (1<<11)) {
- damage = (damage * (def1 + def2))/100;
- idef_flag = 1;
- }
- if(!idef_flag_ && sd->def_ratio_atk_race_ & (1<<11)) {
- damage2 = (damage2 * (def1 + def2))/100;
- idef_flag_ = 1;
- }
- }
- }
-
- // ƒXƒLƒ‹C³‚PiUŒ‚—Í”{‰»Œnj
- // ƒI[ƒo[ƒgƒ‰ƒXƒg(+5% ` +25%),‘¼UŒ‚ŒnƒXƒLƒ‹‚Ìꇂ±‚±‚Å•â³
- // ƒoƒbƒVƒ…,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN,
- // ƒ{[ƒŠƒ“ƒOƒoƒbƒVƒ…,ƒXƒsƒAƒu[ƒƒ‰ƒ“,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA,ƒXƒsƒAƒXƒ^ƒbƒu,
- // ƒƒ}[ƒiƒCƒg,ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“
- // ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO,ƒAƒ[ƒVƒƒƒ[,ƒ`ƒƒ[ƒWƒAƒ[,
- // ƒ\ƒjƒbƒNƒuƒ[
- if(sc_data){ //ó‘ÔˆÙí’†‚̃_ƒ[ƒW’ljÁ
- if(sc_data[SC_OVERTHRUST].timer!=-1){ // ƒI[ƒo[ƒgƒ‰ƒXƒg
- damage += damage*(5*sc_data[SC_OVERTHRUST].val1)/100;
- damage2 += damage2*(5*sc_data[SC_OVERTHRUST].val1)/100;
- }
- if(sc_data[SC_TRUESIGHT].timer!=-1){ // ƒgƒDƒ‹[ƒTƒCƒg
- damage += damage*(2*sc_data[SC_TRUESIGHT].val1)/100;
- damage2 += damage2*(2*sc_data[SC_TRUESIGHT].val1)/100;
- }
- if(sc_data[SC_BERSERK].timer!=-1){ // ƒo[ƒT[ƒN
- damage += damage*2;
- damage2 += damage2*2;
- }
- if(sc_data && sc_data[SC_AURABLADE].timer!=-1) { //[DracoRPG]
- damage += sc_data[SC_AURABLADE].val1 * 20;
- damage2 += sc_data[SC_AURABLADE].val1 * 20;
- }
- }
-
- if(skill_num>0){
- int i;
- if( (i=skill_get_pl(skill_num))>0 )
- s_ele=s_ele_=i;
-
- flag=(flag&~BF_SKILLMASK)|BF_SKILL;
- switch( skill_num ){
- case SM_BASH: // ƒoƒbƒVƒ…
- damage = damage*(100+ 30*skill_lv)/100;
- damage2 = damage2*(100+ 30*skill_lv)/100;
- hitrate = (hitrate*(100+5*skill_lv))/100;
- break;
- case SM_MAGNUM: // ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN
- // 20*skill level+100? i think this will do for now [based on jRO info]
- damage = damage*(wflag > 1 ? 5*skill_lv+115 : 30*skill_lv+100)/100;
- damage2 = damage2*(wflag > 1 ? 5*skill_lv+115 : 30*skill_lv+100)/100;
- hitrate = (hitrate*(100+10*skill_lv))/100;
- break;
- case MC_MAMMONITE: // ƒƒ}[ƒiƒCƒg
- damage = damage*(100+ 50*skill_lv)/100;
- damage2 = damage2*(100+ 50*skill_lv)/100;
- break;
- case AC_DOUBLE: // ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO
- if(!sd->state.arrow_atk && sd->arrow_atk > 0) {
- int arr = rand()%(sd->arrow_atk+1);
- damage += arr;
- damage2 += arr;
- }
- damage = damage*(180+ 20*skill_lv)/100;
- damage2 = damage2*(180+ 20*skill_lv)/100;
- if(sd->arrow_ele > 0) {
- s_ele = sd->arrow_ele;
- s_ele_ = sd->arrow_ele;
- }
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- sd->state.arrow_atk = 1;
- break;
- case AC_SHOWER: // ƒAƒ[ƒVƒƒƒ[
- if(!sd->state.arrow_atk && sd->arrow_atk > 0) {
- int arr = rand()%(sd->arrow_atk+1);
- damage += arr;
- damage2 += arr;
- }
- damage = damage*(75 + 5*skill_lv)/100;
- damage2 = damage2*(75 + 5*skill_lv)/100;
- if(sd->arrow_ele > 0) {
- s_ele = sd->arrow_ele;
- s_ele_ = sd->arrow_ele;
- }
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- sd->state.arrow_atk = 1;
- break;
- case AC_CHARGEARROW: // ƒ`ƒƒ[ƒWƒAƒ[
- if(!sd->state.arrow_atk && sd->arrow_atk > 0) {
- int arr = rand()%(sd->arrow_atk+1);
- damage += arr;
- damage2 += arr;
- }
- damage = damage*150/100;
- damage2 = damage2*150/100;
- if(sd->arrow_ele > 0) {
- s_ele = sd->arrow_ele;
- s_ele_ = sd->arrow_ele;
- }
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- sd->state.arrow_atk = 1;
- break;
- case KN_PIERCE: // ƒsƒA[ƒX
- damage = damage*(100+ 10*skill_lv)/100;
- damage2 = damage2*(100+ 10*skill_lv)/100;
- hitrate=hitrate*(100+5*skill_lv)/100;
- div_=t_size+1;
- div_flag=1;
- break;
- case KN_SPEARSTAB: // ƒXƒsƒAƒXƒ^ƒu
- damage = damage*(100+ 15*skill_lv)/100;
- damage2 = damage2*(100+ 15*skill_lv)/100;
- blewcount=0;
- break;
- case KN_SPEARBOOMERANG: // ƒXƒsƒAƒu[ƒƒ‰ƒ“
- damage = damage*(100+ 50*skill_lv)/100;
- damage2 = damage2*(100+ 50*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case KN_BRANDISHSPEAR: // ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA
- damage = damage*(100+ 20*skill_lv)/100;
- damage2 = damage2*(100+ 20*skill_lv)/100;
- if(skill_lv>3 && wflag==1) damage3+=damage/2;
- if(skill_lv>6 && wflag==1) damage3+=damage/4;
- if(skill_lv>9 && wflag==1) damage3+=damage/8;
- if(skill_lv>6 && wflag==2) damage3+=damage/2;
- if(skill_lv>9 && wflag==2) damage3+=damage/4;
- if(skill_lv>9 && wflag==3) damage3+=damage/2;
- damage +=damage3;
- if(skill_lv>3 && wflag==1) damage4+=damage2/2;
- if(skill_lv>6 && wflag==1) damage4+=damage2/4;
- if(skill_lv>9 && wflag==1) damage4+=damage2/8;
- if(skill_lv>6 && wflag==2) damage4+=damage2/2;
- if(skill_lv>9 && wflag==2) damage4+=damage2/4;
- if(skill_lv>9 && wflag==3) damage4+=damage2/2;
- damage2 +=damage4;
- break;
- case KN_BOWLINGBASH: // ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…
- damage = damage*(100+ 50*skill_lv)/100;
- damage2 = damage2*(100+ 50*skill_lv)/100;
- blewcount=0;
- break;
- case KN_AUTOCOUNTER:
- if(battle_config.pc_auto_counter_type&1)
- hitrate += 20;
- else
- hitrate = 1000000;
- flag=(flag&~BF_SKILLMASK)|BF_NORMAL;
- break;
- case AS_GRIMTOOTH:
- damage = damage*(100+ 20*skill_lv)/100;
- damage2 = damage2*(100+ 20*skill_lv)/100;
- break;
- case AS_POISONREACT: // celest
- s_ele = 0;
- damage = damage*(100+ 30*skill_lv)/100;
- damage2 = damage2*(100+ 30*skill_lv)/100;
- break;
- case AS_SONICBLOW: // ƒ\ƒjƒbƒNƒuƒƒE
- hitrate+=30; // hitrate +30, thanks to midas
- damage = damage*(300+ 50*skill_lv)/100;
- damage2 = damage2*(300+ 50*skill_lv)/100;
- break;
- case TF_SPRINKLESAND: // »‚Ü‚«
- damage = damage*125/100;
- damage2 = damage2*125/100;
- break;
- case MC_CARTREVOLUTION: // ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“
- if(sd->cart_max_weight > 0 && sd->cart_weight > 0) {
- damage = ( damage*(150 + sd->cart_weight/800) )/100; //fixed CARTREV damage [Lupus] // should be 800, not 80... weight is *10 ^_- [celest]
- damage2 = ( damage2*(150 + sd->cart_weight/800) )/100;
- //damage = (damage*(150 + pc_checkskill(sd,BS_WEAPONRESEARCH) + (sd->cart_weight*100/sd->cart_max_weight) ) )/100;
- //damage2 = (damage2*(150 + pc_checkskill(sd,BS_WEAPONRESEARCH) + (sd->cart_weight*100/sd->cart_max_weight) ) )/100;
- }
- else {
- damage = (damage*150)/100;
- damage2 = (damage2*150)/100;
- }
- break;
- // ˆÈ‰ºMOB
- case NPC_COMBOATTACK: // ‘½’iUŒ‚
- div_flag=1;
- break;
- case NPC_RANDOMATTACK: // ƒ‰ƒ“ƒ_ƒ€ATKUŒ‚
- damage = damage*(50+rand()%150)/100;
- damage2 = damage2*(50+rand()%150)/100;
- break;
- // ‘®«UŒ‚i“K“–j
- case NPC_WATERATTACK:
- case NPC_GROUNDATTACK:
- case NPC_FIREATTACK:
- case NPC_WINDATTACK:
- case NPC_POISONATTACK:
- case NPC_HOLYATTACK:
- case NPC_DARKNESSATTACK:
- case NPC_UNDEADATTACK:
- case NPC_TELEKINESISATTACK:
- damage = damage*(100+25*skill_lv)/100;
- damage2 = damage2*(100+25*skill_lv)/100;
- break;
- case NPC_GUIDEDATTACK:
- hitrate = 1000000;
- break;
- case NPC_RANGEATTACK:
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case NPC_PIERCINGATT:
- flag=(flag&~BF_RANGEMASK)|BF_SHORT;
- break;
- case RG_BACKSTAP: // ƒoƒbƒNƒXƒ^ƒu
- if(battle_config.backstab_bow_penalty == 1 && sd->status.weapon == 11){
- damage = (damage*(300+ 40*skill_lv)/100)/2;
- damage2 = (damage2*(300+ 40*skill_lv)/100)/2;
- }else{
- damage = damage*(300+ 40*skill_lv)/100;
- damage2 = damage2*(300+ 40*skill_lv)/100;
- }
- hitrate = 1000000;
- break;
- case RG_RAID: // ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN
- damage = damage*(100+ 40*skill_lv)/100;
- damage2 = damage2*(100+ 40*skill_lv)/100;
- break;
- case RG_INTIMIDATE: // ƒCƒ“ƒeƒBƒ~ƒfƒCƒg
- damage = damage*(100+ 30*skill_lv)/100;
- damage2 = damage2*(100+ 30*skill_lv)/100;
- break;
- case CR_SHIELDCHARGE: // ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW
- damage = damage*(100+ 20*skill_lv)/100;
- damage2 = damage2*(100+ 20*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_SHORT;
- s_ele = 0;
- break;
- case CR_SHIELDBOOMERANG: // ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“
- damage = damage*(100+ 30*skill_lv)/100;
- damage2 = damage2*(100+ 30*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- s_ele = 0;
- break;
- case CR_HOLYCROSS: // ƒz[ƒŠ[ƒNƒƒX
- damage = damage*(100+ 35*skill_lv)/100;
- damage2 = damage2*(100+ 35*skill_lv)/100;
- break;
- case CR_GRANDCROSS:
- hitrate= 1000000;
- if(!battle_config.gx_cardfix)
-
- no_cardfix = 1;
- break;
- case AM_DEMONSTRATION: // ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“
- damage = damage*(100+ 20*skill_lv)/100;
- damage2 = damage2*(100+ 20*skill_lv)/100;
- no_cardfix = 1;
- break;
- case AM_ACIDTERROR: // ƒAƒVƒbƒhƒeƒ‰[
- hitrate = 1000000;
- damage = damage*(100+ 40*skill_lv)/100;
- damage2 = damage2*(100+ 40*skill_lv)/100;
- s_ele = 0;
- s_ele_ = 0;
- no_cardfix = 1;
- break;
- case MO_FINGEROFFENSIVE: //Žw’e
- damage = damage * (125 + 25 * skill_lv) / 100;
- damage2 = damage2 * (125 + 25 * skill_lv) / 100;
- if(battle_config.finger_offensive_type == 0) {
- div_ = sd->spiritball_old;
- div_flag = 1;
- }
- else div_ = 1;
- flag=(flag&~BF_RANGEMASK)|BF_LONG; //orn
- break;
- case MO_INVESTIGATE: // ”­ ™¤
- if(def1 < 1000000) {
- damage = damage*(100+ 75*skill_lv)/100 * (def1 + def2)/50;
- damage2 = damage2*(100+ 75*skill_lv)/100 * (def1 + def2)/50;
- }
- hitrate = 1000000;
- s_ele = 0;
- s_ele_ = 0;
- break;
- case MO_EXTREMITYFIST: // ˆ¢C—…”e–PŒ
- damage = damage * (8 + ((sd->status.sp)/10)) + 250 + (skill_lv * 150);
- damage2 = damage2 * (8 + ((sd->status.sp)/10)) + 250 + (skill_lv * 150);
- sd->status.sp = 0;
- clif_updatestatus(sd,SP_SP);
- hitrate = 1000000;
- s_ele = 0;
- s_ele_ = 0;
- break;
- case MO_CHAINCOMBO: // ˜A‘Ŷ
- damage = damage*(150+ 50*skill_lv)/100;
- damage2 = damage2*(150+ 50*skill_lv)/100;
- break;
- case MO_COMBOFINISH: // –Ò—´Œ
- damage = damage*(240+ 60*skill_lv)/100;
- damage2 = damage2*(240+ 60*skill_lv)/100;
- break;
- case BA_MUSICALSTRIKE: // ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN
- damage = damage*(60+ 40 * skill_lv)/100;
- damage2 = damage2*(60+ 40 * skill_lv)/100;
- if(sd->arrow_ele > 0) {
- s_ele = sd->arrow_ele;
- s_ele_ = sd->arrow_ele;
- }
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case DC_THROWARROW: // –‚¿
- if(!sd->state.arrow_atk && sd->arrow_atk > 0) {
- int arr = rand()%(sd->arrow_atk+1);
- damage += arr;
- damage2 += arr;
- }
- damage = damage*(100+ 50 * skill_lv)/100;
- damage2 = damage2*(100+ 50 * skill_lv)/100;
- if(sd->arrow_ele > 0) {
- s_ele = sd->arrow_ele;
- s_ele_ = sd->arrow_ele;
- }
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- sd->state.arrow_atk = 1;
- break;
- case CH_TIGERFIST: // •šŒÕŒ
- damage = damage*(40+ 100*skill_lv)/100;
- damage2 = damage*(40+ 100*skill_lv)/100;
- break;
- case CH_CHAINCRUSH: // ˜A’Œ•öŒ‚
- damage = damage*(400+ 100*skill_lv)/100;
- damage2 = damage*(400+ 100*skill_lv)/100;
- break;
- case CH_PALMSTRIKE: // –ÒŒÕd”hŽR
- damage = damage*(200+ 100*skill_lv)/100;
- damage2 = damage*(200+ 100*skill_lv)/100;
- break;
- case LK_SPIRALPIERCE: /* ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX */
- damage = damage*(100+ 50*skill_lv)/100; //‘‰Á—Ê‚ª•ª‚©‚ç‚È‚¢‚Ì‚Å“K“–‚É
- damage2 = damage2*(100+ 50*skill_lv)/100; //‘‰Á—Ê‚ª•ª‚©‚ç‚È‚¢‚Ì‚Å“K“–‚É
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- if(tsd)
- tsd->canmove_tick = gettick() + 1000;
- else if(tmd)
- tmd->canmove_tick = gettick() + 1000;
- break;
- case LK_HEADCRUSH: /* ƒwƒbƒhƒNƒ‰ƒbƒVƒ… */
- damage = damage*(100+ 40*skill_lv)/100;
- damage2 = damage2*(100+ 40*skill_lv)/100;
- break;
- case LK_JOINTBEAT: /* ƒWƒ‡ƒCƒ“ƒgƒr[ƒg */
- damage = damage*(50+ 10*skill_lv)/100;
- damage2 = damage2*(50+ 10*skill_lv)/100;
- break;
- case ASC_METEORASSAULT: /* ƒƒeƒIƒAƒTƒ‹ƒg */
- damage = damage*(40+ 40*skill_lv)/100;
- damage2 = damage2*(40+ 40*skill_lv)/100;
- no_cardfix = 1;
- break;
- case SN_SHARPSHOOTING: /* ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO */
- damage += damage*(30*skill_lv)/100;
- damage2 += damage2*(30*skill_lv)/100;
- break;
- case CG_ARROWVULCAN: /* ƒAƒ[ƒoƒ‹ƒJƒ“ */
- damage = damage*(200+100*skill_lv)/100;
- damage2 = damage2*(200+100*skill_lv)/100;
- if(sd->arrow_ele > 0) {
- s_ele = sd->arrow_ele;
- s_ele_ = sd->arrow_ele;
- }
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case AS_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[ */
- damage = damage*(200+20*skill_lv+20*pc_checkskill(sd,AS_POISONREACT))/100;
- damage2 = damage2*(200+20*skill_lv+20*pc_checkskill(sd,AS_POISONREACT))/100;
- no_cardfix = 1;
- hitrate = 1000000;
- break;
- case ASC_BREAKER: // -- moonsoul (special damage for ASC_BREAKER skill)
- if(sd){
- // calculate physical part of damage
-#ifndef TWILIGHT
- damage = damage * skill_lv;
- damage2 = damage2 * skill_lv;
-#else /* TWILIGHT */
- damage = damage * skill_lv * 0.5; //Halved by Krel
- damage2 = damage2 * skill_lv * 0.5; //Halved by Krel
- // element modifier added right after this
-
- // calculate magic part of damage
- damage3 = skill_lv * status_get_int(src) * 5 * 0.5; //Krel
- // ignores magic defense now [Celest]
- /*if(sd->ignore_mdef_ele & (1<<t_ele) || sd->ignore_mdef_race & (1<<t_race))
- imdef_flag = 1;
- if(t_mode & 0x20) {
- if(sd->ignore_mdef_race & (1<<10))
- imdef_flag = 1;
- }
- else {
- if(sd->ignore_mdef_race & (1<<11))
- imdef_flag = 1;
- }
- if(!imdef_flag){
- if(battle_config.magic_defense_type) {
- damage3 = damage3 - (mdef1 * battle_config.magic_defense_type) - mdef2;
- }
- else{
- damage3 = (damage3*(100-mdef1))/100 - mdef2;
- }
- }
-
- if(damage3<1)
- damage3=1;
-
- damage3=battle_attr_fix(damage2,s_ele_, status_get_element(target) );*/
-
-#endif /* TWILIGHT */
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- }
- break;
- }
- if (div_flag && div_ > 1) { // [Skotlex]
- damage *= div_;
- damage2 *= div_;
- }
- if (sd && skill_num > 0 && sd->skillatk[0] == skill_num)
- damage += damage*sd->skillatk[1]/100;
- }
- if(da == 2) { //ŽO’i¶‚ª”­“®‚µ‚Ä‚¢‚é‚©
- type = 0x08;
- div_ = 255; //ŽO’i¶—p‚Éc
- damage = damage * (100 + 20 * pc_checkskill(sd, MO_TRIPLEATTACK)) / 100;
- }
-
- if( skill_num!=NPC_CRITICALSLASH ){
- // ‘Î Û‚Ì–hŒä—Í‚É‚æ‚éƒ_ƒ[ƒW‚ÌŒ¸­
- // ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“i‚±‚±‚Å‚¢‚¢‚Ì‚©‚ÈHj
- if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && skill_num != AM_ACIDTERROR && def1 < 1000000) { //DEF, VIT–³Ž‹
- int t_def;
- target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penalty_count_lv);
- if(battle_config.vit_penalty_type > 0) {
- if(target_count >= battle_config.vit_penalty_count) {
- if(battle_config.vit_penalty_type == 1) {
- def1 = (def1 * (100 - (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num))/100;
- def2 = (def2 * (100 - (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num))/100;
- t_vit = (t_vit * (100 - (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num))/100;
- }
- else if(battle_config.vit_penalty_type == 2) {
- def1 -= (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num;
- def2 -= (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num;
- t_vit -= (target_count - (battle_config.vit_penalty_count - 1))*battle_config.vit_penalty_num;
- }
- if(def1 < 0) def1 = 0;
- if(def2 < 1) def2 = 1;
- if(t_vit < 1) t_vit = 1;
- }
- }
- t_def = def2*8/10;
- vitbonusmax = (t_vit/20)*(t_vit/20)-1;
- if (tmd) {
- if(t_mode & 0x20) {
- if(sd->ignore_def_mob & 2)
- idef_flag = 1;
- if(sd->ignore_def_mob_ & 2)
- idef_flag_ = 1;
- } else {
- if(sd->ignore_def_mob & 1)
- idef_flag = 1;
- if(sd->ignore_def_mob_ & 1)
- idef_flag_ = 1;
- }
- }
- if(sd->ignore_def_ele & (1<<t_ele) || sd->ignore_def_race & (1<<t_race))
- idef_flag = 1;
- if(sd->ignore_def_ele_ & (1<<t_ele) || sd->ignore_def_race_ & (1<<t_race))
- idef_flag_ = 1;
- if(t_mode & 0x20) {
- if(sd->ignore_def_race & (1<<10))
- idef_flag = 1;
- if(sd->ignore_def_race_ & (1<<10))
- idef_flag_ = 1;
- }
- else {
- if(sd->ignore_def_race & (1<<11))
- idef_flag = 1;
- if(sd->ignore_def_race_ & (1<<11))
- idef_flag_ = 1;
- }
-
- if(!idef_flag){
- if(battle_config.player_defense_type) {
- damage = damage - (def1 * battle_config.player_defense_type) - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
- }
- else{
- damage = damage * (100 - def1) /100 - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
- }
- }
- if(!idef_flag_){
- if(battle_config.player_defense_type) {
- damage2 = damage2 - (def1 * battle_config.player_defense_type) - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
- }
- else{
- damage2 = damage2 * (100 - def1) /100 - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
- }
- }
- }
- }
- }
-
- // ó‘ÔˆÙí’†‚̃_ƒ[ƒW’ljÁ‚ŃNƒŠƒeƒBƒJƒ‹‚É‚à—LŒø‚ȃXƒLƒ‹
- if (sc_data) {
- // ƒGƒ“ƒ`ƒƒƒ“ƒgƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“
- if(!no_cardfix && sc_data[SC_EDP].timer != -1 && skill_num != ASC_BREAKER && skill_num != ASC_METEORASSAULT) {
- damage += damage * (150 + sc_data[SC_EDP].val1 * 50) / 100;
- no_cardfix = 1;
- }
- // sacrifice works on boss monsters, and does 9% damage to self [Celest]
- if (!skill_num && /*!(t_mode&0x20) &&*/ sc_data[SC_SACRIFICE].timer != -1) {
- int mhp = status_get_max_hp(src);
- int dmg = mhp * 9/100;
- pc_heal(sd, -dmg, 0);
- damage = dmg * (90 + sc_data[SC_SACRIFICE].val1 * 10) / 100;
- damage2 = 0;
- hitrate = 1000000;
- s_ele = 0;
- s_ele_ = 0;
- skill_num = PA_SACRIFICE;
- //clif_skill_nodamage(src,target,skill_num,skill_lv,1); // this doesn't show effect either.. hmm =/
- sc_data[SC_SACRIFICE].val2 --;
- if (sc_data[SC_SACRIFICE].val2 == 0)
- status_change_end(src, SC_SACRIFICE,-1);
- }
- }
-
- // ¸˜Bƒ_ƒ[ƒW‚̒ljÁ
- if( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST) { //DEF, VIT–³Ž‹
- damage += status_get_atk2(src);
- damage2 += status_get_atk_2(src);
- }
- if(skill_num == CR_SHIELDBOOMERANG) {
- if(sd->equip_index[8] >= 0) {
- int index = sd->equip_index[8];
- if(sd->inventory_data[index] && sd->inventory_data[index]->type == 5) {
- damage += sd->inventory_data[index]->weight/10;
- damage += sd->status.inventory[index].refine * status_getrefinebonus(0,1);
- }
- }
- }
- if(skill_num == LK_SPIRALPIERCE) { /* ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX */
- if(sd->equip_index[9] >= 0) { //d—ʂŒljÁƒ_ƒ[ƒW‚炵‚¢‚̂ŃV[ƒ‹ƒhƒu[ƒƒ‰ƒ“‚ðŽQl‚ɒljÁ
- int index = sd->equip_index[9];
- if(sd->inventory_data[index] && sd->inventory_data[index]->type == 4) {
- damage += (int)(double)(sd->inventory_data[index]->weight*(0.8*skill_lv*4/10));
- damage += sd->status.inventory[index].refine * status_getrefinebonus(0,1);
- }
- }
- }
-
- // 0–¢–ž‚¾‚Á‚½ê‡1‚É•â³
- if(damage<1) damage=1;
- if(damage2<1) damage2=1;
-
- // ƒXƒLƒ‹C³‚QiC—ûŒnj
- // C—ûƒ_ƒ[ƒW(‰EŽè‚Ì‚Ý) ƒ\ƒjƒbƒNƒuƒ[Žž‚͕ʈ—i1Œ‚‚É•t‚«1/8“K‰ž)
- if( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != CR_GRANDCROSS) { //C—ûƒ_ƒ[ƒW–³Ž‹
- damage = battle_addmastery(sd,target,damage,0);
- damage2 = battle_addmastery(sd,target,damage2,1);
- }
-
- if(sd->perfect_hit > 0) {
- if(rand()%100 < sd->perfect_hit)
- hitrate = 1000000;
- }
-
- // ‰ñ”ðC³
- if( hitrate < 1000000 && t_sc_data ) { // •K’†UŒ‚
- if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
- hitrate -= 75;
- if (t_sc_data[SC_SLEEP].timer!=-1 || // ‡–°‚Í•K’†
- t_sc_data[SC_STAN].timer!=-1 || // ƒXƒ^ƒ“‚Í•K’†
- t_sc_data[SC_FREEZE].timer!=-1 ||
- (t_sc_data[SC_STONE].timer!=-1 && t_sc_data[SC_STONE].val2==0)) // “€Œ‹‚Í•K’†
- hitrate = 1000000;
- }
- hitrate = (hitrate<5)?5:hitrate;
- if(type == 0 && rand()%100 >= hitrate) {
- damage = damage2 = 0;
- dmg_lv = ATK_FLEE;
- } else {
- dmg_lv = ATK_DEF;
- }
-
- // ƒXƒLƒ‹C³‚Ri•ŠíŒ¤‹†j
- if( (skill=pc_checkskill(sd,BS_WEAPONRESEARCH)) > 0) {
- damage+= skill*2;
- damage2+= skill*2;
- }
- //Advanced Katar Research by zanetheinsane
- if(sd->weapontype1 == 0x10 || sd->weapontype2 == 0x10){
- if((skill = pc_checkskill(sd,ASC_KATAR)) > 0) {
- damage += damage*(10+(skill * 2))/100;
- }
- }
-
-//ƒXƒLƒ‹‚É‚æ‚éƒ_ƒ[ƒW•â³‚±‚±‚Ü‚Å
-
-//ƒJ[ƒh‚É‚æ‚éƒ_ƒ[ƒW’ljÁˆ—‚±‚±‚©‚ç
- cardfix=100;
- if(!sd->state.arrow_atk) { //‹|–îˆÈŠO
- if(!battle_config.left_cardfix_to_right) { //¶ŽèƒJ[ƒh•â³Ý’è–³‚µ
- cardfix=cardfix*(100+sd->addrace[t_race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒWC³
- cardfix=cardfix*(100+sd->addele[t_ele])/100; // ‘®«‚É‚æ‚éƒ_ƒ[ƒWC³
- cardfix=cardfix*(100+sd->addsize[t_size])/100; // ƒTƒCƒY‚É‚æ‚éƒ_ƒ[ƒWC³
- cardfix=cardfix*(100+sd->addrace2[t_race2])/100;
- }
- else {
- cardfix=cardfix*(100+sd->addrace[t_race]+sd->addrace_[t_race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒWC³(¶Žè‚É‚æ‚é’ljÁ‚ ‚è)
- cardfix=cardfix*(100+sd->addele[t_ele]+sd->addele_[t_ele])/100; // ‘®«‚É‚æ‚éƒ_ƒ[ƒWC³(¶Žè‚É‚æ‚é’ljÁ‚ ‚è)
- cardfix=cardfix*(100+sd->addsize[t_size]+sd->addsize_[t_size])/100; // ƒTƒCƒY‚É‚æ‚éƒ_ƒ[ƒWC³(¶Žè‚É‚æ‚é’ljÁ‚ ‚è)
- cardfix=cardfix*(100+sd->addrace2[t_race2]+sd->addrace2_[t_race2])/100;
- }
- }
- else { //‹|–î
- cardfix=cardfix*(100+sd->addrace[t_race]+sd->arrow_addrace[t_race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒWC³(‹|–î‚É‚æ‚é’ljÁ‚ ‚è)
- cardfix=cardfix*(100+sd->addele[t_ele]+sd->arrow_addele[t_ele])/100; // ‘®«‚É‚æ‚éƒ_ƒ[ƒWC³(‹|–î‚É‚æ‚é’ljÁ‚ ‚è)
- cardfix=cardfix*(100+sd->addsize[t_size]+sd->arrow_addsize[t_size])/100; // ƒTƒCƒY‚É‚æ‚éƒ_ƒ[ƒWC³(‹|–î‚É‚æ‚é’ljÁ‚ ‚è)
- cardfix=cardfix*(100+sd->addrace2[t_race2])/100;
- }
- if(t_mode & 0x20) { //ƒ{ƒX
- if(!sd->state.arrow_atk) { //‹|–îUŒ‚ˆÈŠO‚È‚ç
- if(!battle_config.left_cardfix_to_right) //¶ŽèƒJ[ƒh•â³Ý’è–³‚µ
- cardfix=cardfix*(100+sd->addrace[10])/100; //ƒ{ƒXƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW
- else //¶ŽèƒJ[ƒh•â³Ý’è‚ ‚è
- cardfix=cardfix*(100+sd->addrace[10]+sd->addrace_[10])/100; //ƒ{ƒXƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW(¶Žè‚É‚æ‚é’ljÁ‚ ‚è)
- }
- else //‹|–îUŒ‚
- cardfix=cardfix*(100+sd->addrace[10]+sd->arrow_addrace[10])/100; //ƒ{ƒXƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW(‹|–î‚É‚æ‚é’ljÁ‚ ‚è)
- }
- else { //ƒ{ƒX‚¶‚á‚È‚¢
- if(!sd->state.arrow_atk) { //‹|–îUŒ‚ˆÈŠO
- if(!battle_config.left_cardfix_to_right) //¶ŽèƒJ[ƒh•â³Ý’è–³‚µ
- cardfix=cardfix*(100+sd->addrace[11])/100; //ƒ{ƒXˆÈŠOƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW
- else //¶ŽèƒJ[ƒh•â³Ý’è‚ ‚è
- cardfix=cardfix*(100+sd->addrace[11]+sd->addrace_[11])/100; //ƒ{ƒXˆÈŠOƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW(¶Žè‚É‚æ‚é’ljÁ‚ ‚è)
- }
- else
- cardfix=cardfix*(100+sd->addrace[11]+sd->arrow_addrace[11])/100; //ƒ{ƒXˆÈŠOƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW(‹|–î‚É‚æ‚é’ljÁ‚ ‚è)
- }
- //“Á’èClass—p•â³ˆ—(­—‚Ì“ú‹L¨ƒ{ƒ“ƒSƒ“—pH)
- t_class = status_get_class(target);
- for(i=0;i<sd->add_damage_class_count;i++) {
- if(sd->add_damage_classid[i] == t_class) {
- cardfix=cardfix*(100+sd->add_damage_classrate[i])/100;
- break;
- }
- }
- if(!no_cardfix)
- damage=damage*cardfix/100; //ƒJ[ƒh•â³‚É‚æ‚éƒ_ƒ[ƒW‘‰Á
-//ƒJ[ƒh‚É‚æ‚éƒ_ƒ[ƒW‘‰Áˆ—‚±‚±‚Ü‚Å
-
-//ƒJ[ƒh‚É‚æ‚éƒ_ƒ[ƒW’ljÁˆ—(¶Žè)‚±‚±‚©‚ç
- cardfix=100;
- if(!battle_config.left_cardfix_to_right) { //¶ŽèƒJ[ƒh•â³Ý’è–³‚µ
- cardfix=cardfix*(100+sd->addrace_[t_race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒWC³¶Žè
- cardfix=cardfix*(100+sd->addele_[t_ele])/100; // ‘® «‚É‚æ‚éƒ_ƒ[ƒWC³¶Žè
- cardfix=cardfix*(100+sd->addsize_[t_size])/100; // ƒTƒCƒY‚É‚æ‚éƒ_ƒ[ƒWC³¶Žè
- cardfix=cardfix*(100+sd->addrace2_[t_race2])/100;
- if(t_mode & 0x20) //ƒ{ƒX
- cardfix=cardfix*(100+sd->addrace_[10])/100; //ƒ{ƒXƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW¶Žè
- else
- cardfix=cardfix*(100+sd->addrace_[11])/100; //ƒ{ƒXˆÈŠOƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW¶Žè
- }
- //“Á’èClass—p•â³ˆ—¶Žè(­—‚Ì“ú‹L¨ƒ{ƒ“ƒSƒ“—pH)
- for(i=0;i<sd->add_damage_class_count_;i++) {
- if(sd->add_damage_classid_[i] == t_class) {
- cardfix=cardfix*(100+sd->add_damage_classrate_[i])/100;
- break;
- }
- }
- if(!no_cardfix)
- damage2=damage2*cardfix/100;
-
-//ƒJ[ƒh•â³‚É‚æ‚鶎èƒ_ƒ[ƒW‘‰Á
-//ƒJ[ƒh‚É‚æ‚éƒ_ƒ[ƒW‘‰Áˆ—(¶Žè)‚±‚±‚Ü‚Å
-
-//ƒJ[ƒh‚É‚æ‚éƒ_ƒ[ƒWŒ¸Šˆ—‚±‚±‚©‚ç
- if(tsd){ //‘ÎÛ‚ªPC‚Ìê‡
- cardfix=100;
- cardfix=cardfix*(100-tsd->subrace[s_race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
- cardfix=cardfix*(100-tsd->subele[s_ele])/100; // ‘®«‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
- cardfix=cardfix*(100-tsd->subsize[s_size])/100;
- if(status_get_mode(src) & 0x20)
- cardfix=cardfix*(100-tsd->subrace[10])/100; //ƒ{ƒX‚©‚ç‚ÌUŒ‚‚̓_ƒ[ƒWŒ¸­
- else
- cardfix=cardfix*(100-tsd->subrace[11])/100; //ƒ{ƒXˆÈŠO‚©‚ç‚ÌUŒ‚‚̓_ƒ[ƒWŒ¸­
- //“Á’èClass—p•â³ˆ—¶Žè(­—‚Ì“ú‹L¨ƒ{ƒ“ƒSƒ“—pH)
- for(i=0;i<tsd->add_def_class_count;i++) {
- if(tsd->add_def_classid[i] == sd->status.class_) {
- cardfix=cardfix*(100-tsd->add_def_classrate[i])/100;
- break;
- }
- }
- if(flag&BF_LONG)
- cardfix=cardfix*(100-tsd->long_attack_def_rate)/100; //‰“‹——£UŒ‚‚̓_ƒ[ƒWŒ¸­(ƒzƒ‹ƒ“C‚Æ‚©)
- if(flag&BF_SHORT)
- cardfix=cardfix*(100-tsd->near_attack_def_rate)/100; //‹ß‹——£UŒ‚‚̓_ƒ[ƒWŒ¸­(ŠY“––³‚µH)
- damage=damage*cardfix/100; //ƒJ[ƒh•â³‚É‚æ‚éƒ_ƒ[ƒWŒ¸­
- damage2=damage2*cardfix/100; //ƒJ[ƒh•â³‚É‚æ‚鶎èƒ_ƒ[ƒWŒ¸­
- }
-//ƒJ[ƒh‚É‚æ‚éƒ_ƒ[ƒWŒ¸Šˆ—‚±‚±‚Ü‚Å
-
-//‘ÎۂɃXƒe[ƒ^ƒXˆÙ킪‚ ‚éꇂ̃_ƒ[ƒWŒ¸ŽZˆ—‚±‚±‚©‚ç
- if(t_sc_data) {
- cardfix=100;
- if(t_sc_data[SC_DEFENDER].timer != -1 && flag&BF_LONG) //ƒfƒBƒtƒFƒ“ƒ_[ó‘Ԃʼn“‹——£UŒ‚
- cardfix=cardfix*(100-t_sc_data[SC_DEFENDER].val2)/100; //ƒfƒBƒtƒFƒ“ƒ_[‚É‚æ‚錸Š
- if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
- cardfix=cardfix*50/100;
- if(cardfix != 100) {
- damage=damage*cardfix/100; //ƒfƒBƒtƒFƒ“ƒ_[•â³‚É‚æ‚éƒ_ƒ[ƒWŒ¸­
- damage2=damage2*cardfix/100; //ƒfƒBƒtƒFƒ“ƒ_[•â³‚É‚æ‚鶎èƒ_ƒ[ƒWŒ¸­
- }
- if(t_sc_data[SC_ASSUMPTIO].timer != -1){ //ƒAƒXƒ€ƒvƒeƒBƒI
- if(!map[target->m].flag.pvp){
- damage=damage/3;
- damage2=damage2/3;
- }else{
- damage=damage/2;
- damage2=damage2/2;
- }
- }
- }
-//‘ÎۂɃXƒe[ƒ^ƒXˆÙ킪‚ ‚éꇂ̃_ƒ[ƒWŒ¸ŽZˆ—‚±‚±‚Ü‚Å
-
- if(damage < 0) damage = 0;
- if(damage2 < 0) damage2 = 0;
-
- // ‘® «‚Ì“K—p
- damage=battle_attr_fix(damage,s_ele, status_get_element(target) );
- damage2=battle_attr_fix(damage2,s_ele_, status_get_element(target) );
-
- // ¯‚Ì‚©‚¯‚çA‹C‹…‚Ì“K—p
- damage += sd->star;
- damage2 += sd->star_;
- damage += sd->spiritball*3;
- damage2 += sd->spiritball*3;
-
- //if(sc_data && sc_data[SC_AURABLADE].timer!=-1){ /* ƒI[ƒ‰ƒuƒŒ[ƒh •K’† */
- // damage += sc_data[SC_AURABLADE].val1 * 10;
- // damage2 += sc_data[SC_AURABLADE].val1 * 10;
- //}
- if(skill_num==PA_PRESSURE){ /* ƒvƒŒƒbƒVƒƒ[ •K’†? */
- damage = 500+300*skill_lv;
- damage2 = 500+300*skill_lv;
- }
-
- // >“ñ“—¬‚̶‰Eƒ_ƒ[ƒWŒvŽZ’N‚©‚â‚Á‚Ä‚­‚ê‚¥‚¥‚¥‚¥‚¦‚¦‚¦I
- // >map_session_data ‚ɶŽèƒ_ƒ[ƒW(atk,atk2)’ljÁ‚µ‚Ä
- // >status_calc_pc()‚Å‚â‚é‚ׂ«‚©‚ÈH
- // map_session_data ‚ɶŽè•Ší(atk,atk2,ele,star,atkmods)’ljÁ‚µ‚Ä
- // status_calc_pc()‚Ńf[ƒ^‚ð“ü—Í‚µ‚Ä‚¢‚Ü‚·
-
- //¶Žè‚Ì‚Ý•Ší‘•”õ
- if(sd->weapontype1 == 0 && sd->weapontype2 > 0) {
- damage = damage2;
- damage2 = 0;
- }
-
- // ‰EŽèA¶ŽèC—û‚Ì“K—p
- if(sd->status.weapon > 16) {// “ñ“—¬‚©?
- int dmg = damage, dmg2 = damage2;
- // ‰EŽèC—û(60% ` 100%) ‰EŽè‘S”Ê
- skill = pc_checkskill(sd,AS_RIGHT);
- damage = damage * (50 + (skill * 10))/100;
- if(dmg > 0 && damage < 1) damage = 1;
- // ¶ŽèC—û(40% ` 80%) ¶Žè‘S”Ê
- skill = pc_checkskill(sd,AS_LEFT);
- damage2 = damage2 * (30 + (skill * 10))/100;
- if(dmg2 > 0 && damage2 < 1) damage2 = 1;
- }
- else //“ñ“—¬‚Å‚È‚¯‚ê‚ζŽèƒ_ƒ[ƒW‚Í0
- damage2 = 0;
-
- // ‰EŽè,’ZŒ•‚Ì‚Ý
- if(da == 1) { //ƒ_ƒuƒ‹ƒAƒ^ƒbƒN‚ª”­“®‚µ‚Ä‚¢‚é‚©
- div_ = 2;
- damage += damage;
- type = 0x08;
- }
-
- if(sd->status.weapon == 16) {
- // ƒJƒ^[ƒ‹’ÇŒ‚ƒ_ƒ[ƒW
- skill = pc_checkskill(sd,TF_DOUBLE);
- damage2 = damage * (1 + (skill * 2))/100;
- if(damage > 0 && damage2 < 1) damage2 = 1;
- }
-
- // ƒCƒ“ƒxƒiƒ€C³
- if(skill_num==TF_POISON){
- damage = battle_attr_fix(damage + 15*skill_lv, s_ele, status_get_element(target) );
- }
- if(skill_num==MC_CARTREVOLUTION){
- damage = battle_attr_fix(damage, 0, status_get_element(target) );
- }
-
- // Š®‘S‰ñ”ð‚Ì”»’è
- if(skill_num == 0 && tsd!=NULL && div_ < 255 && rand()%1000 < status_get_flee2(target) ){
- damage=damage2=0;
- type=0x0b;
- dmg_lv = ATK_LUCKY;
- }
-
- // ‘ÎÛ‚ªŠ®‘S‰ñ”ð‚ð‚·‚éݒ肪ON‚È‚ç
- if(battle_config.enemy_perfect_flee) {
- if(skill_num == 0 && tmd!=NULL && div_ < 255 && rand()%1000 < status_get_flee2(target) ) {
- damage=damage2=0;
- type=0x0b;
- dmg_lv = ATK_LUCKY;
- }
- }
-
- //Mob‚ÌMode‚ÉŠæ‹­ƒtƒ‰ƒO‚ª—§‚Á‚Ä‚¢‚é‚Æ‚«‚̈—
- if(t_mode&0x40){
- if(damage > 0)
- damage = 1;
- if(damage2 > 0)
- damage2 = 1;
- }
-
- //bNoWeaponDamage(Ý’èƒAƒCƒeƒ€–³‚µH)‚ŃOƒ‰ƒ“ƒhƒNƒƒX‚¶‚á‚È‚¢ê‡‚̓_ƒ[ƒW‚ª0
- if( tsd && tsd->special_state.no_weapon_damage && skill_num != CR_GRANDCROSS)
- damage = damage2 = 0;
-
- if(skill_num != CR_GRANDCROSS && (damage > 0 || damage2 > 0) ) {
- if(damage2<1) // ƒ_ƒ[ƒWÅIC³
- damage=battle_calc_damage(src,target,damage,div_,skill_num,skill_lv,flag);
- else if(damage<1) // ‰EŽè‚ªƒ~ƒXH
- damage2=battle_calc_damage(src,target,damage2,div_,skill_num,skill_lv,flag);
- else { // —¼ Žè/ƒJƒ^[ƒ‹‚Ìꇂ͂¿‚å‚Á‚ÆŒvŽZ‚â‚₱‚µ‚¢
- int d1=damage+damage2,d2=damage2;
- damage=battle_calc_damage(src,target,damage+damage2,div_,skill_num,skill_lv,flag);
- damage2=(d2*100/d1)*damage/100;
- if(damage > 1 && damage2 < 1) damage2=1;
- damage-=damage2;
- }
- }
-
- /* For executioner card [Valaris] */
- if(src->type == BL_PC && sd->random_attack_increase_add > 0 && sd->random_attack_increase_per > 0 && skill_num == 0 ){
- if(rand()%100 < sd->random_attack_increase_per){
- if(damage >0) damage*=sd->random_attack_increase_add/100;
- if(damage2 >0) damage2*=sd->random_attack_increase_add/100;
- }
- }
- /* End addition */
-
- // for azoth weapon [Valaris]
- if(src->type == BL_PC && target->type == BL_MOB && sd->classchange) {
- if(rand()%10000 < sd->classchange) {
- int changeclass[]={
- 1001,1002,1004,1005,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1018,1019,1020,
- 1021,1023,1024,1025,1026,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1040,1041,
- 1042,1044,1045,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1060,1061,
- 1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1076,1077,1078,1079,1080,1081,1083,
- 1084,1085,1094,1095,1097,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,
- 1111,1113,1114,1116,1117,1118,1119,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,
- 1131,1132,1133,1134,1135,1138,1139,1140,1141,1142,1143,1144,1145,1146,1148,1149,1151,
- 1152,1153,1154,1155,1156,1158,1160,1161,1163,1164,1165,1166,1167,1169,1170,1174,1175,
- 1176,1177,1178,1179,1180,1182,1183,1184,1185,1188,1189,1191,1192,1193,1194,1195,1196,
- 1197,1199,1200,1201,1202,1204,1205,1206,1207,1208,1209,1211,1212,1213,1214,1215,1216,
- 1219,1242,1243,1245,1246,1247,1248,1249,1250,1253,1254,1255,1256,1257,1258,1260,1261,
- 1263,1264,1265,1266,1267,1269,1270,1271,1273,1274,1275,1276,1277,1278,1280,1281,1282,
- 1291,1292,1293,1294,1295,1297,1298,1300,1301,1302,1304,1305,1306,1308,1309,1310,1311,
- 1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1364,1365,1366,1367,1368,1369,
- 1370,1371,1372,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,
- 1390,1391,1392,1400,1401,1402,1403,1404,1405,1406,1408,1409,1410,1412,1413,1415,1416,
- 1417,1493,1494,1495,1497,1498,1499,1500,1502,1503,1504,1505,1506,1507,1508,1509,1510,
- 1511,1512,1513,1514,1515,1516,1517,1519,1520,1582,1584,1585,1586,1587 };
- mob_class_change(((struct mob_data *)target),changeclass);
- }
- }
-
- wd.damage=damage;
- wd.damage2=damage2;
- wd.type=type;
- wd.div_=div_;
- wd.amotion=status_get_amotion(src);
- if(skill_num == KN_AUTOCOUNTER)
- wd.amotion >>= 1;
- wd.dmotion=status_get_dmotion(target);
- wd.blewcount=blewcount;
- wd.flag=flag;
- wd.dmg_lv=dmg_lv;
-
- return wd;
-}
-
-/*==========================================
- * •Šíƒ_ƒ[ƒWŒvŽZ
- *------------------------------------------
- */
-struct Damage battle_calc_weapon_attack(
- struct block_list *src,struct block_list *target,int skill_num,int skill_lv,int wflag)
-{
- struct Damage wd;
-
- //return‘O‚̈—‚ª‚ ‚é‚Ì‚Åî•ño—Í•”‚Ì‚Ý•ÏX
- if (src == NULL || target == NULL) {
- nullpo_info(NLP_MARK);
- memset(&wd,0,sizeof(wd));
- return wd;
- }
-
- if(target->type == BL_PET)
- memset(&wd,0,sizeof(wd));
-
- else if(src->type == BL_PC)
- wd = battle_calc_pc_weapon_attack(src,target,skill_num,skill_lv,wflag);
- else if(src->type == BL_MOB)
- wd = battle_calc_mob_weapon_attack(src,target,skill_num,skill_lv,wflag);
- else if(src->type == BL_PET)
- wd = battle_calc_pet_weapon_attack(src,target,skill_num,skill_lv,wflag);
- else
- memset(&wd,0,sizeof(wd));
-
- if(battle_config.equipment_breaking && src->type==BL_PC && (wd.damage > 0 || wd.damage2 > 0)) {
- struct map_session_data *sd = (struct map_session_data *)src;
- // weapon = 0, armor = 1
- int breakrate = 1; //0.01% default self weapon breaking chance [DracoRPG]
- int breakrate_[2] = {0,0}; //enemy breaking chance [celest]
- int breaktime = 5000;
-
- breakrate_[0] += sd->break_weapon_rate;
- breakrate_[1] += sd->break_armor_rate;
-
- if (sd->sc_count) {
- if (sd->sc_data[SC_MELTDOWN].timer!=-1) {
- breakrate_[0] += 100*sd->sc_data[SC_MELTDOWN].val1;
- breakrate_[1] = 70*sd->sc_data[SC_MELTDOWN].val1;
- breaktime = skill_get_time2(WS_MELTDOWN,1);
- }
- if(sd->sc_data[SC_OVERTHRUST].timer!=-1)
- breakrate += 10;
- }
-
- if(sd->status.weapon && sd->status.weapon != 11) {
- if(rand() % 10000 < breakrate * battle_config.equipment_break_rate / 100 || breakrate >= 10000)
- if (pc_breakweapon(sd) == 1)
- wd = battle_calc_pc_weapon_attack(src,target,skill_num,skill_lv,wflag);
- }
- if(rand() % 10000 < breakrate_[0] * battle_config.equipment_break_rate / 100 || breakrate_[0] >= 10000) {
- if (target->type == BL_PC) {
- struct map_session_data *tsd = (struct map_session_data *)target;
- if(tsd->status.weapon != 11)
- pc_breakweapon(tsd);
- } else
- status_change_start(target,SC_STRIPWEAPON,1,75,0,0,breaktime,0);
- }
- if(rand() % 10000 < breakrate_[1] * battle_config.equipment_break_rate/100 || breakrate_[1] >= 10000) {
- if (target->type == BL_PC) {
- struct map_session_data *tsd = (struct map_session_data *)target;
- if(tsd->status.weapon != 11)
- pc_breakarmor(tsd);
- } else
- status_change_start(target,SC_STRIPSHIELD,1,75,0,0,breaktime,0);
- }
- }
-
- return wd;
-}
-
-/*==========================================
- * –‚–@ƒ_ƒ[ƒWŒvŽZ
- *------------------------------------------
- */
-struct Damage battle_calc_magic_attack(
- struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag)
- {
- int mdef1=status_get_mdef(target);
- int mdef2=status_get_mdef2(target);
- int matk1,matk2,damage=0,div_=1,blewcount=skill_get_blewcount(skill_num,skill_lv),rdamage = 0;
- struct Damage md;
- int aflag;
- int normalmagic_flag=1;
- int matk_flag = 1;
- int ele=0,race=7,size=1,race2=7,t_ele=0,t_race=7,t_mode = 0,cardfix,t_class,i;
- struct map_session_data *sd=NULL,*tsd=NULL;
- struct mob_data *tmd = NULL;
-
-
- //return‘O‚̈—‚ª‚ ‚é‚Ì‚Åî•ño—Í•”‚Ì‚Ý•ÏX
- if( bl == NULL || target == NULL ){
- nullpo_info(NLP_MARK);
- memset(&md,0,sizeof(md));
- return md;
- }
-
- if(target->type == BL_PET) {
- memset(&md,0,sizeof(md));
- return md;
- }
-
- matk1=status_get_matk1(bl);
- matk2=status_get_matk2(bl);
- ele = skill_get_pl(skill_num);
- race = status_get_race(bl);
- size = status_get_size(bl);
- race2 = status_get_race2(bl);
- t_ele = status_get_elem_type(target);
- t_race = status_get_race(target);
- t_mode = status_get_mode(target);
-
-#define MATK_FIX( a,b ) { matk1=matk1*(a)/(b); matk2=matk2*(a)/(b); }
-
- if( bl->type==BL_PC && (sd=(struct map_session_data *)bl) ){
- sd->state.attack_type = BF_MAGIC;
- if(sd->matk_rate != 100)
- MATK_FIX(sd->matk_rate,100);
- sd->state.arrow_atk = 0;
- }
- if( target->type==BL_PC )
- tsd=(struct map_session_data *)target;
- else if( target->type==BL_MOB )
- tmd=(struct mob_data *)target;
-
- aflag=BF_MAGIC|BF_LONG|BF_SKILL;
-
- if(skill_num > 0){
- switch(skill_num){ // Šî–{ƒ_ƒ[ƒWŒvŽZ(ƒXƒLƒ‹‚²‚ƂɈ—)
- // ƒq[ƒ‹or¹‘Ì
- case AL_HEAL:
- case PR_BENEDICTIO:
- damage = skill_calc_heal(bl,skill_lv)/2;
- normalmagic_flag=0;
- break;
- case PR_ASPERSIO: /* ƒAƒXƒyƒ‹ƒVƒI */
- damage = 40; //ŒÅ’èƒ_ƒ[ƒW
- normalmagic_flag=0;
- break;
- case PR_SANCTUARY: // ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ
- damage = (skill_lv>6)?388:skill_lv*50;
- normalmagic_flag=0;
- blewcount|=0x10000;
- break;
- case ALL_RESURRECTION:
- case PR_TURNUNDEAD: // UŒ‚ƒŠƒUƒŒƒNƒVƒ‡ƒ“‚ƃ^[ƒ“ƒAƒ“ƒfƒbƒh
- if(target->type != BL_PC && battle_check_undead(t_race,t_ele)){
- int hp, mhp, thres;
- hp = status_get_hp(target);
- mhp = status_get_max_hp(target);
- thres = (skill_lv * 20) + status_get_luk(bl)+
- status_get_int(bl) + status_get_lv(bl)+
- ((200 - hp * 200 / mhp));
- if(thres > 700) thres = 700;
-// if(battle_config.battle_log)
-// printf("ƒ^[ƒ“ƒAƒ“ƒfƒbƒhI Šm—¦%d ñ(番—¦)\n", thres);
- if(rand()%1000 < thres && !(t_mode&0x20)) // ¬Œ÷
- damage = hp;
- else // Ž¸”s
- damage = status_get_lv(bl) + status_get_int(bl) + skill_lv * 10;
- }
- normalmagic_flag=0;
- break;
-
- case MG_NAPALMBEAT: // ƒiƒp[ƒ€ƒr[ƒgi•ªŽUŒvŽZž‚Ýj
- MATK_FIX(70+ skill_lv*10,100);
- if(flag>0){
- MATK_FIX(1,flag);
- }else {
- if(battle_config.error_log)
- printf("battle_calc_magic_attack(): napam enemy count=0 !\n");
- }
- break;
- case MG_FIREBALL: // ƒtƒ@ƒCƒ„[ƒ{[ƒ‹
- {
- const int drate[]={100,90,70};
- if(flag>2)
- matk1=matk2=0;
- else
- MATK_FIX( (95+skill_lv*5)*drate[flag] ,10000 );
- }
- break;
- case MG_FIREWALL: // ƒtƒ@ƒCƒ„[ƒEƒH[ƒ‹
-/*
- if( (t_ele!=3 && !battle_check_undead(t_race,t_ele)) || target->type==BL_PC ) //PC‚͉Α®«‚Å‚à”ò‚ÔH‚»‚à‚»‚àƒ_ƒ[ƒWŽó‚¯‚éH
- blewcount |= 0x10000;
- else
- blewcount = 0;
-*/
- if((t_ele==3 || battle_check_undead(t_race,t_ele)) && target->type!=BL_PC)
- blewcount = 0;
- else
- blewcount |= 0x10000;
- MATK_FIX( 1,2 );
- break;
- case MG_THUNDERSTORM: // ƒTƒ“ƒ_[ƒXƒg[ƒ€
- MATK_FIX( 80,100 );
- break;
- case MG_FROSTDIVER: // ƒtƒƒXƒgƒ_ƒCƒo
- MATK_FIX( 100+skill_lv*10, 100);
- break;
- case WZ_FROSTNOVA: // ƒtƒƒXƒgƒ_ƒCƒo
- MATK_FIX((100+skill_lv*10)*2/3, 100);
- break;
- case WZ_FIREPILLAR: // ƒtƒ@ƒCƒ„[ƒsƒ‰[
- if(mdef1 < 1000000)
- mdef1=mdef2=0; // MDEF–³Ž‹
- MATK_FIX( 1,5 );
- matk1+=50;
- matk2+=50;
- break;
- case WZ_SIGHTRASHER:
- MATK_FIX( 100+skill_lv*20, 100);
- break;
- case WZ_METEOR:
- case WZ_JUPITEL: // ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[
- break;
- case WZ_VERMILION: // ƒ[ƒhƒIƒuƒo[ƒ~ƒŠƒIƒ“
- MATK_FIX( skill_lv*20+80, 100 );
- break;
- case WZ_WATERBALL: // ƒEƒH[ƒ^[ƒ{[ƒ‹
- //matk1+= skill_lv*30;
- //matk2+= skill_lv*30;
- MATK_FIX( 100+skill_lv*30, 100 );
- break;
- case WZ_STORMGUST: // ƒXƒg[ƒ€ƒKƒXƒg
- MATK_FIX( skill_lv*40+100 ,100 );
-// blewcount|=0x10000;
- break;
- case AL_HOLYLIGHT: // ƒz[ƒŠ[ƒ‰ƒCƒg
- MATK_FIX( 125,100 );
- break;
- case AL_RUWACH:
- MATK_FIX( 145,100 );
- break;
- case HW_NAPALMVULCAN: // ƒiƒp[ƒ€ƒr[ƒgi•ªŽUŒvŽZž‚Ýj
- MATK_FIX(70+ skill_lv*10,100);
- if(flag>0){
- MATK_FIX(1,flag);
- }else {
- if(battle_config.error_log)
- printf("battle_calc_magic_attack(): napalmvulcan enemy count=0 !\n");
- }
- break;
- case PF_SOULBURN: // Celest
- if (target->type != BL_PC || skill_lv < 5) {
- memset(&md,0,sizeof(md));
- return md;
- } else if (target->type == BL_PC) {
- damage = ((struct map_session_data *)target)->status.sp * 2;
- matk_flag = 0; // don't consider matk and matk2
- }
- break;
- case ASC_BREAKER:
- damage = rand()%500 + 500 + skill_lv * status_get_int(bl) * 5;
- matk_flag = 0; // don't consider matk and matk2
- break;
- }
- }
-
- if(normalmagic_flag){ // ˆê”Ê–‚–@ƒ_ƒ[ƒWŒvŽZ
- int imdef_flag=0;
- if (matk_flag) {
- if(matk1>matk2)
- damage= matk2+rand()%(matk1-matk2+1);
- else
- damage= matk2;
- }
- if(sd) {
- if(sd->ignore_mdef_ele & (1<<t_ele) || sd->ignore_mdef_race & (1<<t_race))
- imdef_flag = 1;
- if(t_mode & 0x20) {
- if(sd->ignore_mdef_race & (1<<10))
- imdef_flag = 1;
- }
- else {
- if(sd->ignore_mdef_race & (1<<11))
- imdef_flag = 1;
- }
- }
- if(!imdef_flag){
- if(battle_config.magic_defense_type) {
- damage = damage - (mdef1 * battle_config.magic_defense_type) - mdef2;
- }
- else{
- damage = (damage*(100-mdef1))/100 - mdef2;
- }
- }
-
- if(damage<1)
- damage=1;
- }
-
- if(sd) {
- cardfix=100;
- cardfix=cardfix*(100+sd->magic_addrace[t_race])/100;
- cardfix=cardfix*(100+sd->magic_addele[t_ele])/100;
- if(t_mode & 0x20)
- cardfix=cardfix*(100+sd->magic_addrace[10])/100;
- else
- cardfix=cardfix*(100+sd->magic_addrace[11])/100;
- t_class = status_get_class(target);
- for(i=0;i<sd->add_magic_damage_class_count;i++) {
- if(sd->add_magic_damage_classid[i] == t_class) {
- cardfix=cardfix*(100+sd->add_magic_damage_classrate[i])/100;
- break;
- }
- }
- damage=damage*cardfix/100;
- if (skill_num > 0 && sd->skillatk[0] == skill_num)
- damage += damage*sd->skillatk[1]/100;
- }
-
- if( tsd ){
- int s_class = status_get_class(bl);
- cardfix=100;
- cardfix=cardfix*(100-tsd->subele[ele])/100; // ‘® «‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
- cardfix=cardfix*(100-tsd->subrace[race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
- cardfix=cardfix*(100-tsd->subsize[size])/100;
- cardfix=cardfix*(100-tsd->magic_subrace[race])/100;
- cardfix=cardfix*(100-tsd->subrace2[race2])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
- if(status_get_mode(bl) & 0x20)
- cardfix=cardfix*(100-tsd->magic_subrace[10])/100;
- else
- cardfix=cardfix*(100-tsd->magic_subrace[11])/100;
- for(i=0;i<tsd->add_mdef_class_count;i++) {
- if(tsd->add_mdef_classid[i] == s_class) {
- cardfix=cardfix*(100-tsd->add_mdef_classrate[i])/100;
- break;
- }
- }
- cardfix=cardfix*(100-tsd->magic_def_rate)/100;
- damage=damage*cardfix/100;
- }
- if(damage < 0) damage = 0;
-
- damage=battle_attr_fix(damage, ele, status_get_element(target) ); // ‘® «C³
-
- if(skill_num == CR_GRANDCROSS) { // ƒOƒ‰ƒ“ƒhƒNƒƒX
- struct Damage wd;
- wd=battle_calc_weapon_attack(bl,target,skill_num,skill_lv,flag);
- damage = (damage + wd.damage) * (100 + 40*skill_lv)/100;
- if(battle_config.gx_dupele) damage=battle_attr_fix(damage, ele, status_get_element(target) ); //‘®«2‰ñ‚©‚©‚é
- if(bl==target) damage=damage/2; //”½“®‚Í”¼•ª
- }
-
- div_=skill_get_num( skill_num,skill_lv );
-
- if(div_>1 && skill_num != WZ_VERMILION)
- damage*=div_;
-
-// if(mdef1 >= 1000000 && damage > 0)
- if(t_mode&0x40 && damage > 0)
- damage = 1;
-
- if( tsd && tsd->special_state.no_magic_damage) {
- if (battle_config.gtb_pvp_only != 0) { // [MouseJstr]
- if ((map[target->m].flag.pvp || map[target->m].flag.gvg) && target->type==BL_PC)
- damage = (damage * (100 - battle_config.gtb_pvp_only)) / 100;
- } else
- damage=0; // ‰© ‹à峃J[ƒhi–‚–@ƒ_ƒ[ƒW‚Oj
- }
-
- damage=battle_calc_damage(bl,target,damage,div_,skill_num,skill_lv,aflag); // ÅIC³
-
- /* magic_damage_return by [AppleGirl] and [Valaris] */
- if( target->type==BL_PC && tsd && tsd->magic_damage_return > 0 ){
- rdamage += damage * tsd->magic_damage_return / 100;
- if(rdamage < 1) rdamage = 1;
- clif_damage(target,bl,gettick(),0,0,rdamage,0,0,0);
- battle_damage(target,bl,rdamage,0);
- }
- /* end magic_damage_return */
-
- md.damage=damage;
- md.div_=div_;
- md.amotion=status_get_amotion(bl);
- md.dmotion=status_get_dmotion(target);
- md.damage2=0;
- md.type=0;
- md.blewcount=blewcount;
- md.flag=aflag;
-
- return md;
-}
-
-/*==========================================
- * ‚»‚Ì‘¼ƒ_ƒ[ƒWŒvŽZ
- *------------------------------------------
- */
-struct Damage battle_calc_misc_attack(
- struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag)
-{
- int int_=status_get_int(bl);
-// int luk=status_get_luk(bl);
- int dex=status_get_dex(bl);
- int skill,ele,race,size,cardfix,race2;
- struct map_session_data *sd=NULL,*tsd=NULL;
- int damage=0,div_=1,blewcount=skill_get_blewcount(skill_num,skill_lv);
- struct Damage md;
- int damagefix=1;
-
- int aflag=BF_MISC|BF_SHORT|BF_SKILL;
-
- //return‘O‚̈—‚ª‚ ‚é‚Ì‚Åî•ño—Í•”‚Ì‚Ý•ÏX
- if( bl == NULL || target == NULL ){
- nullpo_info(NLP_MARK);
- memset(&md,0,sizeof(md));
- return md;
- }
-
- if(target->type == BL_PET) {
- memset(&md,0,sizeof(md));
- return md;
- }
-
- if( bl->type == BL_PC && (sd=(struct map_session_data *)bl) ) {
- sd->state.attack_type = BF_MISC;
- sd->state.arrow_atk = 0;
- }
-
- if( target->type==BL_PC )
- tsd=(struct map_session_data *)target;
-
- switch(skill_num){
-
- case HT_LANDMINE: // ƒ‰ƒ“ƒhƒ}ƒCƒ“
- damage=skill_lv*(dex+75)*(100+int_)/100;
- break;
-
- case HT_BLASTMINE: // ƒuƒ‰ƒXƒgƒ}ƒCƒ“
- damage=skill_lv*(dex/2+50)*(100+int_)/100;
- break;
-
- case HT_CLAYMORETRAP: // ƒNƒŒƒCƒ‚ƒA[ƒgƒ‰ƒbƒv
- damage=skill_lv*(dex/2+75)*(100+int_)/100;
- break;
-
- case HT_BLITZBEAT: // ƒuƒŠƒbƒcƒr[ƒg
- if( sd==NULL || (skill = pc_checkskill(sd,HT_STEELCROW)) <= 0)
- skill=0;
- damage=(dex/10+int_/2+skill*3+40)*2;
- if(flag > 1)
- damage /= flag;
- aflag |= (flag&~BF_RANGEMASK)|BF_LONG;
- break;
-
- case TF_THROWSTONE: // ΓŠ‚°
- damage=50;
- damagefix=0;
- aflag |= (flag&~BF_RANGEMASK)|BF_LONG;
- break;
-
- case BA_DISSONANCE: // •s‹¦˜a‰¹
- damage=(skill_lv)*20+pc_checkskill(sd,BA_MUSICALLESSON)*3;
- break;
-
- case NPC_SELFDESTRUCTION: // Ž©”š
- damage=status_get_hp(bl)-(bl==target?1:0);
- damagefix=0;
- break;
-
- case NPC_SMOKING: // ƒ^ƒoƒR‚ð‹z‚¤
- damage=3;
- damagefix=0;
- break;
-
- case NPC_DARKBREATH:
- {
- struct status_change *sc_data = status_get_sc_data(target);
- int hitrate=status_get_hit(bl) - status_get_flee(target) + 80;
- hitrate = ( (hitrate>95)?95: ((hitrate<5)?5:hitrate) );
- if(sc_data && (sc_data[SC_SLEEP].timer!=-1 || sc_data[SC_STAN].timer!=-1 ||
- sc_data[SC_FREEZE].timer!=-1 || (sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0) ) )
- hitrate = 1000000;
- if(rand()%100 < hitrate) {
- damage = 500 + (skill_lv-1)*1000 + rand()%1000;
- if(damage > 9999) damage = 9999;
- }
- }
- break;
- case SN_FALCONASSAULT: /* ƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg */
-#ifdef TWILIGHT
- if( sd==NULL || (skill = pc_checkskill(sd,HT_BLITZBEAT)) <= 0)
- skill=0;
- damage=(100+50*skill_lv+(dex/10+int_/2+skill*3+40)*2) * 2;
-#else
- if( sd==NULL || (skill = pc_checkskill(sd,HT_STEELCROW)) <= 0)
- skill=0;
- damage=((150+50*skill_lv)*(dex/10+int_/2+skill*3+40)*2)/100; // [Celest]
-#endif
- if(flag > 1)
- damage /= flag;
- aflag |= (flag&~BF_RANGEMASK)|BF_LONG;
- break;
- }
-
- ele = skill_get_pl(skill_num);
- race = status_get_race(bl);
- size = status_get_size(bl);
- race2 = status_get_race(bl);
-
- if(damagefix){
- if(damage<1 && skill_num != NPC_DARKBREATH)
- damage=1;
-
- if( tsd ){
- cardfix=100;
- cardfix=cardfix*(100-tsd->subele[ele])/100; // ‘®«‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
- cardfix=cardfix*(100-tsd->subrace[race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
- cardfix=cardfix*(100-tsd->subsize[size])/100;
- cardfix=cardfix*(100-tsd->misc_def_rate)/100;
- cardfix=cardfix*(100-tsd->subrace2[race2])/100;
- damage=damage*cardfix/100;
- }
- if (sd && skill_num > 0 && sd->skillatk[0] == skill_num)
- damage += damage*sd->skillatk[1]/100;
-
- if(damage < 0) damage = 0;
- damage=battle_attr_fix(damage, ele, status_get_element(target) ); // ‘®«C³
- }
-
- div_=skill_get_num( skill_num,skill_lv );
- if(div_>1)
- damage*=div_;
-
- if(damage > 0 && (damage < div_ || (status_get_def(target) >= 1000000 && status_get_mdef(target) >= 1000000) ) ) {
- damage = div_;
- }
-
- if(status_get_mode(target)&0x40 && damage>0)
- damage = 1;
-
- damage=battle_calc_damage(bl,target,damage,div_,skill_num,skill_lv,aflag); // ÅIC³
-
- md.damage=damage;
- md.div_=div_;
- md.amotion=status_get_amotion(bl);
- md.dmotion=status_get_dmotion(target);
- md.damage2=0;
- md.type=0;
- md.blewcount=blewcount;
- md.flag=aflag;
- return md;
-
-}
-/*==========================================
- * ƒ_ƒ[ƒWŒvŽZˆêŠ‡ˆ——p
- *------------------------------------------
- */
-struct Damage battle_calc_attack( int attack_type,
- struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag)
-{
- struct Damage d;
- switch(attack_type){
- case BF_WEAPON:
- return battle_calc_weapon_attack(bl,target,skill_num,skill_lv,flag);
- case BF_MAGIC:
- return battle_calc_magic_attack(bl,target,skill_num,skill_lv,flag);
- case BF_MISC:
- return battle_calc_misc_attack(bl,target,skill_num,skill_lv,flag);
- default:
- if(battle_config.error_log)
- printf("battle_calc_attack: unknwon attack type ! %d\n",attack_type);
- memset(&d,0,sizeof(d));
- break;
- }
- return d;
-}
-/*==========================================
- * ’ÊíUŒ‚ˆ—‚Ü‚Æ‚ß
- *------------------------------------------
- */
-int battle_weapon_attack( struct block_list *src,struct block_list *target,
- unsigned int tick,int flag)
-{
- struct map_session_data *sd=NULL;
- struct status_change *sc_data = status_get_sc_data(src),*t_sc_data=status_get_sc_data(target);
- short *opt1;
- int race = 7, ele = 0;
- int damage,rdamage = 0;
- struct Damage wd;
-
- nullpo_retr(0, src);
- nullpo_retr(0, target);
-
- if(src->type == BL_PC)
- sd = (struct map_session_data *)src;
-
- if(src->prev == NULL || target->prev == NULL)
- return 0;
- if(src->type == BL_PC && pc_isdead(sd))
- return 0;
- if(target->type == BL_PC && pc_isdead((struct map_session_data *)target))
- return 0;
-
- opt1=status_get_opt1(src);
- if(opt1 && *opt1 > 0) {
- battle_stopattack(src);
- return 0;
- }
- if(sc_data && sc_data[SC_BLADESTOP].timer!=-1){
- battle_stopattack(src);
- return 0;
- }
-
- if(battle_check_target(src,target,BCT_ENEMY) <= 0 &&
- !battle_check_range(src,target,0))
- return 0; // UŒ‚‘ÎÛŠO
-
- race = status_get_race(target);
- ele = status_get_elem_type(target);
- if(battle_check_target(src,target,BCT_ENEMY) > 0 &&
- battle_check_range(src,target,0)){
- // UŒ‚‘ÎۂƂȂ肤‚é‚Ì‚ÅUŒ‚
- if(sd && sd->status.weapon == 11) {
- if(sd->equip_index[10] >= 0) {
- if(battle_config.arrow_decrement)
- pc_delitem(sd,sd->equip_index[10],1,0);
- }
- else {
- clif_arrow_fail(sd,0);
- return 0;
- }
- }
- if(flag&0x8000) {
- if(sd && battle_config.pc_attack_direction_change)
- sd->dir = sd->head_dir = map_calc_dir(src, target->x,target->y );
- else if(src->type == BL_MOB && battle_config.monster_attack_direction_change)
- ((struct mob_data *)src)->dir = map_calc_dir(src, target->x,target->y );
- wd=battle_calc_weapon_attack(src,target,KN_AUTOCOUNTER,flag&0xff,0);
- }
- else if(flag&AS_POISONREACT && sc_data && sc_data[SC_POISONREACT].timer!=-1) {
- wd=battle_calc_weapon_attack(src,target,AS_POISONREACT,sc_data[SC_POISONREACT].val1,0);
- }
- else
- wd=battle_calc_weapon_attack(src,target,0,0,0);
- if((damage = wd.damage + wd.damage2) > 0 && src != target) {
- if(wd.flag&BF_SHORT) {
- if(target->type == BL_PC) {
- struct map_session_data *tsd = (struct map_session_data *)target;
- if(tsd && tsd->short_weapon_damage_return > 0) {
- rdamage += damage * tsd->short_weapon_damage_return / 100;
- if(rdamage < 1) rdamage = 1;
- }
- }
- if(t_sc_data && t_sc_data[SC_REFLECTSHIELD].timer != -1) {
- rdamage += damage * t_sc_data[SC_REFLECTSHIELD].val2 / 100;
- if(rdamage < 1) rdamage = 1;
- }
- }
- else if(wd.flag&BF_LONG) {
- if(target->type == BL_PC) {
- struct map_session_data *tsd = (struct map_session_data *)target;
- if(tsd && tsd->long_weapon_damage_return > 0) {
- rdamage += damage * tsd->long_weapon_damage_return / 100;
- if(rdamage < 1) rdamage = 1;
- }
- }
- }
- if(rdamage > 0)
- clif_damage(src,src,tick,wd.amotion,wd.dmotion,rdamage,1,4,0);
- }
-
- if (wd.div_ == 255 && sd) { //ŽO’i¶
- int delay = 1000 - 4 * status_get_agi(src) - 2 * status_get_dex(src);
- int skilllv;
- if(wd.damage+wd.damage2 < status_get_hp(target)) {
- if((skilllv = pc_checkskill(sd, MO_CHAINCOMBO)) > 0)
- delay += 300 * battle_config.combo_delay_rate /100; //’ljÁƒfƒBƒŒƒC‚ðconf‚É‚æ‚è’²®
-
- status_change_start(src,SC_COMBO,MO_TRIPLEATTACK,skilllv,0,0,delay,0);
- }
- sd->attackabletime = sd->canmove_tick = tick + delay;
- clif_combo_delay(src,delay);
- clif_skill_damage(src , target , tick , wd.amotion , wd.dmotion ,
- wd.damage , 3 , MO_TRIPLEATTACK, pc_checkskill(sd,MO_TRIPLEATTACK) , -1 );
- }
- else {
- clif_damage(src,target,tick, wd.amotion, wd.dmotion,
- wd.damage, wd.div_ , wd.type, wd.damage2);
- //“ñ“—¬¶Žè‚ƃJƒ^[ƒ‹’ÇŒ‚‚̃~ƒX•\Ž¦(–³—‚â‚è`)
- if(sd && sd->status.weapon >= 16 && wd.damage2 == 0)
- clif_damage(src,target,tick+10, wd.amotion, wd.dmotion,0, 1, 0, 0);
- }
- if(sd && sd->splash_range > 0 && (wd.damage > 0 || wd.damage2 > 0) )
- skill_castend_damage_id(src,target,0,-1,tick,0);
- map_freeblock_lock();
- battle_delay_damage(tick+wd.amotion,src,target,(wd.damage+wd.damage2),0);
- if(target->prev != NULL &&
- (target->type != BL_PC || (target->type == BL_PC && !pc_isdead((struct map_session_data *)target) ) ) ) {
- if(wd.damage > 0 || wd.damage2 > 0) {
- skill_additional_effect(src,target,0,0,BF_WEAPON,tick);
- if(sd) {
- if(sd->weapon_coma_ele[ele] > 0 && rand()%10000 < sd->weapon_coma_ele[ele])
- battle_damage(src,target,status_get_max_hp(target),1);
- if(sd->weapon_coma_race[race] > 0 && rand()%10000 < sd->weapon_coma_race[race])
- battle_damage(src,target,status_get_max_hp(target),1);
- if(status_get_mode(target) & 0x20) {
- if(sd->weapon_coma_race[10] > 0 && rand()%10000 < sd->weapon_coma_race[10])
- battle_damage(src,target,status_get_max_hp(target),1);
- }
- else {
- if(sd->weapon_coma_race[11] > 0 && rand()%10000 < sd->weapon_coma_race[11])
- battle_damage(src,target,status_get_max_hp(target),1);
- }
- }
- }
- }
- if(sc_data && sc_data[SC_AUTOSPELL].timer != -1 && rand()%100 < sc_data[SC_AUTOSPELL].val4) {
- int skilllv=sc_data[SC_AUTOSPELL].val3,i,f=0;
- i = rand()%100;
- if(i >= 50) skilllv -= 2;
- else if(i >= 15) skilllv--;
- if(skilllv < 1) skilllv = 1;
- if(sd) {
- int sp = skill_get_sp(sc_data[SC_AUTOSPELL].val2,skilllv)*2/3;
- if(sd->status.sp >= sp) {
- if((i=skill_get_inf(sc_data[SC_AUTOSPELL].val2) == 2) || i == 32)
- f = skill_castend_pos2(src,target->x,target->y,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
- else {
- switch( skill_get_nk(sc_data[SC_AUTOSPELL].val2) ) {
- case 0: case 2:
- f = skill_castend_damage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
- break;
- case 1:/* Žx‰‡Œn */
- if((sc_data[SC_AUTOSPELL].val2==AL_HEAL || (sc_data[SC_AUTOSPELL].val2==ALL_RESURRECTION && target->type != BL_PC)) && battle_check_undead(race,ele))
- f = skill_castend_damage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
- else
- f = skill_castend_nodamage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
- break;
- }
- }
- if(!f) pc_heal(sd,0,-sp);
- }
- }
- else {
- if((i=skill_get_inf(sc_data[SC_AUTOSPELL].val2) == 2) || i == 32)
- skill_castend_pos2(src,target->x,target->y,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
- else {
- switch( skill_get_nk(sc_data[SC_AUTOSPELL].val2) ) {
- case 0: case 2:
- skill_castend_damage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
- break;
- case 1:/* Žx‰‡Œn */
- if((sc_data[SC_AUTOSPELL].val2==AL_HEAL || (sc_data[SC_AUTOSPELL].val2==ALL_RESURRECTION && target->type != BL_PC)) && battle_check_undead(race,ele))
- skill_castend_damage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
- else
- skill_castend_nodamage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
- break;
- }
- }
- }
- }
- if(sd) {
- if(sd->autospell_id > 0 && rand()%100 < sd->autospell_rate) {
- int skilllv = sd->autospell_lv, i;
- i = rand()%100;
- if(i >= 50) skilllv -= 2;
- else if(i >= 15) skilllv--;
- if(skilllv < 1) skilllv = 1;
-
- if((i=skill_get_inf(sd->autospell_id) == 2) || i == 32)
- skill_castend_pos2(src,target->x,target->y,sd->autospell_id,skilllv,tick,flag);
- else {
- switch( skill_get_nk(sd->autospell_id) ) {
- case 0: case 2:
- skill_castend_damage_id(src,target,sd->autospell_id,skilllv,tick,flag);
- break;
- case 1:/* Žx‰‡Œn */
- if((sd->autospell_id==AL_HEAL || (sd->autospell_id==ALL_RESURRECTION && target->type != BL_PC)) && battle_check_undead(race,ele))
- skill_castend_damage_id(src,target,sd->autospell_id,skilllv,tick,flag);
- else
- skill_castend_nodamage_id(src,target,sd->autospell_id,skilllv,tick,flag);
- break;
- }
- }
- }
- if (wd.flag&BF_WEAPON && src != target && (wd.damage > 0 || wd.damage2 > 0)) {
- int hp = 0,sp = 0;
- if (!battle_config.left_cardfix_to_right) { // “ñ“—¬¶ŽèƒJ[ƒh‚Ì‹zŽûŒnŒø‰Ê‚ð‰EŽè‚ɒljÁ‚µ‚È‚¢ê‡
- hp += battle_calc_drain(wd.damage, sd->hp_drain_rate, sd->hp_drain_per, sd->hp_drain_value);
- hp += battle_calc_drain(wd.damage2, sd->hp_drain_rate_, sd->hp_drain_per_, sd->hp_drain_value_);
- sp += battle_calc_drain(wd.damage, sd->sp_drain_rate, sd->sp_drain_per, sd->sp_drain_value);
- sp += battle_calc_drain(wd.damage2, sd->sp_drain_rate_, sd->sp_drain_per_, sd->sp_drain_value_);
- } else { // “ñ“—¬¶ŽèƒJ[ƒh‚Ì‹zŽûŒnŒø‰Ê‚ð‰EŽè‚ɒljÁ‚·‚éê‡
- int hp_drain_rate = sd->hp_drain_rate + sd->hp_drain_rate_;
- int hp_drain_per = sd->hp_drain_per + sd->hp_drain_per_;
- int hp_drain_value = sd->hp_drain_value + sd->hp_drain_value_;
- int sp_drain_rate = sd->sp_drain_rate + sd->sp_drain_rate_;
- int sp_drain_per = sd->sp_drain_per + sd->sp_drain_per_;
- int sp_drain_value = sd->sp_drain_value + sd->sp_drain_value_;
- hp += battle_calc_drain(wd.damage, hp_drain_rate, hp_drain_per, hp_drain_value);
- sp += battle_calc_drain(wd.damage, sp_drain_rate, sp_drain_per, sp_drain_value);
- }
-
- if (hp || sp) pc_heal(sd, hp, sp);
- if (sd->sp_drain_type && target->type == BL_PC)
- battle_heal(NULL,target,0,-sp,0);
- }
- }
- if (target->type == BL_PC) {
- struct map_session_data *tsd = (struct map_session_data *)target;
- if(tsd && ((sd && !sd->state.arrow_atk) || (status_get_range(src)<=2)) &&
- tsd->autospell2_id > 0 && rand()%100 < tsd->autospell2_rate) {
- struct block_list *tbl;
- int skilllv = tsd->autospell_lv, i;
- i = rand()%100;
- if(i >= 50) skilllv -= 2;
- else if(i >= 15) skilllv--;
- if(skilllv < 1) skilllv = 1;
-
- if (tsd->autospell2_type == 0) tbl = target;
- else tbl = src;
- if((i=skill_get_inf(tsd->autospell2_id) == 2) || i == 32)
- skill_castend_pos2(target,tbl->x,tbl->y,tsd->autospell2_id,skilllv,tick,flag);
- else {
- switch( skill_get_nk(tsd->autospell2_id) ) {
- case 0: case 2:
- skill_castend_damage_id(target,tbl,tsd->autospell2_id,skilllv,tick,flag);
- break;
- case 1:/* Žx‰‡Œn */
- if((tsd->autospell2_id==AL_HEAL || (tsd->autospell2_id==ALL_RESURRECTION && tbl->type != BL_PC)) &&
- battle_check_undead(status_get_race(tbl),status_get_elem_type(tbl)))
- skill_castend_damage_id(target,tbl,tsd->autospell2_id,skilllv,tick,flag);
- else
- skill_castend_nodamage_id(target,tbl,tsd->autospell2_id,skilllv,tick,flag);
- break;
- }
- }
- }
- }
-
- if(rdamage > 0)
- battle_delay_damage(tick+wd.amotion,target,src,rdamage,0);
-
- if(t_sc_data && t_sc_data[SC_AUTOCOUNTER].timer != -1 && t_sc_data[SC_AUTOCOUNTER].val4 > 0) {
- if(t_sc_data[SC_AUTOCOUNTER].val3 == src->id)
- battle_weapon_attack(target,src,tick,0x8000|t_sc_data[SC_AUTOCOUNTER].val1);
- status_change_end(target,SC_AUTOCOUNTER,-1);
- }
- if(t_sc_data && t_sc_data[SC_POISONREACT].timer != -1 && t_sc_data[SC_POISONREACT].val4 > 0) { // poison react [Celest]
- if(t_sc_data[SC_POISONREACT].val3 == src->id) {
- struct map_session_data *tsd = (struct map_session_data *)target;
- if ((src->type == BL_MOB && status_get_elem_type(src)==5) || (src->type == BL_PC && status_get_attack_element(src)==5)) {
- t_sc_data[SC_POISONREACT].val2 = 0;
- battle_weapon_attack(target,src,tick,flag|AS_POISONREACT);
- } else {
- skill_use_id(tsd,src->id,TF_POISON,5);
- --t_sc_data[SC_POISONREACT].val2;
- }
- if (t_sc_data[SC_POISONREACT].val2<=0)
- status_change_end(target,SC_POISONREACT,-1);
- }
- }
- if (t_sc_data && t_sc_data[SC_BLADESTOP_WAIT].timer != -1 &&
- !(status_get_mode(src)&0x20)) { // ƒ{ƒX‚É‚Í–³Œø
- int lv = t_sc_data[SC_BLADESTOP_WAIT].val1;
- status_change_end(target,SC_BLADESTOP_WAIT,-1);
- status_change_start(src,SC_BLADESTOP,lv,1,(int)src,(int)target,skill_get_time2(MO_BLADESTOP,lv),0);
- status_change_start(target,SC_BLADESTOP,lv,2,(int)target,(int)src,skill_get_time2(MO_BLADESTOP,lv),0);
- }
- if(t_sc_data && t_sc_data[SC_SPLASHER].timer!=-1) //‰£‚Á‚½‚Ì‚Å‘Îۂ̃xƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[ó‘Ô‚ð‰ðœ
- status_change_end(target,SC_SPLASHER,-1);
-
- map_freeblock_unlock();
- }
- return wd.dmg_lv;
-}
-
-int battle_check_undead(int race,int element)
-{
- if(battle_config.undead_detect_type == 0) {
- if(element == 9)
- return 1;
- }
- else if(battle_config.undead_detect_type == 1) {
- if(race == 1)
- return 1;
- }
- else {
- if(element == 9 || race == 1)
- return 1;
- }
- return 0;
-}
-
-/*==========================================
- * “G–¡•û”»’è(1=m’è,0=”Û’è,-1=ƒGƒ‰[)
- * flag&0xf0000 = 0x00000:“G‚¶‚á‚È‚¢‚©”»’èiret:1“G‚Å‚Í‚È‚¢j
- * = 0x10000:ƒp[ƒeƒB[”»’èiret:1=ƒp[ƒeƒB[ƒƒ“ƒo)
- * = 0x20000:‘S‚Ä(ret:1=“G–¡•û—¼•û)
- * = 0x40000:“G‚©”»’è(ret:1=“G)
- * = 0x50000:ƒp[ƒeƒB[‚¶‚á‚È‚¢‚©”»’è(ret:1=ƒp[ƒeƒB‚Å‚È‚¢)
- *------------------------------------------
- */
-int battle_check_target( struct block_list *src, struct block_list *target,int flag)
-{
- int s_p,s_g,t_p,t_g;
- struct block_list *ss=src;
- struct status_change *sc_data;
- struct status_change *tsc_data;
-
- nullpo_retr(0, src);
- nullpo_retr(0, target);
-
- if( flag&0x40000 ){ // ”½“]ƒtƒ‰ƒO
- int ret=battle_check_target(src,target,flag&0x30000);
- if(ret!=-1)
- return !ret;
- return -1;
- }
-
- if( flag&0x20000 ){
- if( target->type==BL_MOB || target->type==BL_PC )
- return 1;
- else
- return -1;
- }
-
- if(src->type == BL_SKILL && target->type == BL_SKILL) // ‘ÎÛ‚ªƒXƒLƒ‹ƒ†ƒjƒbƒg‚È‚ç–³ðŒm’è
- return -1;
-
- if(target->type == BL_PC && ((struct map_session_data *)target)->invincible_timer != -1)
- return -1;
-
- // Celest
- sc_data = status_get_sc_data(src);
- tsc_data = status_get_sc_data(target);
- if ((sc_data && sc_data[SC_BASILICA].timer != -1) ||
- (tsc_data && tsc_data[SC_BASILICA].timer != -1))
- return -1;
-
- if(target->type == BL_SKILL) {
- switch(((struct skill_unit *)target)->group->unit_id){
- case 0x8d:
- case 0x8f:
- case 0x98:
- return 0;
- break;
- }
- }
-
- if(target->type == BL_PET)
- return -1;
-
- // ƒXƒLƒ‹ƒ†ƒjƒbƒg‚Ìê‡Ae‚ð‹‚ß‚é
- if( src->type==BL_SKILL) {
- struct skill_unit *su = (struct skill_unit *)src;
- int skillid, inf2;
-
- nullpo_retr (-1, su);
- nullpo_retr (-1, su->group);
- skillid = su->group->skill_id;
- inf2 = skill_get_inf2(skillid);
- if( (ss=map_id2bl( su->group->src_id))==NULL )
- return -1;
- if(ss->prev == NULL)
- return -1;
- if(inf2&0x80 &&
- (map[src->m].flag.pvp ||
- (skillid >= 115 && skillid <= 125 && map[src->m].flag.gvg)) &&
- !(target->type == BL_PC && pc_isinvisible((struct map_session_data *)target)))
- return 0;
- if(ss == target) {
- if(inf2&0x100)
- return 0;
- if(inf2&0x200)
- return -1;
- }
- }
-
- if( src->type==BL_MOB ){
- struct mob_data *md=(struct mob_data *)src;
- nullpo_retr (-1, md);
-
- if(target->type == BL_PC) {
- struct map_session_data *sd = (struct map_session_data *)target;
- nullpo_retr (-1, sd);
-
- if(md->class_ >= 1285 && md->class_ <= 1287){
- struct guild_castle *gc = guild_mapname2gc (map[target->m].name);
- if(gc && agit_flag==0) // Guardians will not attack during non-woe time [Valaris]
- return 1; // end addition [Valaris]
- if(gc && sd->status.guild_id > 0) {
- struct guild *g=guild_search(sd->status.guild_id); // don't attack guild members [Valaris]
- if(g && g->guild_id == gc->guild_id)
- return 1;
- if(g && guild_isallied(g,gc))
- return 1;
- }
- }
- // option to have monsters ignore GMs [Valaris]
- if (battle_config.monsters_ignore_gm > 0 && pc_isGM(sd) >= battle_config.monsters_ignore_gm)
- return 1;
- }
- // Mob‚Åmaster_id‚ª‚ ‚Á‚Äspecial_mob_ai‚È‚çA¢Š«Žå‚ð‹‚ß‚é
- if(md->master_id>0){
- if(md->master_id==target->id) // Žå‚È‚çm’è
- return 1;
- if(md->state.special_mob_ai){
- if(target->type==BL_MOB){ //special_mob_ai‚Å‘ÎÛ‚ªMob
- struct mob_data *tmd=(struct mob_data *)target;
- if(tmd){
- if(tmd->master_id != md->master_id) //¢Š«Žå‚ªˆê‚Å‚È‚¯‚ê‚Δےè
- return 0;
- else{ //¢Š«Žå‚ªˆê‚È‚Ì‚Åm’肵‚½‚¢‚¯‚ÇŽ©”š‚͔ےè
- if(md->state.special_mob_ai>2)
- return 0;
- else
- return 1;
- }
- }
- }
- }
- if((ss=map_id2bl(md->master_id))==NULL)
- return -1;
- }
- }
-
- if( src==target || ss==target ) // “¯‚¶‚È‚çm’è
- return 1;
-
- if(target->type == BL_PC && pc_isinvisible((struct map_session_data *)target))
- return -1;
-
- if( src->prev==NULL || // Ž€‚ñ‚Å‚é‚È‚çƒGƒ‰[
- (src->type==BL_PC && pc_isdead((struct map_session_data *)src) ) )
- return -1;
-
- if( (ss->type == BL_PC && target->type==BL_MOB) ||
- (ss->type == BL_MOB && target->type==BL_PC) )
- return 0; // PCvsMOB‚È‚ç”Û’è
-
- if(ss->type == BL_PET && target->type==BL_MOB)
- return 0;
-
- s_p=status_get_party_id(ss);
- s_g=status_get_guild_id(ss);
-
- t_p=status_get_party_id(target);
- t_g=status_get_guild_id(target);
-
- if(flag&0x10000) {
- if(s_p && t_p && s_p == t_p) // “¯‚¶ƒp[ƒeƒB‚È‚çm’èi–¡•ûj
- return 1;
- else // ƒp[ƒeƒBŒŸõ‚Ȃ瓯‚¶ƒp[ƒeƒB‚¶‚á‚È‚¢Žž“_‚Ŕےè
- return 0;
- }
-
- if(ss->type == BL_MOB && s_g > 0 && t_g > 0 && s_g == t_g ) // “¯‚¶ƒMƒ‹ƒh/mobƒNƒ‰ƒX‚È‚çm’èi–¡•ûj
- return 1;
-
-//printf("ss:%d src:%d target:%d flag:0x%x %d %d ",ss->id,src->id,target->id,flag,src->type,target->type);
-//printf("p:%d %d g:%d %d\n",s_p,t_p,s_g,t_g);
-
- if( ss->type==BL_PC && target->type==BL_PC) { // —¼•ûPVPƒ‚[ƒh‚È‚ç”Û’èi“Gj
- struct skill_unit *su=NULL;
- if(src->type==BL_SKILL)
- su=(struct skill_unit *)src;
- if(map[ss->m].flag.pvp || pc_iskiller((struct map_session_data *)ss, (struct map_session_data*)target)) { // [MouseJstr]
- if(su && su->group->target_flag==BCT_NOENEMY)
- return 1;
- else if (battle_config.pk_mode &&
- (((struct map_session_data*)ss)->status.class_==0 || ((struct map_session_data*)target)->status.class_==0 ||
- ((struct map_session_data*)ss)->status.base_level < battle_config.pk_min_level ||
- ((struct map_session_data*)target)->status.base_level < battle_config.pk_min_level))
- return 1; // prevent novice engagement in pk_mode [Valaris]
- else if(map[ss->m].flag.pvp_noparty && s_p > 0 && t_p > 0 && s_p == t_p)
- return 1;
- else if(map[ss->m].flag.pvp_noguild && s_g > 0 && t_g > 0 && s_g == t_g)
- return 1;
- return 0;
- }
- if(map[src->m].flag.gvg) {
- struct guild *g=NULL;
- if(su && su->group->target_flag==BCT_NOENEMY)
- return 1;
- if( s_g > 0 && s_g == t_g)
- return 1;
- if(map[src->m].flag.gvg_noparty && s_p > 0 && t_p > 0 && s_p == t_p)
- return 1;
- if((g = guild_search(s_g))) {
- int i;
- for(i=0;i<MAX_GUILDALLIANCE;i++){
- if(g->alliance[i].guild_id > 0 && g->alliance[i].guild_id == t_g) {
- if(g->alliance[i].opposition)
- return 0;//“G‘΃Mƒ‹ƒh‚È‚ç–³ðŒ‚É“G
- else
- return 1;//“¯–¿ƒMƒ‹ƒh‚È‚ç–³ðŒ‚É–¡•û
- }
- }
- }
- return 0;
- }
- }
-
- return 1; // ŠY“–‚µ‚È‚¢‚Ì‚Å–³ŠÖŒWl•¨i‚Ü‚ “G‚¶‚á‚È‚¢‚Ì‚Å–¡•ûj
-}
-/*==========================================
- * ŽË’ö”»’è
- *------------------------------------------
- */
-int battle_check_range(struct block_list *src,struct block_list *bl,int range)
-{
-
- int dx,dy;
- int arange;
-
- nullpo_retr(0, src);
- nullpo_retr(0, bl);
-
- dx=abs(bl->x-src->x);
- dy=abs(bl->y-src->y);
- arange=((dx>dy)?dx:dy);
-
- if(src->m != bl->m) // ˆá‚¤ƒ}ƒbƒv
- return 0;
-
- if( range>0 && range < arange ) // ‰“‚·‚¬‚é
- return 0;
-
- if( arange<2 ) // “¯‚¶ƒ}ƒX‚©—×Ú
- return 1;
-
-// if(bl->type == BL_SKILL && ((struct skill_unit *)bl)->group->unit_id == 0x8d)
-// return 1;
-
- // áŠQ•¨”»’è
- return path_search_long(NULL,src->m,src->x,src->y,bl->x,bl->y);
-}
-
-/*==========================================
- * Return numerical value of a switch configuration (modified by [Yor])
- * on/off, english, français, deutsch, español
- *------------------------------------------
- */
-int battle_config_switch(const char *str) {
- if (strcmpi(str, "on") == 0 || strcmpi(str, "yes") == 0 || strcmpi(str, "oui") == 0 || strcmpi(str, "ja") == 0 || strcmpi(str, "si") == 0)
- return 1;
- if (strcmpi(str, "off") == 0 || strcmpi(str, "no") == 0 || strcmpi(str, "non") == 0 || strcmpi(str, "nein") == 0)
- return 0;
- return atoi(str);
-}
-
-static const struct {
- char str[128];
- void *val;
-} battle_data[] = {
- { "warp_point_debug", &battle_config.warp_point_debug },
- { "enemy_critical", &battle_config.enemy_critical },
- { "enemy_critical_rate", &battle_config.enemy_critical_rate },
- { "enemy_str", &battle_config.enemy_str },
- { "enemy_perfect_flee", &battle_config.enemy_perfect_flee },
- { "casting_rate", &battle_config.cast_rate },
- { "delay_rate", &battle_config.delay_rate },
- { "delay_dependon_dex", &battle_config.delay_dependon_dex },
- { "skill_delay_attack_enable", &battle_config.sdelay_attack_enable },
- { "left_cardfix_to_right", &battle_config.left_cardfix_to_right },
- { "player_skill_add_range", &battle_config.pc_skill_add_range },
- { "skill_out_range_consume", &battle_config.skill_out_range_consume },
- { "monster_skill_add_range", &battle_config.mob_skill_add_range },
- { "player_damage_delay", &battle_config.pc_damage_delay },
- { "player_damage_delay_rate", &battle_config.pc_damage_delay_rate },
- { "defunit_not_enemy", &battle_config.defnotenemy },
- { "random_monster_checklv", &battle_config.random_monster_checklv },
- { "attribute_recover", &battle_config.attr_recover },
- { "flooritem_lifetime", &battle_config.flooritem_lifetime },
- { "item_auto_get", &battle_config.item_auto_get },
- { "item_first_get_time", &battle_config.item_first_get_time },
- { "item_second_get_time", &battle_config.item_second_get_time },
- { "item_third_get_time", &battle_config.item_third_get_time },
- { "mvp_item_first_get_time", &battle_config.mvp_item_first_get_time },
- { "mvp_item_second_get_time", &battle_config.mvp_item_second_get_time },
- { "mvp_item_third_get_time", &battle_config.mvp_item_third_get_time },
- { "item_rate", &battle_config.item_rate },
- { "drop_rate0item", &battle_config.drop_rate0item },
- { "base_exp_rate", &battle_config.base_exp_rate },
- { "job_exp_rate", &battle_config.job_exp_rate },
- { "pvp_exp", &battle_config.pvp_exp },
- { "gtb_pvp_only", &battle_config.gtb_pvp_only },
- { "guild_max_castles", &battle_config.guild_max_castles },
- { "death_penalty_type", &battle_config.death_penalty_type },
- { "death_penalty_base", &battle_config.death_penalty_base },
- { "death_penalty_job", &battle_config.death_penalty_job },
- { "zeny_penalty", &battle_config.zeny_penalty },
- { "restart_hp_rate", &battle_config.restart_hp_rate },
- { "restart_sp_rate", &battle_config.restart_sp_rate },
- { "mvp_hp_rate", &battle_config.mvp_hp_rate },
- { "mvp_item_rate", &battle_config.mvp_item_rate },
- { "mvp_exp_rate", &battle_config.mvp_exp_rate },
- { "monster_hp_rate", &battle_config.monster_hp_rate },
- { "monster_max_aspd", &battle_config.monster_max_aspd },
- { "atcommand_gm_only", &battle_config.atc_gmonly },
- { "atcommand_spawn_quantity_limit", &battle_config.atc_spawn_quantity_limit },
- { "gm_all_skill", &battle_config.gm_allskill },
- { "gm_all_skill_add_abra", &battle_config.gm_allskill_addabra },
- { "gm_all_equipment", &battle_config.gm_allequip },
- { "gm_skill_unconditional", &battle_config.gm_skilluncond },
- { "player_skillfree", &battle_config.skillfree },
- { "player_skillup_limit", &battle_config.skillup_limit },
- { "weapon_produce_rate", &battle_config.wp_rate },
- { "potion_produce_rate", &battle_config.pp_rate },
- { "monster_active_enable", &battle_config.monster_active_enable },
- { "monster_damage_delay_rate", &battle_config.monster_damage_delay_rate},
- { "monster_loot_type", &battle_config.monster_loot_type },
- { "mob_skill_use", &battle_config.mob_skill_use },
- { "mob_count_rate", &battle_config.mob_count_rate },
- { "quest_skill_learn", &battle_config.quest_skill_learn },
- { "quest_skill_reset", &battle_config.quest_skill_reset },
- { "basic_skill_check", &battle_config.basic_skill_check },
- { "guild_emperium_check", &battle_config.guild_emperium_check },
- { "guild_exp_limit", &battle_config.guild_exp_limit },
- { "player_invincible_time", &battle_config.pc_invincible_time },
- { "pet_catch_rate", &battle_config.pet_catch_rate },
- { "pet_rename", &battle_config.pet_rename },
- { "pet_friendly_rate", &battle_config.pet_friendly_rate },
- { "pet_hungry_delay_rate", &battle_config.pet_hungry_delay_rate },
- { "pet_hungry_friendly_decrease", &battle_config.pet_hungry_friendly_decrease},
- { "pet_str", &battle_config.pet_str },
- { "pet_status_support", &battle_config.pet_status_support },
- { "pet_attack_support", &battle_config.pet_attack_support },
- { "pet_damage_support", &battle_config.pet_damage_support },
- { "pet_support_rate", &battle_config.pet_support_rate },
- { "pet_attack_exp_to_master", &battle_config.pet_attack_exp_to_master },
- { "pet_attack_exp_rate", &battle_config.pet_attack_exp_rate },
- { "skill_min_damage", &battle_config.skill_min_damage },
- { "finger_offensive_type", &battle_config.finger_offensive_type },
- { "heal_exp", &battle_config.heal_exp },
- { "resurrection_exp", &battle_config.resurrection_exp },
- { "shop_exp", &battle_config.shop_exp },
- { "combo_delay_rate", &battle_config.combo_delay_rate },
- { "item_check", &battle_config.item_check },
- { "wedding_modifydisplay", &battle_config.wedding_modifydisplay },
- { "natural_healhp_interval", &battle_config.natural_healhp_interval },
- { "natural_healsp_interval", &battle_config.natural_healsp_interval },
- { "natural_heal_skill_interval", &battle_config.natural_heal_skill_interval},
- { "natural_heal_weight_rate", &battle_config.natural_heal_weight_rate },
- { "item_name_override_grffile", &battle_config.item_name_override_grffile},
- { "item_equip_override_grffile", &battle_config.item_equip_override_grffile}, // [Celest]
- { "item_slots_override_grffile", &battle_config.item_slots_override_grffile}, // [Celest]
- { "indoors_override_grffile", &battle_config.indoors_override_grffile}, // [Celest]
- { "skill_sp_override_grffile", &battle_config.skill_sp_override_grffile}, // [Celest]
- { "cardillust_read_grffile", &battle_config.cardillust_read_grffile}, // [Celest]
- { "arrow_decrement", &battle_config.arrow_decrement },
- { "max_aspd", &battle_config.max_aspd },
- { "max_hp", &battle_config.max_hp },
- { "max_sp", &battle_config.max_sp },
- { "max_lv", &battle_config.max_lv },
- { "max_parameter", &battle_config.max_parameter },
- { "max_cart_weight", &battle_config.max_cart_weight },
- { "player_skill_log", &battle_config.pc_skill_log },
- { "monster_skill_log", &battle_config.mob_skill_log },
- { "battle_log", &battle_config.battle_log },
- { "save_log", &battle_config.save_log },
- { "error_log", &battle_config.error_log },
- { "etc_log", &battle_config.etc_log },
- { "save_clothcolor", &battle_config.save_clothcolor },
- { "undead_detect_type", &battle_config.undead_detect_type },
- { "player_auto_counter_type", &battle_config.pc_auto_counter_type },
- { "monster_auto_counter_type", &battle_config.monster_auto_counter_type},
- { "agi_penalty_type", &battle_config.agi_penalty_type },
- { "agi_penalty_count", &battle_config.agi_penalty_count },
- { "agi_penalty_num", &battle_config.agi_penalty_num },
- { "agi_penalty_count_lv", &battle_config.agi_penalty_count_lv },
- { "vit_penalty_type", &battle_config.vit_penalty_type },
- { "vit_penalty_count", &battle_config.vit_penalty_count },
- { "vit_penalty_num", &battle_config.vit_penalty_num },
- { "vit_penalty_count_lv", &battle_config.vit_penalty_count_lv },
- { "player_defense_type", &battle_config.player_defense_type },
- { "monster_defense_type", &battle_config.monster_defense_type },
- { "pet_defense_type", &battle_config.pet_defense_type },
- { "magic_defense_type", &battle_config.magic_defense_type },
- { "player_skill_reiteration", &battle_config.pc_skill_reiteration },
- { "monster_skill_reiteration", &battle_config.monster_skill_reiteration},
- { "player_skill_nofootset", &battle_config.pc_skill_nofootset },
- { "monster_skill_nofootset", &battle_config.monster_skill_nofootset },
- { "player_cloak_check_type", &battle_config.pc_cloak_check_type },
- { "monster_cloak_check_type", &battle_config.monster_cloak_check_type },
- { "gvg_short_attack_damage_rate", &battle_config.gvg_short_damage_rate },
- { "gvg_long_attack_damage_rate", &battle_config.gvg_long_damage_rate },
- { "gvg_magic_attack_damage_rate", &battle_config.gvg_magic_damage_rate },
- { "gvg_misc_attack_damage_rate", &battle_config.gvg_misc_damage_rate },
- { "gvg_eliminate_time", &battle_config.gvg_eliminate_time },
- { "mob_changetarget_byskill", &battle_config.mob_changetarget_byskill},
- { "player_attack_direction_change", &battle_config.pc_attack_direction_change },
- { "monster_attack_direction_change", &battle_config.monster_attack_direction_change },
- { "player_land_skill_limit", &battle_config.pc_land_skill_limit },
- { "monster_land_skill_limit", &battle_config.monster_land_skill_limit},
- { "party_skill_penalty", &battle_config.party_skill_penalty },
- { "monster_class_change_full_recover", &battle_config.monster_class_change_full_recover },
- { "produce_item_name_input", &battle_config.produce_item_name_input },
- { "produce_potion_name_input", &battle_config.produce_potion_name_input},
- { "making_arrow_name_input", &battle_config.making_arrow_name_input },
- { "holywater_name_input", &battle_config.holywater_name_input },
- { "display_delay_skill_fail", &battle_config.display_delay_skill_fail },
- { "display_snatcher_skill_fail", &battle_config.display_snatcher_skill_fail },
- { "chat_warpportal", &battle_config.chat_warpportal },
- { "mob_warpportal", &battle_config.mob_warpportal },
- { "dead_branch_active", &battle_config.dead_branch_active },
- { "vending_max_value", &battle_config.vending_max_value },
- { "show_steal_in_same_party", &battle_config.show_steal_in_same_party },
- { "pet_attack_attr_none", &battle_config.pet_attack_attr_none },
- { "mob_attack_attr_none", &battle_config.mob_attack_attr_none },
- { "mob_ghostring_fix", &battle_config.mob_ghostring_fix },
- { "pc_attack_attr_none", &battle_config.pc_attack_attr_none },
- { "gx_allhit", &battle_config.gx_allhit },
- { "gx_cardfix", &battle_config.gx_cardfix },
- { "gx_dupele", &battle_config.gx_dupele },
- { "gx_disptype", &battle_config.gx_disptype },
- { "devotion_level_difference", &battle_config.devotion_level_difference },
- { "player_skill_partner_check", &battle_config.player_skill_partner_check},
- { "hide_GM_session", &battle_config.hide_GM_session },
- { "unit_movement_type", &battle_config.unit_movement_type },
- { "invite_request_check", &battle_config.invite_request_check },
- { "skill_removetrap_type", &battle_config.skill_removetrap_type },
- { "disp_experience", &battle_config.disp_experience },
- { "castle_defense_rate", &battle_config.castle_defense_rate },
- { "hp_rate", &battle_config.hp_rate },
- { "sp_rate", &battle_config.sp_rate },
- { "gm_can_drop_lv", &battle_config.gm_can_drop_lv },
- { "disp_hpmeter", &battle_config.disp_hpmeter },
- { "bone_drop", &battle_config.bone_drop },
- { "monster_damage_delay", &battle_config.monster_damage_delay },
-
-// eAthena additions
- { "item_rate_common", &battle_config.item_rate_common }, // Added by RoVeRT
- { "item_rate_equip", &battle_config.item_rate_equip },
- { "item_rate_card", &battle_config.item_rate_card }, // End Addition
- { "item_rate_heal", &battle_config.item_rate_heal }, // Added by Valaris
- { "item_rate_use", &battle_config.item_rate_use }, // End
- { "item_drop_common_min", &battle_config.item_drop_common_min }, // Added by TyrNemesis^
- { "item_drop_common_max", &battle_config.item_drop_common_max },
- { "item_drop_equip_min", &battle_config.item_drop_equip_min },
- { "item_drop_equip_max", &battle_config.item_drop_equip_max },
- { "item_drop_card_min", &battle_config.item_drop_card_min },
- { "item_drop_card_max", &battle_config.item_drop_card_max },
- { "item_drop_mvp_min", &battle_config.item_drop_mvp_min },
- { "item_drop_mvp_max", &battle_config.item_drop_mvp_max }, // End Addition
- { "prevent_logout", &battle_config.prevent_logout }, // Added by RoVeRT
- { "alchemist_summon_reward", &battle_config.alchemist_summon_reward }, // [Valaris]
- { "maximum_level", &battle_config.maximum_level }, // [Valaris]
- { "drops_by_luk", &battle_config.drops_by_luk }, // [Valaris]
- { "monsters_ignore_gm", &battle_config.monsters_ignore_gm }, // [Valaris]
- { "equipment_breaking", &battle_config.equipment_breaking }, // [Valaris]
- { "equipment_break_rate", &battle_config.equipment_break_rate }, // [Valaris]
- { "pk_mode", &battle_config.pk_mode }, // [Valaris]
- { "pet_equip_required", &battle_config.pet_equip_required }, // [Valaris]
- { "multi_level_up", &battle_config.multi_level_up }, // [Valaris]
- { "backstab_bow_penalty", &battle_config.backstab_bow_penalty },
- { "night_at_start", &battle_config.night_at_start }, // added by [Yor]
- { "day_duration", &battle_config.day_duration }, // added by [Yor]
- { "night_duration", &battle_config.night_duration }, // added by [Yor]
- { "show_mob_hp", &battle_config.show_mob_hp }, // [Valaris]
- { "ban_spoof_namer", &battle_config.ban_spoof_namer }, // added by [Yor]
- { "hack_info_GM_level", &battle_config.hack_info_GM_level }, // added by [Yor]
- { "any_warp_GM_min_level", &battle_config.any_warp_GM_min_level }, // added by [Yor]
- { "packet_ver_flag", &battle_config.packet_ver_flag }, // added by [Yor]
- { "min_hair_style", &battle_config.min_hair_style }, // added by [MouseJstr]
- { "max_hair_style", &battle_config.max_hair_style }, // added by [MouseJstr]
- { "min_hair_color", &battle_config.min_hair_color }, // added by [MouseJstr]
- { "max_hair_color", &battle_config.max_hair_color }, // added by [MouseJstr]
- { "min_cloth_color", &battle_config.min_cloth_color }, // added by [MouseJstr]
- { "max_cloth_color", &battle_config.max_cloth_color }, // added by [MouseJstr]
- { "castrate_dex_scale", &battle_config.castrate_dex_scale }, // added by [MouseJstr]
- { "area_size", &battle_config.area_size }, // added by [MouseJstr]
- { "muting_players", &battle_config.muting_players}, // added by [Apple]
- { "zeny_from_mobs", &battle_config.zeny_from_mobs}, // [Valaris]
- { "mobs_level_up", &battle_config.mobs_level_up}, // [Valaris]
- { "pk_min_level", &battle_config.pk_min_level}, // [celest]
- { "skill_steal_type", &battle_config.skill_steal_type}, // [celest]
- { "skill_steal_rate", &battle_config.skill_steal_rate}, // [celest]
- { "night_darkness_level", &battle_config.night_darkness_level}, // [celest]
- { "motd_type", &battle_config.motd_type}, // [celest]
- { "allow_atcommand_when_mute", &battle_config.allow_atcommand_when_mute}, // [celest]
- { "finding_ore_rate", &battle_config.finding_ore_rate}, // [celest]
- { "exp_calc_type", &battle_config.exp_calc_type}, // [celest]
- { "min_skill_delay_limit", &battle_config.min_skill_delay_limit}, // [celest]
- { "require_glory_guild", &battle_config.require_glory_guild}, // [celest]
- { "idle_no_share", &battle_config.idle_no_share}, // [celest], for a feature by [MouseJstr]
-
-//SQL-only options start
-#ifndef TXT_ONLY
- { "mail_system", &battle_config.mail_system }, // added by [Valaris]
-//SQL-only options end
-#endif
-};
-
-int battle_set_value(char *w1, char *w2) {
- int i;
- for(i = 0; i < sizeof(battle_data) / (sizeof(battle_data[0])); i++)
- if (strcmpi(w1, battle_data[i].str) == 0) {
- *((unsigned int *) battle_data[i].val) = battle_config_switch(w2);
- return 1;
- }
- return 0;
-}
-
-void battle_set_defaults() {
- battle_config.warp_point_debug=0;
- battle_config.enemy_critical=0;
- battle_config.enemy_critical_rate=100;
- battle_config.enemy_str=1;
- battle_config.enemy_perfect_flee=0;
- battle_config.cast_rate=100;
- battle_config.delay_rate=100;
- battle_config.delay_dependon_dex=0;
- battle_config.sdelay_attack_enable=0;
- battle_config.left_cardfix_to_right=0;
- battle_config.pc_skill_add_range=0;
- battle_config.skill_out_range_consume=1;
- battle_config.mob_skill_add_range=0;
- battle_config.pc_damage_delay=1;
- battle_config.pc_damage_delay_rate=100;
- battle_config.defnotenemy=1;
- battle_config.random_monster_checklv=1;
- battle_config.attr_recover=1;
- battle_config.flooritem_lifetime=LIFETIME_FLOORITEM*1000;
- battle_config.item_auto_get=0;
- battle_config.item_first_get_time=3000;
- battle_config.item_second_get_time=1000;
- battle_config.item_third_get_time=1000;
- battle_config.mvp_item_first_get_time=10000;
- battle_config.mvp_item_second_get_time=10000;
- battle_config.mvp_item_third_get_time=2000;
-
- battle_config.drop_rate0item=0;
- battle_config.base_exp_rate=100;
- battle_config.job_exp_rate=100;
- battle_config.pvp_exp=1;
- battle_config.gtb_pvp_only=0;
- battle_config.death_penalty_type=0;
- battle_config.death_penalty_base=0;
- battle_config.death_penalty_job=0;
- battle_config.zeny_penalty=0;
- battle_config.restart_hp_rate=0;
- battle_config.restart_sp_rate=0;
- battle_config.mvp_item_rate=100;
- battle_config.mvp_exp_rate=100;
- battle_config.mvp_hp_rate=100;
- battle_config.monster_hp_rate=100;
- battle_config.monster_max_aspd=199;
- battle_config.atc_gmonly=0;
- battle_config.gm_allskill=0;
- battle_config.gm_allequip=0;
- battle_config.gm_skilluncond=0;
- battle_config.guild_max_castles=0;
- battle_config.skillfree = 0;
- battle_config.skillup_limit = 0;
- battle_config.wp_rate=100;
- battle_config.pp_rate=100;
- battle_config.monster_active_enable=1;
- battle_config.monster_damage_delay_rate=100;
- battle_config.monster_loot_type=0;
- battle_config.mob_skill_use=1;
- battle_config.mob_count_rate=100;
- battle_config.quest_skill_learn=0;
- battle_config.quest_skill_reset=1;
- battle_config.basic_skill_check=1;
- battle_config.guild_emperium_check=1;
- battle_config.guild_exp_limit=50;
- battle_config.pc_invincible_time = 5000;
- battle_config.pet_catch_rate=100;
- battle_config.pet_rename=0;
- battle_config.pet_friendly_rate=100;
- battle_config.pet_hungry_delay_rate=100;
- battle_config.pet_hungry_friendly_decrease=5;
- battle_config.pet_str=1;
- battle_config.pet_status_support=0;
- battle_config.pet_attack_support=0;
- battle_config.pet_damage_support=0;
- battle_config.pet_support_rate=100;
- battle_config.pet_attack_exp_to_master=0;
- battle_config.pet_attack_exp_rate=100;
- battle_config.skill_min_damage=0;
- battle_config.finger_offensive_type=0;
- battle_config.heal_exp=0;
- battle_config.resurrection_exp=0;
- battle_config.shop_exp=0;
- battle_config.combo_delay_rate=100;
- battle_config.item_check=1;
- battle_config.wedding_modifydisplay=0;
- battle_config.natural_healhp_interval=6000;
- battle_config.natural_healsp_interval=8000;
- battle_config.natural_heal_skill_interval=10000;
- battle_config.natural_heal_weight_rate=50;
- battle_config.item_name_override_grffile=1;
- battle_config.item_equip_override_grffile=0; // [Celest]
- battle_config.item_slots_override_grffile=0; // [Celest]
- battle_config.indoors_override_grffile=0; // [Celest]
- battle_config.skill_sp_override_grffile=0; // [Celest]
- battle_config.cardillust_read_grffile=0; // [Celest]
- battle_config.arrow_decrement=1;
- battle_config.max_aspd = 199;
- battle_config.max_hp = 32500;
- battle_config.max_sp = 32500;
- battle_config.max_lv = 99; // [MouseJstr]
- battle_config.max_parameter = 99;
- battle_config.max_cart_weight = 8000;
- battle_config.pc_skill_log = 0;
- battle_config.mob_skill_log = 0;
- battle_config.battle_log = 0;
- battle_config.save_log = 0;
- battle_config.error_log = 1;
- battle_config.etc_log = 1;
- battle_config.save_clothcolor = 0;
- battle_config.undead_detect_type = 0;
- battle_config.pc_auto_counter_type = 1;
- battle_config.monster_auto_counter_type = 1;
- battle_config.agi_penalty_type = 0;
- battle_config.agi_penalty_count = 3;
- battle_config.agi_penalty_num = 0;
- battle_config.agi_penalty_count_lv = ATK_FLEE;
- battle_config.vit_penalty_type = 0;
- battle_config.vit_penalty_count = 3;
- battle_config.vit_penalty_num = 0;
- battle_config.vit_penalty_count_lv = ATK_DEF;
- battle_config.player_defense_type = 0;
- battle_config.monster_defense_type = 0;
- battle_config.pet_defense_type = 0;
- battle_config.magic_defense_type = 0;
- battle_config.pc_skill_reiteration = 0;
- battle_config.monster_skill_reiteration = 0;
- battle_config.pc_skill_nofootset = 0;
- battle_config.monster_skill_nofootset = 0;
- battle_config.pc_cloak_check_type = 0;
- battle_config.monster_cloak_check_type = 0;
- battle_config.gvg_short_damage_rate = 100;
- battle_config.gvg_long_damage_rate = 60;
- battle_config.gvg_magic_damage_rate = 50;
- battle_config.gvg_misc_damage_rate = 60;
- battle_config.gvg_eliminate_time = 7000;
- battle_config.mob_changetarget_byskill = 0;
- battle_config.pc_attack_direction_change = 1;
- battle_config.monster_attack_direction_change = 1;
- battle_config.pc_land_skill_limit = 1;
- battle_config.monster_land_skill_limit = 1;
- battle_config.party_skill_penalty = 1;
- battle_config.monster_class_change_full_recover = 0;
- battle_config.produce_item_name_input = 1;
- battle_config.produce_potion_name_input = 1;
- battle_config.making_arrow_name_input = 1;
- battle_config.holywater_name_input = 1;
- battle_config.display_delay_skill_fail = 1;
- battle_config.display_snatcher_skill_fail = 1;
- battle_config.chat_warpportal = 0;
- battle_config.mob_warpportal = 0;
- battle_config.dead_branch_active = 0;
- battle_config.vending_max_value = 10000000;
- battle_config.show_steal_in_same_party = 0;
- battle_config.pet_attack_attr_none = 0;
- battle_config.pc_attack_attr_none = 0;
- battle_config.mob_attack_attr_none = 1;
- battle_config.mob_ghostring_fix = 0;
- battle_config.gx_allhit = 0;
- battle_config.gx_cardfix = 0;
- battle_config.gx_dupele = 1;
- battle_config.gx_disptype = 1;
- battle_config.devotion_level_difference = 10;
- battle_config.player_skill_partner_check = 1;
- battle_config.hide_GM_session = 0;
- battle_config.unit_movement_type = 0;
- battle_config.invite_request_check = 1;
- battle_config.skill_removetrap_type = 0;
- battle_config.disp_experience = 0;
- battle_config.castle_defense_rate = 100;
- battle_config.hp_rate = 100;
- battle_config.sp_rate = 100;
- battle_config.gm_can_drop_lv = 0;
- battle_config.disp_hpmeter = 0;
- battle_config.bone_drop = 0;
- battle_config.monster_damage_delay = 1;
-
-// eAthena additions
- battle_config.item_rate_common = 100;
- battle_config.item_rate_equip = 100;
- battle_config.item_rate_card = 100;
- battle_config.item_rate_heal = 100; // Added by Valaris
- battle_config.item_rate_use = 100; // End
- battle_config.item_drop_common_min=1; // Added by TyrNemesis^
- battle_config.item_drop_common_max=10000;
- battle_config.item_drop_equip_min=1;
- battle_config.item_drop_equip_max=10000;
- battle_config.item_drop_card_min=1;
- battle_config.item_drop_card_max=10000;
- battle_config.item_drop_mvp_min=1;
- battle_config.item_drop_mvp_max=10000; // End Addition
- battle_config.item_drop_heal_min=1; // Added by Valaris
- battle_config.item_drop_heal_max=10000;
- battle_config.item_drop_use_min=1;
- battle_config.item_drop_use_max=10000; // End
- battle_config.prevent_logout = 1; // Added by RoVeRT
- battle_config.maximum_level = 255; // Added by Valaris
- battle_config.drops_by_luk = 0; // [Valaris]
- battle_config.equipment_breaking = 0; // [Valaris]
- battle_config.equipment_break_rate = 100; // [Valaris]
- battle_config.pk_mode = 0; // [Valaris]
- battle_config.pet_equip_required = 0; // [Valaris]
- battle_config.multi_level_up = 0; // [Valaris]
- battle_config.backstab_bow_penalty = 0; // Akaru
- battle_config.night_at_start = 0; // added by [Yor]
- battle_config.day_duration = 2*60*60*1000; // added by [Yor] (2 hours)
- battle_config.night_duration = 30*60*1000; // added by [Yor] (30 minutes)
- battle_config.show_mob_hp = 0; // [Valaris]
- battle_config.ban_spoof_namer = 5; // added by [Yor] (default: 5 minutes)
- battle_config.hack_info_GM_level = 60; // added by [Yor] (default: 60, GM level)
- battle_config.any_warp_GM_min_level = 20; // added by [Yor]
- battle_config.packet_ver_flag = 255; // added by [Yor]
- battle_config.min_hair_style = 0;
- battle_config.max_hair_style = 20;
- battle_config.min_hair_color = 0;
- battle_config.max_hair_color = 9;
- battle_config.min_cloth_color = 0;
- battle_config.max_cloth_color = 4;
- battle_config.zeny_from_mobs = 0;
- battle_config.mobs_level_up = 0;
- battle_config.pk_min_level = 55;
- battle_config.skill_steal_type = 1;
- battle_config.skill_steal_rate = 100;
- battle_config.night_darkness_level = 9;
- battle_config.motd_type = 0;
- battle_config.allow_atcommand_when_mute = 0;
- battle_config.finding_ore_rate = 100;
- battle_config.castrate_dex_scale = 150;
- battle_config.area_size = 14;
- battle_config.exp_calc_type = 1;
- battle_config.min_skill_delay_limit = 100;
- battle_config.require_glory_guild = 0;
- battle_config.idle_no_share = 0;
-
-//SQL-only options start
-#ifndef TXT_ONLY
- battle_config.mail_system = 0;
-//SQL-only options end
-#endif
-}
-
-void battle_validate_conf() {
- if(battle_config.flooritem_lifetime < 1000)
- battle_config.flooritem_lifetime = LIFETIME_FLOORITEM*1000;
- if(battle_config.restart_hp_rate < 0)
- battle_config.restart_hp_rate = 0;
- else if(battle_config.restart_hp_rate > 100)
- battle_config.restart_hp_rate = 100;
- if(battle_config.restart_sp_rate < 0)
- battle_config.restart_sp_rate = 0;
- else if(battle_config.restart_sp_rate > 100)
- battle_config.restart_sp_rate = 100;
- if(battle_config.natural_healhp_interval < NATURAL_HEAL_INTERVAL)
- battle_config.natural_healhp_interval=NATURAL_HEAL_INTERVAL;
- if(battle_config.natural_healsp_interval < NATURAL_HEAL_INTERVAL)
- battle_config.natural_healsp_interval=NATURAL_HEAL_INTERVAL;
- if(battle_config.natural_heal_skill_interval < NATURAL_HEAL_INTERVAL)
- battle_config.natural_heal_skill_interval=NATURAL_HEAL_INTERVAL;
- if(battle_config.natural_heal_weight_rate < 50)
- battle_config.natural_heal_weight_rate = 50;
- if(battle_config.natural_heal_weight_rate > 101)
- battle_config.natural_heal_weight_rate = 101;
- battle_config.monster_max_aspd = 2000 - battle_config.monster_max_aspd*10;
- if(battle_config.monster_max_aspd < 10)
- battle_config.monster_max_aspd = 10;
- if(battle_config.monster_max_aspd > 1000)
- battle_config.monster_max_aspd = 1000;
- battle_config.max_aspd = 2000 - battle_config.max_aspd*10;
- if(battle_config.max_aspd < 10)
- battle_config.max_aspd = 10;
- if(battle_config.max_aspd > 1000)
- battle_config.max_aspd = 1000;
- if(battle_config.hp_rate < 0)
- battle_config.hp_rate = 1;
- if(battle_config.sp_rate < 0)
- battle_config.sp_rate = 1;
- if(battle_config.max_hp > 1000000)
- battle_config.max_hp = 1000000;
- if(battle_config.max_hp < 100)
- battle_config.max_hp = 100;
- if(battle_config.max_sp > 1000000)
- battle_config.max_sp = 1000000;
- if(battle_config.max_sp < 100)
- battle_config.max_sp = 100;
- if(battle_config.max_parameter < 10)
- battle_config.max_parameter = 10;
- if(battle_config.max_parameter > 10000)
- battle_config.max_parameter = 10000;
- if(battle_config.max_cart_weight > 1000000)
- battle_config.max_cart_weight = 1000000;
- if(battle_config.max_cart_weight < 100)
- battle_config.max_cart_weight = 100;
- battle_config.max_cart_weight *= 10;
-
- if(battle_config.agi_penalty_count < 2)
- battle_config.agi_penalty_count = 2;
- if(battle_config.vit_penalty_count < 2)
- battle_config.vit_penalty_count = 2;
-
- if(battle_config.guild_exp_limit > 99)
- battle_config.guild_exp_limit = 99;
- if(battle_config.guild_exp_limit < 0)
- battle_config.guild_exp_limit = 0;
-
- if(battle_config.castle_defense_rate < 0)
- battle_config.castle_defense_rate = 0;
- if(battle_config.castle_defense_rate > 100)
- battle_config.castle_defense_rate = 100;
- if(battle_config.item_drop_common_min < 1) // Added by TyrNemesis^
- battle_config.item_drop_common_min = 1;
- if(battle_config.item_drop_common_max > 10000)
- battle_config.item_drop_common_max = 10000;
- if(battle_config.item_drop_equip_min < 1)
- battle_config.item_drop_equip_min = 1;
- if(battle_config.item_drop_equip_max > 10000)
- battle_config.item_drop_equip_max = 10000;
- if(battle_config.item_drop_card_min < 1)
- battle_config.item_drop_card_min = 1;
- if(battle_config.item_drop_card_max > 10000)
- battle_config.item_drop_card_max = 10000;
- if(battle_config.item_drop_mvp_min < 1)
- battle_config.item_drop_mvp_min = 1;
- if(battle_config.item_drop_mvp_max > 10000)
- battle_config.item_drop_mvp_max = 10000; // End Addition
-
- if (battle_config.night_at_start < 0) // added by [Yor]
- battle_config.night_at_start = 0;
- else if (battle_config.night_at_start > 1) // added by [Yor]
- battle_config.night_at_start = 1;
- if (battle_config.day_duration != 0 && battle_config.day_duration < 60000) // added by [Yor]
- battle_config.day_duration = 60000;
- if (battle_config.night_duration != 0 && battle_config.night_duration < 60000) // added by [Yor]
- battle_config.night_duration = 60000;
-
- if (battle_config.ban_spoof_namer < 0) // added by [Yor]
- battle_config.ban_spoof_namer = 0;
- else if (battle_config.ban_spoof_namer > 32767)
- battle_config.ban_spoof_namer = 32767;
-
- if (battle_config.hack_info_GM_level < 0) // added by [Yor]
- battle_config.hack_info_GM_level = 0;
- else if (battle_config.hack_info_GM_level > 100)
- battle_config.hack_info_GM_level = 100;
-
- if (battle_config.any_warp_GM_min_level < 0) // added by [Yor]
- battle_config.any_warp_GM_min_level = 0;
- else if (battle_config.any_warp_GM_min_level > 100)
- battle_config.any_warp_GM_min_level = 100;
-
- // at least 1 client must be accepted
- if ((battle_config.packet_ver_flag & 255) == 0) // added by [Yor]
- battle_config.packet_ver_flag = 255; // accept all clients
-
- if (battle_config.night_darkness_level > 10) // Celest
- battle_config.night_darkness_level = 10;
-
- if (battle_config.motd_type < 0)
- battle_config.motd_type = 0;
- else if (battle_config.motd_type > 1)
- battle_config.motd_type = 1;
-
- if (battle_config.finding_ore_rate < 0)
- battle_config.finding_ore_rate = 0;
-
- if (battle_config.vending_max_value > 10000000 || battle_config.vending_max_value<=0) // Lupus & Kobra_k88
- battle_config.vending_max_value = 10000000;
-
- if (battle_config.min_skill_delay_limit < 10)
- battle_config.min_skill_delay_limit = 10; // minimum delay of 10ms
-}
-
-/*==========================================
- * Ý’èƒtƒ@ƒCƒ‹‚ð“Ç‚Ýž‚Þ
- *------------------------------------------
- */
-int battle_config_read(const char *cfgName)
-{
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
- static int count = 0;
-
- if ((count++) == 0)
- battle_set_defaults();
-
- fp = fopen(cfgName,"r");
- if (fp == NULL) {
- printf("File not found: %s\n", cfgName);
- return 1;
- }
- while(fgets(line,1020,fp)){
- if (line[0] == '/' && line[1] == '/')
- continue;
- if (sscanf(line, "%[^:]:%s", w1, w2) != 2)
- continue;
- battle_set_value(w1, w2);
- if (strcmpi(w1, "import") == 0)
- battle_config_read(w2);
- }
- fclose(fp);
-
- if (--count == 0) {
- battle_validate_conf();
- add_timer_func_list(battle_delay_damage_sub, "battle_delay_damage_sub");
- }
-
- return 0;
-}
diff --git a/src/map/battle.h b/src/map/battle.h
deleted file mode 100644
index 393cc58b4..000000000
--- a/src/map/battle.h
+++ /dev/null
@@ -1,328 +0,0 @@
-// $Id: battle.h,v 1.6 2004/09/29 21:08:17 Akitasha Exp $
-#ifndef _BATTLE_H_
-#define _BATTLE_H_
-
-// ƒ_ƒ[ƒW
-struct Damage {
- int damage,damage2;
- int type,div_;
- int amotion,dmotion;
- int blewcount;
- int flag;
- int dmg_lv; //ˆÍ‚܂ꌸŽZŒvŽZ—p@0:ƒXƒLƒ‹UŒ‚ ATK_LUCKY,ATK_FLEE,ATK_DEF
-};
-
-// ‘®«•\i“Ç‚Ýž‚Ý‚Ípc.cAbattle_attr_fix‚ÅŽg—pj
-extern int attr_fix_table[4][10][10];
-
-struct map_session_data;
-struct mob_data;
-struct block_list;
-
-// ƒ_ƒ[ƒWŒvŽZ
-
-struct Damage battle_calc_attack( int attack_type,
- struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag);
-struct Damage battle_calc_weapon_attack(
- struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag);
-struct Damage battle_calc_magic_attack(
- struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag);
-struct Damage battle_calc_misc_attack(
- struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag);
-
-// ‘®«C³ŒvŽZ
-int battle_attr_fix(int damage,int atk_elem,int def_elem);
-
-// ƒ_ƒ[ƒWÅIŒvŽZ
-int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,int div_,int skill_num,int skill_lv,int flag);
-enum { // ÅIŒvŽZ‚̃tƒ‰ƒO
- BF_WEAPON = 0x0001,
- BF_MAGIC = 0x0002,
- BF_MISC = 0x0004,
- BF_SHORT = 0x0010,
- BF_LONG = 0x0040,
- BF_SKILL = 0x0100,
- BF_NORMAL = 0x0200,
- BF_WEAPONMASK=0x000f,
- BF_RANGEMASK= 0x00f0,
- BF_SKILLMASK= 0x0f00,
-};
-
-// ŽÀÛ‚ÉHP‚𑌸
-int battle_delay_damage(unsigned int tick,struct block_list *src,struct block_list *target,int damage,int flag);
-int battle_damage(struct block_list *bl,struct block_list *target,int damage,int flag);
-int battle_heal(struct block_list *bl,struct block_list *target,int hp,int sp,int flag);
-
-// UŒ‚‚âˆÚ“®‚ðŽ~‚ß‚é
-int battle_stopattack(struct block_list *bl);
-int battle_stopwalking(struct block_list *bl,int type);
-
-// ’ÊíUŒ‚ˆ—‚Ü‚Æ‚ß
-int battle_weapon_attack( struct block_list *bl,struct block_list *target,
- unsigned int tick,int flag);
-
-// ŠeŽíƒpƒ‰ƒ[ƒ^‚𓾂é
-int battle_counttargeted(struct block_list *bl,struct block_list *src,int target_lv);
-
-enum {
- BCT_NOENEMY =0x00000,
- BCT_PARTY =0x10000,
- BCT_ENEMY =0x40000,
- BCT_NOPARTY =0x50000,
- BCT_ALL =0x20000,
- BCT_NOONE =0x60000,
- BCT_SELF =0x60000,
-};
-
-int battle_check_undead(int race,int element);
-int battle_check_target( struct block_list *src, struct block_list *target,int flag);
-int battle_check_range(struct block_list *src,struct block_list *bl,int range);
-
-
-// Ý’è
-
-int battle_config_switch(const char *str); // [Valaris]
-
-extern struct Battle_Config {
- int warp_point_debug;
- int enemy_critical;
- int enemy_critical_rate;
- int enemy_str;
- int enemy_perfect_flee;
- int cast_rate,delay_rate,delay_dependon_dex;
- int sdelay_attack_enable;
- int left_cardfix_to_right;
- int pc_skill_add_range;
- int skill_out_range_consume;
- int mob_skill_add_range;
- int pc_damage_delay;
- int pc_damage_delay_rate;
- int defnotenemy;
- int random_monster_checklv;
- int attr_recover;
- int flooritem_lifetime;
- int item_auto_get;
- int item_first_get_time;
- int item_second_get_time;
- int item_third_get_time;
- int mvp_item_first_get_time;
- int mvp_item_second_get_time;
- int mvp_item_third_get_time;
- int item_rate,base_exp_rate,job_exp_rate; // removed item rate, depreciated
- int drop_rate0item;
- int death_penalty_type;
- int death_penalty_base,death_penalty_job;
- int pvp_exp; // [MouseJstr]
- int gtb_pvp_only; // [MouseJstr]
- int zeny_penalty;
- int restart_hp_rate;
- int restart_sp_rate;
- int mvp_item_rate,mvp_exp_rate;
- int mvp_hp_rate;
- int monster_hp_rate;
- int monster_max_aspd;
- int atc_gmonly;
- int atc_spawn_quantity_limit;
- int gm_allskill;
- int gm_allskill_addabra;
- int gm_allequip;
- int gm_skilluncond;
- int skillfree;
- int skillup_limit;
- int wp_rate;
- int pp_rate;
- int monster_active_enable;
- int monster_damage_delay_rate;
- int monster_loot_type;
- int mob_skill_use;
- int mob_count_rate;
- int quest_skill_learn;
- int quest_skill_reset;
- int basic_skill_check;
- int guild_emperium_check;
- int guild_exp_limit;
- int guild_max_castles;
- int pc_invincible_time;
- int pet_catch_rate;
- int pet_rename;
- int pet_friendly_rate;
- int pet_hungry_delay_rate;
- int pet_hungry_friendly_decrease;
- int pet_str;
- int pet_status_support;
- int pet_attack_support;
- int pet_damage_support;
- int pet_support_rate;
- int pet_attack_exp_to_master;
- int pet_attack_exp_rate;
- int skill_min_damage;
- int finger_offensive_type;
- int heal_exp;
- int resurrection_exp;
- int shop_exp;
- int combo_delay_rate;
- int item_check;
- int wedding_modifydisplay;
- int natural_healhp_interval;
- int natural_healsp_interval;
- int natural_heal_skill_interval;
- int natural_heal_weight_rate;
- int item_name_override_grffile;
- int indoors_override_grffile; // [Celest]
- int skill_sp_override_grffile; // [Celest]
- int cardillust_read_grffile;
- int item_equip_override_grffile;
- int item_slots_override_grffile;
- int arrow_decrement;
- int max_aspd;
- int max_hp;
- int max_sp;
- int max_lv;
- unsigned int max_parameter;
- int max_cart_weight;
- int pc_skill_log;
- int mob_skill_log;
- int battle_log;
- int save_log;
- int error_log;
- int etc_log;
- int save_clothcolor;
- int undead_detect_type;
- int pc_auto_counter_type;
- int monster_auto_counter_type;
- int agi_penalty_type;
- int agi_penalty_count;
- int agi_penalty_num;
- int vit_penalty_type;
- int vit_penalty_count;
- int vit_penalty_num;
- int player_defense_type;
- int monster_defense_type;
- int pet_defense_type;
- int magic_defense_type;
- int pc_skill_reiteration;
- int monster_skill_reiteration;
- int pc_skill_nofootset;
- int monster_skill_nofootset;
- int pc_cloak_check_type;
- int monster_cloak_check_type;
- int gvg_short_damage_rate;
- int gvg_long_damage_rate;
- int gvg_magic_damage_rate;
- int gvg_misc_damage_rate;
- int gvg_eliminate_time;
- int mob_changetarget_byskill;
- int pc_attack_direction_change;
- int monster_attack_direction_change;
- int pc_land_skill_limit;
- int monster_land_skill_limit;
- int party_skill_penalty;
- int monster_class_change_full_recover;
- int produce_item_name_input;
- int produce_potion_name_input;
- int making_arrow_name_input;
- int holywater_name_input;
- int display_delay_skill_fail;
- int display_snatcher_skill_fail;
- int chat_warpportal;
- int mob_warpportal;
- int dead_branch_active;
- int vending_max_value;
-// int pet_lootitem; // removed [Valaris]
-// int pet_weight; // removed [Valaris]
- int show_steal_in_same_party;
- int pet_attack_attr_none;
- int mob_attack_attr_none;
- int mob_ghostring_fix;
- int pc_attack_attr_none;
- int item_rate_common,item_rate_card,item_rate_equip,item_rate_heal,item_rate_use; // Added by RoVeRT, Additional Heal and Usable item rate by Val
- int item_drop_common_min,item_drop_common_max; // Added by TyrNemesis^
- int item_drop_card_min,item_drop_card_max;
- int item_drop_equip_min,item_drop_equip_max;
- int item_drop_mvp_min,item_drop_mvp_max; // End Addition
- int item_drop_heal_min,item_drop_heal_max; // Added by Valatris
- int item_drop_use_min,item_drop_use_max; //End
-
- int prevent_logout; // Added by RoVeRT
-
- int alchemist_summon_reward; // [Valaris]
- unsigned int maximum_level;
- int drops_by_luk;
- int monsters_ignore_gm;
- int equipment_breaking;
- int equipment_break_rate;
- int pet_equip_required;
- int multi_level_up;
- int pk_mode;
- int show_mob_hp; // end additions [Valaris]
-
- int agi_penalty_count_lv;
- int vit_penalty_count_lv;
-
- int gx_allhit;
- int gx_cardfix;
- int gx_dupele;
- int gx_disptype;
- int devotion_level_difference;
- int player_skill_partner_check;
- int hide_GM_session;
- int unit_movement_type;
- int invite_request_check;
- int skill_removetrap_type;
- int disp_experience;
- int castle_defense_rate;
- int backstab_bow_penalty;
- int hp_rate;
- int sp_rate;
- int gm_can_drop_lv;
- int disp_hpmeter;
- int bone_drop;
- int monster_damage_delay;
-
-// eAthena additions
- int night_at_start; // added by [Yor]
- int day_duration; // added by [Yor]
- int night_duration; // added by [Yor]
- int ban_spoof_namer; // added by [Yor]
- int ban_hack_trade; // added by [Yor]
- int hack_info_GM_level; // added by [Yor]
- int any_warp_GM_min_level; // added by [Yor]
- int packet_ver_flag; // added by [Yor]
- int muting_players; // added by [PoW]
-
- int min_hair_style; // added by [MouseJstr]
- int max_hair_style; // added by [MouseJstr]
- int min_hair_color; // added by [MouseJstr]
- int max_hair_color; // added by [MouseJstr]
- int min_cloth_color; // added by [MouseJstr]
- int max_cloth_color; // added by [MouseJstr]
-
- int castrate_dex_scale; // added by [MouseJstr]
- int area_size; // added by [MouseJstr]
-
- int zeny_from_mobs; // [Valaris]
- int mobs_level_up; // [Valaris]
- unsigned int pk_min_level; // [celest]
- int skill_steal_type; // [celest]
- int skill_steal_rate; // [celest]
- int night_darkness_level; // [celest]
- int motd_type; // [celest]
- int allow_atcommand_when_mute; // [celest]
- int finding_ore_rate; // orn
- int exp_calc_type;
- int min_skill_delay_limit;
- int require_glory_guild;
- int idle_no_share;
-
-#ifndef TXT_ONLY /* SQL-only options */
- int mail_system; // [Valaris]
-#endif
-
-} battle_config;
-
-extern int battle_config_read(const char *cfgName);
-extern void battle_validate_conf();
-extern void battle_set_defaults();
-extern int battle_set_value(char *, char *);
-
-#endif
diff --git a/src/map/charcommand.c b/src/map/charcommand.c
deleted file mode 100644
index 9b700dc47..000000000
--- a/src/map/charcommand.c
+++ /dev/null
@@ -1,1257 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <math.h>
-
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/nullpo.h"
-
-#include "log.h"
-#include "clif.h"
-#include "chrif.h"
-#include "intif.h"
-#include "itemdb.h"
-#include "map.h"
-#include "pc.h"
-#include "status.h"
-#include "skill.h"
-#include "mob.h"
-#include "pet.h"
-#include "battle.h"
-#include "party.h"
-#include "guild.h"
-#include "charcommand.h"
-#include "atcommand.h"
-#include "script.h"
-#include "npc.h"
-#include "trade.h"
-#include "core.h"
-#include "showmsg.h"
-
-static char command_symbol = '#';
-
-extern char *msg_table[1000]; // Server messages (0-499 reserved for GM commands, 500-999 reserved for others)
-
-#define CCMD_FUNC(x) int charcommand_ ## x (const int fd, struct map_session_data* sd, const char* command, const char* message)
-
-CCMD_FUNC(jobchange);
-CCMD_FUNC(petrename);
-CCMD_FUNC(petfriendly);
-CCMD_FUNC(stats);
-CCMD_FUNC(option);
-CCMD_FUNC(save);
-CCMD_FUNC(stats_all);
-CCMD_FUNC(reset);
-CCMD_FUNC(spiritball);
-CCMD_FUNC(itemlist);
-CCMD_FUNC(effect);
-CCMD_FUNC(storagelist);
-CCMD_FUNC(item);
-CCMD_FUNC(warp);
-CCMD_FUNC(zeny);
-CCMD_FUNC(showexp);
-CCMD_FUNC(showdelay);
-
-#ifdef TXT_ONLY
-/* TXT_ONLY */
-
-/* TXT_ONLY */
-#else
-/* SQL-only */
-
-/* SQL Only */
-#endif
-
-/*==========================================
- *CharCommandInfo charcommand_info[]\‘¢‘Ì‚Ì’è‹`
- *------------------------------------------
- */
-
-// First char of commands is configured in charcommand_athena.conf. Leave @ in this list for default value.
-// to set default level, read charcommand_athena.conf first please.
-static CharCommandInfo charcommand_info[] = {
- { CharCommandJobChange, "#job", 60, charcommand_jobchange },
- { CharCommandJobChange, "#jobchange", 60, charcommand_jobchange },
- { CharCommandPetRename, "#petrename", 50, charcommand_petrename },
- { CharCommandPetFriendly, "#petfriendly", 50, charcommand_petfriendly },
- { CharCommandStats, "#stats", 40, charcommand_stats },
- { CharCommandOption, "#option", 60, charcommand_option },
- { CharCommandReset, "#reset", 60, charcommand_reset },
- { CharCommandSave, "#save", 60, charcommand_save },
- { CharCommandStatsAll, "#statsall", 40, charcommand_stats_all },
- { CharCommandSpiritball, "#spiritball", 40, charcommand_spiritball },
- { CharCommandItemList, "#itemlist", 40, charcommand_itemlist },
- { CharCommandEffect, "#effect", 40, charcommand_effect },
- { CharCommandStorageList, "#storagelist", 40, charcommand_storagelist },
- { CharCommandItem, "#item", 60, charcommand_item },
- { CharCommandWarp, "#warp", 60, charcommand_warp },
- { CharCommandWarp, "#rura", 60, charcommand_warp },
- { CharCommandWarp, "#rura+", 60, charcommand_warp },
- { CharCommandZeny, "#zeny", 60, charcommand_zeny },
- { CharCommandShowExp, "#showexp", 0, charcommand_showexp},
- { CharCommandShowDelay, "#showdelay", 0, charcommand_showdelay},
-
-
-#ifdef TXT_ONLY
-/* TXT_ONLY */
-
-/* TXT_ONLY */
-#else
-/* SQL-only */
-
-/* SQL Only */
-#endif
-
-// add new commands before this line
- { CharCommand_Unknown, NULL, 1, NULL }
-};
-
-
-int get_charcommand_level(const CharCommandType type) {
- int i;
-
- for (i = 0; charcommand_info[i].type != CharCommand_None; i++)
- if (charcommand_info[i].type == type)
- return charcommand_info[i].level;
-
- return 100; // 100: command can not be used
-}
-
-/*==========================================
- *is_charcommand @ƒRƒ}ƒ“ƒh‚É‘¶Ý‚·‚é‚©‚Ç‚¤‚©Šm”F‚·‚é
- *------------------------------------------
- */
-CharCommandType
-is_charcommand(const int fd, struct map_session_data* sd, const char* message, int gmlvl) {
- const char* str = message;
- int s_flag = 0;
- CharCommandInfo info;
- CharCommandType type;
-
- nullpo_retr(CharCommand_None, sd);
-
- if (!message || !*message)
- return CharCommand_None;
-
- memset(&info, 0, sizeof(info));
- str += strlen(sd->status.name);
- while (*str && (isspace(*str) || (s_flag == 0 && *str == ':'))) {
- if (*str == ':')
- s_flag = 1;
- str++;
- }
- if (!*str)
- return CharCommand_None;
-
- type = charcommand(gmlvl > 0 ? gmlvl : pc_isGM(sd), str, &info);
- if (type != CharCommand_None) {
- char command[100];
- char output[200];
- const char* p = str;
- memset(command, '\0', sizeof(command));
- memset(output, '\0', sizeof(output));
- while (*p && !isspace(*p))
- p++;
- if (p - str >= sizeof(command)) // too long
- return CharCommand_Unknown;
- strncpy(command, str, p - str);
- while (isspace(*p))
- p++;
-
- if (type == CharCommand_Unknown || info.proc == NULL) {
- snprintf(output, sizeof(output),msg_txt(153), command); // %s is Unknown Command.
- clif_displaymessage(fd, output);
- } else {
- if (info.proc(fd, sd, command, p) != 0) {
- // Command can not be executed
- snprintf(output, sizeof(output), msg_txt(154), command); // %s failed.
- clif_displaymessage(fd, output);
- }
- }
-
- return info.type;
- }
-
- return CharCommand_None;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-CharCommandType charcommand(const int level, const char* message, struct CharCommandInfo* info) {
- char* p = (char *)message;
-
- if (!info)
- return CharCommand_None;
- if (battle_config.atc_gmonly != 0 && !level) // level = pc_isGM(sd)
- return CharCommand_None;
- if (!p || !*p) {
- fprintf(stderr, "char command message is empty\n");
- return CharCommand_None;
- }
-
- if (*p == command_symbol) { // check first char.
- char command[101];
- int i = 0;
- memset(info, 0, sizeof(CharCommandInfo));
- sscanf(p, "%100s", command);
- command[sizeof(command)-1] = '\0';
-
- while (charcommand_info[i].type != CharCommand_Unknown) {
- if (strcmpi(command+1, charcommand_info[i].command+1) == 0 && level >= charcommand_info[i].level) {
- p[0] = charcommand_info[i].command[0]; // set correct first symbol for after.
- break;
- }
- i++;
- }
-
- if (charcommand_info[i].type == CharCommand_Unknown) {
- // doesn't return Unknown if player is normal player (display the text, not display: unknown command)
- if (level == 0)
- return CharCommand_None;
- else
- return CharCommand_Unknown;
- }
- memcpy(info, &charcommand_info[i], sizeof charcommand_info[i]);
- } else {
- return CharCommand_None;
- }
-
- return info->type;
-}
-
-
-/*==========================================
- *
- *------------------------------------------
- */
-static CharCommandInfo* get_charcommandinfo_byname(const char* name) {
- int i;
-
- for (i = 0; charcommand_info[i].type != CharCommand_Unknown; i++)
- if (strcmpi(charcommand_info[i].command + 1, name) == 0)
- return &charcommand_info[i];
-
- return NULL;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int charcommand_config_read(const char *cfgName) {
- char line[1024], w1[1024], w2[1024];
- CharCommandInfo* p;
- FILE* fp;
-
- if ((fp = fopen(cfgName, "r")) == NULL) {
- printf("CharCommands configuration file not found: %s\n", cfgName);
- return 1;
- }
-
- while (fgets(line, sizeof(line)-1, fp)) {
- if (line[0] == '/' && line[1] == '/')
- continue;
-
- if (sscanf(line, "%1023[^:]:%1023s", w1, w2) != 2)
- continue;
- p = get_charcommandinfo_byname(w1);
- if (p != NULL) {
- p->level = atoi(w2);
- if (p->level > 100)
- p->level = 100;
- else if (p->level < 0)
- p->level = 0;
- }
-
- if (strcmpi(w1, "import") == 0)
- charcommand_config_read(w2);
- else if (strcmpi(w1, "command_symbol") == 0 && w2[0] > 31 &&
- w2[0] != '/' && // symbol of standard ragnarok GM commands
- w2[0] != '%' // symbol of party chat speaking
- )
- command_symbol = w2[0];
- }
- fclose(fp);
-
- return 0;
-}
-
-/*==========================================
- * ‘ÎÛƒLƒƒƒ‰ƒNƒ^[‚ð“]E‚³‚¹‚é upperŽw’è‚Å“]¶‚â—{Žq‚à‰Â”\
- *------------------------------------------
- */
-int charcommand_jobchange(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- struct map_session_data* pl_sd;
- int job = 0, upper = -1;
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message) {
- clif_displaymessage(fd, "Please, enter a job and a player name (usage: #job/#jobchange <job ID> <char name>).");
- return -1;
- }
-
- if (sscanf(message, "%d %d %99[^\n]", &job, &upper, character) < 3) { //upperŽw’肵‚Ä‚ ‚é
- upper = -1;
- if (sscanf(message, "%d %99[^\n]", &job, character) < 2) { //upperŽw’肵‚Ä‚È‚¢ã‚ɉ½‚©‘«‚è‚È‚¢
- clif_displaymessage(fd, "Please, enter a job and a player name (usage: #job/#jobchange <job ID> <char name>).");
- return -1;
- }
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- int j;
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change job only to lower or same level
- if ((job >= 0 && job < MAX_PC_CLASS)) {
-
- // fix pecopeco display
- if ((job != 13 && job != 21 && job != 4014 && job != 4022)) {
- if (pc_isriding(sd)) {
- if (pl_sd->status.class_ == 13)
- pl_sd->status.class_ = pl_sd->view_class = 7;
- if (pl_sd->status.class_ == 21)
- pl_sd->status.class_ = pl_sd->view_class = 14;
- if (pl_sd->status.class_ == 4014)
- pl_sd->status.class_ = pl_sd->view_class = 4008;
- if (pl_sd->status.class_ == 4022)
- pl_sd->status.class_ = pl_sd->view_class = 4015;
- pl_sd->status.option &= ~0x0020;
- clif_changeoption(&pl_sd->bl);
- status_calc_pc(pl_sd, 0);
- }
- } else {
- if (!pc_isriding(sd)) {
- if (job == 13)
- job = 7;
- if (job == 21)
- job = 14;
- if (job == 4014)
- job = 4008;
- if (job == 4022)
- job = 4015;
- }
- }
- for (j=0; j < MAX_INVENTORY; j++) {
- if(pl_sd->status.inventory[j].nameid>0 && pl_sd->status.inventory[j].equip!=0)
- pc_unequipitem(pl_sd, j, 3);
- }
- if (pc_jobchange(pl_sd, job, upper) == 0)
- clif_displaymessage(fd, msg_table[48]); // Character's job changed.
- else {
- clif_displaymessage(fd, msg_table[192]); // Impossible to change the character's job.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[49]); // Invalid job ID.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int charcommand_petrename(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- struct map_session_data *pl_sd;
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: #petrename <char name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pl_sd->status.pet_id > 0 && pl_sd->pd) {
- if (pl_sd->pet.rename_flag != 0) {
- pl_sd->pet.rename_flag = 0;
- intif_save_petdata(pl_sd->status.account_id, &pl_sd->pet);
- clif_send_petstatus(pl_sd);
- clif_displaymessage(fd, msg_table[189]); // This player can now rename his/her pet.
- } else {
- clif_displaymessage(fd, msg_table[190]); // This player can already rename his/her pet.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[191]); // Sorry, but this player has no pet.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_txt(3)); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-
-/*==========================================
- *
- *------------------------------------------
- */
-int charcommand_petfriendly(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int friendly = 0;
- int t = 0;
- char character[100];
- struct map_session_data *pl_sd;
-
- memset(character, '\0', sizeof(character));
- if (!message || !*message || sscanf(message,"%d %s",&friendly,character) < 2) {
- clif_displaymessage(fd, "Please, enter a valid value (usage: "
- "#petfriendly <0-1000> <player>).");
- return -1;
- }
-
- if (((pl_sd = map_nick2sd(character)) != NULL) && pc_isGM(sd)>pc_isGM(pl_sd)) {
- if (pl_sd->status.pet_id > 0 && pl_sd->pd) {
- if (friendly >= 0 && friendly <= 1000) {
- if (friendly != pl_sd->pet.intimate) {
- t = pl_sd->pet.intimate;
- pl_sd->pet.intimate = friendly;
- clif_send_petstatus(pl_sd);
- clif_pet_emotion(pl_sd->pd,0);
- if (battle_config.pet_status_support) {
- if ((pl_sd->pet.intimate > 0 && t <= 0) ||
- (pl_sd->pet.intimate <= 0 && t > 0)) {
- if (pl_sd->bl.prev != NULL)
- status_calc_pc(pl_sd, 0);
- else
- status_calc_pc(pl_sd, 2);
- }
- }
- clif_displaymessage(pl_sd->fd, msg_table[182]); // Pet friendly value changed!
- clif_displaymessage(sd->fd, msg_table[182]); // Pet friendly value changed!
- } else {
- clif_displaymessage(fd, msg_table[183]); // Pet friendly is already the good value.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
- return -1;
- }
- } else {
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_txt(3)); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int charcommand_stats(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- char job_jobname[100];
- char output[200];
- struct map_session_data *pl_sd;
- int i;
-
- memset(character, '\0', sizeof(character));
- memset(job_jobname, '\0', sizeof(job_jobname));
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: #stats <char name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- struct {
- const char* format;
- int value;
- } output_table[] = {
- { "Base Level - %d", pl_sd->status.base_level },
- { job_jobname, pl_sd->status.job_level },
- { "Hp - %d", pl_sd->status.hp },
- { "MaxHp - %d", pl_sd->status.max_hp },
- { "Sp - %d", pl_sd->status.sp },
- { "MaxSp - %d", pl_sd->status.max_sp },
- { "Str - %3d", pl_sd->status.str },
- { "Agi - %3d", pl_sd->status.agi },
- { "Vit - %3d", pl_sd->status.vit },
- { "Int - %3d", pl_sd->status.int_ },
- { "Dex - %3d", pl_sd->status.dex },
- { "Luk - %3d", pl_sd->status.luk },
- { "Zeny - %d", pl_sd->status.zeny },
- { NULL, 0 }
- };
- sprintf(job_jobname, "Job - %s %s", job_name(pl_sd->status.class_), "(level %d)");
- sprintf(output, msg_table[53], pl_sd->status.name); // '%s' stats:
- clif_displaymessage(fd, output);
- for (i = 0; output_table[i].format != NULL; i++) {
- sprintf(output, output_table[i].format, output_table[i].value);
- clif_displaymessage(fd, output);
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * Character Reset
- *------------------------------------------
- */
-int charcommand_reset(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- char output[200];
- struct map_session_data *pl_sd;
-
- memset(character, '\0', sizeof(character));
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: #reset <charname>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can reset a character only for lower or same GM level
- pc_resetstate(pl_sd);
- pc_resetskill(pl_sd);
- sprintf(output, msg_table[208], character); // '%s' skill and stats points reseted!
- clif_displaymessage(fd, output);
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int charcommand_option(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- int opt1 = 0, opt2 = 0, opt3 = 0;
- struct map_session_data* pl_sd;
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message ||
- sscanf(message, "%d %d %d %99[^\n]", &opt1, &opt2, &opt3, character) < 4 ||
- opt1 < 0 || opt2 < 0 || opt3 < 0) {
- clif_displaymessage(fd, "Please, enter valid options and a player name (usage: #option <param1> <param2> <param3> <charname>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change option only to lower or same level
- pl_sd->opt1 = opt1;
- pl_sd->opt2 = opt2;
- pl_sd->status.option = opt3;
- // fix pecopeco display
- if (pl_sd->status.class_ == 13 || pl_sd->status.class_ == 21 || pl_sd->status.class_ == 4014 || pl_sd->status.class_ == 4022) {
- if (!pc_isriding(pl_sd)) { // pl_sd have the new value...
- if (pl_sd->status.class_ == 13)
- pl_sd->status.class_ = pl_sd->view_class = 7;
- else if (pl_sd->status.class_ == 21)
- pl_sd->status.class_ = pl_sd->view_class = 14;
- else if (pl_sd->status.class_ == 4014)
- pl_sd->status.class_ = pl_sd->view_class = 4008;
- else if (pl_sd->status.class_ == 4022)
- pl_sd->status.class_ = pl_sd->view_class = 4015;
- }
- } else {
- if (pc_isriding(pl_sd)) { // pl_sd have the new value...
- if (pl_sd->disguise > 0) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] (code added by [Yor])
- pl_sd->status.option &= ~0x0020;
- } else {
- if (pl_sd->status.class_ == 7)
- pl_sd->status.class_ = pl_sd->view_class = 13;
- else if (pl_sd->status.class_ == 14)
- pl_sd->status.class_ = pl_sd->view_class = 21;
- else if (pl_sd->status.class_ == 4008)
- pl_sd->status.class_ = pl_sd->view_class = 4014;
- else if (pl_sd->status.class_ == 4015)
- pl_sd->status.class_ = pl_sd->view_class = 4022;
- else
- pl_sd->status.option &= ~0x0020;
- }
- }
- }
- clif_changeoption(&pl_sd->bl);
- status_calc_pc(pl_sd, 0);
- clif_displaymessage(fd, msg_table[58]); // Character's options changed.
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int charcommand_save(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char map_name[100];
- char character[100];
- struct map_session_data* pl_sd;
- int x = 0, y = 0;
- int m;
-
- memset(map_name, '\0', sizeof(map_name));
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%99s %d %d %99[^\n]", map_name, &x, &y, character) < 4 || x < 0 || y < 0) {
- clif_displaymessage(fd, "Please, enter a valid save point and a player name (usage: #save <map> <x> <y> <charname>).");
- return -1;
- }
-
- if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
- strcat(map_name, ".gat");
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change save point only to lower or same gm level
- m = map_mapname2mapid(map_name);
- if (m < 0) {
- clif_displaymessage(fd, msg_table[1]); // Map not found.
- return -1;
- } else {
- if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to set this map as a save map.");
- return -1;
- }
- pc_setsavepoint(pl_sd, map_name, x, y);
- clif_displaymessage(fd, msg_table[57]); // Character's respawn point changed.
- }
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-//** Character Stats All by fritz
-int charcommand_stats_all(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
- char output[1024], gmlevel[1024];
- int i;
- int count;
- struct map_session_data *pl_sd;
-
- memset(output, '\0', sizeof(output));
- memset(gmlevel, '\0', sizeof(gmlevel));
-
- count = 0;
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth) {
-
- if (pc_isGM(pl_sd) > 0)
- sprintf(gmlevel, "| GM Lvl: %d", pc_isGM(pl_sd));
- else
- sprintf(gmlevel, " ");
-
- sprintf(output, "Name: %s | BLvl: %d | Job: %s (Lvl: %d) | HP: %d/%d | SP: %d/%d", pl_sd->status.name, pl_sd->status.base_level, job_name(pl_sd->status.class_), pl_sd->status.job_level, pl_sd->status.hp, pl_sd->status.max_hp, pl_sd->status.sp, pl_sd->status.max_sp);
- clif_displaymessage(fd, output);
- sprintf(output, "STR: %d | AGI: %d | VIT: %d | INT: %d | DEX: %d | LUK: %d | Zeny: %d %s", pl_sd->status.str, pl_sd->status.agi, pl_sd->status.vit, pl_sd->status.int_, pl_sd->status.dex, pl_sd->status.luk, pl_sd->status.zeny, gmlevel);
- clif_displaymessage(fd, output);
- clif_displaymessage(fd, "--------");
- count++;
- }
- }
-
- if (count == 0)
- clif_displaymessage(fd, msg_table[28]); // No player found.
- else if (count == 1)
- clif_displaymessage(fd, msg_table[29]); // 1 player found.
- else {
- sprintf(output, msg_table[30], count); // %d players found.
- clif_displaymessage(fd, output);
- }
-
- return 0;
-}
-
-/*==========================================
- * CharSpiritBall Function by PalasX
- *------------------------------------------
- */
-int charcommand_spiritball(const int fd, struct map_session_data* sd,const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- char character[100];
- int spirit = 0;
-
- memset(character, '\0', sizeof(character));
-
- if(!message || !*message || sscanf(message, "%d %99[^\n]", &spirit, character) < 2 || spirit < 0 || spirit > 1000) {
- clif_displaymessage(fd, "Usage: @spiritball <number: 0-1000>) <CHARACTER_NAME>.");
- return -1;
- }
-
- if((pl_sd = map_nick2sd(character)) != NULL) {
- if (spirit >= 0 && spirit <= 0x7FFF) {
- if (pl_sd->spiritball != spirit || spirit > 999) {
- if (pl_sd->spiritball > 0)
- pc_delspiritball(pl_sd, pl_sd->spiritball, 1);
- pl_sd->spiritball = spirit;
- clif_spiritball(pl_sd);
- // no message, player can look the difference
- if (spirit > 1000)
- clif_displaymessage(fd, msg_table[204]); // WARNING: more than 1000 spiritballs can CRASH your server and/or client!
- } else {
- clif_displaymessage(fd, msg_table[205]); // You already have this number of spiritballs.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
- return 0;
-}
-
-/*==========================================
- * #itemlist <character>: Displays the list of a player's items.
- *------------------------------------------
- */
-int
-charcommand_itemlist(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- struct item_data *item_data, *item_temp;
- int i, j, equip, count, counter, counter2;
- char character[100], output[200], equipstr[100], outputtmp[200];
- nullpo_retr(-1, sd);
-
- memset(character, '\0', sizeof(character));
- memset(output, '\0', sizeof(output));
- memset(equipstr, '\0', sizeof(equipstr));
- memset(outputtmp, '\0', sizeof(outputtmp));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: #itemlist <char name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can look items only lower or same level
- counter = 0;
- count = 0;
- for (i = 0; i < MAX_INVENTORY; i++) {
- if (pl_sd->status.inventory[i].nameid > 0 && (item_data = itemdb_search(pl_sd->status.inventory[i].nameid)) != NULL) {
- counter = counter + pl_sd->status.inventory[i].amount;
- count++;
- if (count == 1) {
- sprintf(output, "------ Items list of '%s' ------", pl_sd->status.name);
- clif_displaymessage(fd, output);
- }
- if ((equip = pl_sd->status.inventory[i].equip)) {
- strcpy(equipstr, "| equiped: ");
- if (equip & 4)
- strcat(equipstr, "robe/gargment, ");
- if (equip & 8)
- strcat(equipstr, "left accessory, ");
- if (equip & 16)
- strcat(equipstr, "body/armor, ");
- if ((equip & 34) == 2)
- strcat(equipstr, "right hand, ");
- if ((equip & 34) == 32)
- strcat(equipstr, "left hand, ");
- if ((equip & 34) == 34)
- strcat(equipstr, "both hands, ");
- if (equip & 64)
- strcat(equipstr, "feet, ");
- if (equip & 128)
- strcat(equipstr, "right accessory, ");
- if ((equip & 769) == 1)
- strcat(equipstr, "lower head, ");
- if ((equip & 769) == 256)
- strcat(equipstr, "top head, ");
- if ((equip & 769) == 257)
- strcat(equipstr, "lower/top head, ");
- if ((equip & 769) == 512)
- strcat(equipstr, "mid head, ");
- if ((equip & 769) == 512)
- strcat(equipstr, "lower/mid head, ");
- if ((equip & 769) == 769)
- strcat(equipstr, "lower/mid/top head, ");
- // remove final ', '
- equipstr[strlen(equipstr) - 2] = '\0';
- } else
- memset(equipstr, '\0', sizeof(equipstr));
- if (sd->status.inventory[i].refine)
- sprintf(output, "%d %s %+d (%s %+d, id: %d) %s", pl_sd->status.inventory[i].amount, item_data->name, pl_sd->status.inventory[i].refine, item_data->jname, pl_sd->status.inventory[i].refine, pl_sd->status.inventory[i].nameid, equipstr);
- else
- sprintf(output, "%d %s (%s, id: %d) %s", pl_sd->status.inventory[i].amount, item_data->name, item_data->jname, pl_sd->status.inventory[i].nameid, equipstr);
- clif_displaymessage(fd, output);
- memset(output, '\0', sizeof(output));
- counter2 = 0;
- for (j = 0; j < item_data->slot; j++) {
- if (pl_sd->status.inventory[i].card[j]) {
- if ((item_temp = itemdb_search(pl_sd->status.inventory[i].card[j])) != NULL) {
- if (output[0] == '\0')
- sprintf(outputtmp, " -> (card(s): #%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname);
- else
- sprintf(outputtmp, "#%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname);
- strcat(output, outputtmp);
- }
- }
- }
- if (output[0] != '\0') {
- output[strlen(output) - 2] = ')';
- output[strlen(output) - 1] = '\0';
- clif_displaymessage(fd, output);
- }
- }
- }
- if (count == 0)
- clif_displaymessage(fd, "No item found on this player.");
- else {
- sprintf(output, "%d item(s) found in %d kind(s) of items.", counter, count);
- clif_displaymessage(fd, output);
- }
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * #effect by [MouseJstr]
- *
- * Create a effect localized on another character
- *------------------------------------------
- */
-int
-charcommand_effect(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd = NULL;
- char target[255];
- int type = 0;
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%d %s", &type, target) != 2) {
- clif_displaymessage(fd, "usage: #effect <type+> <target>.");
- return -1;
- }
-
- if((pl_sd=map_nick2sd((char *) target)) == NULL)
- return -1;
-
- clif_specialeffect(&pl_sd->bl, type, 0);
- clif_displaymessage(fd, msg_table[229]); // Your effect has changed.
-
- return 0;
-}
-
-/*==========================================
- * #storagelist <character>: Displays the items list of a player's storage.
- *------------------------------------------
- */
-int
-charcommand_storagelist(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct storage *stor;
- struct map_session_data *pl_sd;
- struct item_data *item_data, *item_temp;
- int i, j, count, counter, counter2;
- char character[100], output[200], outputtmp[200];
- nullpo_retr(-1, sd);
-
- memset(character, '\0', sizeof(character));
- memset(output, '\0', sizeof(output));
- memset(outputtmp, '\0', sizeof(outputtmp));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: #itemlist <char name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can look items only lower or same level
- if((stor = account2storage2(pl_sd->status.account_id)) != NULL) {
- counter = 0;
- count = 0;
- for (i = 0; i < MAX_STORAGE; i++) {
- if (stor->storage_[i].nameid > 0 && (item_data = itemdb_search(stor->storage_[i].nameid)) != NULL) {
- counter = counter + stor->storage_[i].amount;
- count++;
- if (count == 1) {
- sprintf(output, "------ Storage items list of '%s' ------", pl_sd->status.name);
- clif_displaymessage(fd, output);
- }
- if (stor->storage_[i].refine)
- sprintf(output, "%d %s %+d (%s %+d, id: %d)", stor->storage_[i].amount, item_data->name, stor->storage_[i].refine, item_data->jname, stor->storage_[i].refine, stor->storage_[i].nameid);
- else
- sprintf(output, "%d %s (%s, id: %d)", stor->storage_[i].amount, item_data->name, item_data->jname, stor->storage_[i].nameid);
- clif_displaymessage(fd, output);
- memset(output, '\0', sizeof(output));
- counter2 = 0;
- for (j = 0; j < item_data->slot; j++) {
- if (stor->storage_[i].card[j]) {
- if ((item_temp = itemdb_search(stor->storage_[i].card[j])) != NULL) {
- if (output[0] == '\0')
- sprintf(outputtmp, " -> (card(s): #%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname);
- else
- sprintf(outputtmp, "#%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname);
- strcat(output, outputtmp);
- }
- }
- }
- if (output[0] != '\0') {
- output[strlen(output) - 2] = ')';
- output[strlen(output) - 1] = '\0';
- clif_displaymessage(fd, output);
- }
- }
- }
- if (count == 0)
- clif_displaymessage(fd, "No item found in the storage of this player.");
- else {
- sprintf(output, "%d item(s) found in %d kind(s) of items.", counter, count);
- clif_displaymessage(fd, output);
- }
- } else {
- clif_displaymessage(fd, "This player has no storage.");
- return 0;
- }
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-static void
-charcommand_giveitem_sub(struct map_session_data *sd,struct item_data *item_data,int number)
-{
- int flag = 0;
- int loop = 1, get_count = number,i;
- struct item item_tmp;
-
- if(sd && item_data){
- if (item_data->type == 4 || item_data->type == 5 ||
- item_data->type == 7 || item_data->type == 8) {
- loop = number;
- get_count = 1;
- }
- for (i = 0; i < loop; i++) {
- memset(&item_tmp, 0, sizeof(item_tmp));
- item_tmp.nameid = item_data->nameid;
- item_tmp.identify = 1;
- if ((flag = pc_additem((struct map_session_data*)sd,
- &item_tmp, get_count)))
- clif_additem((struct map_session_data*)sd, 0, 0, flag);
- }
- }
-}
-/*==========================================
- * #item command (usage: #item <name/id_of_item> <quantity> <player>)
- * by MC Cameri
- *------------------------------------------
- */
-int charcommand_item(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char item_name[100];
- char character[100];
- struct map_session_data *pl_sd;
- int number = 0, item_id, flag;
- struct item item_tmp;
- struct item_data *item_data;
- int get_count, i, pet_id;
- nullpo_retr(-1, sd);
-
- memset(item_name, '\0', sizeof(item_name));
-
- if (!message || !*message || sscanf(message, "%99s %d %99[^\n]", item_name, &number, character) < 3) {
- clif_displaymessage(fd, "Please, enter an item name/id (usage: #item <item name or ID> <quantity> <char name>).");
- return -1;
- }
-
- if (number <= 0)
- number = 1;
-
- item_id = 0;
- if ((item_data = itemdb_searchname(item_name)) != NULL ||
- (item_data = itemdb_exists(atoi(item_name))) != NULL)
- item_id = item_data->nameid;
-
- if (item_id >= 500) {
- get_count = number;
- // check pet egg
- pet_id = search_petDB_index(item_id, PET_EGG);
- if (item_data->type == 4 || item_data->type == 5 ||
- item_data->type == 7 || item_data->type == 8) {
- get_count = 1;
- }
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can look items only lower or same level
- for (i = 0; i < number; i += get_count) {
- // if pet egg
- if (pet_id >= 0) {
- pl_sd->catch_target_class = pet_db[pet_id].class_;
- intif_create_pet(pl_sd->status.account_id, pl_sd->status.char_id,
- (short)pet_db[pet_id].class_, (short)mob_db[pet_db[pet_id].class_].lv,
- (short)pet_db[pet_id].EggID, 0, (short)pet_db[pet_id].intimate,
- 100, 0, 1, pet_db[pet_id].jname);
- // if not pet egg
- } else {
- memset(&item_tmp, 0, sizeof(item_tmp));
- item_tmp.nameid = item_id;
- item_tmp.identify = 1;
- if ((flag = pc_additem(pl_sd, &item_tmp, get_count)))
- clif_additem(pl_sd, 0, 0, flag);
- }
- }
- clif_displaymessage(fd, msg_table[18]); // Item created.
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else if(/* from jA's @giveitem */strcmpi(character,"all")==0 || strcmpi(character,"everyone")==0){
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data)){
- charcommand_giveitem_sub(pl_sd,item_data,number);
- snprintf(tmp_output, sizeof(tmp_output), "You got %s %d.", item_name,number);
- clif_displaymessage(pl_sd->fd, tmp_output);
- }
- }
- snprintf(tmp_output, sizeof(tmp_output), "%s received %s %d.","Everyone",item_name,number);
- clif_displaymessage(fd, tmp_output);
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[19]); // Invalid item ID or name.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * #warp/#rura/#rura+ <mapname> <x> <y> <char name>
- *------------------------------------------
- */
-int charcommand_warp(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char map_name[100];
- char character[100];
- int x = 0, y = 0;
- struct map_session_data *pl_sd;
- int m;
-
- nullpo_retr(-1, sd);
-
- memset(map_name, '\0', sizeof(map_name));
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%99s %d %d %99[^\n]", map_name, &x, &y, character) < 4) {
- clif_displaymessage(fd, "Usage: #warp/#rura/#rura+ <mapname> <x> <y> <char name>");
- return -1;
- }
-
- if (x <= 0)
- x = rand() % 399 + 1;
- if (y <= 0)
- y = rand() % 399 + 1;
- if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
- strcat(map_name, ".gat");
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can rura+ only lower or same GM level
- if (x > 0 && x < 400 && y > 0 && y < 400) {
- m = map_mapname2mapid(map_name);
- if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp someone to this map.");
- return -1;
- }
- if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp this player from its actual map.");
- return -1;
- }
- if (pc_setpos(pl_sd, map_name, x, y, 3) == 0) {
- clif_displaymessage(pl_sd->fd, msg_table[0]); // Warped.
- clif_displaymessage(fd, msg_table[15]); // Player warped (message sends to player too).
- } else {
- clif_displaymessage(fd, msg_table[1]); // Map not found.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[2]); // Coordinates out of range.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * #zeny <charname>
- *------------------------------------------
- */
-int charcommand_zeny(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- char character[100];
- int zeny = 0, new_zeny;
- nullpo_retr(-1, sd);
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%d %99[^\n]", &zeny, character) < 2 || zeny == 0) {
- clif_displaymessage(fd, "Please, enter a number and a player name (usage: #zeny <zeny> <name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- new_zeny = pl_sd->status.zeny + zeny;
- if (zeny > 0 && (zeny > MAX_ZENY || new_zeny > MAX_ZENY)) // fix positiv overflow
- new_zeny = MAX_ZENY;
- else if (zeny < 0 && (zeny < -MAX_ZENY || new_zeny < 0)) // fix negativ overflow
- new_zeny = 0;
- if (new_zeny != pl_sd->status.zeny) {
- pl_sd->status.zeny = new_zeny;
- clif_updatestatus(pl_sd, SP_ZENY);
- clif_displaymessage(fd, msg_table[211]); // Character's number of zenys changed!
- } else {
- if (zeny < 0)
- clif_displaymessage(fd, msg_table[41]); // Impossible to decrease the number/value.
- else
- clif_displaymessage(fd, msg_table[149]); // Impossible to increase the number/value.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*===================================
- * Remove some messages
- *-----------------------------------
- */
-int charcommand_showexp(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- if (sd->noexp) {
- sd->noexp = 0;
- clif_displaymessage(fd, "Gained exp is now shown");
- return 0;
- }
- else {
- sd->noexp = 1;
- clif_displaymessage(fd, "Gained exp is now NOT shown");
- return 0;
- }
-}
-
-int charcommand_showdelay(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- if (sd->nodelay) {
- sd->nodelay = 0;
- clif_displaymessage(fd, "Skill delay failure is now shown");
- return 0;
- }
- else {
- sd->nodelay = 1;
- clif_displaymessage(fd, "Skill delay failure is NOT now shown");
- return 0;
- }
-}
-
diff --git a/src/map/charcommand.h b/src/map/charcommand.h
deleted file mode 100644
index 7c1618cca..000000000
--- a/src/map/charcommand.h
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef _CHARCOMMAND_H_
-#define _CHARCOMMAND_H_
-
-enum CharCommandType {
- CharCommand_None = -1,
- CharCommandJobChange,
- CharCommandPetRename,
- CharCommandPetFriendly,
- CharCommandReset,
- CharCommandStats,
- CharCommandOption,
- CharCommandSave,
- CharCommandStatsAll,
- CharCommandSpiritball,
- CharCommandItemList,
- CharCommandEffect,
- CharCommandStorageList,
- CharCommandItem, // by MC Cameri
- CharCommandWarp,
- CharCommandZeny,
- CharCommandShowDelay,
- CharCommandShowExp,
-
-#ifdef TXT_ONLY
-/* TXT_ONLY */
-
-/* TXT_ONLY */
-#else
-/* SQL-only */
-
-/* SQL Only */
-#endif
-
- // End. No more commans after this line.
- CharCommand_Unknown,
- CharCommand_MAX
-};
-
-typedef enum CharCommandType CharCommandType;
-
-typedef struct CharCommandInfo {
- CharCommandType type;
- const char* command;
- int level;
- int (*proc)(const int, struct map_session_data*,
- const char* command, const char* message);
-} CharCommandInfo;
-
-CharCommandType
-is_charcommand(const int fd, struct map_session_data* sd, const char* message, int gmlvl);
-
-CharCommandType charcommand(
- const int level, const char* message, CharCommandInfo* info);
-int get_charcommand_level(const CharCommandType type);
-
-int charcommand_config_read(const char *cfgName);
-
-#endif
-
diff --git a/src/map/chat.c b/src/map/chat.c
deleted file mode 100644
index 3bd29fec3..000000000
--- a/src/map/chat.c
+++ /dev/null
@@ -1,378 +0,0 @@
-// $Id: chat.c,v 1.2 2004/09/22 02:59:47 Akitasha Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "db.h"
-#include "nullpo.h"
-#include "malloc.h"
-#include "map.h"
-#include "clif.h"
-#include "pc.h"
-#include "chat.h"
-#include "npc.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-int chat_triggerevent(struct chat_data *cd);
-
-
-/*==========================================
- * ƒ`ƒƒƒbƒgƒ‹[ƒ€ì¬
- *------------------------------------------
- */
-int chat_createchat(struct map_session_data *sd,int limit,int pub,char* pass,char* title,int titlelen)
-{
- struct chat_data *cd;
-
- nullpo_retr(0, sd);
-
- cd = (struct chat_data *) aCalloc(1,sizeof(struct chat_data));
-
- cd->limit = limit;
- cd->pub = pub;
- cd->users = 1;
- memcpy(cd->pass,pass,8);
- if(titlelen>=sizeof(cd->title)-1) titlelen=sizeof(cd->title)-1;
- memcpy(cd->title,title,titlelen);
- cd->title[titlelen]=0;
-
- cd->owner = (struct block_list **)(&cd->usersd[0]);
- cd->usersd[0] = sd;
- cd->bl.m = sd->bl.m;
- cd->bl.x = sd->bl.x;
- cd->bl.y = sd->bl.y;
- cd->bl.type = BL_CHAT;
-
- cd->bl.id = map_addobject(&cd->bl);
- if(cd->bl.id==0){
- clif_createchat(sd,1);
- aFree(cd);
- return 0;
- }
- pc_setchatid(sd,cd->bl.id);
-
- clif_createchat(sd,0);
- clif_dispchat(cd,0);
-
- return 0;
-}
-
-/*==========================================
- * Šù‘¶ƒ`ƒƒƒbƒgƒ‹[ƒ€‚ÉŽQ‰Á
- *------------------------------------------
- */
-int chat_joinchat(struct map_session_data *sd,int chatid,char* pass)
-{
- struct chat_data *cd;
-
- nullpo_retr(0, sd);
-
- cd=(struct chat_data*)map_id2bl(chatid);
- if(cd==NULL)
- return 1;
-
- if(cd->bl.m != sd->bl.m || cd->limit <= cd->users){
- clif_joinchatfail(sd,0);
- return 0;
- }
- if(cd->pub==0 && strncmp(pass,(char *) cd->pass,8)){
- clif_joinchatfail(sd,1);
- return 0;
- }
- if(chatid == (int)sd->chatID) //Double Chat fix by Alex14, thx CHaNGeTe
- {
- clif_joinchatfail(sd,1);
- return 0;
- }
-
- cd->usersd[cd->users] = sd;
- cd->users++;
-
- pc_setchatid(sd,cd->bl.id);
-
-
- clif_joinchatok(sd,cd); // V‚½‚ÉŽQ‰Á‚µ‚½l‚É‚Í‘Sˆõ‚̃ŠƒXƒg
- clif_addchat(cd,sd); // Šù‚É’†‚É‹‚½l‚ɂ͒ljÁ‚µ‚½l‚Ì•ñ
- clif_dispchat(cd,0); // ŽüˆÍ‚Ìl‚É‚Íl”•Ï‰»•ñ
-
- chat_triggerevent(cd); // ƒCƒxƒ“ƒg
-
- return 0;
-}
-
-/*==========================================
- * ƒ`ƒƒƒbƒgƒ‹[ƒ€‚©‚甲‚¯‚é
- *------------------------------------------
- */
-int chat_leavechat(struct map_session_data *sd)
-{
- struct chat_data *cd;
- int i,leavechar;
-
- nullpo_retr(1, sd);
-
- cd=(struct chat_data*)map_id2bl(sd->chatID);
- if(cd==NULL)
- return 1;
-
- for(i = 0,leavechar=-1;i < cd->users;i++){
- if(cd->usersd[i] == sd){
- leavechar=i;
- break;
- }
- }
- if(leavechar<0) // ‚»‚Ìchat‚ÉŠ‘®‚µ‚Ä‚¢‚È‚¢‚炵‚¢ (ƒoƒOŽž‚Ì‚Ý)
- return -1;
-
- if(leavechar==0 && cd->users>1 && (*cd->owner)->type==BL_PC){
- // Š—LŽÒ‚¾‚Á‚½&‘¼‚Él‚ª‹‚é&PC‚̃`ƒƒƒbƒg
- clif_changechatowner(cd,cd->usersd[1]);
- clif_clearchat(cd,0);
- }
-
- // ”²‚¯‚éPC‚É‚à‘—‚é‚Ì‚Åusers‚ðŒ¸‚ç‚·‘O‚ÉŽÀs
- clif_leavechat(cd,sd);
-
- cd->users--;
- pc_setchatid(sd,0);
-
- if(cd->users == 0 && (*cd->owner)->type==BL_PC){
- // ‘Sˆõ‹‚È‚­‚È‚Á‚½&PC‚̃`ƒƒƒbƒg‚È‚Ì‚ÅÁ‚·
- clif_clearchat(cd,0);
- map_delobject(cd->bl.id); // free‚Ü‚Å‚µ‚Ä‚­‚ê‚é
- } else {
- for(i=leavechar;i < cd->users;i++)
- cd->usersd[i] = cd->usersd[i+1];
- if(leavechar==0 && (*cd->owner)->type==BL_PC){
- // PC‚̃`ƒƒƒbƒg‚È‚Ì‚ÅŠ—LŽÒ‚ª”²‚¯‚½‚̂ňʒu•ÏX
- cd->bl.x=cd->usersd[0]->bl.x;
- cd->bl.y=cd->usersd[0]->bl.y;
- }
- clif_dispchat(cd,0);
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒ`ƒƒƒbƒgƒ‹[ƒ€‚ÌŽ‚¿Žå‚ð÷‚é
- *------------------------------------------
- */
-int chat_changechatowner(struct map_session_data *sd,char *nextownername)
-{
- struct chat_data *cd;
- struct map_session_data *tmp_sd;
- int i,nextowner;
-
- nullpo_retr(1, sd);
-
- cd=(struct chat_data*)map_id2bl(sd->chatID);
- if(cd==NULL || (struct block_list *)sd!=(*cd->owner))
- return 1;
-
- for(i = 1,nextowner=-1;i < cd->users;i++){
- if(strcmp(cd->usersd[i]->status.name,nextownername)==0){
- nextowner=i;
- break;
- }
- }
- if(nextowner<0) // ‚»‚ñ‚Èl‚Í‹‚È‚¢
- return -1;
-
- clif_changechatowner(cd,cd->usersd[nextowner]);
- // ˆê’UÁ‚·
- clif_clearchat(cd,0);
-
- // userlist‚̇”Ô•ÏX (0‚ªŠ—LŽÒ‚È‚Ì‚Å)
- if( (tmp_sd = cd->usersd[0]) == NULL )
- return 1; //‚ ‚肦‚é‚Ì‚©‚ÈH
- cd->usersd[0] = cd->usersd[nextowner];
- cd->usersd[nextowner] = tmp_sd;
-
- // V‚µ‚¢Š—LŽÒ‚̈ʒu‚Ö•ÏX
- cd->bl.x=cd->usersd[0]->bl.x;
- cd->bl.y=cd->usersd[0]->bl.y;
-
- // Ä“x•\Ž¦
- clif_dispchat(cd,0);
-
- return 0;
-}
-
-/*==========================================
- * ƒ`ƒƒƒbƒg‚Ìó‘Ô(ƒ^ƒCƒgƒ‹“™)‚ð•ÏX
- *------------------------------------------
- */
-int chat_changechatstatus(struct map_session_data *sd,int limit,int pub,char* pass,char* title,int titlelen)
-{
- struct chat_data *cd;
-
- nullpo_retr(1, sd);
-
- cd=(struct chat_data*)map_id2bl(sd->chatID);
- if(cd==NULL || (struct block_list *)sd!=(*cd->owner))
- return 1;
-
- cd->limit = limit;
- cd->pub = pub;
- memcpy(cd->pass,pass,8);
- if(titlelen>=sizeof(cd->title)-1) titlelen=sizeof(cd->title)-1;
- memcpy(cd->title,title,titlelen);
- cd->title[titlelen]=0;
-
- clif_changechatstatus(cd);
- clif_dispchat(cd,0);
-
- return 0;
-}
-
-/*==========================================
- * ƒ`ƒƒƒbƒgƒ‹[ƒ€‚©‚çR‚èo‚·
- *------------------------------------------
- */
-int chat_kickchat(struct map_session_data *sd,char *kickusername)
-{
- struct chat_data *cd;
- int i,kickuser;
-
- nullpo_retr(1, sd);
-
- cd=(struct chat_data*)map_id2bl(sd->chatID);
- if(cd==NULL || (struct block_list *)sd!=(*cd->owner))
- return 1;
-
- for(i = 0,kickuser=-1;i < cd->users;i++){
- if(strcmp(cd->usersd[i]->status.name,kickusername)==0){
- kickuser=i;
- break;
- }
- }
- if(kickuser<0) // ‚»‚ñ‚Èl‚Í‹‚È‚¢
- return -1;
-
- chat_leavechat(cd->usersd[kickuser]);
-
- return 0;
-}
-
-/*==========================================
- * npcƒ`ƒƒƒbƒgƒ‹[ƒ€ì¬
- *------------------------------------------
- */
-int chat_createnpcchat(struct npc_data *nd,int limit,int pub,int trigger,char* title,int titlelen,const char *ev)
-{
- struct chat_data *cd;
-
- nullpo_retr(1, nd);
-
- cd = (struct chat_data *) aCalloc(1,sizeof(struct chat_data));
-
- cd->limit = cd->trigger = limit;
- if(trigger>0)
- cd->trigger = trigger;
- cd->pub = pub;
- cd->users = 0;
- memcpy(cd->pass,"",1);
- if(titlelen>=sizeof(cd->title)-1) titlelen=sizeof(cd->title)-1;
- memcpy(cd->title,title,titlelen);
- cd->title[titlelen]=0;
-
- cd->bl.m = nd->bl.m;
- cd->bl.x = nd->bl.x;
- cd->bl.y = nd->bl.y;
- cd->bl.type = BL_CHAT;
- cd->owner_ = (struct block_list *)nd;
- cd->owner = &cd->owner_;
- memcpy(cd->npc_event,ev,strlen(ev));
-
- cd->bl.id = map_addobject(&cd->bl);
- if(cd->bl.id==0){
- aFree(cd);
- return 0;
- }
- nd->chat_id=cd->bl.id;
-
- clif_dispchat(cd,0);
-
- return 0;
-}
-/*==========================================
- * npcƒ`ƒƒƒbƒgƒ‹[ƒ€íœ
- *------------------------------------------
- */
-int chat_deletenpcchat(struct npc_data *nd)
-{
- struct chat_data *cd;
-
- nullpo_retr(0, nd);
- nullpo_retr(0, cd=(struct chat_data*)map_id2bl(nd->chat_id));
-
- chat_npckickall(cd);
- clif_clearchat(cd,0);
- map_delobject(cd->bl.id); // free‚Ü‚Å‚µ‚Ä‚­‚ê‚é
- nd->chat_id=0;
-
- return 0;
-}
-
-/*==========================================
- * ‹K’èl”ˆÈã‚ŃCƒxƒ“ƒg‚ª’è‹`‚³‚ê‚Ä‚é‚È‚çŽÀs
- *------------------------------------------
- */
-int chat_triggerevent(struct chat_data *cd)
-{
- nullpo_retr(0, cd);
-
- if(cd->users>=cd->trigger && cd->npc_event[0])
- npc_event_do(cd->npc_event);
- return 0;
-}
-
-/*==========================================
- * ƒCƒxƒ“ƒg‚Ì—LŒø‰»
- *------------------------------------------
- */
-int chat_enableevent(struct chat_data *cd)
-{
- nullpo_retr(0, cd);
-
- cd->trigger&=0x7f;
- chat_triggerevent(cd);
- return 0;
-}
-/*==========================================
- * ƒCƒxƒ“ƒg‚Ì–³Œø‰»
- *------------------------------------------
- */
-int chat_disableevent(struct chat_data *cd)
-{
- nullpo_retr(0, cd);
-
- cd->trigger|=0x80;
- return 0;
-}
-/*==========================================
- * ƒ`ƒƒƒbƒgƒ‹[ƒ€‚©‚ç‘SˆõR‚èo‚·
- *------------------------------------------
- */
-int chat_npckickall(struct chat_data *cd)
-{
- nullpo_retr(0, cd);
-
- while(cd->users>0){
- chat_leavechat(cd->usersd[cd->users-1]);
- }
- return 0;
-}
-
-/*==========================================
- * I—¹
- *------------------------------------------
- */
-int do_final_chat(void)
-{
- return 0;
-}
diff --git a/src/map/chat.h b/src/map/chat.h
deleted file mode 100644
index 276160251..000000000
--- a/src/map/chat.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// $Id: chat.h,v 1.3 2004/09/25 05:32:18 MouseJstr Exp $
-#ifndef _CHAT_H_
-#define _CHAT_H_
-
-#include "map.h"
-
-int chat_createchat(struct map_session_data *,int,int,char*,char*,int);
-int chat_joinchat(struct map_session_data *,int,char*);
-int chat_leavechat(struct map_session_data* );
-int chat_changechatowner(struct map_session_data *,char *);
-int chat_changechatstatus(struct map_session_data *,int,int,char*,char*,int);
-int chat_kickchat(struct map_session_data *,char *);
-
-int chat_createnpcchat(struct npc_data *nd,int limit,int pub,int trigger,char* title,int titlelen,const char *ev);
-int chat_deletenpcchat(struct npc_data *nd);
-int chat_enableevent(struct chat_data *cd);
-int chat_disableevent(struct chat_data *cd);
-int chat_npckickall(struct chat_data *cd);
-
-int do_final_chat(void);
-
-#endif
diff --git a/src/map/chrif.c b/src/map/chrif.c
deleted file mode 100644
index e250c8a18..000000000
--- a/src/map/chrif.c
+++ /dev/null
@@ -1,1179 +0,0 @@
-// $Id: chrif.c,v 1.6 2004/09/25 11:39:17 MouseJstr Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#ifdef _WIN32
-#include <winsock.h>
-#else
-#include <unistd.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#endif
-#include <sys/types.h>
-#include <time.h>
-
-#include "socket.h"
-#include "timer.h"
-#include "map.h"
-#include "battle.h"
-#include "chrif.h"
-#include "clif.h"
-#include "intif.h"
-#include "npc.h"
-#include "pc.h"
-#include "nullpo.h"
-#include "showmsg.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-static const int packet_len_table[0x20] = {
- 60, 3,-1,27,22,-1, 6,-1, // 2af8-2aff
- 6,-1,18, 7,-1,49,44, 0, // 2b00-2b07
- 6,30,-1,10,86, 7,44,34, // 2b08-2b0f
- -1,-1,10, 6,11,-1, 0, 0, // 2b10-2b17
-};
-
-int chrif_connected;
-int char_fd = -1;
-int srvinfo;
-static char char_ip_str[16];
-static int char_ip;
-static int char_port = 6121;
-static char userid[24], passwd[24];
-static int chrif_state = 0;
-static int char_init_done = 0;
-
-// Ý’èƒtƒ@ƒCƒ‹“Ç‚Ýž‚ÝŠÖŒW
-/*==========================================
- *
- *------------------------------------------
- */
-void chrif_setuserid(char *id)
-{
- strncpy(userid, id, 24);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void chrif_setpasswd(char *pwd)
-{
- strncpy(passwd, pwd, 24);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void chrif_setip(char *ip)
-{
- strncpy(char_ip_str, ip, 16);
- char_ip = inet_addr(char_ip_str);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void chrif_setport(int port)
-{
- char_port = port;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_isconnect(void)
-{
- return chrif_state == 2;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_save(struct map_session_data *sd)
-{
- nullpo_retr(-1, sd);
-
- if( char_fd < 1 || session[char_fd] == NULL || !chrif_isconnect() )
- return -1;
-
- pc_makesavestatus(sd);
-
- WFIFOW(char_fd,0) = 0x2b01;
- WFIFOW(char_fd,2) = sizeof(sd->status) + 12;
- WFIFOL(char_fd,4) = sd->bl.id;
- WFIFOL(char_fd,8) = sd->char_id;
- memcpy(WFIFOP(char_fd,12), &sd->status, sizeof(sd->status));
- WFIFOSET(char_fd, WFIFOW(char_fd,2));
-
- storage_storage_save(sd); // to synchronise storage with character [Yor]
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_connect(int fd)
-{
- WFIFOW(fd,0) = 0x2af8;
- memcpy(WFIFOP(fd,2), userid, 24);
- memcpy(WFIFOP(fd,26), passwd, 24);
- WFIFOL(fd,50) = 0;
- WFIFOL(fd,54) = clif_getip();
- WFIFOW(fd,58) = clif_getport(); // [Valaris] thanks to fov
- WFIFOSET(fd,60);
-
- return 0;
-}
-
-/*==========================================
- * ƒ}ƒbƒv‘—M
- *------------------------------------------
- */
-int chrif_sendmap(int fd)
-{
- int i;
-
- WFIFOW(fd,0) = 0x2afa;
- for(i = 0; i < map_num; i++)
- if (map[i].alias != '\0') // [MouseJstr] map aliasing
- memcpy(WFIFOP(fd,4+i*16), map[i].alias, 16);
- else
- memcpy(WFIFOP(fd,4+i*16), map[i].name, 16);
- WFIFOW(fd,2) = 4 + i * 16;
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-/*==========================================
- * ƒ}ƒbƒvŽóM
- *------------------------------------------
- */
-int chrif_recvmap(int fd)
-{
- int i, j, ip, port;
- unsigned char *p = (unsigned char *)&ip;
-
- if (chrif_state < 2) // ‚Ü‚¾€”õ’†
- return -1;
-
- ip = RFIFOL(fd,4);
- port = RFIFOW(fd,8);
- for(i = 10, j = 0; i < RFIFOW(fd,2); i += 16, j++) {
- map_setipport((char*)RFIFOP(fd,i), ip, port);
-// if (battle_config.etc_log)
-// printf("recv map %d %s\n", j, RFIFOP(fd,i));
- }
- if (battle_config.etc_log)
- printf("recv map on %d.%d.%d.%d:%d (%d maps)\n", p[0], p[1], p[2], p[3], port, j);
-
- return 0;
-}
-
-/*==========================================
- * ƒ}ƒbƒvŽIŠÔˆÚ“®‚Ì‚½‚߂̃f[ƒ^€”õ—v‹
- *------------------------------------------
- */
-int chrif_changemapserver(struct map_session_data *sd, char *name, int x, int y, int ip, short port)
-{
- int i, s_ip;
-
- nullpo_retr(-1, sd);
-
- if( !sd || char_fd < 1 || session[char_fd] == NULL || !chrif_isconnect() )
- return -1;
-
- s_ip = 0;
- for(i = 0; i < fd_max; i++)
- if (session[i] && session[i]->session_data == sd) {
- s_ip = session[i]->client_addr.sin_addr.s_addr;
- break;
- }
-
- WFIFOW(char_fd, 0) = 0x2b05;
- WFIFOL(char_fd, 2) = sd->bl.id;
- WFIFOL(char_fd, 6) = sd->login_id1;
- WFIFOL(char_fd,10) = sd->login_id2;
- WFIFOL(char_fd,14) = sd->status.char_id;
- memcpy(WFIFOP(char_fd,18), name, 16);
- WFIFOW(char_fd,34) = x;
- WFIFOW(char_fd,36) = y;
- WFIFOL(char_fd,38) = ip;
- WFIFOL(char_fd,42) = port;
- WFIFOB(char_fd,44) = sd->status.sex;
- WFIFOL(char_fd,45) = s_ip;
- WFIFOSET(char_fd,49);
-
- return 0;
-}
-
-/*==========================================
- * ƒ}ƒbƒvŽIŠÔˆÚ“®ack
- *------------------------------------------
- */
-int chrif_changemapserverack(int fd)
-{
- struct map_session_data *sd = map_id2sd(RFIFOL(fd,2));
-
- if (sd == NULL || sd->status.char_id != RFIFOL(fd,14))
- return -1;
-
- if (RFIFOL(fd,6) == 1) {
- if (battle_config.error_log)
- printf("map server change failed.\n");
- pc_authfail(sd->fd);
- return 0;
- }
- clif_changemapserver(sd, (char*)RFIFOP(fd,18), RFIFOW(fd,34), RFIFOW(fd,36), RFIFOL(fd,38), RFIFOW(fd,42));
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_connectack(int fd)
-{
- if (RFIFOB(fd,2)) {
- printf("Connected to char-server failed %d.\n", RFIFOB(fd,2));
- exit(1);
- }
- sprintf(tmp_output,"Successfully connected to Char Server (Connection: '"CL_WHITE"%d"CL_RESET"').\n",fd);
- ShowStatus(tmp_output);
- chrif_state = 1;
- chrif_connected=1;
-
- chrif_sendmap(fd);
-
- sprintf(tmp_output,"Event '"CL_WHITE"OnCharIfInit"CL_RESET"' executed with '"CL_WHITE"%d"CL_RESET"' NPCs.\n", npc_event_doall("OnCharIfInit"));
- ShowStatus(tmp_output);
- sprintf(tmp_output,"Event '"CL_WHITE"OnInterIfInit"CL_RESET"' executed with '"CL_WHITE"%d"CL_RESET"' NPCs.\n", npc_event_doall("OnInterIfInit"));
- ShowStatus(tmp_output);
- if(!char_init_done) {
- char_init_done = 1;
- sprintf(tmp_output,"Event '"CL_WHITE"OnInterIfInitOnce"CL_RESET"' executed with '"CL_WHITE"%d"CL_RESET"' NPCs.\n", npc_event_doall("OnInterIfInitOnce"));
- ShowStatus(tmp_output);
- }
-
- // <Agit> Run Event [AgitInit]
-// printf("NPC_Event:[OnAgitInit] do (%d) events (Agit Initialize).\n", npc_event_doall("OnAgitInit"));
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_sendmapack(int fd)
-{
- if (RFIFOB(fd,2)) {
- printf("chrif : send map list to char server failed %d\n", RFIFOB(fd,2));
- exit(1);
- }
-
- memcpy(wisp_server_name, RFIFOP(fd,3), 24);
-
- chrif_state = 2;
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_authreq(struct map_session_data *sd)
-{
- int i;
-
- nullpo_retr(-1, sd);
-
- if(!sd || !sd->bl.id || !sd->login_id1)
- return -1;
- if( char_fd < 1 || session[char_fd] == NULL || !chrif_isconnect() )
- return -1;
-
- for(i = 0; i < fd_max; i++)
- if (session[i] && session[i]->session_data == sd) {
- WFIFOW(char_fd, 0) = 0x2afc;
- WFIFOL(char_fd, 2) = sd->bl.id;
- WFIFOL(char_fd, 6) = sd->char_id;
- WFIFOL(char_fd,10) = sd->login_id1;
- WFIFOL(char_fd,14) = sd->login_id2;
- WFIFOL(char_fd,18) = session[i]->client_addr.sin_addr.s_addr;
- WFIFOSET(char_fd,22);
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_charselectreq(struct map_session_data *sd)
-{
- int i, s_ip;
-
- nullpo_retr(-1, sd);
-
- if( !sd || !sd->bl.id || !sd->login_id1 )
- return -1;
- if( char_fd < 1 || session[char_fd] == NULL || !chrif_isconnect() )
- return -1;
-
- s_ip = 0;
- for(i = 0; i < fd_max; i++)
- if (session[i] && session[i]->session_data == sd) {
- s_ip = session[i]->client_addr.sin_addr.s_addr;
- break;
- }
-
- WFIFOW(char_fd, 0) = 0x2b02;
- WFIFOL(char_fd, 2) = sd->bl.id;
- WFIFOL(char_fd, 6) = sd->login_id1;
- WFIFOL(char_fd,10) = sd->login_id2;
- WFIFOL(char_fd,14) = s_ip;
- WFIFOSET(char_fd,18);
-
- return 0;
-}
-
-/*==========================================
- * ƒLƒƒƒ‰–¼–â‚¢‡‚킹
- *------------------------------------------
- */
-int chrif_searchcharid(int char_id)
-{
- if( !char_id )
- return -1;
- if( char_fd < 1 || session[char_fd] == NULL || !chrif_isconnect() )
- return -1;
-
- WFIFOW(char_fd,0) = 0x2b08;
- WFIFOL(char_fd,2) = char_id;
- WFIFOSET(char_fd,6);
-
- return 0;
-}
-
-/*==========================================
- * GM‚ɕω»—v‹
- *------------------------------------------
- */
-int chrif_changegm(int id, const char *pass, int len)
-{
- if (battle_config.etc_log)
- printf("chrif_changegm: account: %d, password: '%s'.\n", id, pass);
-
- if( char_fd < 1 || session[char_fd] == NULL || !chrif_isconnect() )
- return -1;
-
- WFIFOW(char_fd,0) = 0x2b0a;
- WFIFOW(char_fd,2) = len + 8;
- WFIFOL(char_fd,4) = id;
- memcpy(WFIFOP(char_fd,8), pass, len);
- WFIFOSET(char_fd, len + 8);
-
- return 0;
-}
-
-/*==========================================
- * Change Email
- *------------------------------------------
- */
-int chrif_changeemail(int id, const char *actual_email, const char *new_email)
-{
- if (battle_config.etc_log)
- printf("chrif_changeemail: account: %d, actual_email: '%s', new_email: '%s'.\n", id, actual_email, new_email);
-
- if( char_fd < 1 || session[char_fd] == NULL || !chrif_isconnect() )
- return -1;
-
- WFIFOW(char_fd,0) = 0x2b0c;
- WFIFOL(char_fd,2) = id;
- memcpy(WFIFOP(char_fd,6), actual_email, 40);
- memcpy(WFIFOP(char_fd,46), new_email, 40);
- WFIFOSET(char_fd,86);
-
- return 0;
-}
-
-/*==========================================
- * Send message to char-server with a character name to do some operations (by Yor)
- * Used to ask Char-server about a character name to have the account number to modify account file in login-server.
- * type of operation:
- * 1: block
- * 2: ban
- * 3: unblock
- * 4: unban
- * 5: changesex
- *------------------------------------------
- */
-int chrif_char_ask_name(int id, char * character_name, short operation_type, int year, int month, int day, int hour, int minute, int second)
-{
- if( char_fd < 1 || session[char_fd] == NULL || !chrif_isconnect() )
- return -1;
-
- WFIFOW(char_fd, 0) = 0x2b0e;
- WFIFOL(char_fd, 2) = id; // account_id of who ask (for answer) -1 if nobody
- memcpy(WFIFOP(char_fd,6), character_name, 24);
- WFIFOW(char_fd, 30) = operation_type; // type of operation
- if (operation_type == 2) {
- WFIFOW(char_fd, 32) = year;
- WFIFOW(char_fd, 34) = month;
- WFIFOW(char_fd, 36) = day;
- WFIFOW(char_fd, 38) = hour;
- WFIFOW(char_fd, 40) = minute;
- WFIFOW(char_fd, 42) = second;
- }
- printf("chrif : sended 0x2b0e\n");
- WFIFOSET(char_fd,44);
-
- return 0;
-}
-
-/*==========================================
- * «•Ê•Ï‰»—v‹
- *------------------------------------------
- */
-int chrif_changesex(int id, int sex) {
- if( char_fd < 1 || session[char_fd] == NULL || !chrif_isconnect() )
- return -1;
-
- WFIFOW(char_fd,0) = 0x2b11;
- WFIFOW(char_fd,2) = 9;
- WFIFOL(char_fd,4) = id;
- WFIFOB(char_fd,8) = sex;
- printf("chrif : sent 0x3000(changesex)\n");
- WFIFOSET(char_fd,9);
- return 0;
-}
-
-/*==========================================
- * Answer after a request about a character name to do some operations (by Yor)
- * Used to answer of chrif_char_ask_name.
- * type of operation:
- * 1: block
- * 2: ban
- * 3: unblock
- * 4: unban
- * 5: changesex
- * type of answer:
- * 0: login-server resquest done
- * 1: player not found
- * 2: gm level too low
- * 3: login-server offline
- *------------------------------------------
- */
-int chrif_char_ask_name_answer(int fd)
-{
- int acc;
- struct map_session_data *sd;
- char output[256];
- char player_name[24];
-
- acc = RFIFOL(fd,2); // account_id of who has asked (-1 if nobody)
- memcpy(player_name, RFIFOP(fd,6), sizeof(player_name));
- player_name[sizeof(player_name)-1] = '\0';
-
- sd = map_id2sd(acc);
- if (acc >= 0 && sd != NULL) {
- if (RFIFOW(fd, 32) == 1) // player not found
- sprintf(output, "The player '%s' doesn't exist.", player_name);
- else {
- switch(RFIFOW(fd, 30)) {
- case 1: // block
- switch(RFIFOW(fd, 32)) {
- case 0: // login-server resquest done
- sprintf(output, "Login-server has been asked to block the player '%s'.", player_name);
- break;
- //case 1: // player not found
- case 2: // gm level too low
- sprintf(output, "Your GM level don't authorise you to block the player '%s'.", player_name);
- break;
- case 3: // login-server offline
- sprintf(output, "Login-server is offline. Impossible to block the the player '%s'.", player_name);
- break;
- }
- break;
- case 2: // ban
- switch(RFIFOW(fd, 32)) {
- case 0: // login-server resquest done
- sprintf(output, "Login-server has been asked to ban the player '%s'.", player_name);
- break;
- //case 1: // player not found
- case 2: // gm level too low
- sprintf(output, "Your GM level don't authorise you to ban the player '%s'.", player_name);
- break;
- case 3: // login-server offline
- sprintf(output, "Login-server is offline. Impossible to ban the the player '%s'.", player_name);
- break;
- }
- break;
- case 3: // unblock
- switch(RFIFOW(fd, 32)) {
- case 0: // login-server resquest done
- sprintf(output, "Login-server has been asked to unblock the player '%s'.", player_name);
- break;
- //case 1: // player not found
- case 2: // gm level too low
- sprintf(output, "Your GM level don't authorise you to unblock the player '%s'.", player_name);
- break;
- case 3: // login-server offline
- sprintf(output, "Login-server is offline. Impossible to unblock the the player '%s'.", player_name);
- break;
- }
- break;
- case 4: // unban
- switch(RFIFOW(fd, 32)) {
- case 0: // login-server resquest done
- sprintf(output, "Login-server has been asked to unban the player '%s'.", player_name);
- break;
- //case 1: // player not found
- case 2: // gm level too low
- sprintf(output, "Your GM level don't authorise you to unban the player '%s'.", player_name);
- break;
- case 3: // login-server offline
- sprintf(output, "Login-server is offline. Impossible to unban the the player '%s'.", player_name);
- break;
- }
- break;
- case 5: // changesex
- switch(RFIFOW(fd, 32)) {
- case 0: // login-server resquest done
- sprintf(output, "Login-server has been asked to change the sex of the player '%s'.", player_name);
- break;
- //case 1: // player not found
- case 2: // gm level too low
- sprintf(output, "Your GM level don't authorise you to change the sex of the player '%s'.", player_name);
- break;
- case 3: // login-server offline
- sprintf(output, "Login-server is offline. Impossible to change the sex of the the player '%s'.", player_name);
- break;
- }
- break;
- }
- }
- if (output[0] != '\0') {
- output[sizeof(output)-1] = '\0';
- clif_displaymessage(sd->fd, output);
- }
- } else
- printf("chrif_char_ask_name_answer failed - player not online.\n");
-
- return 0;
-}
-
-/*==========================================
- * End of GM change (@GM) (modified by Yor)
- *------------------------------------------
- */
-int chrif_changedgm(int fd)
-{
- int acc, level;
- struct map_session_data *sd = NULL;
-
- acc = RFIFOL(fd,2);
- level = RFIFOL(fd,6);
-
- sd = map_id2sd(acc);
-
- if (battle_config.etc_log)
- printf("chrif_changedgm: account: %d, GM level 0 -> %d.\n", acc, level);
- if (sd != NULL) {
- if (level > 0)
- clif_displaymessage(sd->fd, "GM modification success.");
- else
- clif_displaymessage(sd->fd, "Failure of GM modification.");
- }
-
- return 0;
-}
-
-/*==========================================
- * «•Ê•Ï‰»I—¹ (modified by Yor)
- *------------------------------------------
- */
-int chrif_changedsex(int fd)
-{
- int acc, sex, i;
- struct map_session_data *sd;
- struct pc_base_job s_class;
-
- acc = RFIFOL(fd,2);
- sex = RFIFOL(fd,6);
- if (battle_config.etc_log)
- printf("chrif_changedsex %d.\n", acc);
- sd = map_id2sd(acc);
- if (acc > 0) {
- if (sd != NULL && sd->status.sex != sex) {
- s_class = pc_calc_base_job(sd->status.class_);
- if (sd->status.sex == 0) {
- sd->status.sex = 1;
- sd->sex = 1;
- } else if (sd->status.sex == 1) {
- sd->status.sex = 0;
- sd->sex = 0;
- }
- // to avoid any problem with equipment and invalid sex, equipment is unequiped.
- for (i = 0; i < MAX_INVENTORY; i++) {
- if (sd->status.inventory[i].nameid && sd->status.inventory[i].equip)
- pc_unequipitem((struct map_session_data*)sd, i, 2);
- }
- // reset skill of some job
- if (s_class.job == 19 || s_class.job == 4020 || s_class.job == 4042 ||
- s_class.job == 20 || s_class.job == 4021 || s_class.job == 4043) {
- // remove specifical skills of classes 19, 4020 and 4042
- for(i = 315; i <= 322; i++) {
- if (sd->status.skill[i].id > 0 && !sd->status.skill[i].flag) {
- sd->status.skill_point += sd->status.skill[i].lv;
- sd->status.skill[i].id = 0;
- sd->status.skill[i].lv = 0;
- }
- }
- // remove specifical skills of classes 20, 4021 and 4043
- for(i = 323; i <= 330; i++) {
- if (sd->status.skill[i].id > 0 && !sd->status.skill[i].flag) {
- sd->status.skill_point += sd->status.skill[i].lv;
- sd->status.skill[i].id = 0;
- sd->status.skill[i].lv = 0;
- }
- }
- clif_updatestatus(sd, SP_SKILLPOINT);
- // change job if necessary
- if (s_class.job == 20 || s_class.job == 4021 || s_class.job == 4043)
- sd->status.class_ -= 1;
- else if (s_class.job == 19 || s_class.job == 4020 || s_class.job == 4042)
- sd->status.class_ += 1;
- }
- // save character
- chrif_save(sd);
- sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters
- // do same modify in login-server for the account, but no in char-server (it ask again login_id1 to login, and don't remember it)
- clif_displaymessage(sd->fd, "Your sex has been changed (need disconnection by the server)...");
- clif_setwaitclose(sd->fd); // forced to disconnect for the change
- }
- } else {
- if (sd != NULL) {
- printf("chrif_changedsex failed.\n");
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒAƒJƒEƒ“ƒg•Ï”•Û‘¶—v‹
- *------------------------------------------
- */
-int chrif_saveaccountreg2(struct map_session_data *sd)
-{
- int p, j;
- nullpo_retr(-1, sd);
-
- if( char_fd < 1 || session[char_fd] == NULL || !chrif_isconnect() )
- return -1;
-
- p = 8;
- for(j = 0; j < sd->status.account_reg2_num; j++) {
- struct global_reg *reg = &sd->status.account_reg2[j];
- if (reg->str[0] && reg->value != 0) {
- memcpy(WFIFOP(char_fd,p), reg->str, 32);
- WFIFOL(char_fd,p+32) = reg->value;
- p += 36;
- }
- }
- WFIFOW(char_fd,0) = 0x2b10;
- WFIFOW(char_fd,2) = p;
- WFIFOL(char_fd,4) = sd->bl.id;
- WFIFOSET(char_fd,p);
-
- return 0;
-}
-
-/*==========================================
- * ƒAƒJƒEƒ“ƒg•Ï”’Ê’m
- *------------------------------------------
- */
-int chrif_accountreg2(int fd)
-{
- int j, p;
- struct map_session_data *sd;
-
- if ((sd = map_id2sd(RFIFOL(fd,4))) == NULL)
- return 1;
-
- for(p = 8, j = 0; p < RFIFOW(fd,2) && j < ACCOUNT_REG2_NUM; p += 36, j++) {
- memcpy(sd->status.account_reg2[j].str, RFIFOP(fd,p), 32);
- sd->status.account_reg2[j].value = RFIFOL(fd, p + 32);
- }
- sd->status.account_reg2_num = j;
-// printf("chrif: accountreg2\n");
-
- return 0;
-}
-
-/*==========================================
- * —£¥î•ñ“¯Šú—v‹
- *------------------------------------------
- */
-int chrif_divorce(int char_id, int partner_id)
-{
- struct map_session_data *sd = NULL;
-
- if (!char_id || !partner_id)
- return 0;
-
- nullpo_retr(0, sd = map_nick2sd(map_charid2nick(partner_id)));
- if (sd->status.partner_id == char_id) {
- int i;
- //—£¥(‘Š•û‚ÍŠù‚ɃLƒƒƒ‰‚ªÁ‚¦‚Ä‚¢‚锤‚È‚Ì‚Å)
- sd->status.partner_id = 0;
-
- //‘Š•û‚ÌŒ‹¥Žw—Ö‚ð”’D
- for(i = 0; i < MAX_INVENTORY; i++)
- if (sd->status.inventory[i].nameid == WEDDING_RING_M || sd->status.inventory[i].nameid == WEDDING_RING_F)
- pc_delitem(sd, i, 1, 0);
- }
-
- return 0;
-}
-
-/*==========================================
- * Disconnection of a player (account has been deleted in login-server) by [Yor]
- *------------------------------------------
- */
-int chrif_accountdeletion(int fd)
-{
- int acc;
- struct map_session_data *sd;
-
- acc = RFIFOL(fd,2);
- if (battle_config.etc_log)
- printf("chrif_accountdeletion %d.\n", acc);
- sd = map_id2sd(acc);
- if (acc > 0) {
- if (sd != NULL) {
- sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters
- clif_displaymessage(sd->fd, "Your account has been deleted (disconnection)...");
- clif_setwaitclose(sd->fd); // forced to disconnect for the change
- }
- } else {
- if (sd != NULL)
- printf("chrif_accountdeletion failed - player not online.\n");
- }
-
- return 0;
-}
-
-/*==========================================
- * Disconnection of a player (account has been banned of has a status, from login-server) by [Yor]
- *------------------------------------------
- */
-int chrif_accountban(int fd)
-{
- int acc;
- struct map_session_data *sd;
-
- acc = RFIFOL(fd,2);
- if (battle_config.etc_log)
- printf("chrif_accountban %d.\n", acc);
- sd = map_id2sd(acc);
- if (acc > 0) {
- if (sd != NULL) {
- sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters
- if (RFIFOB(fd,6) == 0) { // 0: change of statut, 1: ban
- switch (RFIFOL(fd,7)) { // status or final date of a banishment
- case 1: // 0 = Unregistered ID
- clif_displaymessage(sd->fd, "Your account has 'Unregistered'.");
- break;
- case 2: // 1 = Incorrect Password
- clif_displaymessage(sd->fd, "Your account has an 'Incorrect Password'...");
- break;
- case 3: // 2 = This ID is expired
- clif_displaymessage(sd->fd, "Your account has expired.");
- break;
- case 4: // 3 = Rejected from Server
- clif_displaymessage(sd->fd, "Your account has been rejected from server.");
- break;
- case 5: // 4 = You have been blocked by the GM Team
- clif_displaymessage(sd->fd, "Your account has been blocked by the GM Team.");
- break;
- case 6: // 5 = Your Game's EXE file is not the latest version
- clif_displaymessage(sd->fd, "Your Game's EXE file is not the latest version.");
- break;
- case 7: // 6 = Your are Prohibited to log in until %s
- clif_displaymessage(sd->fd, "Your account has been prohibited to log in.");
- break;
- case 8: // 7 = Server is jammed due to over populated
- clif_displaymessage(sd->fd, "Server is jammed due to over populated.");
- break;
- case 9: // 8 = No MSG (actually, all states after 9 except 99 are No MSG, use only this)
- clif_displaymessage(sd->fd, "Your account has not more authorised.");
- break;
- case 100: // 99 = This ID has been totally erased
- clif_displaymessage(sd->fd, "Your account has been totally erased.");
- break;
- default:
- clif_displaymessage(sd->fd, "Your account has not more authorised.");
- break;
- }
- } else if (RFIFOB(fd,6) == 1) { // 0: change of statut, 1: ban
- time_t timestamp;
- char tmpstr[2048];
- timestamp = (time_t)RFIFOL(fd,7); // status or final date of a banishment
- strcpy(tmpstr, "Your account has been banished until ");
- strftime(tmpstr + strlen(tmpstr), 24, "%d-%m-%Y %H:%M:%S", localtime(&timestamp));
- clif_displaymessage(sd->fd, tmpstr);
- }
- clif_setwaitclose(sd->fd); // forced to disconnect for the change
- }
- } else {
- if (sd != NULL)
- printf("chrif_accountban failed - player not online.\n");
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒLƒƒƒ‰ƒNƒ^[Ø’f’Ê’m
- *------------------------------------------
- */
-int chrif_chardisconnect(struct map_session_data *sd)
-{
- nullpo_retr(-1, sd);
-
- if( char_fd < 1 || session[char_fd] == NULL || !chrif_isconnect() )
- return -1;
-
- WFIFOW(char_fd,0)=0x2b18;
- WFIFOL(char_fd,2)=sd->status.account_id;
- WFIFOL(char_fd,6)=sd->status.char_id;
- WFIFOSET(char_fd,10);
- //printf("chrif: char disconnect: %d %s\n",sd->bl.id,sd->status.name);
- return 0;
-
-}
-
-/*==========================================
- * Receiving GM accounts and their levels from char-server by [Yor]
- *------------------------------------------
- */
-int chrif_recvgmaccounts(int fd)
-{
- sprintf(tmp_output,"From login-server: receiving information of '"CL_WHITE"%d"CL_RESET"' GM accounts.\n", pc_read_gm_account(fd));
- ShowInfo(tmp_output);
- memset(tmp_output,'\0',sizeof(tmp_output));
- return 0;
-}
-
-/*==========================================
- * Request to reload GM accounts and their levels: send to char-server by [Yor]
- *------------------------------------------
- */
-int chrif_reloadGMdb(void)
-{
- if( char_fd < 1 || session[char_fd] == NULL || !chrif_isconnect() )
- return -1;
-
- WFIFOW(char_fd,0) = 0x2af7;
- WFIFOSET(char_fd, 2);
-
- return 0;
-}
-
-/*==========================================
- * Send rates and motd to char server [Wizputer]
- *------------------------------------------
- */
- int chrif_ragsrvinfo(int base_rate, int job_rate, int drop_rate)
-{
- char buf[256];
- FILE *fp;
- int i;
-
- if( char_fd < 1 || session[char_fd] == NULL || !chrif_isconnect() )
- return -1;
-
- WFIFOW(char_fd,0) = 0x2b16;
- WFIFOW(char_fd,2) = base_rate;
- WFIFOW(char_fd,4) = job_rate;
- WFIFOW(char_fd,6) = drop_rate;
-
- if ((fp = fopen(motd_txt, "r")) != NULL) {
- if (fgets(buf, 250, fp) != NULL) {
- for(i = 0; buf[i]; i++) {
- if (buf[i] == '\r' || buf[i] == '\n') {
- buf[i] = 0;
- break;
- }
- }
- WFIFOW(char_fd,8) = sizeof(buf) + 10;
- memcpy(WFIFOP(char_fd,10), buf, sizeof(buf));
- }
- fclose(fp);
- } else {
- WFIFOW(char_fd,8) = sizeof(buf) + 10;
- memcpy(WFIFOP(char_fd,10), buf, sizeof(buf));
- }
- WFIFOSET(char_fd,WFIFOW(char_fd,8));
-
- return 0;
-}
-
-/*=========================================
- * Tell char-server charcter disconnected [Wizputer]
- *-----------------------------------------
- */
-
-int chrif_char_offline(struct map_session_data *sd)
-{
- if( char_fd < 1 || session[char_fd] == NULL || !chrif_isconnect() )
- return -1;
-
- WFIFOW(char_fd,0) = 0x2b17;
- WFIFOL(char_fd,2) = sd->status.char_id;
- WFIFOL(char_fd,6) = sd->status.account_id;
- WFIFOSET(char_fd,10);
-
- return 0;
-}
-
-/*=========================================
- * Tell char-server to reset all chars offline [Wizputer]
- *-----------------------------------------
- */
-int chrif_flush_fifo(void) {
- if( char_fd < 1 || session[char_fd] == NULL || !chrif_isconnect() )
- return -1;
-
- set_nonblocking(char_fd, 0);
- flush_fifos();
- set_nonblocking(char_fd, 1);
-
- return 0;
-}
-
-/*=========================================
- * Tell char-server to reset all chars offline [Wizputer]
- *-----------------------------------------
- */
-int chrif_char_reset_offline(void) {
- if( char_fd < 1 || session[char_fd] == NULL || !chrif_isconnect() )
- return -1;
-
- WFIFOW(char_fd,0) = 0x2b18;
- WFIFOSET(char_fd,2);
-
- return 0;
-}
-
-/*=========================================
- * Tell char-server charcter is online [Wizputer]
- *-----------------------------------------
- */
-
-int chrif_char_online(struct map_session_data *sd)
-{
- if( char_fd < 1 || session[char_fd] == NULL || !chrif_isconnect() )
- return -1;
-
- WFIFOW(char_fd,0) = 0x2b19;
- WFIFOL(char_fd,2) = sd->status.char_id;
- WFIFOL(char_fd,6) = sd->status.account_id;
- WFIFOSET(char_fd,10);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_disconnect_sub(struct map_session_data* sd,va_list va) {
- clif_authfail_fd(sd->fd,1);
- map_quit(sd);
- return 0;
-}
-
-int chrif_disconnect(int fd) {
- if(fd == char_fd) {
- char_fd = 0;
- sprintf(tmp_output,"Map Server disconnected from Char Server.\n\n");
- ShowWarning(tmp_output);
- clif_foreachclient(chrif_disconnect_sub);
- chrif_connected = 0;
- // ‘¼‚Ìmap ŽI‚̃f[ƒ^‚ðÁ‚·
- map_eraseallipport();
- }
- close(fd);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_parse(int fd)
-{
- int packet_len, cmd;
- // only char-server can have an access to here.
- // so, if it isn't the char-server, we disconnect the session (fd != char_fd).
- if (fd != char_fd || session[fd]->eof) {
- if (fd == char_fd && chrif_connected == 1) {
- chrif_disconnect (fd);
-// check_connect_char_server(0, 0, 0, 0);
- }
- close(fd);
- delete_session(fd);
- return 0;
- }
-
- while (RFIFOREST(fd) >= 2) {
- cmd = RFIFOW(fd,0);
- if (cmd < 0x2af8 || cmd >= 0x2af8 + (sizeof(packet_len_table) / sizeof(packet_len_table[0])) ||
- packet_len_table[cmd-0x2af8] == 0) {
-
- int r = intif_parse(fd); // intif‚É“n‚·
-
- if (r == 1) continue; // intif‚ň—‚µ‚½
- if (r == 2) return 0; // intif‚ň—‚µ‚½‚ªAƒf[ƒ^‚ª‘«‚è‚È‚¢
-
- session[fd]->eof = 1;
- return 0;
- }
- packet_len = packet_len_table[cmd-0x2af8];
- if (packet_len == -1) {
- if (RFIFOREST(fd) < 4)
- return 0;
- packet_len = RFIFOW(fd,2);
- }
- if (RFIFOREST(fd) < packet_len)
- return 0;
-
- switch(cmd) {
- case 0x2af9: chrif_connectack(fd); break;
- case 0x2afb: chrif_sendmapack(fd); break;
- case 0x2afd: pc_authok(RFIFOL(fd,4), RFIFOL(fd,8), (time_t)RFIFOL(fd,12), (struct mmo_charstatus*)RFIFOP(fd,16)); break;
- case 0x2afe: pc_authfail(RFIFOL(fd,2)); break;
- case 0x2b00: map_setusers(fd); break;
- case 0x2b03: clif_charselectok(RFIFOL(fd,2)); break;
- case 0x2b04: chrif_recvmap(fd); break;
- case 0x2b06: chrif_changemapserverack(fd); break;
- case 0x2b09: map_addchariddb(RFIFOL(fd,2), (char*)RFIFOP(fd,6)); break;
- case 0x2b0b: chrif_changedgm(fd); break;
- case 0x2b0d: chrif_changedsex(fd); break;
- case 0x2b0f: chrif_char_ask_name_answer(fd); break;
- case 0x2b11: chrif_accountreg2(fd); break;
- case 0x2b12: chrif_divorce(RFIFOL(fd,2), RFIFOL(fd,6)); break;
- case 0x2b13: chrif_accountdeletion(fd); break;
- case 0x2b14: chrif_accountban(fd); break;
- case 0x2b15: chrif_recvgmaccounts(fd); break;
-
- default:
- if (battle_config.error_log)
- printf("chrif_parse : unknown packet %d %d\n", fd, RFIFOW(fd,0));
- session[fd]->eof = 1;
- return 0;
- }
- RFIFOSKIP(fd, packet_len);
- }
-
- return 0;
-}
-
-/*==========================================
- * timerŠÖ”
- * ¡‚±‚ÌmapŽI‚ÉŒq‚ª‚Á‚Ä‚¢‚éƒNƒ‰ƒCƒAƒ“ƒgl”‚ðcharŽI‚Ö‘—‚é
- *------------------------------------------
- */
-int send_users_tochar(int tid, unsigned int tick, int id, int data) {
- int users = 0, i;
- struct map_session_data *sd;
-
- if( char_fd < 1 || session[char_fd] == NULL || !chrif_isconnect() ) // Thanks to Toster
- return 0;
-
- WFIFOW(char_fd,0) = 0x2aff;
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (sd = (struct map_session_data*)session[i]->session_data) && sd->state.auth &&
- !((battle_config.hide_GM_session || (sd->status.option & OPTION_HIDE)) && pc_isGM(sd))) {
- WFIFOL(char_fd,6+4*users) = sd->status.char_id;
- users++;
- }
- }
- WFIFOW(char_fd,2) = 6 + 4 * users;
- WFIFOW(char_fd,4) = users;
- WFIFOSET(char_fd,6+4*users);
-
- return 0;
-}
-
-/*==========================================
- * timerŠÖ”
- * charŽI‚Æ‚ÌÚ‘±‚ðŠm”F‚µA‚à‚µØ‚ê‚Ä‚¢‚½‚çÄ“xÚ‘±‚·‚é
- *------------------------------------------
- */
-int check_connect_char_server(int tid, unsigned int tick, int id, int data) {
- static int displayed = 0;
- if (char_fd <= 0 || session[char_fd] == NULL) {
- if (!displayed) {
- ShowStatus("Attempting to connect to Char Server. Please wait.\n");
- displayed = 1;
- }
- chrif_state = 0;
- char_fd = make_connection(char_ip, char_port);
- session[char_fd]->func_parse = chrif_parse;
- realloc_fifo(char_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
-
- chrif_connect(char_fd);
- chrif_connected = chrif_isconnect();
-#ifndef TXT_ONLY
- srvinfo = 0;
- } else {
- if (srvinfo == 0) {
- chrif_ragsrvinfo(battle_config.base_exp_rate, battle_config.job_exp_rate, battle_config.item_rate_common);
- srvinfo = 1;
- }
-#endif /* not TXT_ONLY */
- }
- if (chrif_isconnect()) displayed = 0;
- return 0;
-}
-/*==========================================
- * I—¹
- *------------------------------------------
- */
-int do_final_chrif(void)
-{
- delete_session(char_fd);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int do_init_chrif(void) {
- add_timer_func_list(check_connect_char_server, "check_connect_char_server");
- add_timer_func_list(send_users_tochar, "send_users_tochar");
- add_timer_interval(gettick() + 1000, check_connect_char_server, 0, 0, 10 * 1000);
- add_timer_interval(gettick() + 1000, send_users_tochar, 0, 0, 5 * 1000);
-
- return 0;
-}
diff --git a/src/map/chrif.h b/src/map/chrif.h
deleted file mode 100644
index f2b258ea9..000000000
--- a/src/map/chrif.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// $Id: chrif.h,v 1.3 2004/09/25 11:39:17 MouseJstr Exp $
-#ifndef _CHRIF_H_
-#define _CHRIF_H_
-
-void chrif_setuserid(char*);
-void chrif_setpasswd(char*);
-void chrif_setip(char*);
-void chrif_setport(int);
-
-int chrif_isconnect(void);
-
-extern int chrif_connected;
-
-int chrif_authreq(struct map_session_data *);
-int chrif_save(struct map_session_data*);
-int chrif_charselectreq(struct map_session_data *);
-
-int chrif_changemapserver(struct map_session_data *sd,char *name,int x,int y,int ip,short port);
-
-int chrif_searchcharid(int char_id);
-int chrif_changegm(int id,const char *pass,int len);
-int chrif_changeemail(int id, const char *actual_email, const char *new_email);
-int chrif_char_ask_name(int id, char * character_name, short operation_type, int year, int month, int day, int hour, int minute, int second);
-int chrif_saveaccountreg2(struct map_session_data *sd);
-int chrif_reloadGMdb(void);
-int chrif_ragsrvinfo(int base_rate,int job_rate, int drop_rate);
-int chrif_char_offline(struct map_session_data *sd);
-int chrif_char_reset_offline(void);
-int chrif_char_online(struct map_session_data *sd);
-int chrif_changesex(int id, int sex);
-int chrif_chardisconnect(struct map_session_data *sd);
-int check_connect_char_server(int tid, unsigned int tick, int id, int data);
-
-int do_final_chrif(void);
-int do_init_chrif(void);
-
-int chrif_flush_fifo(void);
-
-#endif
diff --git a/src/map/clif.c b/src/map/clif.c
deleted file mode 100644
index 70d7cdaa9..000000000
--- a/src/map/clif.c
+++ /dev/null
@@ -1,11474 +0,0 @@
-// $Id: clif.c 2200 2004-11-07 11:49:58Z Yor $
-
-#define DUMP_UNKNOWN_PACKET 1
-#define DUMP_ALL_PACKETS 0
-
-#include <stdio.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#ifdef __WIN32
-#define __USE_W32_SOCKETS
-#include <windows.h>
-#else
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#endif
-#include <time.h>
-
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/malloc.h"
-#include "../common/version.h"
-#include "../common/nullpo.h"
-#include "../common/showmsg.h"
-
-#include "map.h"
-#include "chrif.h"
-#include "clif.h"
-#include "pc.h"
-#include "status.h"
-#include "npc.h"
-#include "itemdb.h"
-#include "chat.h"
-#include "trade.h"
-#include "storage.h"
-#include "script.h"
-#include "skill.h"
-#include "atcommand.h"
-#include "charcommand.h"
-#include "intif.h"
-#include "battle.h"
-#include "mob.h"
-#include "party.h"
-#include "guild.h"
-#include "vending.h"
-#include "pet.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-#define STATE_BLIND 0x10
-
-struct Clif_Config clif_config;
-struct packet_db packet_db[MAX_PACKET_VER + 1][MAX_PACKET_DB];
-
-#define USE_PACKET_DB(sd) \
- clif_config.enable_packet_db && sd->packet_ver == clif_config.packet_db_ver
-
-#define IS_PACKET_DB_VER(cmd) \
- cmd == clif_config.connect_cmd
-
-static const int packet_len_table[MAX_PACKET_DB] = {
- 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-//#0x0040
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 55, 17, 3, 37, 46, -1, 23, -1, 3,108, 3, 2,
-#if PACKETVER < 2
- 3, 28, 19, 11, 3, -1, 9, 5, 52, 51, 56, 58, 41, 2, 6, 6,
-#else // 78-7b ‹T“‡ˆÈ~ lv99ƒGƒtƒFƒNƒg—p
- 3, 28, 19, 11, 3, -1, 9, 5, 54, 53, 58, 60, 41, 2, 6, 6,
-#endif
-//#0x0080
- 7, 3, 2, 2, 2, 5, 16, 12, 10, 7, 29, 2, -1, -1, -1, 0, // 0x8b changed to 2 (was 23)
- 7, 22, 28, 2, 6, 30, -1, -1, 3, -1, -1, 5, 9, 17, 17, 6,
- 23, 6, 6, -1, -1, -1, -1, 8, 7, 6, 7, 4, 7, 0, -1, 6,
- 8, 8, 3, 3, -1, 6, 6, -1, 7, 6, 2, 5, 6, 44, 5, 3,
-//#0x00C0
- 7, 2, 6, 8, 6, 7, -1, -1, -1, -1, 3, 3, 6, 3, 2, 27, // 0xcd change to 3 (was 6)
- 3, 4, 4, 2, -1, -1, 3, -1, 6, 14, 3, -1, 28, 29, -1, -1,
- 30, 30, 26, 2, 6, 26, 3, 3, 8, 19, 5, 2, 3, 2, 2, 2,
- 3, 2, 6, 8, 21, 8, 8, 2, 2, 26, 3, -1, 6, 27, 30, 10,
-
-//#0x0100
- 2, 6, 6, 30, 79, 31, 10, 10, -1, -1, 4, 6, 6, 2, 11, -1,
- 10, 39, 4, 10, 31, 35, 10, 18, 2, 13, 15, 20, 68, 2, 3, 16,
- 6, 14, -1, -1, 21, 8, 8, 8, 8, 8, 2, 2, 3, 4, 2, -1,
- 6, 86, 6, -1, -1, 7, -1, 6, 3, 16, 4, 4, 4, 6, 24, 26,
-//#0x0140
- 22, 14, 6, 10, 23, 19, 6, 39, 8, 9, 6, 27, -1, 2, 6, 6,
- 110, 6, -1, -1, -1, -1, -1, 6, -1, 54, 66, 54, 90, 42, 6, 42,
- -1, -1, -1, -1, -1, 30, -1, 3, 14, 3, 30, 10, 43, 14,186,182,
- 14, 30, 10, 3, -1, 6,106, -1, 4, 5, 4, -1, 6, 7, -1, -1,
-//#0x0180
- 6, 3,106, 10, 10, 34, 0, 6, 8, 4, 4, 4, 29, -1, 10, 6,
-#if PACKETVER < 1
- 90, 86, 24, 6, 30,102, 8, 4, 8, 4, 14, 10, -1, 6, 2, 6,
-#else // 196 comodoˆÈ~ ó‘Ô•\Ž¦ƒAƒCƒRƒ“—p
- 90, 86, 24, 6, 30,102, 9, 4, 8, 4, 14, 10, -1, 6, 2, 6,
-#endif
- 3, 3, 35, 5, 11, 26, -1, 4, 4, 6, 10, 12, 6, -1, 4, 4,
- 11, 7, -1, 67, 12, 18,114, 6, 3, 6, 26, 26, 26, 26, 2, 3,
-//#0x01C0, Set 0x1d5=-1
- 2, 14, 10, -1, 22, 22, 4, 2, 13, 97, 0, 9, 9, 30, 6, 28,
- 8, 14, 10, 35, 6, -1, 4, 11, 54, 53, 60, 2, -1, 47, 33, 6,
- 30, 8, 34, 14, 2, 6, 26, 2, 28, 81, 6, 10, 26, 2, -1, -1,
- -1, -1, 20, 10, 32, 9, 34, 14, 2, 6, 48, 56, -1, 4, 5, 10,
-//#0x200
- 26, -1, 26, 10, 18, 26, 11, 34, 14, 36, 10, 0, 0, -1, 24, 0, // 0x20c change to 0 (was 19)
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0
-};
-
-// local define
-enum {
- ALL_CLIENT,
- ALL_SAMEMAP,
- AREA,
- AREA_WOS,
- AREA_WOC,
- AREA_WOSC,
- AREA_CHAT_WOC,
- CHAT,
- CHAT_WOS,
- PARTY,
- PARTY_WOS,
- PARTY_SAMEMAP,
- PARTY_SAMEMAP_WOS,
- PARTY_AREA,
- PARTY_AREA_WOS,
- GUILD,
- GUILD_WOS,
- GUILD_SAMEMAP, // [Valaris]
- GUILD_SAMEMAP_WOS,
- GUILD_AREA,
- GUILD_AREA_WOS, // end additions [Valaris]
- SELF
-};
-
-#define WBUFPOS(p,pos,x,y) { unsigned char *__p = (p); __p+=(pos); __p[0] = (x)>>2; __p[1] = ((x)<<6) | (((y)>>4)&0x3f); __p[2] = (y)<<4; }
-#define WBUFPOS2(p,pos,x0,y0,x1,y1) { unsigned char *__p = (p); __p+=(pos); __p[0] = (x0)>>2; __p[1] = ((x0)<<6) | (((y0)>>4)&0x3f); __p[2] = ((y0)<<4) | (((x1)>>6)&0x0f); __p[3]=((x1)<<2) | (((y1)>>8)&0x03); __p[4]=(y1); }
-
-#define WFIFOPOS(fd,pos,x,y) { WBUFPOS (WFIFOP(fd,pos),0,x,y); }
-#define WFIFOPOS2(fd,pos,x0,y0,x1,y1) { WBUFPOS2(WFIFOP(fd,pos),0,x0,y0,x1,y1); }
-
-static char map_ip_str[16];
-static in_addr_t map_ip;
-static in_addr_t bind_ip = INADDR_ANY;
-static int map_port = 5121;
-int map_fd;
-char talkie_mes[80];
-
-/*==========================================
- * mapŽI‚ÌipÝ’è
- *------------------------------------------
- */
-void clif_setip(char *ip)
-{
- memcpy(map_ip_str, ip, 16);
- map_ip = inet_addr(map_ip_str);
-}
-
-void clif_setbindip(char *ip)
-{
- bind_ip = inet_addr(ip);
-}
-
-/*==========================================
- * mapŽI‚ÌportÝ’è
- *------------------------------------------
- */
-void clif_setport(int port)
-{
- map_port = port;
-}
-
-/*==========================================
- * mapŽI‚Ìip“Ç‚Ýo‚µ
- *------------------------------------------
- */
-in_addr_t clif_getip(void)
-{
- return map_ip;
-}
-
-/*==========================================
- * mapŽI‚Ìport“Ç‚Ýo‚µ
- *------------------------------------------
- */
-int clif_getport(void)
-{
- return map_port;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_countusers(void)
-{
- int users = 0, i;
- struct map_session_data *sd;
-
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = (struct map_session_data*)session[i]->session_data) && sd && sd->state.auth &&
- !(battle_config.hide_GM_session && pc_isGM(sd)))
- users++;
- }
- return users;
-}
-
-/*==========================================
- * ‘S‚Ä‚Ìclient‚ɑ΂µ‚Äfunc()ŽÀs
- *------------------------------------------
- */
-int clif_foreachclient(int (*func)(struct map_session_data*, va_list),...)
-{
- int i;
- va_list ap;
- struct map_session_data *sd;
-
- va_start(ap,func);
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = (struct map_session_data*)session[i]->session_data) && sd && sd->state.auth)
- func(sd, ap);
- }
- va_end(ap);
- return 0;
-}
-
-/*==========================================
- * clif_send‚ÅAREA*Žw’莞—p
- *------------------------------------------
- */
-int clif_send_sub(struct block_list *bl, va_list ap)
-{
- struct block_list *src_bl;
- struct map_session_data *sd;
- unsigned char *buf;
- int len, type;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, sd = (struct map_session_data *)bl);
-
- buf = va_arg(ap,unsigned char*);
- len = va_arg(ap,int);
- nullpo_retr(0, src_bl = va_arg(ap,struct block_list*));
- type = va_arg(ap,int);
-
- switch(type) {
- case AREA_WOS:
- if (bl == src_bl)
- return 0;
- break;
- case AREA_WOC:
- if (sd->chatID || bl == src_bl)
- return 0;
- break;
- case AREA_WOSC:
- {
- struct map_session_data *ssd = (struct map_session_data *)src_bl;
- if (ssd && sd->chatID && sd->chatID == ssd->chatID)
- return 0;
- }
- break;
- }
-
- if (session[sd->fd] != NULL) {
- if (WFIFOP(sd->fd,0) == buf) {
- printf("WARNING: Invalid use of clif_send function\n");
- printf(" Packet x%4x use a WFIFO of a player instead of to use a buffer.\n", WBUFW(buf,0));
- printf(" Please correct your code.\n");
- // don't send to not move the pointer of the packet for next sessions in the loop
- } else {
- if (packet_db[sd->packet_ver][RBUFW(buf,0)].len) { // packet must exist for the client version
- memcpy(WFIFOP(sd->fd,0), buf, len);
- WFIFOSET(sd->fd,len);
- }
- }
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_send(unsigned char *buf, int len, struct block_list *bl, int type) {
- int i;
- struct map_session_data *sd = NULL;
- struct party *p = NULL;
- struct guild *g = NULL;
- int x0 = 0, x1 = 0, y0 = 0, y1 = 0;
-
- if (type != ALL_CLIENT) {
- nullpo_retr(0, bl);
- }
- if (bl && bl->type == BL_PC) {
- nullpo_retr (0, sd=(struct map_session_data*)bl);
- }
-
- switch(type) {
- case ALL_CLIENT: // ‘SƒNƒ‰ƒCƒAƒ“ƒg‚É‘—M
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = (struct map_session_data*)session[i]->session_data) != NULL && sd->state.auth) {
- if (packet_db[sd->packet_ver][RBUFW(buf,0)].len) { // packet must exist for the client version
- memcpy(WFIFOP(i,0), buf, len);
- WFIFOSET(i,len);
- }
- }
- }
- break;
- case ALL_SAMEMAP: // “¯‚¶ƒ}ƒbƒv‚Ì‘SƒNƒ‰ƒCƒAƒ“ƒg‚É‘—M
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = (struct map_session_data*)session[i]->session_data) != NULL && sd->state.auth && sd->bl.m == bl->m) {
- if (packet_db[sd->packet_ver][RBUFW(buf,0)].len) { // packet must exist for the client version
- memcpy(WFIFOP(i,0), buf, len);
- WFIFOSET(i,len);
- }
- }
- }
- break;
- case AREA:
- case AREA_WOS:
- case AREA_WOC:
- case AREA_WOSC:
- map_foreachinarea(clif_send_sub, bl->m, bl->x-AREA_SIZE, bl->y-AREA_SIZE, bl->x+AREA_SIZE, bl->y+AREA_SIZE, BL_PC, buf, len, bl, type);
- break;
- case AREA_CHAT_WOC:
- map_foreachinarea(clif_send_sub, bl->m, bl->x-(AREA_SIZE-5), bl->y-(AREA_SIZE-5), bl->x+(AREA_SIZE-5), bl->y+(AREA_SIZE-5), BL_PC, buf, len, bl, AREA_WOC);
- break;
- case CHAT:
- case CHAT_WOS:
- {
- struct chat_data *cd;
- if (sd) {
- cd = (struct chat_data*)map_id2bl(sd->chatID);
- } else if (bl->type == BL_CHAT) {
- cd = (struct chat_data*)bl;
- } else if (bl->type != BL_CHAT)
- break;
- if (cd == NULL)
- break;
- for(i = 0; i < cd->users; i++) {
- if (type == CHAT_WOS && cd->usersd[i] == sd)
- continue;
- if (packet_db[cd->usersd[i]->packet_ver][RBUFW(buf,0)].len) { // packet must exist for the client version
- if (cd->usersd[i]->fd >=0 && session[cd->usersd[i]->fd]) // Added check to see if session exists [PoW]
- memcpy(WFIFOP(cd->usersd[i]->fd,0), buf, len);
- WFIFOSET(cd->usersd[i]->fd,len);
- }
- }
- }
- break;
-
- case PARTY_AREA: // “¯‚¶‰æ–Ê“à‚Ì‘Sƒp[ƒeƒB[ƒƒ“ƒo‚É‘—M
- case PARTY_AREA_WOS: // Ž©•ªˆÈŠO‚Ì“¯‚¶‰æ–Ê“à‚Ì‘Sƒp[ƒeƒB[ƒƒ“ƒo‚É‘—M
- x0 = bl->x - AREA_SIZE;
- y0 = bl->y - AREA_SIZE;
- x1 = bl->x + AREA_SIZE;
- y1 = bl->y + AREA_SIZE;
- case PARTY: // ‘Sƒp[ƒeƒB[ƒƒ“ƒo‚É‘—M
- case PARTY_WOS: // Ž©•ªˆÈŠO‚Ì‘Sƒp[ƒeƒB[ƒƒ“ƒo‚É‘—M
- case PARTY_SAMEMAP: // “¯‚¶ƒ}ƒbƒv‚Ì‘Sƒp[ƒeƒB[ƒƒ“ƒo‚É‘—M
- case PARTY_SAMEMAP_WOS: // Ž©•ªˆÈŠO‚Ì“¯‚¶ƒ}ƒbƒv‚Ì‘Sƒp[ƒeƒB[ƒƒ“ƒo‚É‘—M
- if (sd) {
- if (sd->partyspy > 0) {
- p = party_search(sd->partyspy);
- } else if (sd->status.party_id > 0) {
- p = party_search(sd->status.party_id);
- }
- }
- if (p) {
- for(i=0;i<MAX_PARTY;i++){
- if ((sd = p->member[i].sd) != NULL) {
- if ((session[sd->fd] == NULL) || (session[sd->fd]->session_data == NULL))
- continue;
- if (sd->bl.id == bl->id && (type == PARTY_WOS ||
- type == PARTY_SAMEMAP_WOS || type == PARTY_AREA_WOS))
- continue;
- if (type != PARTY && type != PARTY_WOS && bl->m != sd->bl.m) // ƒ}ƒbƒvƒ`ƒFƒbƒN
- continue;
- if ((type == PARTY_AREA || type == PARTY_AREA_WOS) &&
- (sd->bl.x < x0 || sd->bl.y < y0 ||
- sd->bl.x > x1 || sd->bl.y > y1))
- continue;
- if (packet_db[sd->packet_ver][RBUFW(buf,0)].len) { // packet must exist for the client version
- memcpy(WFIFOP(sd->fd,0), buf, len);
- WFIFOSET(sd->fd,len);
- }
-// if(battle_config.etc_log)
-// printf("send party %d %d %d\n",p->party_id,i,flag)
-
- }
- }
- for (i = 0; i < fd_max; i++){
- if (session[i] && (sd = (struct map_session_data*)session[i]->session_data) != NULL && sd->state.auth) {
- if (sd->partyspy == p->party_id) {
- if (packet_db[sd->packet_ver][RBUFW(buf,0)].len) { // packet must exist for the client version
- memcpy(WFIFOP(sd->fd,0), buf, len);
- WFIFOSET(sd->fd,len);
- }
- }
- }
- }
- }
- break;
- case SELF:
- if (sd && packet_db[sd->packet_ver][RBUFW(buf,0)].len) { // packet must exist for the client version
- memcpy(WFIFOP(sd->fd,0), buf, len);
- WFIFOSET(sd->fd,len);
- }
- break;
-
-/* New definitions for guilds [Valaris] */
-
- case GUILD_AREA:
- case GUILD_AREA_WOS:
- x0 = bl->x - AREA_SIZE;
- y0 = bl->y - AREA_SIZE;
- x1 = bl->x + AREA_SIZE;
- y1 = bl->y + AREA_SIZE;
- case GUILD:
- case GUILD_WOS:
- if (sd) { // guildspy [Syrus22]
- if (sd->guildspy > 0) {
- g = guild_search(sd->guildspy);
- } else if (sd->status.guild_id > 0) {
- g = guild_search(sd->status.guild_id);
- }
- }
- if (g) {
- for(i = 0; i < g->max_member; i++) {
- if ((sd = g->member[i].sd) != NULL) {
- if (type == GUILD_WOS && sd->bl.id == bl->id)
- continue;
- if (sd->packet_ver > MAX_PACKET_VER)
- continue;
- if (packet_db[sd->packet_ver][RBUFW(buf,0)].len) { // packet must exist for the client version
- memcpy(WFIFOP(sd->fd,0), buf, len);
- WFIFOSET(sd->fd,len);
- }
- }
- }
- for (i = 0; i < fd_max; i++){
- if (session[i] && (sd = (struct map_session_data*)session[i]->session_data) != NULL && sd->state.auth) {
- if (sd->guildspy == g->guild_id) {
- if (packet_db[sd->packet_ver][RBUFW(buf,0)].len) { // packet must exist for the client version
- memcpy(WFIFOP(sd->fd,0), buf, len);
- WFIFOSET(sd->fd,len);
- }
- }
- }
- }
- }
- break;
- case GUILD_SAMEMAP:
- case GUILD_SAMEMAP_WOS:
- if (sd && sd->status.guild_id > 0) {
- g = guild_search(sd->status.guild_id);
- }
- if (g) {
- for(i = 0; i < g->max_member; i++) {
- if ((sd = g->member[i].sd) != NULL) {
- if (sd->bl.id == bl->id && (type == GUILD_WOS ||
- type == GUILD_SAMEMAP_WOS || type == GUILD_AREA_WOS))
- continue;
- if (type != GUILD && type != GUILD_WOS && bl->m != sd->bl.m) // ƒ}ƒbƒvƒ`ƒFƒbƒN
- continue;
- if ((type == GUILD_AREA || type == GUILD_AREA_WOS) &&
- (sd->bl.x < x0 || sd->bl.y < y0 ||
- sd->bl.x > x1 || sd->bl.y > y1))
- continue;
- if (packet_db[sd->packet_ver][RBUFW(buf,0)].len) { // packet must exist for the client version
- memcpy(WFIFOP(sd->fd,0), buf, len);
- WFIFOSET(sd->fd,len);
- }
- }
- }
- }
- break;
-/* End [Valaris] */
-
- default:
- if (battle_config.error_log)
- printf("clif_send ‚Ü‚¾ì‚Á‚Ä‚È‚¢‚æ[\n");
- return -1;
- }
-
- return 0;
-}
-
-//
-// ƒpƒPƒbƒgì‚Á‚Ä‘—M
-//
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_authok(struct map_session_data *sd) {
- int fd;
-
- nullpo_retr(0, sd);
-
- if (!sd)
- return 0;
-
- if (!sd->fd)
- return 0;
-
- fd = sd->fd;
-
- WFIFOW(fd, 0) = 0x73;
- WFIFOL(fd, 2) = gettick();
- WFIFOPOS(fd, 6, sd->bl.x, sd->bl.y);
- WFIFOB(fd, 9) = 5;
- WFIFOB(fd,10) = 5;
- WFIFOSET(fd,packet_len_table[0x73]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_authfail_fd(int fd, int type) {
- if (!fd || !session[fd])
- return 0;
-
- WFIFOW(fd,0) = 0x81;
- WFIFOL(fd,2) = type;
- WFIFOSET(fd,packet_len_table[0x81]);
-
- clif_setwaitclose(fd);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_charselectok(int id) {
- struct map_session_data *sd;
- int fd;
-
- if ((sd = map_id2sd(id)) == NULL)
- return 1;
-
- if (!sd->fd)
- return 1;
-
- fd = sd->fd;
- WFIFOW(fd,0) = 0xb3;
- WFIFOB(fd,2) = 1;
- WFIFOSET(fd,packet_len_table[0xb3]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int clif_set009e(struct flooritem_data *fitem,unsigned char *buf) {
- int view;
-
- nullpo_retr(0, fitem);
-
- //009e <ID>.l <name ID>.w <identify flag>.B <X>.w <Y>.w <subX>.B <subY>.B <amount>.w
- WBUFW(buf, 0) = 0x9e;
- WBUFL(buf, 2) = fitem->bl.id;
- if ((view = itemdb_viewid(fitem->item_data.nameid)) > 0)
- WBUFW(buf, 6) = view;
- else
- WBUFW(buf, 6) = fitem->item_data.nameid;
- WBUFB(buf, 8) = fitem->item_data.identify;
- WBUFW(buf, 9) = fitem->bl.x;
- WBUFW(buf,11) = fitem->bl.y;
- WBUFB(buf,13) = fitem->subx;
- WBUFB(buf,14) = fitem->suby;
- WBUFW(buf,15) = fitem->item_data.amount;
-
- return packet_len_table[0x9e];
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_dropflooritem(struct flooritem_data *fitem) {
- unsigned char buf[64];
-
- nullpo_retr(0, fitem);
-
- if (fitem->item_data.nameid <= 0)
- return 0;
- clif_set009e(fitem, buf);
- clif_send(buf, packet_len_table[0x9e], &fitem->bl, AREA);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_clearflooritem(struct flooritem_data *fitem, int fd) {
- unsigned char buf[16];
-
- nullpo_retr(0, fitem);
-
- WBUFW(buf,0) = 0xa1;
- WBUFL(buf,2) = fitem->bl.id;
-
- if (fd == 0) {
- clif_send(buf, packet_len_table[0xa1], &fitem->bl, AREA);
- } else {
- memcpy(WFIFOP(fd,0), buf, 6);
- WFIFOSET(fd,packet_len_table[0xa1]);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_clearchar(struct block_list *bl, int type) {
- unsigned char buf[16];
-
- nullpo_retr(0, bl);
-
- WBUFW(buf,0) = 0x80;
- WBUFL(buf,2) = bl->id;
- if (type == 9) {
- WBUFB(buf,6) = 0;
- clif_send(buf, packet_len_table[0x80], bl, AREA);
- } else {
- WBUFB(buf,6) = type;
- clif_send(buf, packet_len_table[0x80], bl, type == 1 ? AREA : AREA_WOS);
- }
-
- return 0;
-}
-
-static int clif_clearchar_delay_sub(int tid, unsigned int tick, int id, int data) {
- struct block_list *bl = (struct block_list *)id;
-
- clif_clearchar(bl,data);
- map_freeblock(bl);
-
- return 0;
-}
-
-int clif_clearchar_delay(unsigned int tick, struct block_list *bl, int type) {
- struct block_list *tmpbl;
-
- tmpbl = (struct block_list*)aCalloc(1, sizeof(struct block_list));
-
- memcpy(tmpbl, bl, sizeof(struct block_list));
- add_timer(tick, clif_clearchar_delay_sub, (int)tmpbl, type);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_clearchar_id(int id, int type, int fd) {
- unsigned char buf[16];
-
- WBUFW(buf,0) = 0x80;
- WBUFL(buf,2) = id;
- WBUFB(buf,6) = type;
- memcpy(WFIFOP(fd,0), buf, 7);
- WFIFOSET(fd, packet_len_table[0x80]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int clif_set0078(struct map_session_data *sd, unsigned char *buf) {
- int level;
-
- nullpo_retr(0, sd);
-
- if (sd->disguise > 23 && sd->disguise < 4001) { // mob disguises [Valaris]
-
- WBUFW(buf,0) = 0x78;
- WBUFL(buf,2) = sd->bl.id;
- WBUFW(buf,6) = status_get_speed(&sd->bl);
- WBUFW(buf,8) = sd->opt1;
- WBUFW(buf,10) = sd->opt2;
- WBUFW(buf,12) = sd->status.option;
- WBUFW(buf,14) = sd->disguise;
- WBUFW(buf,42) = 0;
- WBUFB(buf,44) = 0;
- WBUFPOS(buf, 46, sd->bl.x, sd->bl.y);
- WBUFB(buf,48) |= sd->dir & 0x0f;
- WBUFB(buf,49) = 5;
- WBUFB(buf,50) = 5;
- WBUFB(buf,51) = 0;
- WBUFW(buf,52) = ((level = status_get_lv(&sd->bl)) > battle_config.max_lv) ? battle_config.max_lv : level;
-
- return packet_len_table[0x78];
- }
-
-#if PACKETVER < 4
- WBUFW(buf,0)= 0x78;
- WBUFL(buf,2)= sd->bl.id;
- WBUFW(buf,6)= sd->speed;
- WBUFW(buf,8)= sd->opt1;
- WBUFW(buf,10)= sd->opt2;
- WBUFW(buf,12)= sd->status.option;
- WBUFW(buf,14)= sd->view_class;
- WBUFW(buf,16)= sd->status.hair;
- if (sd->view_class != 22)
- WBUFW(buf,18) = sd->status.weapon;
- else
- WBUFW(buf,18)=0;
- WBUFW(buf,20)=sd->status.head_bottom;
- WBUFW(buf,22)=sd->status.shield;
- WBUFW(buf,24)=sd->status.head_top;
- WBUFW(buf,26)=sd->status.head_mid;
- WBUFW(buf,28)=sd->status.hair_color;
- WBUFW(buf,30)=sd->status.clothes_color;
- WBUFW(buf,32)=sd->head_dir;
- WBUFL(buf,34)=sd->status.guild_id;
- WBUFL(buf,38)=sd->guild_emblem_id;
- WBUFW(buf,42)=sd->status.manner;
- WBUFB(buf,44)=sd->status.karma;
- WBUFB(buf,45)=sd->sex;
- WBUFPOS(buf,46,sd->bl.x,sd->bl.y);
- WBUFB(buf,48)|=sd->dir&0x0f;
- WBUFB(buf,49)=5;
- WBUFB(buf,50)=5;
- WBUFB(buf,51)=sd->state.dead_sit;
- WBUFW(buf,52)=(sd->status.base_level>battle_config.max_lv)?battle_config.max_lv:sd->status.base_level;
-
- return packet_len_table[0x78];
-#else
- WBUFW(buf,0) = 0x1d8;
- WBUFL(buf,2) = sd->bl.id;
- WBUFW(buf,6) = sd->speed;
- WBUFW(buf,8) = sd->opt1;
- WBUFW(buf,10) = sd->opt2;
- WBUFW(buf,12) = sd->status.option;
- WBUFW(buf,14) = sd->view_class;
- WBUFW(buf,16) = sd->status.hair;
- if (sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]] && sd->view_class != 22) {
- if (sd->inventory_data[sd->equip_index[9]]->view_id > 0)
- WBUFW(buf,18) = sd->inventory_data[sd->equip_index[9]]->view_id;
- else
- WBUFW(buf,18) = sd->status.inventory[sd->equip_index[9]].nameid;
- } else
- WBUFW(buf,18) = 0;
- if (sd->equip_index[8] >= 0 && sd->equip_index[8] != sd->equip_index[9] && sd->inventory_data[sd->equip_index[8]] && sd->view_class != 22) {
- if (sd->inventory_data[sd->equip_index[8]]->view_id > 0)
- WBUFW(buf,20) = sd->inventory_data[sd->equip_index[8]]->view_id;
- else
- WBUFW(buf,20) = sd->status.inventory[sd->equip_index[8]].nameid;
- } else
- WBUFW(buf,20) = 0;
- WBUFW(buf,22) = sd->status.head_bottom;
- WBUFW(buf,24) = sd->status.head_top;
- WBUFW(buf,26) = sd->status.head_mid;
- WBUFW(buf,28) = sd->status.hair_color;
- WBUFW(buf,30) = sd->status.clothes_color;
- WBUFW(buf,32) = sd->head_dir;
- WBUFL(buf,34) = sd->status.guild_id;
- WBUFW(buf,38) = sd->guild_emblem_id;
- WBUFW(buf,40) = sd->status.manner;
- WBUFW(buf,42)=sd->opt3;
- WBUFB(buf,44) = sd->status.karma;
- WBUFB(buf,45) = sd->sex;
- WBUFPOS(buf, 46, sd->bl.x, sd->bl.y);
- WBUFB(buf,48) |= sd->dir & 0x0f;
- WBUFB(buf,49) = 5;
- WBUFB(buf,50) = 5;
- WBUFB(buf,51) = sd->state.dead_sit;
- WBUFW(buf,52) = ((level = status_get_lv(&sd->bl)) > battle_config.max_lv) ? battle_config.max_lv : level;
-
- return packet_len_table[0x1d8];
-#endif
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int clif_set007b(struct map_session_data *sd,unsigned char *buf) {
- int level;
-
- nullpo_retr(0, sd);
-
- if (sd->disguise > 23 && sd->disguise < 4001) { // mob disguises [Valaris]
-
- WBUFW(buf,0)=0x7b;
- WBUFL(buf,2)=sd->bl.id;
- WBUFW(buf,6)=status_get_speed(&sd->bl);
- WBUFW(buf,8)=sd->opt1;
- WBUFW(buf,10)=sd->opt2;
- WBUFW(buf,12)=sd->status.option;
- WBUFW(buf,14)=sd->disguise;
- WBUFL(buf,22)=gettick();
- WBUFW(buf,46)=0;
- WBUFB(buf,48)=0;
- WBUFPOS2(buf,50,sd->bl.x,sd->bl.y,sd->to_x,sd->to_y);
- WBUFB(buf,55)=0;
- WBUFB(buf,56)=5;
- WBUFB(buf,57)=5;
- WBUFW(buf,58)=((level = status_get_lv(&sd->bl))>battle_config.max_lv)? battle_config.max_lv:level;
-
- return packet_len_table[0x7b];
- }
-
-#if PACKETVER < 4
- WBUFW(buf,0)=0x7b;
- WBUFL(buf,2)=sd->bl.id;
- WBUFW(buf,6)=sd->speed;
- WBUFW(buf,8)=sd->opt1;
- WBUFW(buf,10)=sd->opt2;
- WBUFW(buf,12)=sd->status.option;
- WBUFW(buf,14)=sd->view_class;
- WBUFW(buf,16)=sd->status.hair;
- if(sd->view_class != 22)
- WBUFW(buf,18)=sd->status.weapon;
- else
- WBUFW(buf,18)=0;
- WBUFW(buf,20)=sd->status.head_bottom;
- WBUFL(buf,22)=gettick();
- WBUFW(buf,26)=sd->status.shield;
- WBUFW(buf,28)=sd->status.head_top;
- WBUFW(buf,30)=sd->status.head_mid;
- WBUFW(buf,32)=sd->status.hair_color;
- WBUFW(buf,34)=sd->status.clothes_color;
- WBUFW(buf,36)=sd->head_dir;
- WBUFL(buf,38)=sd->status.guild_id;
- WBUFL(buf,42)=sd->guild_emblem_id;
- WBUFW(buf,46)=sd->status.manner;
- WBUFB(buf,48)=sd->status.karma;
- WBUFB(buf,49)=sd->sex;
- WBUFPOS2(buf,50,sd->bl.x,sd->bl.y,sd->to_x,sd->to_y);
- WBUFB(buf,55)=0;
- WBUFB(buf,56)=5;
- WBUFB(buf,57)=5;
- WBUFW(buf,58)=(sd->status.base_level>battle_config.max_lv)?battle_config.max_lv:sd->status.base_level;
-
- return packet_len_table[0x7b];
-#else
- WBUFW(buf,0)=0x1da;
- WBUFL(buf,2)=sd->bl.id;
- WBUFW(buf,6)=sd->speed;
- WBUFW(buf,8)=sd->opt1;
- WBUFW(buf,10)=sd->opt2;
- WBUFW(buf,12)=sd->status.option;
- WBUFW(buf,14)=sd->view_class;
- WBUFW(buf,16)=sd->status.hair;
- if(sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]] && sd->view_class != 22) {
- if(sd->inventory_data[sd->equip_index[9]]->view_id > 0)
- WBUFW(buf,18)=sd->inventory_data[sd->equip_index[9]]->view_id;
- else
- WBUFW(buf,18)=sd->status.inventory[sd->equip_index[9]].nameid;
- }
- else
- WBUFW(buf,18)=0;
- if(sd->equip_index[8] >= 0 && sd->equip_index[8] != sd->equip_index[9] && sd->inventory_data[sd->equip_index[8]] && sd->view_class != 22) {
- if(sd->inventory_data[sd->equip_index[8]]->view_id > 0)
- WBUFW(buf,20)=sd->inventory_data[sd->equip_index[8]]->view_id;
- else
- WBUFW(buf,20)=sd->status.inventory[sd->equip_index[8]].nameid;
- }
- else
- WBUFW(buf,20)=0;
- WBUFW(buf,22)=sd->status.head_bottom;
- WBUFL(buf,24)=gettick();
- WBUFW(buf,28)=sd->status.head_top;
- WBUFW(buf,30)=sd->status.head_mid;
- WBUFW(buf,32)=sd->status.hair_color;
- WBUFW(buf,34)=sd->status.clothes_color;
- WBUFW(buf,36)=sd->head_dir;
- WBUFL(buf,38)=sd->status.guild_id;
- WBUFW(buf,42)=sd->guild_emblem_id;
- WBUFW(buf,44)=sd->status.manner;
- WBUFW(buf,46)=sd->opt3;
- WBUFB(buf,48)=sd->status.karma;
- WBUFB(buf,49)=sd->sex;
- WBUFPOS2(buf,50,sd->bl.x,sd->bl.y,sd->to_x,sd->to_y);
- WBUFB(buf,55)=0;
- WBUFB(buf,56)=5;
- WBUFB(buf,57)=5;
- WBUFW(buf,58)=(sd->status.base_level>battle_config.max_lv)?battle_config.max_lv:sd->status.base_level;
-
- return packet_len_table[0x1da];
-#endif
-}
-
-/*==========================================
- * ƒNƒ‰ƒXƒ`ƒFƒ“ƒW type‚ÍMob‚ÌꇂÍ1‚Å‘¼‚Í0H
- *------------------------------------------
- */
-int clif_class_change(struct block_list *bl,int class_,int type)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, bl);
-
- if(class_ >= MAX_PC_CLASS) {
- WBUFW(buf,0)=0x1b0;
- WBUFL(buf,2)=bl->id;
- WBUFB(buf,6)=type;
- WBUFL(buf,7)=class_;
-
- clif_send(buf,packet_len_table[0x1b0],bl,AREA);
- }
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_mob_class_change(struct mob_data *md, int class_) {
- unsigned char buf[16];
- int view = mob_get_viewclass(class_);
-
- nullpo_retr(0, md);
-
- if(view >= MAX_PC_CLASS) {
- WBUFW(buf,0)=0x1b0;
- WBUFL(buf,2)=md->bl.id;
- WBUFB(buf,6)=1;
- WBUFL(buf,7)=view;
-
- clif_send(buf,packet_len_table[0x1b0],&md->bl,AREA);
- }
- return 0;
-}
-// mob equipment [Valaris]
-
-int clif_mob_equip(struct mob_data *md, int nameid) {
- unsigned char buf[16];
-
- nullpo_retr(0, md);
-
- memset(buf,0,packet_len_table[0x1a4]);
-
- WBUFW(buf,0)=0x1a4;
- WBUFB(buf,2)=3;
- WBUFL(buf,3)=md->bl.id;
- WBUFL(buf,7)=nameid;
-
- clif_send(buf,packet_len_table[0x1a4],&md->bl,AREA);
-
- return 0;
-}
-
-/*==========================================
- * MOB•\Ž¦1
- *------------------------------------------
- */
-static int clif_mob0078(struct mob_data *md, unsigned char *buf)
-{
- int level, i;
-
- memset(buf,0,packet_len_table[0x78]);
-
- nullpo_retr(0, md);
-
- WBUFW(buf,0)=0x78;
- WBUFL(buf,2)=md->bl.id;
- WBUFW(buf,6)=status_get_speed(&md->bl);
- WBUFW(buf,8)=md->opt1;
- WBUFW(buf,10)=md->opt2;
- WBUFW(buf,12)=md->option;
- WBUFW(buf,14)=mob_get_viewclass(md->class_);
- if((i=mob_get_viewclass(md->class_)) <= 23 || i == 812 || i >= 4001) {
- WBUFW(buf,12)|=mob_db[md->class_].option;
- WBUFW(buf,16)=mob_get_hair(md->class_);
- WBUFW(buf,18)=mob_get_weapon(md->class_);
- WBUFW(buf,20)=mob_get_head_buttom(md->class_);
- WBUFW(buf,22)=mob_get_shield(md->class_);
- WBUFW(buf,24)=mob_get_head_top(md->class_);
- WBUFW(buf,26)=mob_get_head_mid(md->class_);
- WBUFW(buf,28)=mob_get_hair_color(md->class_);
- WBUFW(buf,30)=mob_get_clothes_color(md->class_); //Add for player monster dye - Valaris
- WBUFB(buf,45)=mob_get_sex(md->class_);
- }
-
- if (md->class_ >= 1285 && md->class_ <= 1287 && md->guild_id) { // Added guardian emblems [Valaris]
- struct guild *g;
- struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name);
- if (gc && gc->guild_id > 0) {
- g=guild_search(gc->guild_id);
- if (g) {
- WBUFL(buf,22)=g->emblem_id;
- WBUFL(buf,26)=gc->guild_id;
- }
- }
- } // End addition
-
- WBUFPOS(buf,46,md->bl.x,md->bl.y);
- WBUFB(buf,48)|=md->dir&0x0f;
- WBUFB(buf,49)=5;
- WBUFB(buf,50)=5;
- WBUFW(buf,52)=((level = status_get_lv(&md->bl))>battle_config.max_lv)? battle_config.max_lv:level;
-
- return packet_len_table[0x78];
-}
-
-/*==========================================
- * MOB•\Ž¦2
- *------------------------------------------
- */
-static int clif_mob007b(struct mob_data *md, unsigned char *buf) {
- int level;
-
- memset(buf,0,packet_len_table[0x7b]);
-
- nullpo_retr(0, md);
-
- WBUFW(buf,0)=0x7b;
- WBUFL(buf,2)=md->bl.id;
- WBUFW(buf,6)=status_get_speed(&md->bl);
- WBUFW(buf,8)=md->opt1;
- WBUFW(buf,10)=md->opt2;
- WBUFW(buf,12)=md->option;
- WBUFW(buf,14)=mob_get_viewclass(md->class_);
- if ((mob_get_viewclass(md->class_) < 24) || (mob_get_viewclass(md->class_) > 4000)) {
- WBUFW(buf,12)|=mob_db[md->class_].option;
- WBUFW(buf,16)=mob_get_hair(md->class_);
- WBUFW(buf,18)=mob_get_weapon(md->class_);
- WBUFW(buf,20)=mob_get_head_buttom(md->class_);
- WBUFL(buf,22)=gettick();
- WBUFW(buf,26)=mob_get_shield(md->class_);
- WBUFW(buf,28)=mob_get_head_top(md->class_);
- WBUFW(buf,30)=mob_get_head_mid(md->class_);
- WBUFW(buf,32)=mob_get_hair_color(md->class_);
- WBUFW(buf,34)=mob_get_clothes_color(md->class_); //Add for player monster dye - Valaris
- WBUFB(buf,49)=mob_get_sex(md->class_);
- } else
- WBUFL(buf,22)=gettick();
-
- if(md->class_ >= 1285 && md->class_ <= 1287 && md->guild_id) { // Added guardian emblems [Valaris]
- struct guild *g;
- struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name);
- if(gc && gc->guild_id > 0){
- g=guild_search(gc->guild_id);
- if(g) {
- WBUFL(buf,28)=gc->guild_id;
- WBUFL(buf,24)=g->emblem_id;
- }
- }
- } // End addition
-
- WBUFPOS2(buf,50,md->bl.x,md->bl.y,md->to_x,md->to_y);
- WBUFB(buf,56)=5;
- WBUFB(buf,57)=5;
- WBUFW(buf,58)=((level = status_get_lv(&md->bl))>battle_config.max_lv)? battle_config.max_lv:level;
-
- return packet_len_table[0x7b];
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int clif_npc0078(struct npc_data *nd, unsigned char *buf) {
- struct guild *g;
-
- nullpo_retr(0, nd);
-
- memset(buf,0,packet_len_table[0x78]);
-
- WBUFW(buf,0)=0x78;
- WBUFL(buf,2)=nd->bl.id;
- WBUFW(buf,6)=nd->speed;
- WBUFW(buf,14)=nd->class_;
- if ((nd->class_ == 722) && (nd->u.scr.guild_id > 0) && ((g=guild_search(nd->u.scr.guild_id)) != NULL)) {
- WBUFL(buf,22)=g->emblem_id;
- WBUFL(buf,26)=g->guild_id;
- }
- WBUFPOS(buf,46,nd->bl.x,nd->bl.y);
- WBUFB(buf,48)|=nd->dir&0x0f;
- WBUFB(buf,49)=5;
- WBUFB(buf,50)=5;
-
- return packet_len_table[0x78];
-}
-
-// NPC Walking [Valaris]
-static int clif_npc007b(struct npc_data *nd, unsigned char *buf) {
- struct guild *g;
-
- nullpo_retr(0, nd);
-
- memset(buf,0,packet_len_table[0x7b]);
-
- WBUFW(buf,0)=0x7b;
- WBUFL(buf,2)=nd->bl.id;
- WBUFW(buf,6)=nd->speed;
- WBUFW(buf,14)=nd->class_;
- if ((nd->class_ == 722) && (nd->u.scr.guild_id > 0) && ((g=guild_search(nd->u.scr.guild_id)) != NULL)) {
- WBUFL(buf,22)=g->emblem_id;
- WBUFL(buf,26)=g->guild_id;
- }
-
- WBUFL(buf,22)=gettick();
- WBUFPOS2(buf,50,nd->bl.x,nd->bl.y,nd->to_x,nd->to_y);
- WBUFB(buf,56)=5;
- WBUFB(buf,57)=5;
-
- return packet_len_table[0x7b];
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int clif_pet0078(struct pet_data *pd, unsigned char *buf) {
- int view,level;
-
- nullpo_retr(0, pd);
-
- memset(buf,0,packet_len_table[0x78]);
-
- WBUFW(buf,0)=0x78;
- WBUFL(buf,2)=pd->bl.id;
- WBUFW(buf,6)=pd->speed;
- WBUFW(buf,14)=mob_get_viewclass(pd->class_);
- if((mob_get_viewclass(pd->class_) < 24) || (mob_get_viewclass(pd->class_) > 4000)) {
- WBUFW(buf,12)=mob_db[pd->class_].option;
- WBUFW(buf,16)=mob_get_hair(pd->class_);
- WBUFW(buf,18)=mob_get_weapon(pd->class_);
- WBUFW(buf,20)=mob_get_head_buttom(pd->class_);
- WBUFW(buf,22)=mob_get_shield(pd->class_);
- WBUFW(buf,24)=mob_get_head_top(pd->class_);
- WBUFW(buf,26)=mob_get_head_mid(pd->class_);
- WBUFW(buf,28)=mob_get_hair_color(pd->class_);
- WBUFW(buf,30)=mob_get_clothes_color(pd->class_); //Add for player pet dye - Valaris
- WBUFB(buf,45)=mob_get_sex(pd->class_);
- } else {
- WBUFW(buf,16)=0x14;
- if((view = itemdb_viewid(pd->equip)) > 0)
- WBUFW(buf,20)=view;
- else
- WBUFW(buf,20)=pd->equip;
- }
- WBUFPOS(buf,46,pd->bl.x,pd->bl.y);
- WBUFB(buf,48)|=pd->dir&0x0f;
- WBUFB(buf,49)=0;
- WBUFB(buf,50)=0;
- WBUFW(buf,52)=((level = status_get_lv(&pd->bl))>battle_config.max_lv)? battle_config.max_lv:level;
-
- return packet_len_table[0x78];
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int clif_pet007b(struct pet_data *pd, unsigned char *buf) {
- int view,level;
-
- nullpo_retr(0, pd);
-
- memset(buf,0,packet_len_table[0x7b]);
-
- WBUFW(buf,0)=0x7b;
- WBUFL(buf,2)=pd->bl.id;
- WBUFW(buf,6)=pd->speed;
- WBUFW(buf,14)=mob_get_viewclass(pd->class_);
- if((mob_get_viewclass(pd->class_) < 24) || (mob_get_viewclass(pd->class_) > 4000)) {
- WBUFW(buf,12)=mob_db[pd->class_].option;
- WBUFW(buf,16)=mob_get_hair(pd->class_);
- WBUFW(buf,18)=mob_get_weapon(pd->class_);
- WBUFW(buf,20)=mob_get_head_buttom(pd->class_);
- WBUFL(buf,22)=gettick();
- WBUFW(buf,26)=mob_get_shield(pd->class_);
- WBUFW(buf,28)=mob_get_head_top(pd->class_);
- WBUFW(buf,30)=mob_get_head_mid(pd->class_);
- WBUFW(buf,32)=mob_get_hair_color(pd->class_);
- WBUFW(buf,34)=mob_get_clothes_color(pd->class_); //Add for player pet dye - Valaris
- WBUFB(buf,49)=mob_get_sex(pd->class_);
- } else {
- WBUFW(buf,16)=0x14;
- if ((view = itemdb_viewid(pd->equip)) > 0)
- WBUFW(buf,20)=view;
- else
- WBUFW(buf,20)=pd->equip;
- WBUFL(buf,22)=gettick();
- }
- WBUFPOS2(buf,50,pd->bl.x,pd->bl.y,pd->to_x,pd->to_y);
- WBUFB(buf,56)=0;
- WBUFB(buf,57)=0;
- WBUFW(buf,58)=((level = status_get_lv(&pd->bl))>battle_config.max_lv)? battle_config.max_lv:level;
-
- return packet_len_table[0x7b];
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int clif_set01e1(struct map_session_data *sd, unsigned char *buf) {
- nullpo_retr(0, sd);
-
- WBUFW(buf,0)=0x1e1;
- WBUFL(buf,2)=sd->bl.id;
- WBUFW(buf,6)=sd->spiritball;
-
- return packet_len_table[0x1e1];
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int clif_set0192(int fd, int m, int x, int y, int type) {
- WFIFOW(fd,0) = 0x192;
- WFIFOW(fd,2) = x;
- WFIFOW(fd,4) = y;
- WFIFOW(fd,6) = type;
- memcpy(WFIFOP(fd,8),map[m].name,16);
- WFIFOSET(fd,packet_len_table[0x192]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_spawnpc(struct map_session_data *sd) {
- unsigned char buf[128];
-
- nullpo_retr(0, sd);
-
- if (sd->disguise > 23 && sd->disguise < 4001) { // mob disguises [Valaris]
- clif_clearchar(&sd->bl, 9);
-
- memset(buf, 0, packet_len_table[0x119]);
-
- WBUFW(buf, 0) = 0x119;
- WBUFL(buf, 2) = sd->bl.id;
- WBUFW(buf, 6) = 0;
- WBUFW(buf, 8) = 0;
- WBUFW(buf,10) = 0x40;
- WBUFB(buf,12) = 0;
-
- clif_send(buf, packet_len_table[0x119], &sd->bl, SELF);
-
- memset(buf, 0, packet_len_table[0x7c]);
-
- WBUFW(buf, 0) = 0x7c;
- WBUFL(buf, 2) = sd->bl.id;
- WBUFW(buf, 6) = sd->speed;
- WBUFW(buf, 8) = sd->opt1;
- WBUFW(buf,10) = sd->opt2;
- WBUFW(buf,12) = sd->status.option;
- WBUFW(buf,20) = sd->disguise;
- WBUFPOS(buf, 36, sd->bl.x, sd->bl.y);
- clif_send(buf, packet_len_table[0x7c], &sd->bl, AREA);
- }
-
- clif_set0078(sd, buf);
-
-#if PACKETVER < 4
- WBUFW(buf, 0) = 0x79;
- WBUFW(buf,51) = (sd->status.base_level > battle_config.max_lv) ? battle_config.max_lv : sd->status.base_level;
- clif_send(buf, packet_len_table[0x79], &sd->bl, AREA_WOS);
-#else
- WBUFW(buf, 0) = 0x1d9;
- WBUFW(buf,51) = (sd->status.base_level > battle_config.max_lv) ? battle_config.max_lv : sd->status.base_level;
- clif_send(buf, packet_len_table[0x1d9], &sd->bl, AREA_WOS);
-#endif
-
-
- if (sd->spiritball > 0)
- clif_spiritball(sd);
-
- if (sd->status.guild_id > 0) { // force display of guild emblem [Valaris]
- struct guild *g = guild_search(sd->status.guild_id);
- if (g)
- clif_guild_emblem(sd,g);
- } // end addition [Valaris]
-
- if (sd->status.class_==13 || sd->status.class_==21 || sd->status.class_==4014 || sd->status.class_==4022)
- pc_setoption(sd,sd->status.option|0x0020); // [Valaris]
-
- if ((pc_isriding(sd) && pc_checkskill(sd,KN_RIDING)>0) && (sd->status.class_==7 ||
- sd->status.class_==14 || sd->status.class_==4008 || sd->status.class_==4015))
- pc_setriding(sd); // update peco riders for people upgrading athena [Valaris]
-
-
- if (map[sd->bl.m].flag.snow)
- clif_specialeffect(&sd->bl, 162, 1);
- if (map[sd->bl.m].flag.fog)
- clif_specialeffect(&sd->bl, 233, 1);
- if (map[sd->bl.m].flag.sakura)
- clif_specialeffect(&sd->bl, 163, 1);
- if (map[sd->bl.m].flag.leaves)
- clif_specialeffect(&sd->bl, 333, 1);
- if (map[sd->bl.m].flag.rain)
- clif_specialeffect(&sd->bl, 161, 1);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_spawnnpc(struct npc_data *nd)
-{
- unsigned char buf[64];
- int len;
-
- nullpo_retr(0, nd);
-
- if(nd->class_ < 0 || nd->flag&1 || nd->class_ == INVISIBLE_CLASS)
- return 0;
-
- memset(buf,0,packet_len_table[0x7c]);
-
- WBUFW(buf,0)=0x7c;
- WBUFL(buf,2)=nd->bl.id;
- WBUFW(buf,6)=nd->speed;
- WBUFW(buf,20)=nd->class_;
- WBUFPOS(buf,36,nd->bl.x,nd->bl.y);
-
- clif_send(buf,packet_len_table[0x7c],&nd->bl,AREA);
-
- len = clif_npc0078(nd,buf);
- clif_send(buf,len,&nd->bl,AREA);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_spawnmob(struct mob_data *md)
-{
- unsigned char buf[64];
- int len;
-
- nullpo_retr(0, md);
-
- if (mob_get_viewclass(md->class_) > 23) {
- memset(buf,0,packet_len_table[0x7c]);
-
- WBUFW(buf,0)=0x7c;
- WBUFL(buf,2)=md->bl.id;
- WBUFW(buf,6)=md->speed;
- WBUFW(buf,8)=md->opt1;
- WBUFW(buf,10)=md->opt2;
- WBUFW(buf,12)=md->option;
- WBUFW(buf,20)=mob_get_viewclass(md->class_);
- WBUFPOS(buf,36,md->bl.x,md->bl.y);
- clif_send(buf,packet_len_table[0x7c],&md->bl,AREA);
- }
-
- len = clif_mob0078(md,buf);
- clif_send(buf,len,&md->bl,AREA);
-
- if (mob_get_equip(md->class_) > 0) // mob equipment [Valaris]
- clif_mob_equip(md,mob_get_equip(md->class_));
-
- if(md->size==2) // tiny/big mobs [Valaris]
- clif_specialeffect(&md->bl,423,0);
- else if(md->size==1)
- clif_specialeffect(&md->bl,421,0);
-
- return 0;
-}
-
-// pet
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_spawnpet(struct pet_data *pd)
-{
- unsigned char buf[64];
- int len;
-
- nullpo_retr(0, pd);
-
- if (mob_get_viewclass(pd->class_) >= MAX_PC_CLASS) {
- memset(buf,0,packet_len_table[0x7c]);
-
- WBUFW(buf,0)=0x7c;
- WBUFL(buf,2)=pd->bl.id;
- WBUFW(buf,6)=pd->speed;
- WBUFW(buf,20)=mob_get_viewclass(pd->class_);
- WBUFPOS(buf,36,pd->bl.x,pd->bl.y);
-
- clif_send(buf,packet_len_table[0x7c],&pd->bl,AREA);
- }
-
- len = clif_pet0078(pd,buf);
- clif_send(buf,len,&pd->bl,AREA);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_movepet(struct pet_data *pd) {
- unsigned char buf[256];
- int len;
-
- nullpo_retr(0, pd);
-
- len = clif_pet007b(pd,buf);
- clif_send(buf,len,&pd->bl,AREA);
-
- return 0;
-}
-
-/*==========================================
- * npc walking [Valaris]
- *------------------------------------------
- */
-int clif_movenpc(struct npc_data *nd) {
- unsigned char buf[256];
- int len;
-
- nullpo_retr(0, nd);
-
- len = clif_npc007b(nd,buf);
- clif_send(buf,len,&nd->bl,AREA);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_servertick(struct map_session_data *sd)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x7f;
- WFIFOL(fd,2)=sd->server_tick;
- WFIFOSET(fd,packet_len_table[0x7f]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_walkok(struct map_session_data *sd)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x87;
- WFIFOL(fd,2)=gettick();;
- WFIFOPOS2(fd,6,sd->bl.x,sd->bl.y,sd->to_x,sd->to_y);
- WFIFOB(fd,11)=0;
- WFIFOSET(fd,packet_len_table[0x87]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_movechar(struct map_session_data *sd) {
- int fd;
- int len;
- unsigned char buf[256];
-
- nullpo_retr(0, sd);
-
- fd = sd->fd;
-
- len = clif_set007b(sd, buf);
-
- if (sd->disguise > 23 && sd->disguise < 4001) {
- clif_send(buf, len, &sd->bl, AREA);
- return 0;
- } else
- clif_send(buf, len, &sd->bl, AREA_WOS);
-
- if (battle_config.save_clothcolor == 1 && sd->status.clothes_color > 0)
- clif_changelook(&sd->bl, LOOK_CLOTHES_COLOR, sd->status.clothes_color);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_quitsave(int fd,struct map_session_data *sd)
-{
- map_quit(sd);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int clif_waitclose(int tid, unsigned int tick, int id, int data) {
- if (session[id])
- session[id]->eof = 1;
-
- close(id);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_setwaitclose(int fd) {
- struct map_session_data *sd;
-
- // if player is not already in the game (double connection probably)
- if ((sd = (struct map_session_data*)session[fd]->session_data) == NULL) {
- // limited timer, just to send information.
- add_timer(gettick() + 1000, clif_waitclose, fd, 0);
- } else
- add_timer(gettick() + 5000, clif_waitclose, fd, 0);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_changemap(struct map_session_data *sd, char *mapname, int x, int y) {
- int fd;
-
- nullpo_retr(0, sd);
-
- fd = sd->fd;
-
- WFIFOW(fd,0) = 0x91;
- memcpy(WFIFOP(fd,2), mapname, 16);
- WFIFOW(fd,18) = x;
- WFIFOW(fd,20) = y;
- WFIFOSET(fd, packet_len_table[0x91]);
-
- if (sd->disguise > 23 && sd->disguise < 4001) // mob disguises [Valaris]
- clif_spawnpc(sd);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_changemapserver(struct map_session_data *sd, char *mapname, int x, int y, int ip, int port) {
- int fd;
-
- nullpo_retr(0, sd);
-
- fd = sd->fd;
- WFIFOW(fd,0) = 0x92;
- memcpy(WFIFOP(fd,2), mapname, 16);
- WFIFOW(fd,18) = x;
- WFIFOW(fd,20) = y;
- WFIFOL(fd,22) = ip;
- WFIFOW(fd,26) = port;
- WFIFOSET(fd, packet_len_table[0x92]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_fixpos(struct block_list *bl) {
- unsigned char buf[16];
-
- nullpo_retr(0, bl);
-
- WBUFW(buf,0)=0x88;
- WBUFL(buf,2)=bl->id;
- WBUFW(buf,6)=bl->x;
- WBUFW(buf,8)=bl->y;
-
- clif_send(buf, packet_len_table[0x88], bl, AREA);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_npcbuysell(struct map_session_data* sd, int id) {
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xc4;
- WFIFOL(fd,2)=id;
- WFIFOSET(fd,packet_len_table[0xc4]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_buylist(struct map_session_data *sd, struct npc_data *nd) {
- struct item_data *id;
- int fd,i,val;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, nd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xc6;
- for(i=0;nd->u.shop_item[i].nameid > 0;i++){
- id = itemdb_search(nd->u.shop_item[i].nameid);
- val=nd->u.shop_item[i].value;
- WFIFOL(fd,4+i*11)=val;
- if (!id->flag.value_notdc)
- val=pc_modifybuyvalue(sd,val);
- WFIFOL(fd,8+i*11)=val;
- WFIFOB(fd,12+i*11)=id->type;
- if (id->view_id > 0)
- WFIFOW(fd,13+i*11)=id->view_id;
- else
- WFIFOW(fd,13+i*11)=nd->u.shop_item[i].nameid;
- }
- WFIFOW(fd,2)=i*11+4;
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_selllist(struct map_session_data *sd) {
- int fd,i,c=0,val;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xc7;
- for(i=0;i<MAX_INVENTORY;i++) {
- if(sd->status.inventory[i].nameid > 0 && sd->inventory_data[i]) {
- val=sd->inventory_data[i]->value_sell;
- if (val < 0)
- continue;
- WFIFOW(fd,4+c*10)=i+2;
- WFIFOL(fd,6+c*10)=val;
- if (!sd->inventory_data[i]->flag.value_notoc)
- val=pc_modifysellvalue(sd,val);
- WFIFOL(fd,10+c*10)=val;
- c++;
- }
- }
- WFIFOW(fd,2)=c*10+4;
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_scriptmes(struct map_session_data *sd, int npcid, char *mes) {
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xb4;
- WFIFOW(fd,2)=strlen(mes)+9;
- WFIFOL(fd,4)=npcid;
- strcpy((char*)WFIFOP(fd,8),mes);
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_scriptnext(struct map_session_data *sd,int npcid) {
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xb5;
- WFIFOL(fd,2)=npcid;
- WFIFOSET(fd,packet_len_table[0xb5]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_scriptclose(struct map_session_data *sd, int npcid) {
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xb6;
- WFIFOL(fd,2)=npcid;
- WFIFOSET(fd,packet_len_table[0xb6]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_scriptmenu(struct map_session_data *sd, int npcid, char *mes) {
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xb7;
- WFIFOW(fd,2)=strlen(mes)+8;
- WFIFOL(fd,4)=npcid;
- strcpy((char*)WFIFOP(fd,8),mes);
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_scriptinput(struct map_session_data *sd, int npcid) {
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x142;
- WFIFOL(fd,2)=npcid;
- WFIFOSET(fd,packet_len_table[0x142]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_scriptinputstr(struct map_session_data *sd, int npcid) {
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x1d4;
- WFIFOL(fd,2)=npcid;
- WFIFOSET(fd,packet_len_table[0x1d4]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_viewpoint(struct map_session_data *sd, int npc_id, int type, int x, int y, int id, int color) {
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x144;
- WFIFOL(fd,2)=npc_id;
- WFIFOL(fd,6)=type;
- WFIFOL(fd,10)=x;
- WFIFOL(fd,14)=y;
- WFIFOB(fd,18)=id;
- WFIFOL(fd,19)=color;
- WFIFOSET(fd,packet_len_table[0x144]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_cutin(struct map_session_data *sd, char *image, int type) {
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x1b3;
- strncpy((char*)WFIFOP(fd,2),image,64);
- WFIFOB(fd,66)=type;
- WFIFOSET(fd,packet_len_table[0x1b3]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_additem(struct map_session_data *sd, int n, int amount, int fail) {
- int fd,j;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- buf=WFIFOP(fd,0);
- if(fail) {
- WBUFW(buf,0)=0xa0;
- WBUFW(buf,2)=n+2;
- WBUFW(buf,4)=amount;
- WBUFW(buf,6)=0;
- WBUFB(buf,8)=0;
- WBUFB(buf,9)=0;
- WBUFB(buf,10)=0;
- WBUFW(buf,11)=0;
- WBUFW(buf,13)=0;
- WBUFW(buf,15)=0;
- WBUFW(buf,17)=0;
- WBUFW(buf,19)=0;
- WBUFB(buf,21)=0;
- WBUFB(buf,22)=fail;
- } else {
- if (n<0 || n>=MAX_INVENTORY || sd->status.inventory[n].nameid <=0 || sd->inventory_data[n] == NULL)
- return 1;
-
- WBUFW(buf,0)=0xa0;
- WBUFW(buf,2)=n+2;
- WBUFW(buf,4)=amount;
- if (sd->inventory_data[n]->view_id > 0)
- WBUFW(buf,6)=sd->inventory_data[n]->view_id;
- else
- WBUFW(buf,6)=sd->status.inventory[n].nameid;
- WBUFB(buf,8)=sd->status.inventory[n].identify;
- WBUFB(buf,9)=sd->status.inventory[n].attribute;
- WBUFB(buf,10)=sd->status.inventory[n].refine;
- if(sd->status.inventory[n].card[0]==0x00ff || sd->status.inventory[n].card[0]==0x00fe || sd->status.inventory[n].card[0]==(short)0xff00) {
- WBUFW(buf,11)=sd->status.inventory[n].card[0];
- WBUFW(buf,13)=sd->status.inventory[n].card[1];
- WBUFW(buf,15)=sd->status.inventory[n].card[2];
- WBUFW(buf,17)=sd->status.inventory[n].card[3];
- } else {
- if (sd->status.inventory[n].card[0] > 0 && (j=itemdb_viewid(sd->status.inventory[n].card[0])) > 0)
- WBUFW(buf,11)=j;
- else
- WBUFW(buf,11)=sd->status.inventory[n].card[0];
- if (sd->status.inventory[n].card[1] > 0 && (j=itemdb_viewid(sd->status.inventory[n].card[1])) > 0)
- WBUFW(buf,13)=j;
- else
- WBUFW(buf,13)=sd->status.inventory[n].card[1];
- if (sd->status.inventory[n].card[2] > 0 && (j=itemdb_viewid(sd->status.inventory[n].card[2])) > 0)
- WBUFW(buf,15)=j;
- else
- WBUFW(buf,15)=sd->status.inventory[n].card[2];
- if (sd->status.inventory[n].card[3] > 0 && (j=itemdb_viewid(sd->status.inventory[n].card[3])) > 0)
- WBUFW(buf,17)=j;
- else
- WBUFW(buf,17)=sd->status.inventory[n].card[3];
- }
- WBUFW(buf,19)=pc_equippoint(sd,n);
- WBUFB(buf,21)=(sd->inventory_data[n]->type == 7)? 4:sd->inventory_data[n]->type;
- WBUFB(buf,22)=fail;
- }
-
- WFIFOSET(fd,packet_len_table[0xa0]);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_delitem(struct map_session_data *sd,int n,int amount)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xaf;
- WFIFOW(fd,2)=n+2;
- WFIFOW(fd,4)=amount;
-
- WFIFOSET(fd,packet_len_table[0xaf]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_itemlist(struct map_session_data *sd)
-{
- int i,n,fd,arrow=-1;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- buf = WFIFOP(fd,0);
-#if PACKETVER < 5
- WBUFW(buf,0)=0xa3;
- for(i=0,n=0;i<MAX_INVENTORY;i++){
- if (sd->status.inventory[i].nameid <=0 || sd->inventory_data[i] == NULL || itemdb_isequip2(sd->inventory_data[i]))
- continue;
- WBUFW(buf,n*10+4)=i+2;
- if (sd->inventory_data[i]->view_id > 0)
- WBUFW(buf,n*10+6)=sd->inventory_data[i]->view_id;
- else
- WBUFW(buf,n*10+6)=sd->status.inventory[i].nameid;
- WBUFB(buf,n*10+8)=sd->inventory_data[i]->type;
- WBUFB(buf,n*10+9)=sd->status.inventory[i].identify;
- WBUFW(buf,n*10+10)=sd->status.inventory[i].amount;
- if (sd->inventory_data[i]->equip == 0x8000) {
- WBUFW(buf,n*10+12)=0x8000;
- if (sd->status.inventory[i].equip)
- arrow=i; // ‚‚¢‚Å‚É–î‘•”õƒ`ƒFƒbƒN
- } else
- WBUFW(buf,n*10+12)=0;
- n++;
- }
- if (n) {
- WBUFW(buf,2)=4+n*10;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
-#else
- WBUFW(buf,0)=0x1ee;
- for(i=0,n=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid <=0 || sd->inventory_data[i] == NULL || itemdb_isequip2(sd->inventory_data[i]))
- continue;
- WBUFW(buf,n*18+4)=i+2;
- if(sd->inventory_data[i]->view_id > 0)
- WBUFW(buf,n*18+6)=sd->inventory_data[i]->view_id;
- else
- WBUFW(buf,n*18+6)=sd->status.inventory[i].nameid;
- WBUFB(buf,n*18+8)=sd->inventory_data[i]->type;
- WBUFB(buf,n*18+9)=sd->status.inventory[i].identify;
- WBUFW(buf,n*18+10)=sd->status.inventory[i].amount;
- if (sd->inventory_data[i]->equip == 0x8000) {
- WBUFW(buf,n*18+12)=0x8000;
- if(sd->status.inventory[i].equip)
- arrow=i; // ‚‚¢‚Å‚É–î‘•”õƒ`ƒFƒbƒN
- } else
- WBUFW(buf,n*18+12)=0;
- WBUFW(buf,n*18+14)=sd->status.inventory[i].card[0];
- WBUFW(buf,n*18+16)=sd->status.inventory[i].card[1];
- WBUFW(buf,n*18+18)=sd->status.inventory[i].card[2];
- WBUFW(buf,n*18+20)=sd->status.inventory[i].card[3];
- n++;
- }
- if (n) {
- WBUFW(buf,2)=4+n*18;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
-#endif
- if(arrow >= 0)
- clif_arrowequip(sd,arrow);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_equiplist(struct map_session_data *sd)
-{
- int i,j,n,fd;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- buf = WFIFOP(fd,0);
- WBUFW(buf,0)=0xa4;
- for(i=0,n=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid<=0 || sd->inventory_data[i] == NULL || !itemdb_isequip2(sd->inventory_data[i]))
- continue;
- WBUFW(buf,n*20+4)=i+2;
- if(sd->inventory_data[i]->view_id > 0)
- WBUFW(buf,n*20+6)=sd->inventory_data[i]->view_id;
- else
- WBUFW(buf,n*20+6)=sd->status.inventory[i].nameid;
- WBUFB(buf,n*20+8)=(sd->inventory_data[i]->type == 7)? 4:sd->inventory_data[i]->type;
- WBUFB(buf,n*20+9)=sd->status.inventory[i].identify;
- WBUFW(buf,n*20+10)=pc_equippoint(sd,i);
- WBUFW(buf,n*20+12)=sd->status.inventory[i].equip;
- WBUFB(buf,n*20+14)=sd->status.inventory[i].attribute;
- WBUFB(buf,n*20+15)=sd->status.inventory[i].refine;
- if(sd->status.inventory[i].card[0]==0x00ff || sd->status.inventory[i].card[0]==0x00fe || sd->status.inventory[i].card[0]==(short)0xff00) {
- WBUFW(buf,n*20+16)=sd->status.inventory[i].card[0];
- WBUFW(buf,n*20+18)=sd->status.inventory[i].card[1];
- WBUFW(buf,n*20+20)=sd->status.inventory[i].card[2];
- WBUFW(buf,n*20+22)=sd->status.inventory[i].card[3];
- } else {
- if(sd->status.inventory[i].card[0] > 0 && (j=itemdb_viewid(sd->status.inventory[i].card[0])) > 0)
- WBUFW(buf,n*20+16)=j;
- else
- WBUFW(buf,n*20+16)=sd->status.inventory[i].card[0];
- if(sd->status.inventory[i].card[1] > 0 && (j=itemdb_viewid(sd->status.inventory[i].card[1])) > 0)
- WBUFW(buf,n*20+18)=j;
- else
- WBUFW(buf,n*20+18)=sd->status.inventory[i].card[1];
- if(sd->status.inventory[i].card[2] > 0 && (j=itemdb_viewid(sd->status.inventory[i].card[2])) > 0)
- WBUFW(buf,n*20+20)=j;
- else
- WBUFW(buf,n*20+20)=sd->status.inventory[i].card[2];
- if(sd->status.inventory[i].card[3] > 0 && (j=itemdb_viewid(sd->status.inventory[i].card[3])) > 0)
- WBUFW(buf,n*20+22)=j;
- else
- WBUFW(buf,n*20+22)=sd->status.inventory[i].card[3];
- }
- n++;
- }
- if(n){
- WBUFW(buf,2)=4+n*20;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
- return 0;
-}
-
-/*==========================================
- * ƒJƒvƒ‰‚³‚ñ‚É—a‚¯‚Ä‚ ‚éÁ–Õ•i&ŽûW•iƒŠƒXƒg
- *------------------------------------------
- */
-int clif_storageitemlist(struct map_session_data *sd,struct storage *stor)
-{
- struct item_data *id;
- int i,n,fd;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor);
-
- fd=sd->fd;
- buf = WFIFOP(fd,0);
-#if PACKETVER < 5
- WBUFW(buf,0)=0xa5;
- for(i=0,n=0;i<MAX_STORAGE;i++){
- if(stor->storage_[i].nameid<=0)
- continue;
- nullpo_retr(0, id = itemdb_search(stor->storage_[i].nameid));
- if(itemdb_isequip2(id))
- continue;
-
- WBUFW(buf,n*10+4)=i+1;
- if(id->view_id > 0)
- WBUFW(buf,n*10+6)=id->view_id;
- else
- WBUFW(buf,n*10+6)=stor->storage_[i].nameid;
- WBUFB(buf,n*10+8)=id->type;;
- WBUFB(buf,n*10+9)=stor->storage_[i].identify;
- WBUFW(buf,n*10+10)=stor->storage_[i].amount;
- WBUFW(buf,n*10+12)=0;
- n++;
- }
- if(n){
- WBUFW(buf,2)=4+n*10;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
-#else
- WBUFW(buf,0)=0x1f0;
- for(i=0,n=0;i<MAX_STORAGE;i++){
- if(stor->storage_[i].nameid<=0)
- continue;
- nullpo_retr(0, id = itemdb_search(stor->storage_[i].nameid));
- if(itemdb_isequip2(id))
- continue;
-
- WBUFW(buf,n*18+4)=i+1;
- if(id->view_id > 0)
- WBUFW(buf,n*18+6)=id->view_id;
- else
- WBUFW(buf,n*18+6)=stor->storage_[i].nameid;
- WBUFB(buf,n*18+8)=id->type;;
- WBUFB(buf,n*18+9)=stor->storage_[i].identify;
- WBUFW(buf,n*18+10)=stor->storage_[i].amount;
- WBUFW(buf,n*18+12)=0;
- WBUFW(buf,n*18+14)=stor->storage_[i].card[0];
- WBUFW(buf,n*18+16)=stor->storage_[i].card[1];
- WBUFW(buf,n*18+18)=stor->storage_[i].card[2];
- WBUFW(buf,n*18+20)=stor->storage_[i].card[3];
- n++;
- }
- if(n){
- WBUFW(buf,2)=4+n*18;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
-#endif
- return 0;
-}
-
-/*==========================================
- * ƒJƒvƒ‰‚³‚ñ‚É—a‚¯‚Ä‚ ‚é‘•”õƒŠƒXƒg
- *------------------------------------------
- */
-int clif_storageequiplist(struct map_session_data *sd,struct storage *stor)
-{
- struct item_data *id;
- int i,j,n,fd;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor);
-
- fd=sd->fd;
- buf = WFIFOP(fd,0);
- WBUFW(buf,0)=0xa6;
- for(i=0,n=0;i<MAX_STORAGE;i++){
- if(stor->storage_[i].nameid<=0)
- continue;
- nullpo_retr(0, id = itemdb_search(stor->storage_[i].nameid));
- if(!itemdb_isequip2(id))
- continue;
- WBUFW(buf,n*20+4)=i+1;
- if(id->view_id > 0)
- WBUFW(buf,n*20+6)=id->view_id;
- else
- WBUFW(buf,n*20+6)=stor->storage_[i].nameid;
- WBUFB(buf,n*20+8)=id->type;
- WBUFB(buf,n*20+9)=stor->storage_[i].identify;
- WBUFW(buf,n*20+10)=id->equip;
- WBUFW(buf,n*20+12)=stor->storage_[i].equip;
- WBUFB(buf,n*20+14)=stor->storage_[i].attribute;
- WBUFB(buf,n*20+15)=stor->storage_[i].refine;
- if(stor->storage_[i].card[0]==0x00ff || stor->storage_[i].card[0]==0x00fe || stor->storage_[i].card[0]==(short)0xff00) {
- WBUFW(buf,n*20+16)=stor->storage_[i].card[0];
- WBUFW(buf,n*20+18)=stor->storage_[i].card[1];
- WBUFW(buf,n*20+20)=stor->storage_[i].card[2];
- WBUFW(buf,n*20+22)=stor->storage_[i].card[3];
- } else {
- if(stor->storage_[i].card[0] > 0 && (j=itemdb_viewid(stor->storage_[i].card[0])) > 0)
- WBUFW(buf,n*20+16)=j;
- else
- WBUFW(buf,n*20+16)=stor->storage_[i].card[0];
- if(stor->storage_[i].card[1] > 0 && (j=itemdb_viewid(stor->storage_[i].card[1])) > 0)
- WBUFW(buf,n*20+18)=j;
- else
- WBUFW(buf,n*20+18)=stor->storage_[i].card[1];
- if(stor->storage_[i].card[2] > 0 && (j=itemdb_viewid(stor->storage_[i].card[2])) > 0)
- WBUFW(buf,n*20+20)=j;
- else
- WBUFW(buf,n*20+20)=stor->storage_[i].card[2];
- if(stor->storage_[i].card[3] > 0 && (j=itemdb_viewid(stor->storage_[i].card[3])) > 0)
- WBUFW(buf,n*20+22)=j;
- else
- WBUFW(buf,n*20+22)=stor->storage_[i].card[3];
- }
- n++;
- }
- if(n){
- WBUFW(buf,2)=4+n*20;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_guildstorageitemlist(struct map_session_data *sd,struct guild_storage *stor)
-{
- struct item_data *id;
- int i,n,fd;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor);
-
- fd=sd->fd;
- buf=WFIFOP(fd,0);
-
-#if PACKETVER < 5
- WBUFW(buf,0)=0xa5;
- for(i=0,n=0;i<MAX_GUILD_STORAGE;i++){
- if(stor->storage_[i].nameid<=0)
- continue;
- nullpo_retr(0, id = itemdb_search(stor->storage_[i].nameid));
- if(itemdb_isequip2(id))
- continue;
-
- WBUFW(buf,n*10+4)=i+1;
- if(id->view_id > 0)
- WBUFW(buf,n*10+6)=id->view_id;
- else
- WBUFW(buf,n*10+6)=stor->storage_[i].nameid;
- WBUFB(buf,n*10+8)=id->type;;
- WBUFB(buf,n*10+9)=stor->storage_[i].identify;
- WBUFW(buf,n*10+10)=stor->storage_[i].amount;
- WBUFW(buf,n*10+12)=0;
- n++;
- }
- if(n){
- WBUFW(buf,2)=4+n*10;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
-#else
- WBUFW(buf,0)=0x1f0;
- for(i=0,n=0;i<MAX_GUILD_STORAGE;i++){
- if(stor->storage_[i].nameid<=0)
- continue;
- nullpo_retr(0, id = itemdb_search(stor->storage_[i].nameid));
- if(itemdb_isequip2(id))
- continue;
-
- WBUFW(buf,n*18+4)=i+1;
- if(id->view_id > 0)
- WBUFW(buf,n*18+6)=id->view_id;
- else
- WBUFW(buf,n*18+6)=stor->storage_[i].nameid;
- WBUFB(buf,n*18+8)=id->type;;
- WBUFB(buf,n*18+9)=stor->storage_[i].identify;
- WBUFW(buf,n*18+10)=stor->storage_[i].amount;
- WBUFW(buf,n*18+12)=0;
- WBUFW(buf,n*18+14)=stor->storage_[i].card[0];
- WBUFW(buf,n*18+16)=stor->storage_[i].card[1];
- WBUFW(buf,n*18+18)=stor->storage_[i].card[2];
- WBUFW(buf,n*18+20)=stor->storage_[i].card[3];
- n++;
- }
- if(n){
- WBUFW(buf,2)=4+n*18;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
-#endif
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_guildstorageequiplist(struct map_session_data *sd,struct guild_storage *stor)
-{
- struct item_data *id;
- int i,j,n,fd;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- buf=WFIFOP(fd,0);
-
- WBUFW(buf,0)=0xa6;
- for(i=0,n=0;i<MAX_GUILD_STORAGE;i++){
- if(stor->storage_[i].nameid<=0)
- continue;
- nullpo_retr(0, id = itemdb_search(stor->storage_[i].nameid));
- if(!itemdb_isequip2(id))
- continue;
- WBUFW(buf,n*20+4)=i+1;
- if(id->view_id > 0)
- WBUFW(buf,n*20+6)=id->view_id;
- else
- WBUFW(buf,n*20+6)=stor->storage_[i].nameid;
- WBUFB(buf,n*20+8)=id->type;
- WBUFB(buf,n*20+9)=stor->storage_[i].identify;
- WBUFW(buf,n*20+10)=id->equip;
- WBUFW(buf,n*20+12)=stor->storage_[i].equip;
- WBUFB(buf,n*20+14)=stor->storage_[i].attribute;
- WBUFB(buf,n*20+15)=stor->storage_[i].refine;
- if(stor->storage_[i].card[0]==0x00ff || stor->storage_[i].card[0]==0x00fe || stor->storage_[i].card[0]==(short)0xff00) {
- WBUFW(buf,n*20+16)=stor->storage_[i].card[0];
- WBUFW(buf,n*20+18)=stor->storage_[i].card[1];
- WBUFW(buf,n*20+20)=stor->storage_[i].card[2];
- WBUFW(buf,n*20+22)=stor->storage_[i].card[3];
- } else {
- if(stor->storage_[i].card[0] > 0 && (j=itemdb_viewid(stor->storage_[i].card[0])) > 0)
- WBUFW(buf,n*20+16)=j;
- else
- WBUFW(buf,n*20+16)=stor->storage_[i].card[0];
- if(stor->storage_[i].card[1] > 0 && (j=itemdb_viewid(stor->storage_[i].card[1])) > 0)
- WBUFW(buf,n*20+18)=j;
- else
- WBUFW(buf,n*20+18)=stor->storage_[i].card[1];
- if(stor->storage_[i].card[2] > 0 && (j=itemdb_viewid(stor->storage_[i].card[2])) > 0)
- WBUFW(buf,n*20+20)=j;
- else
- WBUFW(buf,n*20+20)=stor->storage_[i].card[2];
- if(stor->storage_[i].card[3] > 0 && (j=itemdb_viewid(stor->storage_[i].card[3])) > 0)
- WBUFW(buf,n*20+22)=j;
- else
- WBUFW(buf,n*20+22)=stor->storage_[i].card[3];
- }
- n++;
- }
- if(n){
- WBUFW(buf,2)=4+n*20;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
- return 0;
-}
-
-/*==========================================
- * ƒXƒe[ƒ^ƒX‚ð‘—‚è‚‚¯‚é
- * •\Ž¦ê—p”Žš‚Í‚±‚Ì’†‚ÅŒvŽZ‚µ‚Ä‘—‚é
- *------------------------------------------
- */
-int clif_updatestatus(struct map_session_data *sd,int type)
-{
- int fd,len=8;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
-
- WFIFOW(fd,0)=0xb0;
- WFIFOW(fd,2)=type;
- switch(type){
- // 00b0
- case SP_WEIGHT:
- pc_checkweighticon(sd);
- WFIFOW(fd,0)=0xb0;
- WFIFOW(fd,2)=type;
- WFIFOL(fd,4)=sd->weight;
- break;
- case SP_MAXWEIGHT:
- WFIFOL(fd,4)=sd->max_weight;
- break;
- case SP_SPEED:
- WFIFOL(fd,4)=sd->speed;
- break;
- case SP_BASELEVEL:
- WFIFOL(fd,4)=sd->status.base_level;
- break;
- case SP_JOBLEVEL:
- WFIFOL(fd,4)=sd->status.job_level;
- break;
- case SP_MANNER:
- WFIFOL(fd,4)=sd->status.manner;
- clif_changestatus(&sd->bl,SP_MANNER,sd->status.manner);
- break;
- case SP_STATUSPOINT:
- WFIFOL(fd,4)=sd->status.status_point;
- break;
- case SP_SKILLPOINT:
- WFIFOL(fd,4)=sd->status.skill_point;
- break;
- case SP_HIT:
- WFIFOL(fd,4)=sd->hit;
- break;
- case SP_FLEE1:
- WFIFOL(fd,4)=sd->flee;
- break;
- case SP_FLEE2:
- WFIFOL(fd,4)=sd->flee2/10;
- break;
- case SP_MAXHP:
- WFIFOL(fd,4)=sd->status.max_hp;
- break;
- case SP_MAXSP:
- WFIFOL(fd,4)=sd->status.max_sp;
- break;
- case SP_HP:
- WFIFOL(fd,4)=sd->status.hp;
- if(battle_config.disp_hpmeter)
- clif_hpmeter(sd);
- break;
- case SP_SP:
- WFIFOL(fd,4)=sd->status.sp;
- break;
- case SP_ASPD:
- WFIFOL(fd,4)=sd->aspd;
- break;
- case SP_ATK1:
- WFIFOL(fd,4)=sd->base_atk+sd->watk;
- break;
- case SP_DEF1:
- WFIFOL(fd,4)=sd->def;
- break;
- case SP_MDEF1:
- WFIFOL(fd,4)=sd->mdef;
- break;
- case SP_ATK2:
- WFIFOL(fd,4)=sd->watk2;
- break;
- case SP_DEF2:
- WFIFOL(fd,4)=sd->def2;
- break;
- case SP_MDEF2:
- WFIFOL(fd,4)=sd->mdef2;
- break;
- case SP_CRITICAL:
- WFIFOL(fd,4)=sd->critical/10;
- break;
- case SP_MATK1:
- WFIFOL(fd,4)=sd->matk1;
- break;
- case SP_MATK2:
- WFIFOL(fd,4)=sd->matk2;
- break;
-
-
- case SP_ZENY:
- WFIFOW(fd,0)=0xb1;
- if(sd->status.zeny < 0)
- sd->status.zeny = 0;
- WFIFOL(fd,4)=sd->status.zeny;
- break;
- case SP_BASEEXP:
- WFIFOW(fd,0)=0xb1;
- WFIFOL(fd,4)=sd->status.base_exp;
- break;
- case SP_JOBEXP:
- WFIFOW(fd,0)=0xb1;
- WFIFOL(fd,4)=sd->status.job_exp;
- break;
- case SP_NEXTBASEEXP:
- WFIFOW(fd,0)=0xb1;
- WFIFOL(fd,4)=pc_nextbaseexp(sd);
- break;
- case SP_NEXTJOBEXP:
- WFIFOW(fd,0)=0xb1;
- WFIFOL(fd,4)=pc_nextjobexp(sd);
- break;
-
- // 00be I—¹
- case SP_USTR:
- case SP_UAGI:
- case SP_UVIT:
- case SP_UINT:
- case SP_UDEX:
- case SP_ULUK:
- WFIFOW(fd,0)=0xbe;
- WFIFOB(fd,4)=pc_need_status_point(sd,type-SP_USTR+SP_STR);
- len=5;
- break;
-
- // 013a I—¹
- case SP_ATTACKRANGE:
- WFIFOW(fd,0)=0x13a;
- WFIFOW(fd,2)=sd->attackrange;
- len=4;
- break;
-
- // 0141 I—¹
- case SP_STR:
- WFIFOW(fd,0)=0x141;
- WFIFOL(fd,2)=type;
- WFIFOL(fd,6)=sd->status.str;
- WFIFOL(fd,10)=sd->paramb[0] + sd->parame[0];
- len=14;
- break;
- case SP_AGI:
- WFIFOW(fd,0)=0x141;
- WFIFOL(fd,2)=type;
- WFIFOL(fd,6)=sd->status.agi;
- WFIFOL(fd,10)=sd->paramb[1] + sd->parame[1];
- len=14;
- break;
- case SP_VIT:
- WFIFOW(fd,0)=0x141;
- WFIFOL(fd,2)=type;
- WFIFOL(fd,6)=sd->status.vit;
- WFIFOL(fd,10)=sd->paramb[2] + sd->parame[2];
- len=14;
- break;
- case SP_INT:
- WFIFOW(fd,0)=0x141;
- WFIFOL(fd,2)=type;
- WFIFOL(fd,6)=sd->status.int_;
- WFIFOL(fd,10)=sd->paramb[3] + sd->parame[3];
- len=14;
- break;
- case SP_DEX:
- WFIFOW(fd,0)=0x141;
- WFIFOL(fd,2)=type;
- WFIFOL(fd,6)=sd->status.dex;
- WFIFOL(fd,10)=sd->paramb[4] + sd->parame[4];
- len=14;
- break;
- case SP_LUK:
- WFIFOW(fd,0)=0x141;
- WFIFOL(fd,2)=type;
- WFIFOL(fd,6)=sd->status.luk;
- WFIFOL(fd,10)=sd->paramb[5] + sd->parame[5];
- len=14;
- break;
-
- case SP_CARTINFO:
- WFIFOW(fd,0)=0x121;
- WFIFOW(fd,2)=sd->cart_num;
- WFIFOW(fd,4)=sd->cart_max_num;
- WFIFOL(fd,6)=sd->cart_weight;
- WFIFOL(fd,10)=sd->cart_max_weight;
- len=14;
- break;
-
- default:
- if(battle_config.error_log)
- printf("clif_updatestatus : make %d routine\n",type);
- return 1;
- }
- WFIFOSET(fd,len);
-
- return 0;
-}
-int clif_changestatus(struct block_list *bl,int type,int val)
-{
- unsigned char buf[12];
- struct map_session_data *sd = NULL;
-
- nullpo_retr(0, bl);
-
- if(bl->type == BL_PC)
- sd = (struct map_session_data *)bl;
-
-//printf("clif_changestatus id:%d type:%d val:%d\n",bl->id,type,val);
- if(sd){
- WBUFW(buf,0)=0x1ab;
- WBUFL(buf,2)=bl->id;
- WBUFW(buf,6)=type;
- switch(type){
- case SP_MANNER:
- WBUFL(buf,8)=val;
- break;
- default:
- if(battle_config.error_log)
- printf("clif_changestatus : make %d routine\n",type);
- return 1;
- }
- clif_send(buf,packet_len_table[0x1ab],bl,AREA_WOS);
- }
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_changelook(struct block_list *bl,int type,int val)
-{
-
- unsigned char buf[32];
- struct map_session_data *sd = NULL;
-
- nullpo_retr(0, bl);
-
- if(bl->type == BL_PC)
- sd = (struct map_session_data *)bl;
-
- if(sd && sd->disguise > 23 && sd->disguise < 4001) // mob disguises [Valaris]
- return 0;
-
-#if PACKETVER < 4
- if(sd && (type == LOOK_WEAPON || type == LOOK_SHIELD) && sd->view_class == 22)
- val =0;
- WBUFW(buf,0)=0xc3;
- WBUFL(buf,2)=bl->id;
- WBUFB(buf,6)=type;
- WBUFB(buf,7)=val;
- clif_send(buf,packet_len_table[0xc3],bl,AREA);
-#else
- if(sd && (type == LOOK_WEAPON || type == LOOK_SHIELD || type == LOOK_SHOES)) {
- WBUFW(buf,0)=0x1d7;
- WBUFL(buf,2)=bl->id;
- if(type == LOOK_SHOES) {
- WBUFB(buf,6)=9;
- if(sd->equip_index[2] >= 0 && sd->inventory_data[sd->equip_index[2]]) {
- if(sd->inventory_data[sd->equip_index[2]]->view_id > 0)
- WBUFW(buf,7)=sd->inventory_data[sd->equip_index[2]]->view_id;
- else
- WBUFW(buf,7)=sd->status.inventory[sd->equip_index[2]].nameid;
- } else
- WBUFW(buf,7)=0;
- WBUFW(buf,9)=0;
- }
- else {
- WBUFB(buf,6)=2;
- if(sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]] && sd->view_class != 22) {
- if(sd->inventory_data[sd->equip_index[9]]->view_id > 0)
- WBUFW(buf,7)=sd->inventory_data[sd->equip_index[9]]->view_id;
- else
- WBUFW(buf,7)=sd->status.inventory[sd->equip_index[9]].nameid;
- } else
- WBUFW(buf,7)=0;
- if(sd->equip_index[8] >= 0 && sd->equip_index[8] != sd->equip_index[9] && sd->inventory_data[sd->equip_index[8]] &&
- sd->view_class != 22) {
- if(sd->inventory_data[sd->equip_index[8]]->view_id > 0)
- WBUFW(buf,9)=sd->inventory_data[sd->equip_index[8]]->view_id;
- else
- WBUFW(buf,9)=sd->status.inventory[sd->equip_index[8]].nameid;
- } else
- WBUFW(buf,9)=0;
- }
- clif_send(buf,packet_len_table[0x1d7],bl,AREA);
- }
- else if(sd && (type == LOOK_BASE) && (val > 255))
- {
- WBUFW(buf,0)=0x1d7;
- WBUFL(buf,2)=bl->id;
- WBUFB(buf,6)=type;
- WBUFW(buf,7)=val;
- WBUFW(buf,9)=0;
- clif_send(buf,packet_len_table[0x1d7],bl,AREA);
- } else {
- WBUFW(buf,0)=0xc3;
- WBUFL(buf,2)=bl->id;
- WBUFB(buf,6)=type;
- WBUFB(buf,7)=val;
- clif_send(buf,packet_len_table[0xc3],bl,AREA);
- }
-#endif
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_initialstatus(struct map_session_data *sd)
-{
- int fd;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- buf=WFIFOP(fd,0);
-
- WBUFW(buf,0)=0xbd;
- WBUFW(buf,2)=sd->status.status_point;
- WBUFB(buf,4)=(sd->status.str > 255)? 255:sd->status.str;
- WBUFB(buf,5)=pc_need_status_point(sd,SP_STR);
- WBUFB(buf,6)=(sd->status.agi > 255)? 255:sd->status.agi;
- WBUFB(buf,7)=pc_need_status_point(sd,SP_AGI);
- WBUFB(buf,8)=(sd->status.vit > 255)? 255:sd->status.vit;
- WBUFB(buf,9)=pc_need_status_point(sd,SP_VIT);
- WBUFB(buf,10)=(sd->status.int_ > 255)? 255:sd->status.int_;
- WBUFB(buf,11)=pc_need_status_point(sd,SP_INT);
- WBUFB(buf,12)=(sd->status.dex > 255)? 255:sd->status.dex;
- WBUFB(buf,13)=pc_need_status_point(sd,SP_DEX);
- WBUFB(buf,14)=(sd->status.luk > 255)? 255:sd->status.luk;
- WBUFB(buf,15)=pc_need_status_point(sd,SP_LUK);
-
- WBUFW(buf,16) = sd->base_atk + sd->watk;
- WBUFW(buf,18) = sd->watk2; //atk bonus
- WBUFW(buf,20) = sd->matk1;
- WBUFW(buf,22) = sd->matk2;
- WBUFW(buf,24) = sd->def; // def
- WBUFW(buf,26) = sd->def2;
- WBUFW(buf,28) = sd->mdef; // mdef
- WBUFW(buf,30) = sd->mdef2;
- WBUFW(buf,32) = sd->hit;
- WBUFW(buf,34) = sd->flee;
- WBUFW(buf,36) = sd->flee2/10;
- WBUFW(buf,38) = sd->critical/10;
- WBUFW(buf,40) = sd->status.karma;
- WBUFW(buf,42) = sd->status.manner;
-
- WFIFOSET(fd,packet_len_table[0xbd]);
-
- clif_updatestatus(sd,SP_STR);
- clif_updatestatus(sd,SP_AGI);
- clif_updatestatus(sd,SP_VIT);
- clif_updatestatus(sd,SP_INT);
- clif_updatestatus(sd,SP_DEX);
- clif_updatestatus(sd,SP_LUK);
-
- clif_updatestatus(sd,SP_ATTACKRANGE);
- clif_updatestatus(sd,SP_ASPD);
-
- return 0;
-}
-
-/*==========================================
- *–î‘•”õ
- *------------------------------------------
- */
-int clif_arrowequip(struct map_session_data *sd,int val)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- if(sd->attacktarget && sd->attacktarget > 0) // [Valaris]
- sd->attacktarget = 0;
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x013c;
- WFIFOW(fd,2)=val+2;//–î‚̃AƒCƒeƒ€ID
-
- WFIFOSET(fd,packet_len_table[0x013c]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_arrow_fail(struct map_session_data *sd,int type)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x013b;
- WFIFOW(fd,2)=type;
-
- WFIFOSET(fd,packet_len_table[0x013b]);
-
- return 0;
-}
-
-/*==========================================
- * 쬉”\ –ƒXƒg‘—M
- *------------------------------------------
- */
-int clif_arrow_create_list(struct map_session_data *sd)
-{
- int i,c,view;
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x1ad;
-
- for(i=0,c=0;i<MAX_SKILL_ARROW_DB;i++){
- if(skill_arrow_db[i].nameid > 0 && pc_search_inventory(sd,skill_arrow_db[i].nameid)>=0){
- if((view = itemdb_viewid(skill_arrow_db[i].nameid)) > 0)
- WFIFOW(fd,c*2+4) = view;
- else
- WFIFOW(fd,c*2+4) = skill_arrow_db[i].nameid;
- c++;
- }
- }
- WFIFOW(fd,2)=c*2+4;
- WFIFOSET(fd,WFIFOW(fd,2));
- if(c > 0) sd->state.make_arrow_flag = 1;
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_statusupack(struct map_session_data *sd,int type,int ok,int val)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xbc;
- WFIFOW(fd,2)=type;
- WFIFOB(fd,4)=ok;
- WFIFOB(fd,5)=val;
- WFIFOSET(fd,packet_len_table[0xbc]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_equipitemack(struct map_session_data *sd,int n,int pos,int ok)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xaa;
- WFIFOW(fd,2)=n+2;
- WFIFOW(fd,4)=pos;
- WFIFOB(fd,6)=ok;
- WFIFOSET(fd,packet_len_table[0xaa]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_unequipitemack(struct map_session_data *sd,int n,int pos,int ok)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xac;
- WFIFOW(fd,2)=n+2;
- WFIFOW(fd,4)=pos;
- WFIFOB(fd,6)=ok;
- WFIFOSET(fd,packet_len_table[0xac]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_misceffect(struct block_list* bl,int type)
-{
- unsigned char buf[32];
-
- nullpo_retr(0, bl);
-
- WBUFW(buf,0) = 0x19b;
- WBUFL(buf,2) = bl->id;
- WBUFL(buf,6) = type;
-
- clif_send(buf,packet_len_table[0x19b],bl,AREA);
-
- return 0;
-}
-int clif_misceffect2(struct block_list *bl, int type) {
- unsigned char buf[24];
-
- nullpo_retr(0, bl);
-
- memset(buf, 0, packet_len_table[0x1f3]);
-
- WBUFW(buf,0) = 0x1f3;
- WBUFL(buf,2) = bl->id;
- WBUFL(buf,6) = type;
-
- clif_send(buf, packet_len_table[0x1f3], bl, AREA);
-
- return 0;
-
-}
-/*==========================================
- * •\Ž¦ƒIƒvƒVƒ‡ƒ“•ÏX
- *------------------------------------------
- */
-int clif_changeoption(struct block_list* bl)
-{
- unsigned char buf[32];
- short option;
- struct status_change *sc_data;
- static const int omask[]={ 0x10,0x20 };
- static const int scnum[]={ SC_FALCON, SC_RIDING };
- int i;
-
- nullpo_retr(0, bl);
-
- option = *status_get_option(bl);
- sc_data = status_get_sc_data(bl);
-
- WBUFW(buf,0) = 0x119;
- WBUFL(buf,2) = bl->id;
- WBUFW(buf,6) = *status_get_opt1(bl);
- WBUFW(buf,8) = *status_get_opt2(bl);
- WBUFW(buf,10) = option;
- WBUFB(buf,12) = 0; // ??
-
- if(bl->type==BL_PC) { // disguises [Valaris]
- struct map_session_data *sd=(struct map_session_data *)bl;
- if(sd && sd->disguise > 23 && sd->disguise < 4001) {
- clif_send(buf,packet_len_table[0x119],bl,AREA_WOS);
- clif_spawnpc(sd);
- } else
- clif_send(buf,packet_len_table[0x119],bl,AREA);
- } else
- clif_send(buf,packet_len_table[0x119],bl,AREA);
-
- // ƒAƒCƒRƒ“‚Ì•\Ž¦
- for(i=0;i<sizeof(omask)/sizeof(omask[0]);i++){
- if( option&omask[i] ){
- if( sc_data[scnum[i]].timer==-1)
- status_change_start(bl,scnum[i],0,0,0,0,0,0);
- } else {
- status_change_end(bl,scnum[i],-1);
- }
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_useitemack(struct map_session_data *sd,int index,int amount,int ok)
-{
- nullpo_retr(0, sd);
-
- if(!ok) {
- int fd=sd->fd;
- WFIFOW(fd,0)=0xa8;
- WFIFOW(fd,2)=index+2;
- WFIFOW(fd,4)=amount;
- WFIFOB(fd,6)=ok;
- WFIFOSET(fd,packet_len_table[0xa8]);
- }
- else {
-#if PACKETVER < 3
- int fd=sd->fd;
- WFIFOW(fd,0)=0xa8;
- WFIFOW(fd,2)=index+2;
- WFIFOW(fd,4)=amount;
- WFIFOB(fd,6)=ok;
- WFIFOSET(fd,packet_len_table[0xa8]);
-#else
- unsigned char buf[32];
-
- WBUFW(buf,0)=0x1c8;
- WBUFW(buf,2)=index+2;
- if(sd->inventory_data[index] && sd->inventory_data[index]->view_id > 0)
- WBUFW(buf,4)=sd->inventory_data[index]->view_id;
- else
- WBUFW(buf,4)=sd->status.inventory[index].nameid;
- WBUFL(buf,6)=sd->bl.id;
- WBUFW(buf,10)=amount;
- WBUFB(buf,12)=ok;
- clif_send(buf,packet_len_table[0x1c8],&sd->bl,AREA);
-#endif
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_createchat(struct map_session_data *sd,int fail)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xd6;
- WFIFOB(fd,2)=fail;
- WFIFOSET(fd,packet_len_table[0xd6]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_dispchat(struct chat_data *cd,int fd)
-{
- unsigned char buf[128]; // Å‘åtitle(60ƒoƒCƒg)+17
-
- if(cd==NULL || *cd->owner==NULL)
- return 1;
-
- WBUFW(buf,0)=0xd7;
- WBUFW(buf,2)=strlen((const char*)cd->title)+17;
- WBUFL(buf,4)=(*cd->owner)->id;
- WBUFL(buf,8)=cd->bl.id;
- WBUFW(buf,12)=cd->limit;
- WBUFW(buf,14)=cd->users;
- WBUFB(buf,16)=cd->pub;
- strcpy((char*)WBUFP(buf,17),(const char*)cd->title);
- if(fd){
- memcpy(WFIFOP(fd,0),buf,WBUFW(buf,2));
- WFIFOSET(fd,WBUFW(buf,2));
- } else {
- clif_send(buf,WBUFW(buf,2),*cd->owner,AREA_WOSC);
- }
-
- return 0;
-}
-
-/*==========================================
- * chat‚Ìó‘Ô•ÏX¬Œ÷
- * ŠO•”‚Ìl—p‚Æ–½—߃R[ƒh(d7->df)‚ªˆá‚¤‚¾‚¯
- *------------------------------------------
- */
-int clif_changechatstatus(struct chat_data *cd)
-{
- unsigned char buf[128]; // Å‘åtitle(60ƒoƒCƒg)+17
-
- if(cd==NULL || cd->usersd[0]==NULL)
- return 1;
-
- WBUFW(buf,0)=0xdf;
- WBUFW(buf,2)=strlen((char*)cd->title)+17;
- WBUFL(buf,4)=cd->usersd[0]->bl.id;
- WBUFL(buf,8)=cd->bl.id;
- WBUFW(buf,12)=cd->limit;
- WBUFW(buf,14)=cd->users;
- WBUFB(buf,16)=cd->pub;
- strcpy((char*)WBUFP(buf,17),(const char*)cd->title);
- clif_send(buf,WBUFW(buf,2),&cd->usersd[0]->bl,CHAT);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_clearchat(struct chat_data *cd,int fd)
-{
- unsigned char buf[32];
-
- nullpo_retr(0, cd);
-
- WBUFW(buf,0)=0xd8;
- WBUFL(buf,2)=cd->bl.id;
- if(fd){
- memcpy(WFIFOP(fd,0),buf,packet_len_table[0xd8]);
- WFIFOSET(fd,packet_len_table[0xd8]);
- } else {
- clif_send(buf,packet_len_table[0xd8],*cd->owner,AREA_WOSC);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_joinchatfail(struct map_session_data *sd,int fail)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
-
- WFIFOW(fd,0)=0xda;
- WFIFOB(fd,2)=fail;
- WFIFOSET(fd,packet_len_table[0xda]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_joinchatok(struct map_session_data *sd,struct chat_data* cd)
-{
- int fd;
- int i;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, cd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xdb;
- WFIFOW(fd,2)=8+(28*cd->users);
- WFIFOL(fd,4)=cd->bl.id;
- for(i = 0;i < cd->users;i++){
- WFIFOL(fd,8+i*28) = (i!=0)||((*cd->owner)->type==BL_NPC);
- memcpy(WFIFOP(fd,8+i*28+4),cd->usersd[i]->status.name,24);
- }
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_addchat(struct chat_data* cd,struct map_session_data *sd)
-{
- unsigned char buf[32];
-
- nullpo_retr(0, sd);
- nullpo_retr(0, cd);
-
- WBUFW(buf, 0) = 0x0dc;
- WBUFW(buf, 2) = cd->users;
- memcpy(WBUFP(buf, 4),sd->status.name,24);
- clif_send(buf,packet_len_table[0xdc],&sd->bl,CHAT_WOS);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_changechatowner(struct chat_data* cd,struct map_session_data *sd)
-{
- unsigned char buf[64];
-
- nullpo_retr(0, sd);
- nullpo_retr(0, cd);
-
- WBUFW(buf, 0) = 0xe1;
- WBUFL(buf, 2) = 1;
- memcpy(WBUFP(buf,6),cd->usersd[0]->status.name,24);
- WBUFW(buf,30) = 0xe1;
- WBUFL(buf,32) = 0;
- memcpy(WBUFP(buf,36),sd->status.name,24);
-
- clif_send(buf,packet_len_table[0xe1]*2,&sd->bl,CHAT);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_leavechat(struct chat_data* cd,struct map_session_data *sd)
-{
- unsigned char buf[32];
-
- nullpo_retr(0, sd);
- nullpo_retr(0, cd);
-
- WBUFW(buf, 0) = 0xdd;
- WBUFW(buf, 2) = cd->users-1;
- memcpy(WBUFP(buf,4),sd->status.name,24);
- WBUFB(buf,28) = 0;
-
- clif_send(buf,packet_len_table[0xdd],&sd->bl,CHAT);
-
- return 0;
-}
-
-/*==========================================
- * Žæ‚èˆø‚«—v¿Žó‚¯
- *------------------------------------------
- */
-int clif_traderequest(struct map_session_data *sd,char *name)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xe5;
- strcpy((char*)WFIFOP(fd,2),name);
- WFIFOSET(fd,packet_len_table[0xe5]);
-
- return 0;
-}
-
-/*==========================================
- * Žæ‚èˆø‚«—v‹‰ž“š
- *------------------------------------------
- */
-int clif_tradestart(struct map_session_data *sd,int type)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xe7;
- WFIFOB(fd,2)=type;
- WFIFOSET(fd,packet_len_table[0xe7]);
-
- return 0;
-}
-
-/*==========================================
- * ‘ŠŽè•û‚©‚ç‚̃AƒCƒeƒ€’ljÁ
- *------------------------------------------
- */
-int clif_tradeadditem(struct map_session_data *sd,struct map_session_data *tsd,int index,int amount)
-{
- int fd,j;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, tsd);
-
- fd=tsd->fd;
- WFIFOW(fd,0)=0xe9;
- WFIFOL(fd,2)=amount;
- if(index==0){
- WFIFOW(fd,6) = 0; // type id
- WFIFOB(fd,8) = 0; //identify flag
- WFIFOB(fd,9) = 0; // attribute
- WFIFOB(fd,10)= 0; //refine
- WFIFOW(fd,11)= 0; //card (4w)
- WFIFOW(fd,13)= 0; //card (4w)
- WFIFOW(fd,15)= 0; //card (4w)
- WFIFOW(fd,17)= 0; //card (4w)
- }
- else{
- index -= 2;
- if(sd->inventory_data[index] && sd->inventory_data[index]->view_id > 0)
- WFIFOW(fd,6) = sd->inventory_data[index]->view_id;
- else
- WFIFOW(fd,6) = sd->status.inventory[index].nameid; // type id
- WFIFOB(fd,8) = sd->status.inventory[index].identify; //identify flag
- WFIFOB(fd,9) = sd->status.inventory[index].attribute; // attribute
- WFIFOB(fd,10)= sd->status.inventory[index].refine; //refine
- if(sd->status.inventory[index].card[0]==0x00ff || sd->status.inventory[index].card[0]==0x00fe || sd->status.inventory[index].card[0]==(short)0xff00) {
- WFIFOW(fd,11)= sd->status.inventory[index].card[0]; //card (4w)
- WFIFOW(fd,13)= sd->status.inventory[index].card[1]; //card (4w)
- WFIFOW(fd,15)= sd->status.inventory[index].card[2]; //card (4w)
- WFIFOW(fd,17)= sd->status.inventory[index].card[3]; //card (4w)
- } else {
- if(sd->status.inventory[index].card[0] > 0 && (j=itemdb_viewid(sd->status.inventory[index].card[0])) > 0)
- WFIFOW(fd,11)= j;
- else
- WFIFOW(fd,11)= sd->status.inventory[index].card[0];
- if(sd->status.inventory[index].card[1] > 0 && (j=itemdb_viewid(sd->status.inventory[index].card[1])) > 0)
- WFIFOW(fd,13)= j;
- else
- WFIFOW(fd,13)= sd->status.inventory[index].card[1];
- if(sd->status.inventory[index].card[2] > 0 && (j=itemdb_viewid(sd->status.inventory[index].card[2])) > 0)
- WFIFOW(fd,15)= j;
- else
- WFIFOW(fd,15)= sd->status.inventory[index].card[2];
- if(sd->status.inventory[index].card[3] > 0 && (j=itemdb_viewid(sd->status.inventory[index].card[3])) > 0)
- WFIFOW(fd,17)= j;
- else
- WFIFOW(fd,17)= sd->status.inventory[index].card[3];
- }
- }
- WFIFOSET(fd,packet_len_table[0xe9]);
-
- return 0;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€’ljÁ¬Œ÷/Ž¸”s
- *------------------------------------------
- */
-int clif_tradeitemok(struct map_session_data *sd,int index,int fail)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xea;
- WFIFOW(fd,2)=index;
- WFIFOB(fd,4)=fail;
- WFIFOSET(fd,packet_len_table[0xea]);
-
- return 0;
-}
-
-/*==========================================
- * Žæ‚èˆø‚«ok‰Ÿ‚µ
- *------------------------------------------
- */
-int clif_tradedeal_lock(struct map_session_data *sd,int fail)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xec;
- WFIFOB(fd,2)=fail; // 0=you 1=the other person
- WFIFOSET(fd,packet_len_table[0xec]);
-
- return 0;
-}
-
-/*==========================================
- * Žæ‚èˆø‚«‚ªƒLƒƒƒ“ƒZƒ‹‚³‚ê‚Ü‚µ‚½
- *------------------------------------------
- */
-int clif_tradecancelled(struct map_session_data *sd)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xee;
- WFIFOSET(fd,packet_len_table[0xee]);
-
- return 0;
-}
-
-/*==========================================
- * Žæ‚èˆø‚«Š®—¹
- *------------------------------------------
- */
-int clif_tradecompleted(struct map_session_data *sd,int fail)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xf0;
- WFIFOB(fd,2)=fail;
- WFIFOSET(fd,packet_len_table[0xf0]);
-
- return 0;
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚̃AƒCƒeƒ€”‚ðXV
- *------------------------------------------
- */
-int clif_updatestorageamount(struct map_session_data *sd,struct storage *stor)
-{
- int fd;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor);
-
- fd=sd->fd;
- WFIFOW(fd,0) = 0xf2; // update storage amount
- WFIFOW(fd,2) = stor->storage_amount; //items
- WFIFOW(fd,4) = MAX_STORAGE; //items max
- WFIFOSET(fd,packet_len_table[0xf2]);
-
- return 0;
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚ɃAƒCƒeƒ€‚ð’ljÁ‚·‚é
- *------------------------------------------
- */
-int clif_storageitemadded(struct map_session_data *sd,struct storage *stor,int index,int amount)
-{
- int view,fd,j;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor);
-
- fd=sd->fd;
- WFIFOW(fd,0) =0xf4; // Storage item added
- WFIFOW(fd,2) =index+1; // index
- WFIFOL(fd,4) =amount; // amount
- if((view = itemdb_viewid(stor->storage_[index].nameid)) > 0)
- WFIFOW(fd,8) =view;
- else
- WFIFOW(fd,8) =stor->storage_[index].nameid; // id
- WFIFOB(fd,10)=stor->storage_[index].identify; //identify flag
- WFIFOB(fd,11)=stor->storage_[index].attribute; // attribute
- WFIFOB(fd,12)=stor->storage_[index].refine; //refine
- if(stor->storage_[index].card[0]==0x00ff || stor->storage_[index].card[0]==0x00fe || stor->storage_[index].card[0]==(short)0xff00) {
- WFIFOW(fd,13)=stor->storage_[index].card[0]; //card (4w)
- WFIFOW(fd,15)=stor->storage_[index].card[1]; //card (4w)
- WFIFOW(fd,17)=stor->storage_[index].card[2]; //card (4w)
- WFIFOW(fd,19)=stor->storage_[index].card[3]; //card (4w)
- } else {
- if(stor->storage_[index].card[0] > 0 && (j=itemdb_viewid(stor->storage_[index].card[0])) > 0)
- WFIFOW(fd,13)= j;
- else
- WFIFOW(fd,13)= stor->storage_[index].card[0];
- if(stor->storage_[index].card[1] > 0 && (j=itemdb_viewid(stor->storage_[index].card[1])) > 0)
- WFIFOW(fd,15)= j;
- else
- WFIFOW(fd,15)= stor->storage_[index].card[1];
- if(stor->storage_[index].card[2] > 0 && (j=itemdb_viewid(stor->storage_[index].card[2])) > 0)
- WFIFOW(fd,17)= j;
- else
- WFIFOW(fd,17)= stor->storage_[index].card[2];
- if(stor->storage_[index].card[3] > 0 && (j=itemdb_viewid(stor->storage_[index].card[3])) > 0)
- WFIFOW(fd,19)= j;
- else
- WFIFOW(fd,19)= stor->storage_[index].card[3];
- }
- WFIFOSET(fd,packet_len_table[0xf4]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_updateguildstorageamount(struct map_session_data *sd,struct guild_storage *stor)
-{
- int fd;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor);
-
- fd=sd->fd;
- WFIFOW(fd,0) = 0xf2; // update storage amount
- WFIFOW(fd,2) = stor->storage_amount; //items
- WFIFOW(fd,4) = MAX_GUILD_STORAGE; //items max
- WFIFOSET(fd,packet_len_table[0xf2]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_guildstorageitemadded(struct map_session_data *sd,struct guild_storage *stor,int index,int amount)
-{
- int view,fd,j;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor);
-
- fd=sd->fd;
- WFIFOW(fd,0) =0xf4; // Storage item added
- WFIFOW(fd,2) =index+1; // index
- WFIFOL(fd,4) =amount; // amount
- if((view = itemdb_viewid(stor->storage_[index].nameid)) > 0)
- WFIFOW(fd,8) =view;
- else
- WFIFOW(fd,8) =stor->storage_[index].nameid; // id
- WFIFOB(fd,10)=stor->storage_[index].identify; //identify flag
- WFIFOB(fd,11)=stor->storage_[index].attribute; // attribute
- WFIFOB(fd,12)=stor->storage_[index].refine; //refine
- if(stor->storage_[index].card[0]==0x00ff || stor->storage_[index].card[0]==0x00fe || stor->storage_[index].card[0]==(short)0xff00) {
- WFIFOW(fd,13)=stor->storage_[index].card[0]; //card (4w)
- WFIFOW(fd,15)=stor->storage_[index].card[1]; //card (4w)
- WFIFOW(fd,17)=stor->storage_[index].card[2]; //card (4w)
- WFIFOW(fd,19)=stor->storage_[index].card[3]; //card (4w)
- } else {
- if(stor->storage_[index].card[0] > 0 && (j=itemdb_viewid(stor->storage_[index].card[0])) > 0)
- WFIFOW(fd,13)= j;
- else
- WFIFOW(fd,13)= stor->storage_[index].card[0];
- if(stor->storage_[index].card[1] > 0 && (j=itemdb_viewid(stor->storage_[index].card[1])) > 0)
- WFIFOW(fd,15)= j;
- else
- WFIFOW(fd,15)= stor->storage_[index].card[1];
- if(stor->storage_[index].card[2] > 0 && (j=itemdb_viewid(stor->storage_[index].card[2])) > 0)
- WFIFOW(fd,17)= j;
- else
- WFIFOW(fd,17)= stor->storage_[index].card[2];
- if(stor->storage_[index].card[3] > 0 && (j=itemdb_viewid(stor->storage_[index].card[3])) > 0)
- WFIFOW(fd,19)= j;
- else
- WFIFOW(fd,19)= stor->storage_[index].card[3];
- }
- WFIFOSET(fd,packet_len_table[0xf4]);
-
- return 0;
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚©‚çƒAƒCƒeƒ€‚ðŽæ‚è‹Ž‚é
- *------------------------------------------
- */
-int clif_storageitemremoved(struct map_session_data *sd,int index,int amount)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xf6; // Storage item removed
- WFIFOW(fd,2)=index+1;
- WFIFOL(fd,4)=amount;
- WFIFOSET(fd,packet_len_table[0xf6]);
-
- return 0;
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚ð•Â‚¶‚é
- *------------------------------------------
- */
-int clif_storageclose(struct map_session_data *sd)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xf8; // Storage Closed
- WFIFOSET(fd,packet_len_table[0xf8]);
-
- return 0;
-}
-
-//
-// callbackŒn ?
-//
-/*==========================================
- * PC•\Ž¦
- *------------------------------------------
- */
-void clif_getareachar_pc(struct map_session_data* sd,struct map_session_data* dstsd)
-{
- int len;
-
- nullpo_retv(sd);
- nullpo_retv(dstsd);
-
- if(dstsd->walktimer != -1){
- len = clif_set007b(dstsd,WFIFOP(sd->fd,0));
- WFIFOSET(sd->fd,len);
- } else {
- len = clif_set0078(dstsd,WFIFOP(sd->fd,0));
- WFIFOSET(sd->fd,len);
- }
-
- if(dstsd->chatID){
- struct chat_data *cd;
- cd=(struct chat_data*)map_id2bl(dstsd->chatID);
- if(cd->usersd[0]==dstsd)
- clif_dispchat(cd,sd->fd);
- }
- if(dstsd->vender_id){
- clif_showvendingboard(&dstsd->bl,dstsd->message,sd->fd);
- }
- if(dstsd->spiritball > 0) {
- clif_set01e1(dstsd,WFIFOP(sd->fd,0));
- WFIFOSET(sd->fd,packet_len_table[0x1e1]);
- }
- if(battle_config.save_clothcolor==1 && dstsd->status.clothes_color > 0)
- clif_changelook(&dstsd->bl,LOOK_CLOTHES_COLOR,dstsd->status.clothes_color);
- if(sd->status.manner < 0)
- clif_changestatus(&sd->bl,SP_MANNER,sd->status.manner);
-
-}
-
-/*==========================================
- * NPC•\Ž¦
- *------------------------------------------
- */
-//fixed by Valaris
-void clif_getareachar_npc(struct map_session_data* sd,struct npc_data* nd)
-{
- int len;
- nullpo_retv(sd);
- nullpo_retv(nd);
- if(nd->class_ < 0 || nd->flag&1 || nd->class_ == INVISIBLE_CLASS)
- return;
- if(nd->state.state == MS_WALK){
- len = clif_npc007b(nd,WFIFOP(sd->fd,0));
- WFIFOSET(sd->fd,len);
- } else {
- len = clif_npc0078(nd,WFIFOP(sd->fd,0));
- WFIFOSET(sd->fd,len);
- }
- if(nd->chat_id){
- clif_dispchat((struct chat_data*)map_id2bl(nd->chat_id),sd->fd);
- }
-}
-
-/*==========================================
- * ˆÚ“®’âŽ~
- *------------------------------------------
- */
-int clif_movemob(struct mob_data *md)
-{
- unsigned char buf[256];
- int len;
-
- nullpo_retr(0, md);
-
- len = clif_mob007b(md,buf);
- clif_send(buf,len,&md->bl,AREA);
-
- if(mob_get_equip(md->class_) > 0) // mob equipment [Valaris]
- clif_mob_equip(md,mob_get_equip(md->class_));
-
- if(md->size==2) // tiny/big mobs [Valaris]
- clif_specialeffect(&md->bl,423,0);
- else if(md->size==1)
- clif_specialeffect(&md->bl,421,0);
-
- return 0;
-}
-
-/*==========================================
- * ƒ‚ƒ“ƒXƒ^[‚̈ʒuC³
- *------------------------------------------
- */
-int clif_fixmobpos(struct mob_data *md)
-{
- unsigned char buf[256];
- int len;
-
- nullpo_retr(0, md);
-
- if(md->state.state == MS_WALK){
- len = clif_mob007b(md,buf);
- clif_send(buf,len,&md->bl,AREA);
- } else {
- len = clif_mob0078(md,buf);
- clif_send(buf,len,&md->bl,AREA);
- }
-
- return 0;
-}
-
-/*==========================================
- * PC‚̈ʒuC³
- *------------------------------------------
- */
-int clif_fixpcpos(struct map_session_data *sd)
-{
- unsigned char buf[256];
- int len;
-
- nullpo_retr(0, sd);
-
- if(sd->walktimer != -1){
- len = clif_set007b(sd,buf);
- clif_send(buf,len,&sd->bl,AREA);
- } else {
- len = clif_set0078(sd,buf);
- clif_send(buf,len,&sd->bl,AREA);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_fixpetpos(struct pet_data *pd)
-{
- unsigned char buf[256];
- int len;
-
- nullpo_retr(0, pd);
-
- if(pd->state.state == MS_WALK){
- len = clif_pet007b(pd,buf);
- clif_send(buf,len,&pd->bl,AREA);
- } else {
- len = clif_pet0078(pd,buf);
- clif_send(buf,len,&pd->bl,AREA);
- }
-
- return 0;
-}
-
-// npc walking [Valaris]
-int clif_fixnpcpos(struct npc_data *nd)
-{
- unsigned char buf[256];
- int len;
-
- nullpo_retr(0, nd);
-
- if(nd->state.state == MS_WALK){
- len = clif_npc007b(nd,buf);
- clif_send(buf,len,&nd->bl,AREA);
- } else {
- len = clif_npc0078(nd,buf);
- clif_send(buf,len,&nd->bl,AREA);
- }
-
- return 0;
-}
-
-/*==========================================
- * ’ÊíUŒ‚ƒGƒtƒFƒNƒg•ƒ_ƒ[ƒW
- *------------------------------------------
- */
-int clif_damage(struct block_list *src,struct block_list *dst,unsigned int tick,int sdelay,int ddelay,int damage,int div,int type,int damage2)
-{
- unsigned char buf[256];
- struct status_change *sc_data;
-
- nullpo_retr(0, src);
- nullpo_retr(0, dst);
-
- sc_data = status_get_sc_data(dst);
-
- if(type != 4 && dst->type == BL_PC && ((struct map_session_data *)dst)->special_state.infinite_endure)
- type = 9;
- if(sc_data) {
- if(type != 4 && sc_data[SC_ENDURE].timer != -1 &&
- (dst->type == BL_PC && !map[dst->m].flag.gvg))
- type = 9;
- if(sc_data[SC_HALLUCINATION].timer != -1) {
- if(damage > 0)
- damage = damage*(5+sc_data[SC_HALLUCINATION].val1) + rand()%100;
- if(damage2 > 0)
- damage2 = damage2*(5+sc_data[SC_HALLUCINATION].val1) + rand()%100;
- }
- }
-
- WBUFW(buf,0)=0x8a;
- WBUFL(buf,2)=src->id;
- WBUFL(buf,6)=dst->id;
- WBUFL(buf,10)=tick;
- WBUFL(buf,14)=sdelay;
- WBUFL(buf,18)=ddelay;
- WBUFW(buf,22)=(damage > 0x7fff)? 0x7fff:damage;
- WBUFW(buf,24)=div;
- WBUFB(buf,26)=type;
- WBUFW(buf,27)=damage2;
- clif_send(buf,packet_len_table[0x8a],src,AREA);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_getareachar_mob(struct map_session_data* sd,struct mob_data* md)
-{
- int len;
- nullpo_retv(sd);
- nullpo_retv(md);
-
- if (session[sd->fd] == NULL)
- return;
-
- if(md->state.state == MS_WALK){
- len = clif_mob007b(md,WFIFOP(sd->fd,0));
- WFIFOSET(sd->fd,len);
- } else {
- len = clif_mob0078(md,WFIFOP(sd->fd,0));
- WFIFOSET(sd->fd,len);
- }
-
- if(mob_get_equip(md->class_) > 0) // mob equipment [Valaris]
- clif_mob_equip(md,mob_get_equip(md->class_));
-
- if(md->size==2) // tiny/big mobs [Valaris]
- clif_specialeffect(&md->bl,423,0);
- else if(md->size==1)
- clif_specialeffect(&md->bl,421,0);
-
-
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_getareachar_pet(struct map_session_data* sd,struct pet_data* pd)
-{
- int len;
-
- nullpo_retv(sd);
- nullpo_retv(pd);
-
- if(pd->state.state == MS_WALK){
- len = clif_pet007b(pd,WFIFOP(sd->fd,0));
- WFIFOSET(sd->fd,len);
- } else {
- len = clif_pet0078(pd,WFIFOP(sd->fd,0));
- WFIFOSET(sd->fd,len);
- }
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_getareachar_item(struct map_session_data* sd,struct flooritem_data* fitem)
-{
- int view,fd;
-
- nullpo_retv(sd);
- nullpo_retv(fitem);
-
- fd=sd->fd;
- //009d <ID>.l <item ID>.w <identify flag>.B <X>.w <Y>.w <amount>.w <subX>.B <subY>.B
- WFIFOW(fd,0)=0x9d;
- WFIFOL(fd,2)=fitem->bl.id;
- if((view = itemdb_viewid(fitem->item_data.nameid)) > 0)
- WFIFOW(fd,6)=view;
- else
- WFIFOW(fd,6)=fitem->item_data.nameid;
- WFIFOB(fd,8)=fitem->item_data.identify;
- WFIFOW(fd,9)=fitem->bl.x;
- WFIFOW(fd,11)=fitem->bl.y;
- WFIFOW(fd,13)=fitem->item_data.amount;
- WFIFOB(fd,15)=fitem->subx;
- WFIFOB(fd,16)=fitem->suby;
-
- WFIFOSET(fd,packet_len_table[0x9d]);
-}
-/*==========================================
- * ꊃXƒLƒ‹ƒGƒtƒFƒNƒg‚ªŽ‹ŠE‚É“ü‚é
- *------------------------------------------
- */
-int clif_getareachar_skillunit(struct map_session_data *sd,struct skill_unit *unit)
-{
- int fd;
- struct block_list *bl;
-
- nullpo_retr(0, unit);
-
- fd=sd->fd;
- bl=map_id2bl(unit->group->src_id);
-#if PACKETVER < 3
- memset(WFIFOP(fd,0),0,packet_len_table[0x11f]);
- WFIFOW(fd, 0)=0x11f;
- WFIFOL(fd, 2)=unit->bl.id;
- WFIFOL(fd, 6)=unit->group->src_id;
- WFIFOW(fd,10)=unit->bl.x;
- WFIFOW(fd,12)=unit->bl.y;
- WFIFOB(fd,14)=unit->group->unit_id;
- WFIFOB(fd,15)=0;
- WFIFOSET(fd,packet_len_table[0x11f]);
-#else
- memset(WFIFOP(fd,0),0,packet_len_table[0x1c9]);
- WFIFOW(fd, 0)=0x1c9;
- WFIFOL(fd, 2)=unit->bl.id;
- WFIFOL(fd, 6)=unit->group->src_id;
- WFIFOW(fd,10)=unit->bl.x;
- WFIFOW(fd,12)=unit->bl.y;
- WFIFOB(fd,14)=unit->group->unit_id;
- WFIFOB(fd,15)=1;
- WFIFOL(fd,15+1)=0; //1-4’²‚ׂ½ŒÀ‚èŒÅ’è
- WFIFOL(fd,15+5)=0; //5-8’²‚ׂ½ŒÀ‚èŒÅ’è
- //9-12ƒ}ƒbƒv‚²‚Ƃňê’è‚Ì77-80‚Æ‚Í‚Ü‚½ˆá‚¤4ƒoƒCƒg‚Ì‚©‚È‚è‘å‚«‚È”Žš
- WFIFOL(fd,15+13)=unit->bl.y - 0x12; //13-16ƒ†ƒjƒbƒg‚ÌYÀ•W-18‚Á‚Û‚¢(Y:17‚ÅFF FF FF FF)
- WFIFOL(fd,15+17)=0x004f37dd; //17-20’²‚ׂ½ŒÀ‚èŒÅ’è
- WFIFOL(fd,15+21)=0x0012f674; //21-24’²‚ׂ½ŒÀ‚èŒÅ’è
- WFIFOL(fd,15+25)=0x0012f664; //25-28’²‚ׂ½ŒÀ‚èŒÅ’è
- WFIFOL(fd,15+29)=0x0012f654; //29-32’²‚ׂ½ŒÀ‚èŒÅ’è
- WFIFOL(fd,15+33)=0x77527bbc; //33-36’²‚ׂ½ŒÀ‚èŒÅ’è
- //37-39
- WFIFOB(fd,15+40)=0x2d; //40’²‚ׂ½ŒÀ‚èŒÅ’è
- WFIFOL(fd,15+41)=0; //41-44’²‚ׂ½ŒÀ‚è0ŒÅ’è
- WFIFOL(fd,15+45)=0; //45-48’²‚ׂ½ŒÀ‚è0ŒÅ’è
- WFIFOL(fd,15+49)=0; //49-52’²‚ׂ½ŒÀ‚è0ŒÅ’è
- WFIFOL(fd,15+53)=0x0048d919; //53-56’²‚ׂ½ŒÀ‚èŒÅ’è
- WFIFOL(fd,15+57)=0x0000003e; //57-60’²‚ׂ½ŒÀ‚èŒÅ’è
- WFIFOL(fd,15+61)=0x0012f66c; //61-64’²‚ׂ½ŒÀ‚èŒÅ’è
- //65-68
- //69-72
- if(bl) WFIFOL(fd,15+73)=bl->y; //73-76pŽÒ‚ÌYÀ•W
- WFIFOL(fd,15+77)=unit->bl.m; //77-80ƒ}ƒbƒvID‚©‚È‚ŸH‚©‚È‚è2ƒoƒCƒg‚Å‘«‚è‚»‚¤‚È”Žš
- WFIFOB(fd,15+81)=0xaa; //81I’[•¶Žš0xaa
-
- /* Graffiti [Valaris] */
- if(unit->group->unit_id==0xb0) {
- WFIFOL(fd,15)=1;
- WFIFOL(fd,16)=1;
- memcpy(WFIFOP(fd,17),unit->group->valstr,80);
- }
-
- WFIFOSET(fd,packet_len_table[0x1c9]);
-#endif
- if(unit->group->skill_id == WZ_ICEWALL)
- clif_set0192(fd,unit->bl.m,unit->bl.x,unit->bl.y,5);
-
- return 0;
-}
-/*==========================================
- * ꊃXƒLƒ‹ƒGƒtƒFƒNƒg‚ªŽ‹ŠE‚©‚çÁ‚¦‚é
- *------------------------------------------
- */
-int clif_clearchar_skillunit(struct skill_unit *unit,int fd)
-{
- nullpo_retr(0, unit);
-
- WFIFOW(fd, 0)=0x120;
- WFIFOL(fd, 2)=unit->bl.id;
- WFIFOSET(fd,packet_len_table[0x120]);
- if(unit->group && unit->group->skill_id == WZ_ICEWALL)
- clif_set0192(fd,unit->bl.m,unit->bl.x,unit->bl.y,unit->val2);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_01ac(struct block_list *bl)
-{
- unsigned char buf[32];
-
- nullpo_retr(0, bl);
-
- WBUFW(buf, 0) = 0x1ac;
- WBUFL(buf, 2) = bl->id;
-
- clif_send(buf,packet_len_table[0x1ac],bl,AREA);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
- int clif_getareachar(struct block_list* bl,va_list ap)
-{
- struct map_session_data *sd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- sd=va_arg(ap,struct map_session_data*);
-
- if (sd == NULL || session[sd->fd] == NULL)
- return 0;
-
- switch(bl->type){
- case BL_PC:
- if(sd==(struct map_session_data*)bl)
- break;
- clif_getareachar_pc(sd,(struct map_session_data*) bl);
- break;
- case BL_NPC:
- clif_getareachar_npc(sd,(struct npc_data*) bl);
- break;
- case BL_MOB:
- clif_getareachar_mob(sd,(struct mob_data*) bl);
- break;
- case BL_PET:
- clif_getareachar_pet(sd,(struct pet_data*) bl);
- break;
- case BL_ITEM:
- clif_getareachar_item(sd,(struct flooritem_data*) bl);
- break;
- case BL_SKILL:
- clif_getareachar_skillunit(sd,(struct skill_unit *)bl);
- break;
- default:
- if(battle_config.error_log)
- printf("get area char ??? %d\n",bl->type);
- break;
- }
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_pcoutsight(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd,*dstsd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, sd=va_arg(ap,struct map_session_data*));
-
- switch(bl->type){
- case BL_PC:
- dstsd = (struct map_session_data*) bl;
- if(sd != dstsd) {
- clif_clearchar_id(dstsd->bl.id,0,sd->fd);
- clif_clearchar_id(sd->bl.id,0,dstsd->fd);
- if(dstsd->chatID){
- struct chat_data *cd;
- cd=(struct chat_data*)map_id2bl(dstsd->chatID);
- if(cd->usersd[0]==dstsd)
- clif_dispchat(cd,sd->fd);
- }
- if(dstsd->vender_id){
- clif_closevendingboard(&dstsd->bl,sd->fd);
- }
- }
- break;
- case BL_NPC:
- if( ((struct npc_data *)bl)->class_ != INVISIBLE_CLASS )
- clif_clearchar_id(bl->id,0,sd->fd);
- break;
- case BL_MOB:
- case BL_PET:
- clif_clearchar_id(bl->id,0,sd->fd);
- break;
- case BL_ITEM:
- clif_clearflooritem((struct flooritem_data*)bl,sd->fd);
- break;
- case BL_SKILL:
- clif_clearchar_skillunit((struct skill_unit *)bl,sd->fd);
- break;
- }
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_pcinsight(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd,*dstsd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, sd=va_arg(ap,struct map_session_data*));
-
- switch(bl->type){
- case BL_PC:
- dstsd = (struct map_session_data *)bl;
- if(sd != dstsd) {
- clif_getareachar_pc(sd,dstsd);
- clif_getareachar_pc(dstsd,sd);
- }
- break;
- case BL_NPC:
- clif_getareachar_npc(sd,(struct npc_data*)bl);
- break;
- case BL_MOB:
- clif_getareachar_mob(sd,(struct mob_data*)bl);
- break;
- case BL_PET:
- clif_getareachar_pet(sd,(struct pet_data*)bl);
- break;
- case BL_ITEM:
- clif_getareachar_item(sd,(struct flooritem_data*)bl);
- break;
- case BL_SKILL:
- clif_getareachar_skillunit(sd,(struct skill_unit *)bl);
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_moboutsight(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd;
- struct mob_data *md;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, md=va_arg(ap,struct mob_data*));
-
- if(bl->type==BL_PC
- && ((sd = (struct map_session_data*) bl) != NULL)
- && session[sd->fd] != NULL) {
- clif_clearchar_id(md->bl.id,0,sd->fd);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_mobinsight(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd;
- struct mob_data *md;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- md=va_arg(ap,struct mob_data*);
- if(bl->type==BL_PC
- && ((sd = (struct map_session_data*) bl) != NULL)
- && session[sd->fd] != NULL) {
- clif_getareachar_mob(sd,md);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_petoutsight(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd;
- struct pet_data *pd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, pd=va_arg(ap,struct pet_data*));
-
- if(bl->type==BL_PC
- && ((sd = (struct map_session_data*) bl) != NULL)
- && session[sd->fd] != NULL) {
- clif_clearchar_id(pd->bl.id,0,sd->fd);
- }
-
- return 0;
-}
-
-// npc walking [Valaris]
-int clif_npcoutsight(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd;
- struct npc_data *nd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, nd=va_arg(ap,struct npc_data*));
-
- if(bl->type==BL_PC
- && ((sd = (struct map_session_data*) bl) != NULL)
- && session[sd->fd] != NULL) {
- clif_clearchar_id(nd->bl.id,0,sd->fd);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_petinsight(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd;
- struct pet_data *pd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- pd=va_arg(ap,struct pet_data*);
- if(bl->type==BL_PC
- && ((sd = (struct map_session_data*) bl) != NULL)
- && session[sd->fd] != NULL) {
- clif_getareachar_pet(sd,pd);
- }
-
- return 0;
-}
-
-// npc walking [Valaris]
-int clif_npcinsight(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd;
- struct npc_data *nd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- nd=va_arg(ap,struct npc_data*);
- if(bl->type==BL_PC
- && ((sd = (struct map_session_data*) bl) != NULL)
- && session[sd->fd] != NULL) {
- clif_getareachar_npc(sd,nd);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_skillinfo(struct map_session_data *sd,int skillid,int type,int range)
-{
- int fd,id;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- if( (id=sd->status.skill[skillid].id) <= 0 )
- return 0;
- WFIFOW(fd,0)=0x147;
- WFIFOW(fd,2) = id;
- if(type < 0)
- WFIFOW(fd,4) = skill_get_inf(id);
- else
- WFIFOW(fd,4) = type;
- WFIFOW(fd,6) = 0;
- WFIFOW(fd,8) = sd->status.skill[skillid].lv;
- WFIFOW(fd,10) = skill_get_sp(id,sd->status.skill[skillid].lv);
- if(range < 0) {
- range = skill_get_range(id,sd->status.skill[skillid].lv);
- if(range < 0)
- range = status_get_range(&sd->bl) - (range + 1);
- WFIFOW(fd,12)= range;
- } else
- WFIFOW(fd,12)= range;
- memset(WFIFOP(fd,14),0,24);
- if(!(skill_get_inf2(id)&0x01) || battle_config.quest_skill_learn == 1 || (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill) )
- //WFIFOB(fd,38)= (sd->status.skill[skillid].lv < skill_get_max(id) && sd->status.skill[skillid].flag ==0 )? 1:0;
- WFIFOB(fd,38)= (sd->status.skill[skillid].lv < skill_tree_get_max(id, sd->status.class_) && sd->status.skill[skillid].flag ==0 )? 1:0;
- else
- WFIFOB(fd,38) = 0;
- WFIFOSET(fd,packet_len_table[0x147]);
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒŠƒXƒg‚ð‘—M‚·‚é
- *------------------------------------------
- */
-int clif_skillinfoblock(struct map_session_data *sd)
-{
- int fd;
- int i,c,len=4,id,range;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x10f;
- for ( i = c = 0; i < MAX_SKILL; i++){
- if( (id=sd->status.skill[i].id)!=0 ){
- WFIFOW(fd,len ) = id;
- WFIFOW(fd,len+2) = skill_get_inf(id);
- WFIFOW(fd,len+4) = 0;
- WFIFOW(fd,len+6) = sd->status.skill[i].lv;
- WFIFOW(fd,len+8) = skill_get_sp(id,sd->status.skill[i].lv);
- range = skill_get_range(id,sd->status.skill[i].lv);
- if(range < 0)
- range = status_get_range(&sd->bl) - (range + 1);
- WFIFOW(fd,len+10)= range;
- memset(WFIFOP(fd,len+12),0,24);
- if(!(skill_get_inf2(id)&0x01) || battle_config.quest_skill_learn == 1 || (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill) )
- //WFIFOB(fd,len+36)= (sd->status.skill[i].lv < skill_get_max(id) && sd->status.skill[i].flag ==0 )? 1:0;
- WFIFOB(fd,len+36)= (sd->status.skill[i].lv < skill_tree_get_max(id, sd->status.class_) && sd->status.skill[i].flag ==0 )? 1:0;
- else
- WFIFOB(fd,len+36) = 0;
- len+=37;
- c++;
- }
- }
- WFIFOW(fd,2)=len;
- WFIFOSET(fd,len);
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹Š„‚èU‚è’Ê’m
- *------------------------------------------
- */
-int clif_skillup(struct map_session_data *sd,int skill_num)
-{
- int range,fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0) = 0x10e;
- WFIFOW(fd,2) = skill_num;
- WFIFOW(fd,4) = sd->status.skill[skill_num].lv;
- WFIFOW(fd,6) = skill_get_sp(skill_num,sd->status.skill[skill_num].lv);
- range = skill_get_range(skill_num,sd->status.skill[skill_num].lv);
- if(range < 0)
- range = status_get_range(&sd->bl) - (range + 1);
- WFIFOW(fd,8) = range;
- //WFIFOB(fd,10) = (sd->status.skill[skill_num].lv < skill_get_max(sd->status.skill[skill_num].id)) ? 1 : 0;
- WFIFOB(fd,10) = (sd->status.skill[skill_num].lv < skill_tree_get_max(sd->status.skill[skill_num].id, sd->status.class_)) ? 1 : 0;
- WFIFOSET(fd,packet_len_table[0x10e]);
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹‰r¥ƒGƒtƒFƒNƒg‚ð‘—M‚·‚é
- *------------------------------------------
- */
-int clif_skillcasting(struct block_list* bl,
- int src_id,int dst_id,int dst_x,int dst_y,int skill_num,int casttime)
-{
- unsigned char buf[32];
- WBUFW(buf,0) = 0x13e;
- WBUFL(buf,2) = src_id;
- WBUFL(buf,6) = dst_id;
- WBUFW(buf,10) = dst_x;
- WBUFW(buf,12) = dst_y;
- WBUFW(buf,14) = skill_num;//–‚–@‰r¥ƒXƒLƒ‹
- WBUFL(buf,16) = skill_get_pl(skill_num);//‘®«
- WBUFL(buf,20) = casttime;//skill‰r¥ŽžŠÔ
- clif_send(buf,packet_len_table[0x13e], bl, AREA);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_skillcastcancel(struct block_list* bl)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, bl);
-
- WBUFW(buf,0) = 0x1b9;
- WBUFL(buf,2) = bl->id;
- clif_send(buf,packet_len_table[0x1b9], bl, AREA);
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹‰r¥Ž¸”s
- *------------------------------------------
- */
-int clif_skill_fail(struct map_session_data *sd,int skill_id,int type,int btype)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
-
- // reset all variables [celest]
- sd->skillx = sd->skilly = -1;
- sd->skillid = sd->skilllv = -1;
- sd->skillitem = sd->skillitemlv = -1;
-
- if(type==0x4 && (battle_config.display_delay_skill_fail==0 || sd->nodelay)){
- return 0;
- }
-
- WFIFOW(fd,0) = 0x110;
- WFIFOW(fd,2) = skill_id;
- WFIFOW(fd,4) = btype;
- WFIFOW(fd,6) = 0;
- WFIFOB(fd,8) = 0;
- WFIFOB(fd,9) = type;
- WFIFOSET(fd,packet_len_table[0x110]);
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹UŒ‚ƒGƒtƒFƒNƒg•ƒ_ƒ[ƒW
- *------------------------------------------
- */
-int clif_skill_damage(struct block_list *src,struct block_list *dst,
- unsigned int tick,int sdelay,int ddelay,int damage,int div,int skill_id,int skill_lv,int type)
-{
- unsigned char buf[64];
- struct status_change *sc_data;
-
- nullpo_retr(0, src);
- nullpo_retr(0, dst);
-
- sc_data = status_get_sc_data(dst);
-
- if(type != 5 && dst->type == BL_PC && ((struct map_session_data *)dst)->special_state.infinite_endure)
- type = 9;
- if(sc_data) {
- if(type != 5 && sc_data[SC_ENDURE].timer != -1)
- type = 9;
- if(sc_data[SC_HALLUCINATION].timer != -1 && damage > 0)
- damage = damage*(5+sc_data[SC_HALLUCINATION].val1) + rand()%100;
- }
-
-#if PACKETVER < 3
- WBUFW(buf,0)=0x114;
- WBUFW(buf,2)=skill_id;
- WBUFL(buf,4)=src->id;
- WBUFL(buf,8)=dst->id;
- WBUFL(buf,12)=tick;
- WBUFL(buf,16)=sdelay;
- WBUFL(buf,20)=ddelay;
- WBUFW(buf,24)=damage;
- WBUFW(buf,26)=skill_lv;
- WBUFW(buf,28)=div;
- WBUFB(buf,30)=(type>0)?type:skill_get_hit(skill_id);
- clif_send(buf,packet_len_table[0x114],src,AREA);
-#else
- WBUFW(buf,0)=0x1de;
- WBUFW(buf,2)=skill_id;
- WBUFL(buf,4)=src->id;
- WBUFL(buf,8)=dst->id;
- WBUFL(buf,12)=tick;
- WBUFL(buf,16)=sdelay;
- WBUFL(buf,20)=ddelay;
- WBUFL(buf,24)=damage;
- WBUFW(buf,28)=skill_lv;
- WBUFW(buf,30)=div;
- WBUFB(buf,32)=(type>0)?type:skill_get_hit(skill_id);
- clif_send(buf,packet_len_table[0x1de],src,AREA);
-#endif
-
- return 0;
-}
-
-/*==========================================
- * ‚«”ò‚΂µƒXƒLƒ‹UŒ‚ƒGƒtƒFƒNƒg•ƒ_ƒ[ƒW
- *------------------------------------------
- */
-int clif_skill_damage2(struct block_list *src,struct block_list *dst,
- unsigned int tick,int sdelay,int ddelay,int damage,int div,int skill_id,int skill_lv,int type)
-{
- unsigned char buf[64];
- struct status_change *sc_data;
-
- nullpo_retr(0, src);
- nullpo_retr(0, dst);
-
- sc_data = status_get_sc_data(dst);
-
- if(type != 5 && dst->type == BL_PC && ((struct map_session_data *)dst)->special_state.infinite_endure)
- type = 9;
- if(sc_data) {
- if(type != 5 && sc_data[SC_ENDURE].timer != -1)
- type = 9;
- if(sc_data[SC_HALLUCINATION].timer != -1 && damage > 0)
- damage = damage*(5+sc_data[SC_HALLUCINATION].val1) + rand()%100;
- }
-
- WBUFW(buf,0)=0x115;
- WBUFW(buf,2)=skill_id;
- WBUFL(buf,4)=src->id;
- WBUFL(buf,8)=dst->id;
- WBUFL(buf,12)=tick;
- WBUFL(buf,16)=sdelay;
- WBUFL(buf,20)=ddelay;
- WBUFW(buf,24)=dst->x;
- WBUFW(buf,26)=dst->y;
- WBUFW(buf,28)=damage;
- WBUFW(buf,30)=skill_lv;
- WBUFW(buf,32)=div;
- WBUFB(buf,34)=(type>0)?type:skill_get_hit(skill_id);
- clif_send(buf,packet_len_table[0x115],src,AREA);
-
- return 0;
-}
-
-/*==========================================
- * Žx‰‡/‰ñ•œƒXƒLƒ‹ƒGƒtƒFƒNƒg
- *------------------------------------------
- */
-int clif_skill_nodamage(struct block_list *src,struct block_list *dst,
- int skill_id,int heal,int fail)
-{
- unsigned char buf[32];
-
- nullpo_retr(0, src);
- nullpo_retr(0, dst);
-
- WBUFW(buf,0)=0x11a;
- WBUFW(buf,2)=skill_id;
- WBUFW(buf,4)=(heal > 0x7fff)? 0x7fff:heal;
- WBUFL(buf,6)=dst->id;
- WBUFL(buf,10)=src->id;
- WBUFB(buf,14)=fail;
- clif_send(buf,packet_len_table[0x11a],src,AREA);
-
- return 0;
-}
-
-/*==========================================
- * ꊃXƒLƒ‹ƒGƒtƒFƒNƒg
- *------------------------------------------
- */
-int clif_skill_poseffect(struct block_list *src,int skill_id,int val,int x,int y,int tick)
-{
- unsigned char buf[32];
-
- nullpo_retr(0, src);
-
- WBUFW(buf,0)=0x117;
- WBUFW(buf,2)=skill_id;
- WBUFL(buf,4)=src->id;
- WBUFW(buf,8)=val;
- WBUFW(buf,10)=x;
- WBUFW(buf,12)=y;
- WBUFL(buf,14)=tick;
- clif_send(buf,packet_len_table[0x117],src,AREA);
-
- return 0;
-}
-
-/*==========================================
- * ꊃXƒLƒ‹ƒGƒtƒFƒNƒg•\Ž¦
- *------------------------------------------
- */
-int clif_skill_setunit(struct skill_unit *unit)
-{
- unsigned char buf[128];
- struct block_list *bl;
-
- nullpo_retr(0, unit);
-
- bl=map_id2bl(unit->group->src_id);
-
-#if PACKETVER < 3
- memset(WBUFP(buf, 0),0,packet_len_table[0x11f]);
- WBUFW(buf, 0)=0x11f;
- WBUFL(buf, 2)=unit->bl.id;
- WBUFL(buf, 6)=unit->group->src_id;
- WBUFW(buf,10)=unit->bl.x;
- WBUFW(buf,12)=unit->bl.y;
- WBUFB(buf,14)=unit->group->unit_id;
- WBUFB(buf,15)=0;
- clif_send(buf,packet_len_table[0x11f],&unit->bl,AREA);
-#else
- memset(WBUFP(buf, 0),0,packet_len_table[0x1c9]);
- WBUFW(buf, 0)=0x1c9;
- WBUFL(buf, 2)=unit->bl.id;
- WBUFL(buf, 6)=unit->group->src_id;
- WBUFW(buf,10)=unit->bl.x;
- WBUFW(buf,12)=unit->bl.y;
- WBUFB(buf,14)=unit->group->unit_id;
- WBUFB(buf,15)=1;
- WBUFL(buf,15+1)=0; //1-4’²‚ׂ½ŒÀ‚èŒÅ’è
- WBUFL(buf,15+5)=0; //5-8’²‚ׂ½ŒÀ‚èŒÅ’è
- //9-12ƒ}ƒbƒv‚²‚Ƃňê’è‚Ì77-80‚Æ‚Í‚Ü‚½ˆá‚¤4ƒoƒCƒg‚Ì‚©‚È‚è‘å‚«‚È”Žš
- WBUFL(buf,15+13)=unit->bl.y - 0x12; //13-16ƒ†ƒjƒbƒg‚ÌYÀ•W-18‚Á‚Û‚¢(Y:17‚ÅFF FF FF FF)
- WBUFL(buf,15+17)=0x004f37dd; //17-20’²‚ׂ½ŒÀ‚èŒÅ’è(0x1b2‚Å0x004fdbdd‚¾‚Á‚½)
- WBUFL(buf,15+21)=0x0012f674; //21-24’²‚ׂ½ŒÀ‚èŒÅ’è
- WBUFL(buf,15+25)=0x0012f664; //25-28’²‚ׂ½ŒÀ‚èŒÅ’è
- WBUFL(buf,15+29)=0x0012f654; //29-32’²‚ׂ½ŒÀ‚èŒÅ’è
- WBUFL(buf,15+33)=0x77527bbc; //33-36’²‚ׂ½ŒÀ‚èŒÅ’è
- //37-39
- WBUFB(buf,15+40)=0x2d; //40’²‚ׂ½ŒÀ‚èŒÅ’è
- WBUFL(buf,15+41)=0; //41-44’²‚ׂ½ŒÀ‚è0ŒÅ’è
- WBUFL(buf,15+45)=0; //45-48’²‚ׂ½ŒÀ‚è0ŒÅ’è
- WBUFL(buf,15+49)=0; //49-52’²‚ׂ½ŒÀ‚è0ŒÅ’è
- WBUFL(buf,15+53)=0x0048d919; //53-56’²‚ׂ½ŒÀ‚èŒÅ’è(0x01b2‚Å0x00495119‚¾‚Á‚½)
- WBUFL(buf,15+57)=0x0000003e; //57-60’²‚ׂ½ŒÀ‚èŒÅ’è
- WBUFL(buf,15+61)=0x0012f66c; //61-64’²‚ׂ½ŒÀ‚èŒÅ’è
- //65-68
- //69-72
- if(bl) WBUFL(buf,15+73)=bl->y; //73-76pŽÒ‚ÌYÀ•W
- WBUFL(buf,15+77)=unit->bl.m; //77-80ƒ}ƒbƒvID‚©‚È‚ŸH‚©‚È‚è2ƒoƒCƒg‚Å‘«‚è‚»‚¤‚È”Žš
- WBUFB(buf,15+81)=0xaa; //81I’[•¶Žš0xaa
-
- /* Graffiti [Valaris] */
- if(unit->group->unit_id==0xb0) {
- WBUFL(buf,15)=1;
- WBUFL(buf,16)=1;
- memcpy(WBUFP(buf,17),unit->group->valstr,80);
- }
-
- clif_send(buf,packet_len_table[0x1c9],&unit->bl,AREA);
-#endif
- return 0;
-}
-/*==========================================
- * ꊃXƒLƒ‹ƒGƒtƒFƒNƒgíœ
- *------------------------------------------
- */
-int clif_skill_delunit(struct skill_unit *unit)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, unit);
-
- WBUFW(buf, 0)=0x120;
- WBUFL(buf, 2)=unit->bl.id;
- clif_send(buf,packet_len_table[0x120],&unit->bl,AREA);
- return 0;
-}
-/*==========================================
- * ƒ[ƒvꊑI‘ð
- *------------------------------------------
- */
-int clif_skill_warppoint(struct map_session_data *sd,int skill_num,
- const char *map1,const char *map2,const char *map3,const char *map4)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x11c;
- WFIFOW(fd,2)=skill_num;
- strncpy((char*)WFIFOP(fd, 4),map1,16);
- strncpy((char*)WFIFOP(fd,20),map2,16);
- strncpy((char*)WFIFOP(fd,36),map3,16);
- strncpy((char*)WFIFOP(fd,52),map4,16);
- WFIFOSET(fd,packet_len_table[0x11c]);
- return 0;
-}
-/*==========================================
- * ƒƒ‚‰ž“š
- *------------------------------------------
- */
-int clif_skill_memo(struct map_session_data *sd,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
-
- WFIFOW(fd,0)=0x11e;
- WFIFOB(fd,2)=flag;
- WFIFOSET(fd,packet_len_table[0x11e]);
- return 0;
-}
-int clif_skill_teleportmessage(struct map_session_data *sd,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x189;
- WFIFOW(fd,2)=flag;
- WFIFOSET(fd,packet_len_table[0x189]);
- return 0;
-}
-
-/*==========================================
- * ƒ‚ƒ“ƒXƒ^[î•ñ
- *------------------------------------------
- */
-int clif_skill_estimation(struct map_session_data *sd,struct block_list *dst)
-{
- struct mob_data *md;
- unsigned char buf[64];
- int i;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, dst);
-
- if(dst->type!=BL_MOB )
- return 0;
- if((md=(struct mob_data *)dst) == NULL)
- return 0;
-
- WBUFW(buf, 0)=0x18c;
- WBUFW(buf, 2)=mob_get_viewclass(md->class_);
- WBUFW(buf, 4)=md->level;
- WBUFW(buf, 6)=mob_db[md->class_].size;
- WBUFL(buf, 8)=md->hp;
- WBUFW(buf,12)=status_get_def2(&md->bl);
- WBUFW(buf,14)=mob_db[md->class_].race;
- WBUFW(buf,16)=status_get_mdef2(&md->bl) - (mob_db[md->class_].vit>>1);
- WBUFW(buf,18)=status_get_elem_type(&md->bl);
- for(i=0;i<9;i++)
- WBUFB(buf,20+i)= battle_attr_fix(100,i+1,md->def_ele);
-
- if(sd->status.party_id>0)
- clif_send(buf,packet_len_table[0x18c],&sd->bl,PARTY_AREA);
- else{
- memcpy(WFIFOP(sd->fd,0),buf,packet_len_table[0x18c]);
- WFIFOSET(sd->fd,packet_len_table[0x18c]);
- }
- return 0;
-}
-/*==========================================
- * ƒAƒCƒeƒ€‡¬‰Â”\ƒŠƒXƒg
- *------------------------------------------
- */
-int clif_skill_produce_mix_list(struct map_session_data *sd,int trigger)
-{
- int i,c,view,fd;
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd, 0)=0x18d;
-
- for(i=0,c=0;i<MAX_SKILL_PRODUCE_DB;i++){
- if( skill_can_produce_mix(sd,skill_produce_db[i].nameid,trigger) ){
- if((view = itemdb_viewid(skill_produce_db[i].nameid)) > 0)
- WFIFOW(fd,c*8+ 4)= view;
- else
- WFIFOW(fd,c*8+ 4)= skill_produce_db[i].nameid;
- WFIFOW(fd,c*8+ 6)= 0x0012;
- WFIFOL(fd,c*8+ 8)= sd->status.char_id;
- c++;
- }
- }
- WFIFOW(fd, 2)=c*8+8;
- WFIFOSET(fd,WFIFOW(fd,2));
- if(c > 0) sd->state.produce_flag = 1;
- return 0;
-}
-
-/*==========================================
- * ó‘ÔˆÙíƒAƒCƒRƒ“/ƒƒbƒZ[ƒW•\Ž¦
- *------------------------------------------
- */
-int clif_status_change(struct block_list *bl,int type,int flag)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, bl);
-
- WBUFW(buf,0)=0x0196;
- WBUFW(buf,2)=type;
- WBUFL(buf,4)=bl->id;
- WBUFB(buf,8)=flag;
- clif_send(buf,packet_len_table[0x196],bl,AREA);
- return 0;
-}
-
-/*==========================================
- * Send message (modified by [Yor])
- *------------------------------------------
- */
-int clif_displaymessage(const int fd, char* mes)
-{
- // invalid pointer?
- nullpo_retr(-1, mes);
-
- //Console [Wizputer]
- if (fd == 0)
- printf("\033[0;36mConsole: \033[0m\033[1m%s\033[0m\n", mes);
- else {
- int len_mes = strlen(mes);
-
- if (len_mes > 0) { // don't send a void message (it's not displaying on the client chat). @help can send void line.
- WFIFOW(fd,0) = 0x8e;
- WFIFOW(fd,2) = 5 + len_mes; // 4 + len + NULL teminate
- memcpy(WFIFOP(fd,4), mes, len_mes + 1);
- WFIFOSET(fd, 5 + len_mes);
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * “V‚̺‚ð‘—M‚·‚é
- *------------------------------------------
- */
-int clif_GMmessage(struct block_list *bl, char* mes, int len, int flag)
-{
- unsigned char *buf;
- int lp;
-
- lp = (flag & 0x10) ? 8 : 4;
- buf = (unsigned char*)aCallocA(len + lp, sizeof(unsigned char));
-
- WBUFW(buf,0) = 0x9a;
- WBUFW(buf,2) = len + lp;
- WBUFL(buf,4) = 0x65756c62;
- memcpy(WBUFP(buf,lp), mes, len);
- flag &= 0x07;
- clif_send(buf, WBUFW(buf,2), bl,
- (flag == 1) ? ALL_SAMEMAP :
- (flag == 2) ? AREA :
- (flag == 3) ? SELF :
- ALL_CLIENT);
-
- if(buf) aFree(buf);
-
- return 0;
-}
-
-/*==========================================
- * ƒOƒ[ƒoƒ‹ƒƒbƒZ[ƒW
- *------------------------------------------
- */
-void clif_GlobalMessage(struct block_list *bl,char *message)
-{
- char buf[100];
- int len,cmd=0x8d;
-
- if(!bl || !message)
- return;
-
- len=strlen(message)+1;
-
- WBUFW(buf,0)=cmd;
- WBUFW(buf,2)=len+8;
- WBUFL(buf,4)=bl->id;
- strncpy((char *) WBUFP(buf,8),message,len);
- clif_send((unsigned char *) buf,WBUFW(buf,2),bl,AREA_CHAT_WOC);
-}
-
-/*==========================================
- * HPSP‰ñ•œƒGƒtƒFƒNƒg‚ð‘—M‚·‚é
- *------------------------------------------
- */
-int clif_heal(int fd,int type,int val)
-{
- WFIFOW(fd,0)=0x13d;
- WFIFOW(fd,2)=type;
- WFIFOW(fd,4)=val;
- WFIFOSET(fd,packet_len_table[0x13d]);
-
- return 0;
-}
-
-/*==========================================
- * •œŠˆ‚·‚é
- *------------------------------------------
- */
-int clif_resurrection(struct block_list *bl,int type)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, bl);
-
- if(bl->type==BL_PC) { // disguises [Valaris]
- struct map_session_data *sd=((struct map_session_data *)bl);
- if(sd && sd->disguise > 23 && sd->disguise < 4001)
- clif_spawnpc(sd);
- }
-
- WBUFW(buf,0)=0x148;
- WBUFL(buf,2)=bl->id;
- WBUFW(buf,6)=type;
-
- clif_send(buf,packet_len_table[0x148],bl,type==1 ? AREA : AREA_WOS);
-
- return 0;
-}
-
-/*==========================================
- * PVPŽÀ‘•Hi‰¼j
- *------------------------------------------
- */
-int clif_set0199(int fd,int type)
-{
- WFIFOW(fd,0)=0x199;
- WFIFOW(fd,2)=type;
- WFIFOSET(fd,packet_len_table[0x199]);
-
- return 0;
-}
-
-/*==========================================
- * PVPŽÀ‘•H(‰¼)
- *------------------------------------------
- */
-int clif_pvpset(struct map_session_data *sd,int pvprank,int pvpnum,int type)
-{
- nullpo_retr(0, sd);
-
- if(map[sd->bl.m].flag.nopvp)
- return 0;
-
- if(type == 2) {
- WFIFOW(sd->fd,0) = 0x19a;
- WFIFOL(sd->fd,2) = sd->bl.id;
- if(pvprank<=0)
- pc_calc_pvprank(sd);
- WFIFOL(sd->fd,6) = pvprank;
- WFIFOL(sd->fd,10) = pvpnum;
- WFIFOSET(sd->fd,packet_len_table[0x19a]);
- } else {
- unsigned char buf[32];
-
- WBUFW(buf,0) = 0x19a;
- WBUFL(buf,2) = sd->bl.id;
- if(sd->status.option&0x46)
- // WTF? a -1 to an unsigned value...
- WBUFL(buf,6) = 0xFFFFFFFF;
- else
- if(pvprank<=0)
- pc_calc_pvprank(sd);
- WBUFL(buf,6) = pvprank;
- WBUFL(buf,10) = pvpnum;
- if(!type)
- clif_send(buf,packet_len_table[0x19a],&sd->bl,AREA);
- else
- clif_send(buf,packet_len_table[0x19a],&sd->bl,ALL_SAMEMAP);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_send0199(int map,int type)
-{
- struct block_list bl;
- unsigned char buf[16];
-
- bl.m = map;
- WBUFW(buf,0)=0x199;
- WBUFW(buf,2)=type;
- clif_send(buf,packet_len_table[0x199],&bl,ALL_SAMEMAP);
-
- return 0;
-}
-
-/*==========================================
- * ¸˜BƒGƒtƒFƒNƒg‚ð‘—M‚·‚é
- *------------------------------------------
- */
-int clif_refine(int fd,struct map_session_data *sd,int fail,int index,int val)
-{
- WFIFOW(fd,0)=0x188;
- WFIFOW(fd,2)=fail;
- WFIFOW(fd,4)=index+2;
- WFIFOW(fd,6)=val;
- WFIFOSET(fd,packet_len_table[0x188]);
-
- return 0;
-}
-
-/*==========================================
- * Wisp/page is transmitted to the destination player
- *------------------------------------------
- */
-int clif_wis_message(int fd, char *nick, char *mes, int mes_len) // R 0097 <len>.w <nick>.24B <message>.?B
-{
-// printf("clif_wis_message(%d, %s, %s)\n", fd, nick, mes);
-
- WFIFOW(fd,0) = 0x97;
- WFIFOW(fd,2) = mes_len + 24 + 4;
- memcpy(WFIFOP(fd,4), nick, 24);
- memcpy(WFIFOP(fd,28), mes, mes_len);
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-
-/*==========================================
- * The transmission result of Wisp/page is transmitted to the source player
- *------------------------------------------
- */
-int clif_wis_end(int fd, int flag) // R 0098 <type>.B: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
-{
- WFIFOW(fd,0) = 0x98;
- WFIFOW(fd,2) = flag;
- WFIFOSET(fd,packet_len_table[0x98]);
- return 0;
-}
-
-/*==========================================
- * ƒLƒƒƒ‰ID–¼‘Oˆø‚«Œ‹‰Ê‚ð‘—M‚·‚é
- *------------------------------------------
- */
-int clif_solved_charname(struct map_session_data *sd,int char_id)
-{
- char *p= map_charid2nick(char_id);
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- if(p!=NULL){
- WFIFOW(fd,0)=0x194;
- WFIFOL(fd,2)=char_id;
- memcpy(WFIFOP(fd,6), p,24 );
- WFIFOSET(fd,packet_len_table[0x194]);
- }else{
- map_reqchariddb(sd,char_id);
- chrif_searchcharid(char_id);
- }
- return 0;
-}
-
-/*==========================================
- * ƒJ[ƒh‚Ì‘}“ü‰Â”\ƒŠƒXƒg‚ð•Ô‚·
- *------------------------------------------
- */
-int clif_use_card(struct map_session_data *sd,int idx)
-{
- nullpo_retr(0, sd);
-
- if(sd->inventory_data[idx]) {
- int i,c;
- int ep=sd->inventory_data[idx]->equip;
- int fd=sd->fd;
- WFIFOW(fd,0)=0x017b;
-
- for(i=c=0;i<MAX_INVENTORY;i++){
- int j;
-
- if(sd->inventory_data[i] == NULL)
- continue;
- if(sd->inventory_data[i]->type!=4 && sd->inventory_data[i]->type!=5) // •Ší–h‹ï‚¶‚á‚È‚¢
- continue;
- if(sd->status.inventory[i].card[0]==0x00ff) // »‘¢•Ší
- continue;
- if(sd->status.inventory[i].card[0]==(short)0xff00 || sd->status.inventory[i].card[0]==0x00fe)
- continue;
- if(sd->status.inventory[i].identify==0 ) // –¢ŠÓ’è
- continue;
-
- if((sd->inventory_data[i]->equip&ep)==0) // ‘•”õŒÂŠ‚ªˆá‚¤
- continue;
- if(sd->inventory_data[i]->type==4 && ep==32) // ‚ƒJ[ƒh‚Æ—¼Žè•Ší
- continue;
-
- for(j=0;j<sd->inventory_data[i]->slot;j++){
- if( sd->status.inventory[i].card[j]==0 )
- break;
- }
- if(j==sd->inventory_data[i]->slot) // ‚·‚łɃJ[ƒh‚ªˆê”t
- continue;
-
- WFIFOW(fd,4+c*2)=i+2;
- c++;
- }
- WFIFOW(fd,2)=4+c*2;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
-
- return 0;
-}
-/*==========================================
- * ƒJ[ƒh‚Ì‘}“üI—¹
- *------------------------------------------
- */
-int clif_insert_card(struct map_session_data *sd,int idx_equip,int idx_card,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x17d;
- WFIFOW(fd,2)=idx_equip+2;
- WFIFOW(fd,4)=idx_card+2;
- WFIFOB(fd,6)=flag;
- WFIFOSET(fd,packet_len_table[0x17d]);
- return 0;
-}
-
-/*==========================================
- * ŠÓ’è‰Â”\ƒAƒCƒeƒ€ƒŠƒXƒg‘—M
- *------------------------------------------
- */
-int clif_item_identify_list(struct map_session_data *sd)
-{
- int i,c;
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
-
- WFIFOW(fd,0)=0x177;
- for(i=c=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid > 0 && sd->status.inventory[i].identify!=1){
- WFIFOW(fd,c*2+4)=i+2;
- c++;
- }
- }
- if(c > 0) {
- WFIFOW(fd,2)=c*2+4;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
- return 0;
-}
-
-/*==========================================
- * ŠÓ’茋‰Ê
- *------------------------------------------
- */
-int clif_item_identified(struct map_session_data *sd,int idx,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd, 0)=0x179;
- WFIFOW(fd, 2)=idx+2;
- WFIFOB(fd, 4)=flag;
- WFIFOSET(fd,packet_len_table[0x179]);
- return 0;
-}
-
-/*==========================================
- * C—‰Â”\ƒAƒCƒeƒ€ƒŠƒXƒg‘—M
- * ¦ŽÀۂ̃pƒPƒbƒg‚ª‚í‚©‚ç‚È‚¢‚Ì‚Å“®ì‚µ‚Ü‚¹‚ñ
- *------------------------------------------
- */
-int clif_item_repair_list(struct map_session_data *sd)
-{
- int i,c;
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
-
- WFIFOW(fd,0)=0x177; // temporarily use same packet as clif_item_identify
- for(i=c=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid > 0 && sd->status.inventory[i].attribute==1){
- WFIFOW(fd,c*2+4)=i+2;
- c++;
- }
- }
- if(c > 0) {
- WFIFOW(fd,2)=c*2+4;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
- return 0;
-}
-
-/*==========================================
- * Weapon Refining [Celest]
- *------------------------------------------
- */
-int clif_item_refine_list(struct map_session_data *sd)
-{
- int i,c;
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
-
- WFIFOW(fd,0)=0x177; // temporarily use same packet as clif_item_identify
- for(i=c=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid > 0 && itemdb_type(sd->status.inventory[i].nameid)==4){
- WFIFOW(fd,c*2+4)=i+2;
- c++;
- }
- }
- if(c > 0) {
- WFIFOW(fd,2)=c*2+4;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
- return 0;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€‚É‚æ‚éˆêŽž“I‚ȃXƒLƒ‹Œø‰Ê
- *------------------------------------------
- */
-int clif_item_skill(struct map_session_data *sd,int skillid,int skilllv,const char *name)
-{
- int range,fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd, 0)=0x147;
- WFIFOW(fd, 2)=skillid;
- WFIFOW(fd, 4)=skill_get_inf(skillid);
- WFIFOW(fd, 6)=0;
- WFIFOW(fd, 8)=skilllv;
- WFIFOW(fd,10)=skill_get_sp(skillid,skilllv);
- range = skill_get_range(skillid,skilllv);
- if(range < 0)
- range = status_get_range(&sd->bl) - (range + 1);
- WFIFOW(fd,12)=range;
- strncpy((char*)WFIFOP(fd,14),name,24);
- WFIFOB(fd,38)=0;
- WFIFOSET(fd,packet_len_table[0x147]);
- return 0;
-}
-
-/*==========================================
- * ƒJ[ƒg‚ɃAƒCƒeƒ€’ljÁ
- *------------------------------------------
- */
-int clif_cart_additem(struct map_session_data *sd,int n,int amount,int fail)
-{
- int view,j,fd;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- buf=WFIFOP(fd,0);
- if(n<0 || n>=MAX_CART || sd->status.cart[n].nameid<=0)
- return 1;
-
- WBUFW(buf,0)=0x124;
- WBUFW(buf,2)=n+2;
- WBUFL(buf,4)=amount;
- if((view = itemdb_viewid(sd->status.cart[n].nameid)) > 0)
- WBUFW(buf,8)=view;
- else
- WBUFW(buf,8)=sd->status.cart[n].nameid;
- WBUFB(buf,10)=sd->status.cart[n].identify;
- WBUFB(buf,11)=sd->status.cart[n].attribute;
- WBUFB(buf,12)=sd->status.cart[n].refine;
- if(sd->status.cart[n].card[0]==0x00ff || sd->status.cart[n].card[0]==0x00fe || sd->status.cart[n].card[0]==(short)0xff00) {
- WBUFW(buf,13)=sd->status.cart[n].card[0];
- WBUFW(buf,15)=sd->status.cart[n].card[1];
- WBUFW(buf,17)=sd->status.cart[n].card[2];
- WBUFW(buf,19)=sd->status.cart[n].card[3];
- } else {
- if(sd->status.cart[n].card[0] > 0 && (j=itemdb_viewid(sd->status.cart[n].card[0])) > 0)
- WBUFW(buf,13)= j;
- else
- WBUFW(buf,13)= sd->status.cart[n].card[0];
- if(sd->status.cart[n].card[1] > 0 && (j=itemdb_viewid(sd->status.cart[n].card[1])) > 0)
- WBUFW(buf,15)= j;
- else
- WBUFW(buf,15)= sd->status.cart[n].card[1];
- if(sd->status.cart[n].card[2] > 0 && (j=itemdb_viewid(sd->status.cart[n].card[2])) > 0)
- WBUFW(buf,17)= j;
- else
- WBUFW(buf,17)= sd->status.cart[n].card[2];
- if(sd->status.cart[n].card[3] > 0 && (j=itemdb_viewid(sd->status.cart[n].card[3])) > 0)
- WBUFW(buf,19)= j;
- else
- WBUFW(buf,19)= sd->status.cart[n].card[3];
- }
- WFIFOSET(fd,packet_len_table[0x124]);
- return 0;
-}
-
-/*==========================================
- * ƒJ[ƒg‚©‚çƒAƒCƒeƒ€íœ
- *------------------------------------------
- */
-int clif_cart_delitem(struct map_session_data *sd,int n,int amount)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
-
- WFIFOW(fd,0)=0x125;
- WFIFOW(fd,2)=n+2;
- WFIFOL(fd,4)=amount;
-
- WFIFOSET(fd,packet_len_table[0x125]);
-
- return 0;
-}
-
-/*==========================================
- * ƒJ[ƒg‚̃AƒCƒeƒ€ƒŠƒXƒg
- *------------------------------------------
- */
-int clif_cart_itemlist(struct map_session_data *sd)
-{
- struct item_data *id;
- int i,n,fd;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- buf = WFIFOP(fd,0);
-#if PACKETVER < 5
- WBUFW(buf,0)=0x123;
- for(i=0,n=0;i<MAX_CART;i++){
- if(sd->status.cart[i].nameid<=0)
- continue;
- id = itemdb_search(sd->status.cart[i].nameid);
- if(itemdb_isequip2(id))
- continue;
- WBUFW(buf,n*10+4)=i+2;
- if(id->view_id > 0)
- WBUFW(buf,n*10+6)=id->view_id;
- else
- WBUFW(buf,n*10+6)=sd->status.cart[i].nameid;
- WBUFB(buf,n*10+8)=id->type;
- WBUFB(buf,n*10+9)=sd->status.cart[i].identify;
- WBUFW(buf,n*10+10)=sd->status.cart[i].amount;
- WBUFW(buf,n*10+12)=0;
- n++;
- }
- if(n){
- WBUFW(buf,2)=4+n*10;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
-#else
- WBUFW(buf,0)=0x1ef;
- for(i=0,n=0;i<MAX_CART;i++){
- if(sd->status.cart[i].nameid<=0)
- continue;
- id = itemdb_search(sd->status.cart[i].nameid);
- if(itemdb_isequip2(id))
- continue;
- WBUFW(buf,n*18+4)=i+2;
- if(id->view_id > 0)
- WBUFW(buf,n*18+6)=id->view_id;
- else
- WBUFW(buf,n*18+6)=sd->status.cart[i].nameid;
- WBUFB(buf,n*18+8)=id->type;
- WBUFB(buf,n*18+9)=sd->status.cart[i].identify;
- WBUFW(buf,n*18+10)=sd->status.cart[i].amount;
- WBUFW(buf,n*18+12)=0;
- WBUFW(buf,n*18+14)=sd->status.cart[i].card[0];
- WBUFW(buf,n*18+16)=sd->status.cart[i].card[1];
- WBUFW(buf,n*18+18)=sd->status.cart[i].card[2];
- WBUFW(buf,n*18+20)=sd->status.cart[i].card[3];
- n++;
- }
- if(n){
- WBUFW(buf,2)=4+n*18;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
-#endif
- return 0;
-}
-
-/*==========================================
- * ƒJ[ƒg‚Ì‘•”õ•iƒŠƒXƒg
- *------------------------------------------
- */
-int clif_cart_equiplist(struct map_session_data *sd)
-{
- struct item_data *id;
- int i,j,n,fd;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- buf = WFIFOP(fd,0);
-
- WBUFW(buf,0)=0x122;
- for(i=0,n=0;i<MAX_INVENTORY;i++){
- if(sd->status.cart[i].nameid<=0)
- continue;
- id = itemdb_search(sd->status.cart[i].nameid);
- if(!itemdb_isequip2(id))
- continue;
- WBUFW(buf,n*20+4)=i+2;
- if(id->view_id > 0)
- WBUFW(buf,n*20+6)=id->view_id;
- else
- WBUFW(buf,n*20+6)=sd->status.cart[i].nameid;
- WBUFB(buf,n*20+8)=id->type;
- WBUFB(buf,n*20+9)=sd->status.cart[i].identify;
- WBUFW(buf,n*20+10)=id->equip;
- WBUFW(buf,n*20+12)=sd->status.cart[i].equip;
- WBUFB(buf,n*20+14)=sd->status.cart[i].attribute;
- WBUFB(buf,n*20+15)=sd->status.cart[i].refine;
- if(sd->status.cart[i].card[0]==0x00ff || sd->status.cart[i].card[0]==0x00fe || sd->status.cart[i].card[0]==(short)0xff00) {
- WBUFW(buf,n*20+16)=sd->status.cart[i].card[0];
- WBUFW(buf,n*20+18)=sd->status.cart[i].card[1];
- WBUFW(buf,n*20+20)=sd->status.cart[i].card[2];
- WBUFW(buf,n*20+22)=sd->status.cart[i].card[3];
- } else {
- if(sd->status.cart[i].card[0] > 0 && (j=itemdb_viewid(sd->status.cart[i].card[0])) > 0)
- WBUFW(buf,n*20+16)= j;
- else
- WBUFW(buf,n*20+16)= sd->status.cart[i].card[0];
- if(sd->status.cart[i].card[1] > 0 && (j=itemdb_viewid(sd->status.cart[i].card[1])) > 0)
- WBUFW(buf,n*20+18)= j;
- else
- WBUFW(buf,n*20+18)= sd->status.cart[i].card[1];
- if(sd->status.cart[i].card[2] > 0 && (j=itemdb_viewid(sd->status.cart[i].card[2])) > 0)
- WBUFW(buf,n*20+20)= j;
- else
- WBUFW(buf,n*20+20)= sd->status.cart[i].card[2];
- if(sd->status.cart[i].card[3] > 0 && (j=itemdb_viewid(sd->status.cart[i].card[3])) > 0)
- WBUFW(buf,n*20+22)= j;
- else
- WBUFW(buf,n*20+22)= sd->status.cart[i].card[3];
- }
- n++;
- }
- if(n){
- WBUFW(buf,2)=4+n*20;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
- return 0;
-}
-
-/*==========================================
- * ˜I“XŠJÝ
- *------------------------------------------
- */
-int clif_openvendingreq(struct map_session_data *sd,int num)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x12d;
- WFIFOW(fd,2)=num;
- WFIFOSET(fd,packet_len_table[0x12d]);
-
- return 0;
-}
-
-/*==========================================
- * ˜I“XŠÅ”•\Ž¦
- *------------------------------------------
- */
-int clif_showvendingboard(struct block_list* bl,char *message,int fd)
-{
- unsigned char buf[128];
-
- nullpo_retr(0, bl);
-
- WBUFW(buf,0)=0x131;
- WBUFL(buf,2)=bl->id;
- strncpy((char*)WBUFP(buf,6),message,80);
- if(fd){
- memcpy(WFIFOP(fd,0),buf,packet_len_table[0x131]);
- WFIFOSET(fd,packet_len_table[0x131]);
- }else{
- clif_send(buf,packet_len_table[0x131],bl,AREA_WOS);
- }
- return 0;
-}
-
-/*==========================================
- * ˜I“XŠÅ”ÂÁ‹Ž
- *------------------------------------------
- */
-int clif_closevendingboard(struct block_list* bl,int fd)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, bl);
-
- WBUFW(buf,0)=0x132;
- WBUFL(buf,2)=bl->id;
- if(fd){
- memcpy(WFIFOP(fd,0),buf,packet_len_table[0x132]);
- WFIFOSET(fd,packet_len_table[0x132]);
- }else{
- clif_send(buf,packet_len_table[0x132],bl,AREA_WOS);
- }
-
- return 0;
-}
-/*==========================================
- * ˜I“XƒAƒCƒeƒ€ƒŠƒXƒg
- *------------------------------------------
- */
-int clif_vendinglist(struct map_session_data *sd,int id,struct vending *vending)
-{
- struct item_data *data;
- int i,j,n,index,fd;
- struct map_session_data *vsd;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, vending);
- nullpo_retr(0, vsd=map_id2sd(id));
-
- fd=sd->fd;
- buf = WFIFOP(fd,0);
- WBUFW(buf,0)=0x133;
- WBUFL(buf,4)=id;
- for(i=0,n=0;i<vsd->vend_num;i++){
- if(vending[i].amount<=0)
- continue;
- WBUFL(buf,8+n*22)=vending[i].value;
- WBUFW(buf,12+n*22)=vending[i].amount;
- WBUFW(buf,14+n*22)=(index=vending[i].index)+2;
- if(vsd->status.cart[index].nameid <= 0 || vsd->status.cart[index].amount <= 0)
- continue;
- data = itemdb_search(vsd->status.cart[index].nameid);
- WBUFB(buf,16+n*22)=data->type;
- if(data->view_id > 0)
- WBUFW(buf,17+n*22)=data->view_id;
- else
- WBUFW(buf,17+n*22)=vsd->status.cart[index].nameid;
- WBUFB(buf,19+n*22)=vsd->status.cart[index].identify;
- WBUFB(buf,20+n*22)=vsd->status.cart[index].attribute;
- WBUFB(buf,21+n*22)=vsd->status.cart[index].refine;
- if(vsd->status.cart[index].card[0]==0x00ff || vsd->status.cart[index].card[0]==0x00fe || vsd->status.cart[index].card[0]==(short)0xff00) {
- WBUFW(buf,22+n*22)=vsd->status.cart[index].card[0];
- WBUFW(buf,24+n*22)=vsd->status.cart[index].card[1];
- WBUFW(buf,26+n*22)=vsd->status.cart[index].card[2];
- WBUFW(buf,28+n*22)=vsd->status.cart[index].card[3];
- } else {
- if(vsd->status.cart[index].card[0] > 0 && (j=itemdb_viewid(vsd->status.cart[index].card[0])) > 0)
- WBUFW(buf,22+n*22)= j;
- else
- WBUFW(buf,22+n*22)= vsd->status.cart[index].card[0];
- if(vsd->status.cart[index].card[1] > 0 && (j=itemdb_viewid(vsd->status.cart[index].card[1])) > 0)
- WBUFW(buf,24+n*22)= j;
- else
- WBUFW(buf,24+n*22)= vsd->status.cart[index].card[1];
- if(vsd->status.cart[index].card[2] > 0 && (j=itemdb_viewid(vsd->status.cart[index].card[2])) > 0)
- WBUFW(buf,26+n*22)= j;
- else
- WBUFW(buf,26+n*22)= vsd->status.cart[index].card[2];
- if(vsd->status.cart[index].card[3] > 0 && (j=itemdb_viewid(vsd->status.cart[index].card[3])) > 0)
- WBUFW(buf,28+n*22)= j;
- else
- WBUFW(buf,28+n*22)= vsd->status.cart[index].card[3];
- }
- n++;
- }
- if(n > 0){
- WBUFW(buf,2)=8+n*22;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
-
- return 0;
-}
-
-/*==========================================
- * ˜I“XƒAƒCƒeƒ€w“üŽ¸”s
- *------------------------------------------
-*/
-int clif_buyvending(struct map_session_data *sd,int index,int amount,int fail)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x135;
- WFIFOW(fd,2)=index+2;
- WFIFOW(fd,4)=amount;
- WFIFOB(fd,6)=fail;
- WFIFOSET(fd,packet_len_table[0x135]);
-
- return 0;
-}
-
-/*==========================================
- * ˜I“XŠJݬŒ÷
- *------------------------------------------
-*/
-int clif_openvending(struct map_session_data *sd,int id,struct vending *vending)
-{
- struct item_data *data;
- int i,j,n,index,fd;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- buf = WFIFOP(fd,0);
-
- WBUFW(buf,0)=0x136;
- WBUFL(buf,4)=id;
- for(i=0,n=0;i<sd->vend_num;i++){
- if (sd->vend_num > 2+pc_checkskill(sd,MC_VENDING)) return 0;
- WBUFL(buf,8+n*22)=vending[i].value;
- WBUFW(buf,12+n*22)=(index=vending[i].index)+2;
- WBUFW(buf,14+n*22)=vending[i].amount;
- if(sd->status.cart[index].nameid <= 0 || sd->status.cart[index].amount <= 0 || sd->status.cart[index].identify==0 ||
- sd->status.cart[index].attribute==1) // Prevent unidentified and broken items from being sold [Valaris]
- continue;
- data = itemdb_search(sd->status.cart[index].nameid);
- WBUFB(buf,16+n*22)=data->type;
- if(data->view_id > 0)
- WBUFW(buf,17+n*22)=data->view_id;
- else
- WBUFW(buf,17+n*22)=sd->status.cart[index].nameid;
- WBUFB(buf,19+n*22)=sd->status.cart[index].identify;
- WBUFB(buf,20+n*22)=sd->status.cart[index].attribute;
- WBUFB(buf,21+n*22)=sd->status.cart[index].refine;
- if(sd->status.cart[index].card[0]==0x00ff || sd->status.cart[index].card[0]==0x00fe || sd->status.cart[index].card[0]==(short)0xff00) {
- WBUFW(buf,22+n*22)=sd->status.cart[index].card[0];
- WBUFW(buf,24+n*22)=sd->status.cart[index].card[1];
- WBUFW(buf,26+n*22)=sd->status.cart[index].card[2];
- WBUFW(buf,28+n*22)=sd->status.cart[index].card[3];
- } else {
- if(sd->status.cart[index].card[0] > 0 && (j=itemdb_viewid(sd->status.cart[index].card[0])) > 0)
- WBUFW(buf,22+n*22)= j;
- else
- WBUFW(buf,22+n*22)= sd->status.cart[index].card[0];
- if(sd->status.cart[index].card[1] > 0 && (j=itemdb_viewid(sd->status.cart[index].card[1])) > 0)
- WBUFW(buf,24+n*22)= j;
- else
- WBUFW(buf,24+n*22)= sd->status.cart[index].card[1];
- if(sd->status.cart[index].card[2] > 0 && (j=itemdb_viewid(sd->status.cart[index].card[2])) > 0)
- WBUFW(buf,26+n*22)= j;
- else
- WBUFW(buf,26+n*22)= sd->status.cart[index].card[2];
- if(sd->status.cart[index].card[3] > 0 && (j=itemdb_viewid(sd->status.cart[index].card[3])) > 0)
- WBUFW(buf,28+n*22)= j;
- else
- WBUFW(buf,28+n*22)= sd->status.cart[index].card[3];
- }
- n++;
- }
- if(n > 0){
- WBUFW(buf,2)=8+n*22;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
-
- return n;
-}
-
-/*==========================================
- * ˜I“XƒAƒCƒeƒ€”Ì”„•ñ
- *------------------------------------------
-*/
-int clif_vendingreport(struct map_session_data *sd,int index,int amount)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x137;
- WFIFOW(fd,2)=index+2;
- WFIFOW(fd,4)=amount;
- WFIFOSET(fd,packet_len_table[0x137]);
-
- return 0;
-}
-
-/*==========================================
- * ƒp[ƒeƒB쬊®—¹
- *------------------------------------------
- */
-int clif_party_created(struct map_session_data *sd,int flag)
-{
- int fd;
-
- // printf("clif_party_message(%s, %d, %s)\n", p->name, account_id, mes);
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xfa;
- WFIFOB(fd,2)=flag;
- WFIFOSET(fd,packet_len_table[0xfa]);
- return 0;
-}
-/*==========================================
- * ƒp[ƒeƒBî•ñ‘—M
- *------------------------------------------
- */
-int clif_party_info(struct party *p,int fd)
-{
- unsigned char buf[1024];
- int i,c;
- struct map_session_data *sd=NULL;
-
- nullpo_retr(0, p);
-
- WBUFW(buf,0)=0xfb;
- memcpy(WBUFP(buf,4),p->name,24);
- for(i=c=0;i<MAX_PARTY;i++){
- struct party_member *m=&p->member[i];
- if(m->account_id>0){
- if(sd==NULL) sd=m->sd;
- WBUFL(buf,28+c*46)=m->account_id;
- memcpy(WBUFP(buf,28+c*46+ 4),m->name,24);
- memcpy(WBUFP(buf,28+c*46+28),m->map,16);
- WBUFB(buf,28+c*46+44)=(m->leader)?0:1;
- WBUFB(buf,28+c*46+45)=(m->online)?0:1;
- c++;
- }
- }
- WBUFW(buf,2)=28+c*46;
- if(fd>=0){ // fd‚ªÝ’肳‚ê‚Ä‚é‚È‚ç‚»‚ê‚É‘—‚é
- memcpy(WFIFOP(fd,0),buf,WBUFW(buf,2));
- WFIFOSET(fd,WFIFOW(fd,2));
- return 9;
- }
- if(sd!=NULL)
- clif_send(buf,WBUFW(buf,2),&sd->bl,PARTY);
- return 0;
-}
-/*==========================================
- * ƒp[ƒeƒBŠ©—U
- *------------------------------------------
- */
-int clif_party_invite(struct map_session_data *sd,struct map_session_data *tsd)
-{
- int fd;
- struct party *p;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, tsd);
-
- fd=tsd->fd;
-
- if( (p=party_search(sd->status.party_id))==NULL )
- return 0;
-
- WFIFOW(fd,0)=0xfe;
- WFIFOL(fd,2)=sd->status.account_id;
- memcpy(WFIFOP(fd,6),p->name,24);
- WFIFOSET(fd,packet_len_table[0xfe]);
- return 0;
-}
-
-/*==========================================
- * ƒp[ƒeƒBŠ©—UŒ‹‰Ê
- *------------------------------------------
- */
-int clif_party_inviteack(struct map_session_data *sd,char *nick,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xfd;
- memcpy(WFIFOP(fd,2),nick,24);
- WFIFOB(fd,26)=flag;
- WFIFOSET(fd,packet_len_table[0xfd]);
- return 0;
-}
-
-/*==========================================
- * ƒp[ƒeƒBÝ’è‘—M
- * flag & 0x001=exp•ÏXƒ~ƒX
- * 0x010=item•ÏXƒ~ƒX
- * 0x100=ˆêl‚É‚Ì‚Ý‘—M
- *------------------------------------------
- */
-int clif_party_option(struct party *p,struct map_session_data *sd,int flag)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, p);
-
-// if(battle_config.etc_log)
-// printf("clif_party_option: %d %d %d\n",p->exp,p->item,flag);
- if(sd==NULL && flag==0){
- int i;
- for(i=0;i<MAX_PARTY;i++)
- if((sd=map_id2sd(p->member[i].account_id))!=NULL)
- break;
- }
- if(sd==NULL)
- return 0;
- WBUFW(buf,0)=0x101;
- WBUFW(buf,2)=((flag&0x01)?2:p->exp);
- WBUFW(buf,4)=((flag&0x10)?2:p->item);
- if(flag==0)
- clif_send(buf,packet_len_table[0x101],&sd->bl,PARTY);
- else {
- memcpy(WFIFOP(sd->fd,0),buf,packet_len_table[0x101]);
- WFIFOSET(sd->fd,packet_len_table[0x101]);
- }
- return 0;
-}
-/*==========================================
- * ƒp[ƒeƒB’E‘Þi’E‘Þ‘O‚ɌĂԂ±‚Æj
- *------------------------------------------
- */
-int clif_party_leaved(struct party *p,struct map_session_data *sd,int account_id,char *name,int flag)
-{
- unsigned char buf[64];
- int i;
-
- nullpo_retr(0, p);
-
- WBUFW(buf,0)=0x105;
- WBUFL(buf,2)=account_id;
- memcpy(WBUFP(buf,6),name,24);
- WBUFB(buf,30)=flag&0x0f;
-
- if((flag&0xf0)==0){
- if(sd==NULL)
- for(i=0;i<MAX_PARTY;i++)
- if((sd=p->member[i].sd)!=NULL)
- break;
- if (sd!=NULL)
- clif_send(buf,packet_len_table[0x105],&sd->bl,PARTY);
- } else if (sd!=NULL) {
- memcpy(WFIFOP(sd->fd,0),buf,packet_len_table[0x105]);
- WFIFOSET(sd->fd,packet_len_table[0x105]);
- }
- return 0;
-}
-/*==========================================
- * ƒp[ƒeƒBƒƒbƒZ[ƒW‘—M
- *------------------------------------------
- */
-int clif_party_message(struct party *p,int account_id,char *mes,int len)
-{
- struct map_session_data *sd;
- int i;
-
- nullpo_retr(0, p);
-
- for(i=0;i<MAX_PARTY;i++){
- if((sd=p->member[i].sd)!=NULL)
- break;
- }
- if(sd!=NULL){
- unsigned char buf[1024];
- WBUFW(buf,0)=0x109;
- WBUFW(buf,2)=len+8;
- WBUFL(buf,4)=account_id;
- memcpy(WBUFP(buf,8),mes,len);
- clif_send(buf,len+8,&sd->bl,PARTY);
- }
- return 0;
-}
-/*==========================================
- * ƒp[ƒeƒBÀ•W’Ê’m
- *------------------------------------------
- */
-int clif_party_xy(struct party *p,struct map_session_data *sd)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, sd);
-
- WBUFW(buf,0)=0x107;
- WBUFL(buf,2)=sd->status.account_id;
- WBUFW(buf,6)=sd->bl.x;
- WBUFW(buf,8)=sd->bl.y;
- clif_send(buf,packet_len_table[0x107],&sd->bl,PARTY_SAMEMAP_WOS);
-// if(battle_config.etc_log)
-// printf("clif_party_xy %d\n",sd->status.account_id);
- return 0;
-}
-/*==========================================
- * ƒp[ƒeƒBHP’Ê’m
- *------------------------------------------
- */
-int clif_party_hp(struct party *p,struct map_session_data *sd)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, sd);
-
- WBUFW(buf,0)=0x106;
- WBUFL(buf,2)=sd->status.account_id;
- WBUFW(buf,6)=(sd->status.hp > 0x7fff)? 0x7fff:sd->status.hp;
- WBUFW(buf,8)=(sd->status.max_hp > 0x7fff)? 0x7fff:sd->status.max_hp;
- clif_send(buf,packet_len_table[0x106],&sd->bl,PARTY_AREA_WOS);
-// if(battle_config.etc_log)
-// printf("clif_party_hp %d\n",sd->status.account_id);
- return 0;
-}
-/*==========================================
- * GM‚ÖꊂÆHP’Ê’m
- *------------------------------------------
- */
-int clif_hpmeter(struct map_session_data *sd)
-{
- struct map_session_data *md;
- unsigned char buf[16];
- unsigned char buf2[16];
- int i;
-
- nullpo_retr(0, sd);
-
- WBUFW(buf,0)=0x107;
- WBUFL(buf,2)=sd->bl.id;
- WBUFW(buf,6)=sd->bl.x;
- WBUFW(buf,8)=sd->bl.y;
-
- for(i=0;i<fd_max;i++){
- if(session[i] && (md = (struct map_session_data*)session[i]->session_data) && md->state.auth &&
- md->bl.m == sd->bl.m && pc_isGM(md) && sd != md){
- memcpy(WFIFOP(i,0),buf,packet_len_table[0x107]);
- WFIFOSET(i,packet_len_table[0x107]);
- }
- }
-
- WBUFW(buf2,0)=0x106;
- WBUFL(buf2,2)=sd->status.account_id;
- WBUFW(buf2,6)=(sd->status.hp > 0x7fff)? 0x7fff:sd->status.hp;
- WBUFW(buf2,8)=(sd->status.max_hp > 0x7fff)? 0x7fff:sd->status.max_hp;
- for(i=0;i<fd_max;i++){
- if(session[i] && (md = (struct map_session_data*)session[i]->session_data) && md->state.auth &&
- md->bl.m == sd->bl.m && pc_isGM(md) && sd != md){
- memcpy(WFIFOP(i,0),buf2,packet_len_table[0x106]);
- WFIFOSET(i,packet_len_table[0x106]);
- }
- }
-
- return 0;
-}
-/*==================================================
- * Update monster hp view if it has changed [Celest]
- *--------------------------------------------------
- */
-int clif_update_mobhp(struct mob_data *md)
-{
- unsigned char buf[102];
- char mobhp[50];
-
- nullpo_retr(0, md);
-
- WBUFW(buf,0) = 0x95;
- WBUFL(buf,2) = md->bl.id;
-
- memcpy(WBUFP(buf,6), md->name, 24);
- sprintf(mobhp, "hp: %d/%d", md->hp, mob_db[md->class_].max_hp);
- WBUFW(buf, 0) = 0x195;
- memcpy(WBUFP(buf,30), mobhp, 24);
- WBUFL(buf,54) = 0;
- WBUFL(buf,78) = 0;
- clif_send(buf,packet_len_table[0x195],&md->bl,AREA);
-
- return 0;
-}
-/*==========================================
- * ƒp[ƒeƒBꊈړ®i–¢Žg—pj
- *------------------------------------------
- */
-int clif_party_move(struct party *p,struct map_session_data *sd,int online)
-{
- unsigned char buf[128];
-
- nullpo_retr(0, sd);
- nullpo_retr(0, p);
-
- WBUFW(buf, 0)=0x104;
- WBUFL(buf, 2)=sd->status.account_id;
- WBUFL(buf, 6)=0;
- WBUFW(buf,10)=sd->bl.x;
- WBUFW(buf,12)=sd->bl.y;
- WBUFB(buf,14)=!online;
- memcpy(WBUFP(buf,15),p->name,24);
- memcpy(WBUFP(buf,39),sd->status.name,24);
- memcpy(WBUFP(buf,63),map[sd->bl.m].name,16);
- clif_send(buf,packet_len_table[0x104],&sd->bl,PARTY);
- return 0;
-}
-/*==========================================
- * UŒ‚‚·‚邽‚߂Ɉړ®‚ª•K—v
- *------------------------------------------
- */
-int clif_movetoattack(struct map_session_data *sd,struct block_list *bl)
-{
- int fd;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, bl);
-
- fd=sd->fd;
- WFIFOW(fd, 0)=0x139;
- WFIFOL(fd, 2)=bl->id;
- WFIFOW(fd, 6)=bl->x;
- WFIFOW(fd, 8)=bl->y;
- WFIFOW(fd,10)=sd->bl.x;
- WFIFOW(fd,12)=sd->bl.y;
- WFIFOW(fd,14)=sd->attackrange;
- WFIFOSET(fd,packet_len_table[0x139]);
- return 0;
-}
-/*==========================================
- * »‘¢ƒGƒtƒFƒNƒg
- *------------------------------------------
- */
-int clif_produceeffect(struct map_session_data *sd,int flag,int nameid)
-{
- int view,fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- // –¼‘O‚Ì“o˜^‚Æ‘—M‚ðæ‚É‚µ‚Ä‚¨‚­
- if( map_charid2nick(sd->status.char_id)==NULL )
- map_addchariddb(sd->status.char_id,sd->status.name);
- clif_solved_charname(sd,sd->status.char_id);
-
- WFIFOW(fd, 0)=0x18f;
- WFIFOW(fd, 2)=flag;
- if((view = itemdb_viewid(nameid)) > 0)
- WFIFOW(fd, 4)=view;
- else
- WFIFOW(fd, 4)=nameid;
- WFIFOSET(fd,packet_len_table[0x18f]);
- return 0;
-}
-
-// pet
-int clif_catch_process(struct map_session_data *sd)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x19e;
- WFIFOSET(fd,packet_len_table[0x19e]);
-
- return 0;
-}
-
-int clif_pet_rulet(struct map_session_data *sd,int data)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x1a0;
- WFIFOB(fd,2)=data;
- WFIFOSET(fd,packet_len_table[0x1a0]);
-
- return 0;
-}
-
-/*==========================================
- * pet—‘ƒŠƒXƒgì¬
- *------------------------------------------
- */
-int clif_sendegg(struct map_session_data *sd)
-{
- //R 01a6 <len>.w <index>.w*
- int i,n=0,fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x1a6;
- if(sd->status.pet_id <= 0) {
- for(i=0,n=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid<=0 || sd->inventory_data[i] == NULL ||
- sd->inventory_data[i]->type!=7 ||
- sd->status.inventory[i].amount<=0)
- continue;
- WFIFOW(fd,n*2+4)=i+2;
- n++;
- }
- }
- WFIFOW(fd,2)=4+n*2;
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-int clif_send_petdata(struct map_session_data *sd,int type,int param)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x1a4;
- WFIFOB(fd,2)=type;
- WFIFOL(fd,3)=sd->pd->bl.id;
- WFIFOL(fd,7)=param;
- WFIFOSET(fd,packet_len_table[0x1a4]);
-
- return 0;
-}
-
-int clif_send_petstatus(struct map_session_data *sd)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x1a2;
- memcpy(WFIFOP(fd,2),sd->pet.name,24);
- WFIFOB(fd,26)=(battle_config.pet_rename == 1)? 0:sd->pet.rename_flag;
- WFIFOW(fd,27)=sd->pet.level;
- WFIFOW(fd,29)=sd->pet.hungry;
- WFIFOW(fd,31)=sd->pet.intimate;
- WFIFOW(fd,33)=sd->pet.equip;
- WFIFOSET(fd,packet_len_table[0x1a2]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_pet_emotion(struct pet_data *pd,int param)
-{
- unsigned char buf[16];
- struct map_session_data *sd;
-
- nullpo_retr(0, pd);
- nullpo_retr(0, sd = pd->msd);
-
- memset(buf,0,packet_len_table[0x1aa]);
-
- WBUFW(buf,0)=0x1aa;
- WBUFL(buf,2)=pd->bl.id;
- if(param >= 100 && sd->petDB->talk_convert_class) {
- if(sd->petDB->talk_convert_class < 0)
- return 0;
- else if(sd->petDB->talk_convert_class > 0) {
- param -= (pd->class_ - 100)*100;
- param += (sd->petDB->talk_convert_class - 100)*100;
- }
- }
- WBUFL(buf,6)=param;
-
- clif_send(buf,packet_len_table[0x1aa],&pd->bl,AREA);
-
- return 0;
-}
-
-int clif_pet_performance(struct block_list *bl,int param)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, bl);
-
- memset(buf,0,packet_len_table[0x1a4]);
-
- WBUFW(buf,0)=0x1a4;
- WBUFB(buf,2)=4;
- WBUFL(buf,3)=bl->id;
- WBUFL(buf,7)=param;
-
- clif_send(buf,packet_len_table[0x1a4],bl,AREA);
-
- return 0;
-}
-
-int clif_pet_equip(struct pet_data *pd,int nameid)
-{
- unsigned char buf[16];
- int view;
-
- nullpo_retr(0, pd);
-
- memset(buf,0,packet_len_table[0x1a4]);
-
- WBUFW(buf,0)=0x1a4;
- WBUFB(buf,2)=3;
- WBUFL(buf,3)=pd->bl.id;
- if((view = itemdb_viewid(nameid)) > 0)
- WBUFL(buf,7)=view;
- else
- WBUFL(buf,7)=nameid;
-
- clif_send(buf,packet_len_table[0x1a4],&pd->bl,AREA);
-
- return 0;
-}
-
-int clif_pet_food(struct map_session_data *sd,int foodid,int fail)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x1a3;
- WFIFOB(fd,2)=fail;
- WFIFOW(fd,3)=foodid;
- WFIFOSET(fd,packet_len_table[0x1a3]);
-
- return 0;
-}
-
-/*==========================================
- * ƒI[ƒgƒXƒyƒ‹ ƒŠƒXƒg‘—M
- *------------------------------------------
- */
-int clif_autospell(struct map_session_data *sd,int skilllv)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd, 0)=0x1cd;
-
- if(skilllv>0 && pc_checkskill(sd,MG_NAPALMBEAT)>0)
- WFIFOL(fd,2)= MG_NAPALMBEAT;
- else
- WFIFOL(fd,2)= 0x00000000;
- if(skilllv>1 && pc_checkskill(sd,MG_COLDBOLT)>0)
- WFIFOL(fd,6)= MG_COLDBOLT;
- else
- WFIFOL(fd,6)= 0x00000000;
- if(skilllv>1 && pc_checkskill(sd,MG_FIREBOLT)>0)
- WFIFOL(fd,10)= MG_FIREBOLT;
- else
- WFIFOL(fd,10)= 0x00000000;
- if(skilllv>1 && pc_checkskill(sd,MG_LIGHTNINGBOLT)>0)
- WFIFOL(fd,14)= MG_LIGHTNINGBOLT;
- else
- WFIFOL(fd,14)= 0x00000000;
- if(skilllv>4 && pc_checkskill(sd,MG_SOULSTRIKE)>0)
- WFIFOL(fd,18)= MG_SOULSTRIKE;
- else
- WFIFOL(fd,18)= 0x00000000;
- if(skilllv>7 && pc_checkskill(sd,MG_FIREBALL)>0)
- WFIFOL(fd,22)= MG_FIREBALL;
- else
- WFIFOL(fd,22)= 0x00000000;
- if(skilllv>9 && pc_checkskill(sd,MG_FROSTDIVER)>0)
- WFIFOL(fd,26)= MG_FROSTDIVER;
- else
- WFIFOL(fd,26)= 0x00000000;
-
- WFIFOSET(fd,packet_len_table[0x1cd]);
- return 0;
-}
-
-/*==========================================
- * ƒfƒBƒ{[ƒVƒ‡ƒ“‚Ì‚¢Ž…
- *------------------------------------------
- */
-int clif_devotion(struct map_session_data *sd,int target)
-{
- unsigned char buf[56];
- int n;
-
- nullpo_retr(0, sd);
-
- WBUFW(buf,0)=0x1cf;
- WBUFL(buf,2)=sd->bl.id;
-// WBUFL(buf,6)=target;
- for(n=0;n<5;n++)
- WBUFL(buf,6+4*n)=sd->dev.val2[n];
-// WBUFL(buf,10+4*n)=0;
- WBUFB(buf,26)=8;
- WBUFB(buf,27)=0;
-
- clif_send(buf,packet_len_table[0x1cf],&sd->bl,AREA);
- return 0;
-}
-
-/*==========================================
- * Ÿ†‹…
- *------------------------------------------
- */
-int clif_spiritball(struct map_session_data *sd)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, sd);
-
- WBUFW(buf,0)=0x1d0;
- WBUFL(buf,2)=sd->bl.id;
- WBUFW(buf,6)=sd->spiritball;
- clif_send(buf,packet_len_table[0x1d0],&sd->bl,AREA);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_combo_delay(struct block_list *bl,int wait)
-{
- unsigned char buf[32];
-
- nullpo_retr(0, bl);
-
- WBUFW(buf,0)=0x1d2;
- WBUFL(buf,2)=bl->id;
- WBUFL(buf,6)=wait;
- clif_send(buf,packet_len_table[0x1d2],bl,AREA);
-
- return 0;
-}
-/*==========================================
- *”’nŽæ‚è
- *------------------------------------------
- */
-int clif_bladestop(struct block_list *src,struct block_list *dst,
- int _bool)
-{
- unsigned char buf[32];
-
- nullpo_retr(0, src);
- nullpo_retr(0, dst);
-
- WBUFW(buf,0)=0x1d1;
- WBUFL(buf,2)=src->id;
- WBUFL(buf,6)=dst->id;
- WBUFL(buf,10)=_bool;
-
- clif_send(buf,packet_len_table[0x1d1],src,AREA);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_changemapcell(int m,int x,int y,int cell_type,int type)
-{
- struct block_list bl;
- unsigned char buf[32];
-
- bl.m = m;
- bl.x = x;
- bl.y = y;
- WBUFW(buf,0) = 0x192;
- WBUFW(buf,2) = x;
- WBUFW(buf,4) = y;
- WBUFW(buf,6) = cell_type;
- memcpy(WBUFP(buf,8),map[m].name,16);
- if(!type)
- clif_send(buf,packet_len_table[0x192],&bl,AREA);
- else
- clif_send(buf,packet_len_table[0x192],&bl,ALL_SAMEMAP);
-
- return 0;
-}
-
-/*==========================================
- * MVPƒGƒtƒFƒNƒg
- *------------------------------------------
- */
-int clif_mvp_effect(struct map_session_data *sd)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, sd);
-
- WBUFW(buf,0)=0x10c;
- WBUFL(buf,2)=sd->bl.id;
- clif_send(buf,packet_len_table[0x10c],&sd->bl,AREA);
- return 0;
-}
-/*==========================================
- * MVPƒAƒCƒeƒ€Š“¾
- *------------------------------------------
- */
-int clif_mvp_item(struct map_session_data *sd,int nameid)
-{
- int view,fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x10a;
- if((view = itemdb_viewid(nameid)) > 0)
- WFIFOW(fd,2)=view;
- else
- WFIFOW(fd,2)=nameid;
- WFIFOSET(fd,packet_len_table[0x10a]);
- return 0;
-}
-/*==========================================
- * MVPŒoŒ±’lŠ“¾
- *------------------------------------------
- */
-int clif_mvp_exp(struct map_session_data *sd,int exp)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x10b;
- WFIFOL(fd,2)=exp;
- WFIFOSET(fd,packet_len_table[0x10b]);
- return 0;
-}
-
-/*==========================================
- * ƒMƒ‹ƒh쬉”ےʒm
- *------------------------------------------
- */
-int clif_guild_created(struct map_session_data *sd,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x167;
- WFIFOB(fd,2)=flag;
- WFIFOSET(fd,packet_len_table[0x167]);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhŠ‘®’Ê’m
- *------------------------------------------
- */
-int clif_guild_belonginfo(struct map_session_data *sd,struct guild *g)
-{
- int ps,fd;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, g);
-
- fd=sd->fd;
- ps=guild_getposition(sd,g);
-
- memset(WFIFOP(fd,0),0,packet_len_table[0x16c]);
- WFIFOW(fd,0)=0x16c;
- WFIFOL(fd,2)=g->guild_id;
- WFIFOL(fd,6)=g->emblem_id;
- WFIFOL(fd,10)=g->position[ps].mode;
- memcpy(WFIFOP(fd,19),g->name,24);
- WFIFOSET(fd,packet_len_table[0x16c]);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhƒƒ“ƒoƒƒOƒCƒ“’Ê’m
- *------------------------------------------
- */
-int clif_guild_memberlogin_notice(struct guild *g,int idx,int flag)
-{
- unsigned char buf[64];
-
- nullpo_retr(0, g);
-
- // printf("clif_guild_message(%s, %d, %s)\n", g->name, account_id, mes);
-
- WBUFW(buf, 0)=0x16d;
- WBUFL(buf, 2)=g->member[idx].account_id;
- WBUFL(buf, 6)=g->member[idx].char_id;
- WBUFL(buf,10)=flag;
- if(g->member[idx].sd==NULL){
- struct map_session_data *sd=guild_getavailablesd(g);
- if(sd!=NULL)
- clif_send(buf,packet_len_table[0x16d],&sd->bl,GUILD);
- }else
- clif_send(buf,packet_len_table[0x16d],&g->member[idx].sd->bl,GUILD_WOS);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhƒ}ƒXƒ^[’Ê’m(14d‚ւ̉ž“š)
- *------------------------------------------
- */
-int clif_guild_masterormember(struct map_session_data *sd)
-{
- int type=0x57,fd;
- struct guild *g;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- g=guild_search(sd->status.guild_id);
- if(g!=NULL && strcmp(g->master,sd->status.name)==0)
- type=0xd7;
- WFIFOW(fd,0)=0x14e;
- WFIFOL(fd,2)=type;
- WFIFOSET(fd,packet_len_table[0x14e]);
- return 0;
-}
-/*==========================================
- * Basic Info (Territories [Valaris])
- *------------------------------------------
- */
-int clif_guild_basicinfo(struct map_session_data *sd)
-{
- int fd,i,t=0;
- struct guild *g;
- struct guild_castle *gc=NULL;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- g=guild_search(sd->status.guild_id);
- if(g==NULL)
- return 0;
-
- WFIFOW(fd, 0)=0x1b6;//0x150;
- WFIFOL(fd, 2)=g->guild_id;
- WFIFOL(fd, 6)=g->guild_lv;
- WFIFOL(fd,10)=g->connect_member;
- WFIFOL(fd,14)=g->max_member;
- WFIFOL(fd,18)=g->average_lv;
- WFIFOL(fd,22)=g->exp;
- WFIFOL(fd,26)=g->next_exp;
- WFIFOL(fd,30)=0; // ã”[
- WFIFOL(fd,34)=0; // VWi«Ši‚̈«‚³HF«ŒüƒOƒ‰ƒt¶‰Ej
- WFIFOL(fd,38)=0; // RFi³‹`‚Ì“x‡‚¢HF«ŒüƒOƒ‰ƒt㉺j
- WFIFOL(fd,42)=0; // l”H
- memcpy(WFIFOP(fd,46),g->name,24);
- memcpy(WFIFOP(fd,70),g->master,24);
-
- for(i=0;i<MAX_GUILDCASTLE;i++){
- gc=guild_castle_search(i);
- if(!gc) continue;
- if(g->guild_id == gc->guild_id) t++;
- }
-
- if (t==1) strncpy((char*)WFIFOP(fd,94),"One Castle",20);
- else if (t==2) strncpy((char*)WFIFOP(fd,94),"Two Castles",20);
- else if (t==3) strncpy((char*)WFIFOP(fd,94),"Three Castles",20);
- else if (t==4) strncpy((char*)WFIFOP(fd,94),"Four Castles",20);
- else if (t==5) strncpy((char*)WFIFOP(fd,94),"Five Castles",20);
- else if (t==6) strncpy((char*)WFIFOP(fd,94),"Six Castles",20);
- else if (t==7) strncpy((char*)WFIFOP(fd,94),"Seven Castles",20);
- else if (t==8) strncpy((char*)WFIFOP(fd,94),"Eight Castles",20);
- else if (t==9) strncpy((char*)WFIFOP(fd,94),"Nine Castles",20);
- else if (t==10) strncpy((char*)WFIFOP(fd,94),"Ten Castles",20);
- else if (t==11) strncpy((char*)WFIFOP(fd,94),"Eleven Castles",20);
- else if (t==12) strncpy((char*)WFIFOP(fd,94),"Twelve Castles",20);
- else if (t==13) strncpy((char*)WFIFOP(fd,94),"Thirteen Castles",20);
- else if (t==14) strncpy((char*)WFIFOP(fd,94),"Fourteen Castles",20);
- else if (t==15) strncpy((char*)WFIFOP(fd,94),"Fifteen Castles",20);
- else if (t==16) strncpy((char*)WFIFOP(fd,94),"Sixteen Castles",20);
- else if (t==17) strncpy((char*)WFIFOP(fd,94),"Seventeen Castles",20);
- else if (t==18) strncpy((char*)WFIFOP(fd,94),"Eighteen Castles",20);
- else if (t==19) strncpy((char*)WFIFOP(fd,94),"Nineteen Castles",20);
- else if (t==20) strncpy((char*)WFIFOP(fd,94),"Twenty Castles",20);
- else if (t==21) strncpy((char*)WFIFOP(fd,94),"Twenty One Castles",20);
- else if (t==22) strncpy((char*)WFIFOP(fd,94),"Twenty Two Castles",20);
- else if (t==23) strncpy((char*)WFIFOP(fd,94),"Twenty Three Castles",20);
- else if (t==24) strncpy((char*)WFIFOP(fd,94),"Twenty Four Castles",20);
- else if (t==MAX_GUILDCASTLE) strncpy((char*)WFIFOP(fd,94),"Total Domination",20);
- else strncpy((char*)WFIFOP(fd,94),"None Taken",20);
-
- WFIFOSET(fd,packet_len_table[WFIFOW(fd,0)]);
- clif_guild_emblem(sd,g); // Guild emblem vanish fix [Valaris]
- return 0;
-}
-
-/*==========================================
- * ƒMƒ‹ƒh“¯–¿/“G‘Îî•ñ
- *------------------------------------------
- */
-int clif_guild_allianceinfo(struct map_session_data *sd)
-{
- int fd,i,c;
- struct guild *g;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- g=guild_search(sd->status.guild_id);
- if(g==NULL)
- return 0;
- WFIFOW(fd, 0)=0x14c;
- for(i=c=0;i<MAX_GUILDALLIANCE;i++){
- struct guild_alliance *a=&g->alliance[i];
- if(a->guild_id>0){
- WFIFOL(fd,c*32+4)=a->opposition;
- WFIFOL(fd,c*32+8)=a->guild_id;
- memcpy(WFIFOP(fd,c*32+12),a->name,24);
- c++;
- }
- }
- WFIFOW(fd, 2)=c*32+4;
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-
-/*==========================================
- * ƒMƒ‹ƒhƒƒ“ƒo[ƒŠƒXƒg
- *------------------------------------------
- */
-int clif_guild_memberlist(struct map_session_data *sd)
-{
- int fd;
- int i,c;
- struct guild *g;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- g=guild_search(sd->status.guild_id);
- if(g==NULL)
- return 0;
-
- WFIFOW(fd, 0)=0x154;
- for(i=0,c=0;i<g->max_member;i++){
- struct guild_member *m=&g->member[i];
- if(m->account_id==0)
- continue;
- WFIFOL(fd,c*104+ 4)=m->account_id;
- WFIFOL(fd,c*104+ 8)=m->char_id;
- WFIFOW(fd,c*104+12)=m->hair;
- WFIFOW(fd,c*104+14)=m->hair_color;
- WFIFOW(fd,c*104+16)=m->gender;
- WFIFOW(fd,c*104+18)=m->class_;
- WFIFOW(fd,c*104+20)=m->lv;
- WFIFOL(fd,c*104+22)=m->exp;
- WFIFOL(fd,c*104+26)=m->online;
- WFIFOL(fd,c*104+30)=m->position;
- memset(WFIFOP(fd,c*104+34),0,50); // ƒƒ‚H
- memcpy(WFIFOP(fd,c*104+84),m->name,24);
- c++;
- }
- WFIFOW(fd, 2)=c*104+4;
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒh–ðE–¼ƒŠƒXƒg
- *------------------------------------------
- */
-int clif_guild_positionnamelist(struct map_session_data *sd)
-{
- int i,fd;
- struct guild *g;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- g=guild_search(sd->status.guild_id);
- if(g==NULL)
- return 0;
- WFIFOW(fd, 0)=0x166;
- for(i=0;i<MAX_GUILDPOSITION;i++){
- WFIFOL(fd,i*28+4)=i;
- memcpy(WFIFOP(fd,i*28+8),g->position[i].name,24);
- }
- WFIFOW(fd,2)=i*28+4;
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒh–ðEî•ñƒŠƒXƒg
- *------------------------------------------
- */
-int clif_guild_positioninfolist(struct map_session_data *sd)
-{
- int i,fd;
- struct guild *g;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- g=guild_search(sd->status.guild_id);
- if(g==NULL)
- return 0;
- WFIFOW(fd, 0)=0x160;
- for(i=0;i<MAX_GUILDPOSITION;i++){
- struct guild_position *p=&g->position[i];
- WFIFOL(fd,i*16+ 4)=i;
- WFIFOL(fd,i*16+ 8)=p->mode;
- WFIFOL(fd,i*16+12)=i;
- WFIFOL(fd,i*16+16)=p->exp_mode;
- }
- WFIFOW(fd, 2)=i*16+4;
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒh–ðE•ÏX’Ê’m
- *------------------------------------------
- */
-int clif_guild_positionchanged(struct guild *g,int idx)
-{
- struct map_session_data *sd;
- unsigned char buf[128];
-
- nullpo_retr(0, g);
-
- WBUFW(buf, 0)=0x174;
- WBUFW(buf, 2)=44;
- WBUFL(buf, 4)=idx;
- WBUFL(buf, 8)=g->position[idx].mode;
- WBUFL(buf,12)=idx;
- WBUFL(buf,16)=g->position[idx].exp_mode;
- memcpy(WBUFP(buf,20),g->position[idx].name,24);
- if( (sd=guild_getavailablesd(g))!=NULL )
- clif_send(buf,WBUFW(buf,2),&sd->bl,GUILD);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhƒƒ“ƒo•ÏX’Ê’m
- *------------------------------------------
- */
-int clif_guild_memberpositionchanged(struct guild *g,int idx)
-{
- struct map_session_data *sd;
- unsigned char buf[64];
-
- nullpo_retr(0, g);
-
- WBUFW(buf, 0)=0x156;
- WBUFW(buf, 2)=16;
- WBUFL(buf, 4)=g->member[idx].account_id;
- WBUFL(buf, 8)=g->member[idx].char_id;
- WBUFL(buf,12)=g->member[idx].position;
- if( (sd=guild_getavailablesd(g))!=NULL )
- clif_send(buf,WBUFW(buf,2),&sd->bl,GUILD);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€‘—M
- *------------------------------------------
- */
-int clif_guild_emblem(struct map_session_data *sd,struct guild *g)
-{
- int fd;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, g);
-
- fd=sd->fd;
-
- if(g->emblem_len<=0)
- return 0;
- WFIFOW(fd,0)=0x152;
- WFIFOW(fd,2)=g->emblem_len+12;
- WFIFOL(fd,4)=g->guild_id;
- WFIFOL(fd,8)=g->emblem_id;
- memcpy(WFIFOP(fd,12),g->emblem_data,g->emblem_len);
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhƒXƒLƒ‹‘—M
- *------------------------------------------
- */
-int clif_guild_skillinfo(struct map_session_data *sd)
-{
- int fd;
- int i,id,c,up=1;
- struct guild *g;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- g=guild_search(sd->status.guild_id);
- if(g==NULL)
- return 0;
- WFIFOW(fd,0)=0x0162;
- WFIFOW(fd,4)=g->skill_point;
- for(i=c=0;i<MAX_GUILDSKILL;i++){
- if(g->skill[i].id>0){
- WFIFOW(fd,c*37+ 6) = id = g->skill[i].id;
- WFIFOW(fd,c*37+ 8) = guild_skill_get_inf(id);
- WFIFOW(fd,c*37+10) = 0;
- WFIFOW(fd,c*37+12) = g->skill[i].lv;
- WFIFOW(fd,c*37+14) = guild_skill_get_sp(id,g->skill[i].lv);
- WFIFOW(fd,c*37+16) = guild_skill_get_range(id);
- memset(WFIFOP(fd,c*37+18),0,24);
- if(g->skill[i].lv < guild_skill_get_max(id)) {
- //Kafra and Guardian changed to require Approval [Sara]
- switch (g->skill[i].id)
- {
- case GD_KAFRACONTACT:
- case GD_GUARDIANRESEARCH:
- case GD_GUARDUP:
- case GD_DEVELOPMENT:
- up = guild_checkskill(g,GD_APPROVAL) > 0;
- break;
- case GD_LEADERSHIP:
- //Glory skill requirements -- Pretty sure correct [Sara]
- up = (battle_config.require_glory_guild) ?
- guild_checkskill(g,GD_GLORYGUILD) > 0 : 1;
- // what skill does it need now that glory guild was removed? [celest]
- break;
- case GD_GLORYWOUNDS:
- up = (battle_config.require_glory_guild) ?
- guild_checkskill(g,GD_GLORYGUILD) > 0 : 1;
- break;
- case GD_SOULCOLD:
- up = guild_checkskill(g,GD_GLORYWOUNDS) > 0;
- break;
- case GD_HAWKEYES:
- up = guild_checkskill(g,GD_LEADERSHIP) > 0;
- break;
- case GD_BATTLEORDER:
- up = guild_checkskill(g,GD_APPROVAL) > 0 &&
- guild_checkskill(g,GD_EXTENSION) >= 2;
- break;
- case GD_REGENERATION:
- up = guild_checkskill(g,GD_EXTENSION) >= 5 &&
- guild_checkskill(g,GD_BATTLEORDER) > 0;
- break;
- case GD_RESTORE:
- up = guild_checkskill(g,GD_REGENERATION) >= 2;
- break;
- case GD_EMERGENCYCALL:
- up = guild_checkskill(g,GD_GUARDIANRESEARCH) > 0 &&
- guild_checkskill(g,GD_REGENERATION) > 0;
- break;
- case GD_GLORYGUILD:
- up = (battle_config.require_glory_guild) ? 1 : 0;
- break;
- default:
- up = 1;
- }
- }
- else {
- up = 0;
- }
- WFIFOB(fd,c*37+42)= up;
- c++;
- }
- }
- WFIFOW(fd,2)=c*37+6;
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒh’m‘—M
- *------------------------------------------
- */
-int clif_guild_notice(struct map_session_data *sd,struct guild *g)
-{
- int fd;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, g);
-
- fd=sd->fd;
- if(*g->mes1==0 && *g->mes2==0)
- return 0;
- WFIFOW(fd,0)=0x16f;
- memcpy(WFIFOP(fd,2),g->mes1,60);
- memcpy(WFIFOP(fd,62),g->mes2,120);
- WFIFOSET(fd,packet_len_table[0x16f]);
- return 0;
-}
-
-/*==========================================
- * ƒMƒ‹ƒhƒƒ“ƒoŠ©—U
- *------------------------------------------
- */
-int clif_guild_invite(struct map_session_data *sd,struct guild *g)
-{
- int fd;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, g);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x16a;
- WFIFOL(fd,2)=g->guild_id;
- memcpy(WFIFOP(fd,6),g->name,24);
- WFIFOSET(fd,packet_len_table[0x16a]);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhƒƒ“ƒoŠ©—UŒ‹‰Ê
- *------------------------------------------
- */
-int clif_guild_inviteack(struct map_session_data *sd,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x169;
- WFIFOB(fd,2)=flag;
- WFIFOSET(fd,packet_len_table[0x169]);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhƒƒ“ƒo’E‘Þ’Ê’m
- *------------------------------------------
- */
-int clif_guild_leave(struct map_session_data *sd,const char *name,const char *mes)
-{
- unsigned char buf[128];
-
- nullpo_retr(0, sd);
-
- WBUFW(buf, 0)=0x15a;
- memcpy(WBUFP(buf, 2),name,24);
- memcpy(WBUFP(buf,26),mes,40);
- clif_send(buf,packet_len_table[0x15a],&sd->bl,GUILD);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhƒƒ“ƒo’Ç•ú’Ê’m
- *------------------------------------------
- */
-int clif_guild_explusion(struct map_session_data *sd,const char *name,const char *mes,
- int account_id)
-{
- unsigned char buf[128];
-
- nullpo_retr(0, sd);
-
- WBUFW(buf, 0)=0x15c;
- memcpy(WBUFP(buf, 2),name,24);
- memcpy(WBUFP(buf,26),mes,40);
- memcpy(WBUFP(buf,66),"dummy",24);
- clif_send(buf,packet_len_table[0x15c],&sd->bl,GUILD);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒh’Ç•úƒƒ“ƒoƒŠƒXƒg
- *------------------------------------------
- */
-int clif_guild_explusionlist(struct map_session_data *sd)
-{
- int fd;
- int i,c;
- struct guild *g;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- g=guild_search(sd->status.guild_id);
- if(g==NULL)
- return 0;
- WFIFOW(fd,0)=0x163;
- for(i=c=0;i<MAX_GUILDEXPLUSION;i++){
- struct guild_explusion *e=&g->explusion[i];
- if(e->account_id>0){
- memcpy(WFIFOP(fd,c*88+ 4),e->name,24);
- memcpy(WFIFOP(fd,c*88+28),e->acc,24);
- memcpy(WFIFOP(fd,c*88+52),e->mes,44);
- c++;
- }
- }
- WFIFOW(fd,2)=c*88+4;
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-
-/*==========================================
- * ƒMƒ‹ƒh‰ï˜b
- *------------------------------------------
- */
-int clif_guild_message(struct guild *g,int account_id,const char *mes,int len)
-{
- struct map_session_data *sd;
- unsigned char *buf;
-
- buf = (unsigned char*)aCallocA(len + 4, sizeof(unsigned char));
-
- WBUFW(buf, 0) = 0x17f;
- WBUFW(buf, 2) = len + 4;
- memcpy(WBUFP(buf,4), mes, len);
-
- if ((sd = guild_getavailablesd(g)) != NULL)
- clif_send(buf, WBUFW(buf,2), &sd->bl, GUILD);
-
- if(buf) aFree(buf);
-
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhƒXƒLƒ‹Š„‚èU‚è’Ê’m
- *------------------------------------------
- */
-int clif_guild_skillup(struct map_session_data *sd,int skill_num,int lv)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0) = 0x10e;
- WFIFOW(fd,2) = skill_num;
- WFIFOW(fd,4) = lv;
- WFIFOW(fd,6) = guild_skill_get_sp(skill_num,lv);
- WFIFOW(fd,8) = guild_skill_get_range(skill_num);
- WFIFOB(fd,10) = 1;
- WFIFOSET(fd,11);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒh“¯–¿—v¿
- *------------------------------------------
- */
-int clif_guild_reqalliance(struct map_session_data *sd,int account_id,const char *name)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x171;
- WFIFOL(fd,2)=account_id;
- memcpy(WFIFOP(fd,6),name,24);
- WFIFOSET(fd,packet_len_table[0x171]);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒh“¯–¿Œ‹‰Ê
- *------------------------------------------
- */
-int clif_guild_allianceack(struct map_session_data *sd,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x173;
- WFIFOL(fd,2)=flag;
- WFIFOSET(fd,packet_len_table[0x173]);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhŠÖŒW‰ðÁ’Ê’m
- *------------------------------------------
- */
-int clif_guild_delalliance(struct map_session_data *sd,int guild_id,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x184;
- WFIFOL(fd,2)=guild_id;
- WFIFOL(fd,6)=flag;
- WFIFOSET(fd,packet_len_table[0x184]);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒh“G‘ÎŒ‹‰Ê
- *------------------------------------------
- */
-int clif_guild_oppositionack(struct map_session_data *sd,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x181;
- WFIFOB(fd,2)=flag;
- WFIFOSET(fd,packet_len_table[0x181]);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhŠÖŒW’ljÁ
- *------------------------------------------
- */
-/*int clif_guild_allianceadded(struct guild *g,int idx)
-{
- unsigned char buf[64];
- WBUFW(fd,0)=0x185;
- WBUFL(fd,2)=g->alliance[idx].opposition;
- WBUFL(fd,6)=g->alliance[idx].guild_id;
- memcpy(WBUFP(fd,10),g->alliance[idx].name,24);
- clif_send(buf,packet_len_table[0x185],guild_getavailablesd(g),GUILD);
- return 0;
-}*/
-
-/*==========================================
- * ƒMƒ‹ƒh‰ðŽU’Ê’m
- *------------------------------------------
- */
-int clif_guild_broken(struct map_session_data *sd,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x15e;
- WFIFOL(fd,2)=flag;
- WFIFOSET(fd,packet_len_table[0x15e]);
- return 0;
-}
-
-/*==========================================
- * ƒGƒ‚[ƒVƒ‡ƒ“
- *------------------------------------------
- */
-void clif_emotion(struct block_list *bl,int type)
-{
- unsigned char buf[8];
-
- nullpo_retv(bl);
-
- WBUFW(buf,0)=0xc0;
- WBUFL(buf,2)=bl->id;
- WBUFB(buf,6)=type;
- clif_send(buf,packet_len_table[0xc0],bl,AREA);
-}
-
-/*==========================================
- * ƒg[ƒL[ƒ{ƒbƒNƒX
- *------------------------------------------
- */
-void clif_talkiebox(struct block_list *bl,char* talkie)
-{
- unsigned char buf[86];
-
- nullpo_retv(bl);
-
- WBUFW(buf,0)=0x191;
- WBUFL(buf,2)=bl->id;
- memcpy(WBUFP(buf,6),talkie,80);
- clif_send(buf,packet_len_table[0x191],bl,AREA);
-}
-
-/*==========================================
- * Œ‹¥ƒGƒtƒFƒNƒg
- *------------------------------------------
- */
-void clif_wedding_effect(struct block_list *bl) {
- unsigned char buf[6];
-
- nullpo_retv(bl);
-
- WBUFW(buf,0) = 0x1ea;
- WBUFL(buf,2) = bl->id;
- clif_send(buf, packet_len_table[0x1ea], bl, AREA);
-}
-/*==========================================
- * ‚ ‚È‚½‚Ɉ§‚¢‚½‚¢Žg—pŽž–¼‘O‹©‚Ñ
- *------------------------------------------
-
-void clif_callpartner(struct map_session_data *sd)
-{
- unsigned char buf[26];
- char *p;
-
- nullpo_retv(sd);
-
- if(sd->status.partner_id){
- WBUFW(buf,0)=0x1e6;
- p = map_charid2nick(sd->status.partner_id);
- if(p){
- memcpy(WBUFP(buf,2),p,24);
- }else{
- map_reqchariddb(sd,sd->status.partner_id);
- chrif_searchcharid(sd->status.partner_id);
- WBUFB(buf,2) = 0;
- }
- clif_send(buf,packet_len_table[0x1e6]&sd->bl,AREA);
- }
- return;
-}
-*/
-/*==========================================
- * Adopt baby [Celest]
- *------------------------------------------
- */
-void clif_adopt_process(struct map_session_data *sd)
-{
- int fd;
- nullpo_retv(sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x1f8;
- WFIFOSET(fd,packet_len_table[0x1f8]);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_ReqAdopt(int fd, struct map_session_data *sd) {
- nullpo_retv(sd);
-
- printf ("%d\n", RFIFOL(fd,2));
-}
-
-/*==========================================
- * À‚é
- *------------------------------------------
- */
-void clif_sitting(struct map_session_data *sd)
-{
- unsigned char buf[64];
-
- nullpo_retv(sd);
-
- WBUFW(buf, 0) = 0x8a;
- WBUFL(buf, 2) = sd->bl.id;
- WBUFB(buf,26) = 2;
- clif_send(buf, packet_len_table[0x8a], &sd->bl, AREA);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_disp_onlyself(struct map_session_data *sd, char *mes, int len)
-{
- unsigned char *buf;
-
- nullpo_retr(0, sd);
-
- buf = (unsigned char*)aCallocA(len + 8, sizeof(unsigned char));
-
- WBUFW(buf, 0) = 0x17f;
- WBUFW(buf, 2) = len + 8;
- memcpy(WBUFP(buf,4), mes, len + 4);
-
- clif_send(buf, WBUFW(buf,2), &sd->bl, SELF);
-
- if(buf) aFree(buf);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-
-int clif_GM_kickack(struct map_session_data *sd, int id)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd = sd->fd;
- WFIFOW(fd,0) = 0xcd;
- WFIFOL(fd,2) = id;
- WFIFOSET(fd, packet_len_table[0xcd]);
- return 0;
-}
-
-void clif_parse_QuitGame(int fd,struct map_session_data *sd);
-
-int clif_GM_kick(struct map_session_data *sd,struct map_session_data *tsd,int type)
-{
- nullpo_retr(0, tsd);
-
- if(type)
- clif_GM_kickack(sd,tsd->status.account_id);
- tsd->opt1 = tsd->opt2 = 0;
- WFIFOW(tsd->fd,0) = 0x18b;
- WFIFOW(tsd->fd,2) = 0;
- WFIFOSET(tsd->fd,packet_len_table[0x18b]);
- clif_setwaitclose(tsd->fd);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-
-int clif_timedout(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- sprintf(tmp_output,"%sCharacter with Account ID '"CL_WHITE"%d"CL_RESET"' timed out.\n", (pc_isGM(sd))?"GM ":"", sd->bl.id);
- ShowInfo(tmp_output);
- map_quit(sd);
- clif_authfail_fd(sd->fd,3); // Even if player is not on we still send anyway
- clif_setwaitclose(sd->fd); // Set session to EOF
-
- return 0;
-}
-
-/*==========================================
- * Wis‹‘”Û‹–‰Â‰ž“š
- *------------------------------------------
- */
-int clif_wisexin(struct map_session_data *sd,int type,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xd1;
- WFIFOB(fd,2)=type;
- WFIFOB(fd,3)=flag;
- WFIFOSET(fd,packet_len_table[0xd1]);
-
- return 0;
-}
-/*==========================================
- * Wis‘S‹‘”Û‹–‰Â‰ž“š
- *------------------------------------------
- */
-int clif_wisall(struct map_session_data *sd,int type,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xd2;
- WFIFOB(fd,2)=type;
- WFIFOB(fd,3)=flag;
- WFIFOSET(fd,packet_len_table[0xd2]);
-
- return 0;
-}
-/*==========================================
- * ƒTƒEƒ“ƒhƒGƒtƒFƒNƒg
- *------------------------------------------
- */
-void clif_soundeffect(struct map_session_data *sd,struct block_list *bl,char *name,int type)
-{
- int fd;
-
- nullpo_retv(sd);
- nullpo_retv(bl);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x1d3;
- memcpy(WFIFOP(fd,2),name,24);
- WFIFOB(fd,26)=type;
- WFIFOL(fd,27)=0;
- WFIFOL(fd,31)=bl->id;
- WFIFOSET(fd,packet_len_table[0x1d3]);
-
- return;
-}
-
-int clif_soundeffectall(struct block_list *bl, char *name, int type)
-{
- unsigned char buf[31];
- memset(buf, 0, packet_len_table[0x1d3]);
-
- nullpo_retr(0, bl);
-
- WBUFW(buf,0)=0x1d3;
- memcpy(WBUFP(buf,2), name, 24);
- WBUFB(buf,26)=type;
- WBUFL(buf,27)=0;
- WBUFL(buf,31)=bl->id;
- clif_send(buf, packet_len_table[0x1d3], bl, AREA);
-
- return 0;
-}
-
-// displaying special effects (npcs, weather, etc) [Valaris]
-int clif_specialeffect(struct block_list *bl, int type, int flag) {
- unsigned char buf[24];
-
- nullpo_retr(0, bl);
-
- memset(buf, 0, packet_len_table[0x1f3]);
-
- WBUFW(buf,0) = 0x1f3;
- WBUFL(buf,2) = bl->id;
- WBUFL(buf,6) = type;
-
- if (flag == 3) {
-// struct map_session_data *sd;
- struct map_session_data *pl_sd;
- int i;
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data*)session[i]->session_data) != NULL &&
- pl_sd->state.auth &&
- (pc_isGM((struct map_session_data *)&bl) > pc_isGM((struct map_session_data *)&pl_sd->bl)))
- clif_specialeffect(&pl_sd->bl, type, 1);
- }
- }
- if (flag == 2) {
- struct map_session_data *sd;
- int i;
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = (struct map_session_data*)session[i]->session_data) != NULL && sd->state.auth && sd->bl.m == bl->m)
- clif_specialeffect(&sd->bl, type, 1);
- }
- }
-
- else if (flag == 1)
- clif_send(buf, packet_len_table[0x1f3], bl, SELF);
- else if (!flag)
- clif_send(buf, packet_len_table[0x1f3], bl, AREA);
-
- return 0;
-
-}
-
-// refresh the client's screen, getting rid of any effects
-int clif_refresh(struct map_session_data *sd) {
- nullpo_retr(-1, sd);
- clif_changemap(sd,sd->mapname,sd->bl.x,sd->bl.y);
- return 0;
-}
-
-// ------------
-// clif_parse_*
-// ------------
-// ƒpƒPƒbƒg“Ç‚ÝŽæ‚Á‚ÄFX‘€ì
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_WantToConnection(int fd, struct map_session_data *sd)
-{
- struct map_session_data *old_sd;
- int cmd, account_id; // account_id in the packet 0x72 or 0x7E
-
- if (sd) {
- if (battle_config.error_log)
- printf("clif_parse_WantToConnection : invalid request?\n");
- return;
- }
-
- cmd = RFIFOW(fd,0);
-
- // packet DB
- if (IS_PACKET_DB_VER(cmd)) {
- //printf("Received bytes %d with packet 0x72.\n", RFIFOREST(fd));
- account_id = RFIFOL(fd,packet_db[clif_config.packet_db_ver][clif_config.connect_cmd].pos[0]);
- // 0x72
- } else if (cmd == 0x72) {
- //printf("Received bytes %d with packet 0x72.\n", RFIFOREST(fd));
- if (RFIFOREST(fd) >= 39 && (RFIFOB(fd,38) == 0 || RFIFOB(fd,38) == 1)) // 00 = Female, 01 = Male
- account_id = RFIFOL(fd,12);
- else if (RFIFOREST(fd) >= 22 && (RFIFOB(fd,21) == 0 || RFIFOB(fd,21) == 1)) // 00 = Female, 01 = Male
- account_id = RFIFOL(fd,5);
- else // old packet version
- account_id = RFIFOL(fd,2);
- // 0x7E
- } else if (cmd == 0x7E) {
- //printf("Received bytes %d with packet 0x7E.\n", RFIFOREST(fd));
- if (RFIFOREST(fd) >= 37 && (RFIFOB(fd,36) == 0 || RFIFOB(fd,36) == 1)) // 00 = Female, 01 = Male
- account_id = RFIFOL(fd,9);
- else
- account_id = RFIFOL(fd,12);
- // 0xF5
- } else if (cmd == 0xF5) {
- //printf("Received bytes %d with packet 0xF5.\n", RFIFOREST(fd));
- if (RFIFOREST(fd) >= 34 && (RFIFOB(fd,33) == 0 || RFIFOB(fd,33) == 1)) // 00 = Female, 01 = Male
- account_id = RFIFOL(fd,7);
- else if (RFIFOREST(fd) >= 33 && (RFIFOB(fd,32) == 0 || RFIFOB(fd,32) == 1)) // 00 = Female, 01 = Male
- account_id = RFIFOL(fd,12);
- else if (RFIFOREST(fd) >= 32 && (RFIFOB(fd,31) == 0 || RFIFOB(fd,31) == 1)) // 00 = Female, 01 = Male
- account_id = RFIFOL(fd,10);
- else { // 29 28 28 // search correct value
- // if account id and char id of version 14
- if (RFIFOL(fd,3) > 700000 && RFIFOL(fd,10) >= 150000 && RFIFOL(fd,10) < 5000000) // account id / char id (more than 5.000.000 characters?) [Yor]
- account_id = RFIFOL(fd,3);
- else
- account_id = RFIFOL(fd,5);
- }
- // 0x9B
- } else {
- account_id = RFIFOL(fd,3);
- }
-
- // if same account already connected, we disconnect the 2 sessions
- if ((old_sd = map_id2sd(account_id)) != NULL) {
- clif_authfail_fd(fd, 8); // still recognizes last connection
- clif_authfail_fd(old_sd->fd, 2); // same id
- if (sd != 0)
- clif_setwaitclose(sd->fd); // Set session to EOF
- } else {
- sd = (struct map_session_data*)aCalloc(1, sizeof(struct map_session_data));
- session[fd]->session_data = sd;
- sd->fd = fd;
-
- if (IS_PACKET_DB_VER(cmd)) {
- sd->packet_ver = clif_config.packet_db_ver; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- pc_setnewpc(sd, account_id, RFIFOL(fd,packet_db[clif_config.packet_db_ver][clif_config.connect_cmd].pos[1]),
- RFIFOL(fd,packet_db[clif_config.packet_db_ver][clif_config.connect_cmd].pos[2]),
- RFIFOL(fd,packet_db[clif_config.packet_db_ver][clif_config.connect_cmd].pos[3]),
- RFIFOL(fd,packet_db[clif_config.packet_db_ver][clif_config.connect_cmd].pos[4]), fd);
- // 0x72
- } else if (cmd == 0x72) {
- if (RFIFOREST(fd) >= 39 && (RFIFOB(fd,38) == 0 || RFIFOB(fd,38) == 1)) { // 00 = Female, 01 = Male
- sd->packet_ver = 7; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- pc_setnewpc(sd, account_id, RFIFOL(fd,22), RFIFOL(fd,30), RFIFOL(fd,34), RFIFOB(fd,38), fd);
- } else if (RFIFOREST(fd) >= 22 && (RFIFOB(fd,21) == 0 || RFIFOB(fd,21) == 1)) { // 00 = Female, 01 = Male
- sd->packet_ver = 6; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- pc_setnewpc(sd, account_id, RFIFOL(fd,9), RFIFOL(fd,13), RFIFOL(fd,17), RFIFOB(fd,21), fd);
- } else { // old packet version
- sd->packet_ver = 5; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- pc_setnewpc(sd, account_id, RFIFOL(fd,6), RFIFOL(fd,10), RFIFOL(fd,14), RFIFOB(fd,18), fd);
- }
- // 0x7E
- } else if (cmd == 0x7E) {
- if (RFIFOREST(fd) >= 37 && (RFIFOB(fd,36) == 0 || RFIFOB(fd,36) == 1)) { // 00 = Female, 01 = Male
- sd->packet_ver = 9; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- pc_setnewpc(sd, account_id, RFIFOL(fd,21), RFIFOL(fd,28), RFIFOL(fd,32), RFIFOB(fd,36), fd);
- } else {
- sd->packet_ver = 8; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- pc_setnewpc(sd, account_id, RFIFOL(fd,18), RFIFOL(fd,24), RFIFOL(fd,28), RFIFOB(fd,32), fd);
- }
- // 0xF5
- } else if (cmd == 0xF5) {
- if (RFIFOREST(fd) >= 34 && (RFIFOB(fd,33) == 0 || RFIFOB(fd,33) == 1)) { // 00 = Female, 01 = Male
- sd->packet_ver = 10; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- pc_setnewpc(sd, account_id, RFIFOL(fd,15), RFIFOL(fd,25), RFIFOL(fd,29), RFIFOB(fd,33), fd);
- } else if (RFIFOREST(fd) >= 33 && (RFIFOB(fd,32) == 0 || RFIFOB(fd,32) == 1)) { // 00 = Female, 01 = Male
- sd->packet_ver = 12; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- pc_setnewpc(sd, account_id, RFIFOL(fd,18), RFIFOL(fd,24), RFIFOL(fd,28), RFIFOB(fd,32), fd);
- } else if (RFIFOREST(fd) >= 32 && (RFIFOB(fd,31) == 0 || RFIFOB(fd,31) == 1)) { // 00 = Female, 01 = Male
- sd->packet_ver = 11; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- pc_setnewpc(sd, account_id, RFIFOL(fd,17), RFIFOL(fd,23), RFIFOL(fd,27), RFIFOB(fd,31), fd);
- } else { // 29
- // if account id and char id of version 14
- if (RFIFOL(fd,3) > 700000 && RFIFOL(fd,10) >= 150000 && RFIFOL(fd,10) < 5000000) { // account id / char id (more than 5.000.000 characters?)
- sd->packet_ver = 15; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- pc_setnewpc(sd, account_id, RFIFOL(fd,10), RFIFOL(fd,20), RFIFOL(fd,24), RFIFOB(fd,28), fd);
- } else {
- sd->packet_ver = 13; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- pc_setnewpc(sd, account_id, RFIFOL(fd,14), RFIFOL(fd,20), RFIFOL(fd,24), RFIFOB(fd,28), fd);
- }
- }
- // 0x9B
- } else {
- sd->packet_ver = 16; // 16: 10jan05
- pc_setnewpc(sd, account_id, RFIFOL(fd,12), RFIFOL(fd,23), RFIFOL(fd,27), RFIFOB(fd,31), fd);
- }
-
- WFIFOL(fd,0) = sd->bl.id;
- WFIFOSET(fd,4);
-
- map_addiddb(&sd->bl);
-
- chrif_authreq(sd);
- }
-
- return;
-}
-
-/*==========================================
- * 007d ƒNƒ‰ƒCƒAƒ“ƒg‘¤ƒ}ƒbƒv“Ç‚Ýž‚ÝŠ®—¹
- * mapN“üŽž‚É•K—v‚ȃf[ƒ^‚ð‘S‚Ä‘—‚è‚‚¯‚é
- *------------------------------------------
- */
-void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
-{
-// struct item_data* item;
- int i;
- nullpo_retv(sd);
-
- if(sd->bl.prev != NULL)
- return;
-
- // Ú‘±okŽž
- //clif_authok();
- if(sd->npc_id) npc_event_dequeue(sd);
- clif_skillinfoblock(sd);
- pc_checkitem(sd);
- //guild_info();
-
- // loadendackŽž
- // next exp
- clif_updatestatus(sd,SP_NEXTBASEEXP);
- clif_updatestatus(sd,SP_NEXTJOBEXP);
- // skill point
- clif_updatestatus(sd,SP_SKILLPOINT);
- // item
- clif_itemlist(sd);
- clif_equiplist(sd);
- // cart
- if(pc_iscarton(sd)){
- clif_cart_itemlist(sd);
- clif_cart_equiplist(sd);
- clif_updatestatus(sd,SP_CARTINFO);
- }
- // param all
- clif_initialstatus(sd);
- // party
- party_send_movemap(sd);
- // guild
- guild_send_memberinfoshort(sd,1);
- // 119
- // 78
-
- if(battle_config.pc_invincible_time > 0) {
- if(map[sd->bl.m].flag.gvg)
- pc_setinvincibletimer(sd,battle_config.pc_invincible_time<<1);
- else
- pc_setinvincibletimer(sd,battle_config.pc_invincible_time);
- }
-
- map_addblock(&sd->bl); // ƒuƒƒbƒN“o˜^
- clif_spawnpc(sd); // spawn
-
- // weight max , now
- clif_updatestatus(sd,SP_MAXWEIGHT);
- clif_updatestatus(sd,SP_WEIGHT);
-
- // pvp
- if(sd->pvp_timer!=-1 && !battle_config.pk_mode)
- delete_timer(sd->pvp_timer,pc_calc_pvprank_timer);
- if(map[sd->bl.m].flag.pvp){
- if(!battle_config.pk_mode) { // remove pvp stuff for pk_mode [Valaris]
- sd->pvp_timer=add_timer(gettick()+200,pc_calc_pvprank_timer,sd->bl.id,0);
- sd->pvp_rank=0;
- sd->pvp_lastusers=0;
- sd->pvp_point=5;
- }
- clif_set0199(sd->fd,1);
- } else {
- sd->pvp_timer=-1;
- }
- if(map[sd->bl.m].flag.gvg) {
- clif_set0199(sd->fd,3);
- }
-
- // pet
- if(sd->status.pet_id > 0 && sd->pd && sd->pet.intimate > 0) {
- map_addblock(&sd->pd->bl);
- clif_spawnpet(sd->pd);
- clif_send_petdata(sd,0,0);
- clif_send_petdata(sd,5,0x14);
- clif_send_petstatus(sd);
- }
-
- if(sd->state.connect_new) {
- sd->state.connect_new = 0;
- if(sd->status.class_ != sd->view_class)
- clif_changelook(&sd->bl,LOOK_BASE,sd->view_class);
- if(sd->status.pet_id > 0 && sd->pd && sd->pet.intimate > 900)
- clif_pet_emotion(sd->pd,(sd->pd->class_ - 100)*100 + 50 + pet_hungry_val(sd));
-
-/* Stop players from spawning inside castles [Valaris] */
-
- {
- struct guild_castle *gc=guild_mapname2gc(map[sd->bl.m].name);
- if (gc)
- pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,2);
- }
-
-/* End Addition [Valaris] */
-
- }
-
- // view equipment item
-#if PACKETVER < 4
- clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
- clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield);
-#else
- clif_changelook(&sd->bl,LOOK_WEAPON,0);
-#endif
- if(battle_config.save_clothcolor==1 && sd->status.clothes_color > 0)
- clif_changelook(&sd->bl,LOOK_CLOTHES_COLOR,sd->status.clothes_color);
-
- //if(sd->status.hp<sd->status.max_hp>>2 && pc_checkskill(sd,SM_AUTOBERSERK)>0 &&
- if(sd->status.hp<sd->status.max_hp>>2 && sd->sc_data[SC_AUTOBERSERK].timer != -1 &&
- (sd->sc_data[SC_PROVOKE].timer==-1 || sd->sc_data[SC_PROVOKE].val2==0 ))
- // ƒI[ƒgƒo[ƒT[ƒN”­“®
- status_change_start(&sd->bl,SC_PROVOKE,10,1,0,0,0,0);
-
-// if(time(&timer) < ((weddingtime=pc_readglobalreg(sd,"PC_WEDDING_TIME")) + 3600))
-// status_change_start(&sd->bl,SC_WEDDING,0,weddingtime,0,0,36000,0);
-
- if(battle_config.muting_players && sd->status.manner < 0)
- status_change_start(&sd->bl,SC_NOCHAT,0,0,0,0,0,0);
-
- if (night_flag) {
- if (battle_config.night_darkness_level > 0 && !map[sd->bl.m].flag.indoors)
- clif_specialeffect(&sd->bl, 474 + battle_config.night_darkness_level, 0);
- else {
- //clif_specialeffect(&sd->bl, 483, 0); // default darkness level
- // night - when changing from indoors to outdoors - celest
- if (!map[sd->bl.m].flag.indoors && sd->opt2 != STATE_BLIND)
- sd->opt2 |= STATE_BLIND;
- // changing from outdoors to indoors
- else if (map[sd->bl.m].flag.indoors && sd->opt2 == STATE_BLIND)
- sd->opt2 &= ~STATE_BLIND;
- }
- }
-
- // option
- clif_changeoption(&sd->bl);
- if(sd->sc_data[SC_TRICKDEAD].timer != -1)
- status_change_end(&sd->bl,SC_TRICKDEAD,-1);
- if(sd->sc_data[SC_SIGNUMCRUCIS].timer != -1 && !battle_check_undead(7,sd->def_ele))
- status_change_end(&sd->bl,SC_SIGNUMCRUCIS,-1);
- if(sd->special_state.infinite_endure && sd->sc_data[SC_ENDURE].timer == -1)
- status_change_start(&sd->bl,SC_ENDURE,10,1,0,0,0,0);
- for(i=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].equip && sd->status.inventory[i].equip & 0x0002 && sd->status.inventory[i].attribute==1)
- status_change_start(&sd->bl,SC_BROKNWEAPON,0,0,0,0,0,0);
- if(sd->status.inventory[i].equip && sd->status.inventory[i].equip & 0x0010 && sd->status.inventory[i].attribute==1)
- status_change_start(&sd->bl,SC_BROKNARMOR,0,0,0,0,0,0);
- }
-
- map_foreachinarea(clif_getareachar,sd->bl.m,sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE,sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,0,sd);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_TickSend(int fd, struct map_session_data *sd) {
- nullpo_retv(sd);
-
- if (USE_PACKET_DB(sd)) {
- sd->client_tick=RFIFOL(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0]);
- } else {
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 8:
- sd->client_tick = RFIFOL(fd,6);
- break;
- case 9:
- sd->client_tick = RFIFOL(fd,9);
- break;
- case 10:
- sd->client_tick = RFIFOL(fd,7);
- break;
- case 11:
- sd->client_tick = RFIFOL(fd,10);
- break;
- case 12:
- sd->client_tick = RFIFOL(fd,6);
- break;
- case 13:
- case 14:
- sd->client_tick = RFIFOL(fd,5);
- break;
- case 15:
- sd->client_tick = RFIFOL(fd,3);
- break;
- case 16:
- sd->client_tick = RFIFOL(fd,5);
- break;
-
- default: // old version by default (and version 6 + 7)
- sd->client_tick = RFIFOL(fd,2);
- break;
- }
- }
-
- sd->server_tick = gettick();
- clif_servertick(sd);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_WalkToXY(int fd, struct map_session_data *sd) {
- int x, y;
-
- nullpo_retv(sd);
-
- if (pc_isdead(sd)) {
- clif_clearchar_area(&sd->bl, 1);
- return;
- }
-
- if (sd->npc_id != 0 || sd->vender_id != 0)
- return;
-
- if (sd->skilltimer != -1 && pc_checkskill(sd, SA_FREECAST) <= 0) // ƒtƒŠ[ƒLƒƒƒXƒg
- return;
-
- if (sd->chatID)
- return;
-
- if (sd->canmove_tick > gettick())
- return;
-
- // ƒXƒe[ƒ^ƒXˆÙí‚âƒnƒCƒfƒBƒ“ƒO’†(ƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒu–³)‚Å“®‚¯‚È‚¢
- if ((sd->opt1 > 0 && sd->opt1 != 6) ||
- sd->sc_data[SC_ANKLE].timer !=-1 || //ƒAƒ“ƒNƒ‹ƒXƒlƒA
- sd->sc_data[SC_AUTOCOUNTER].timer !=-1 || //ƒI[ƒgƒJƒEƒ“ƒ^[
- sd->sc_data[SC_TRICKDEAD].timer !=-1 || //Ž€‚ñ‚¾‚Ó‚è
- sd->sc_data[SC_BLADESTOP].timer !=-1 || //”’nŽæ‚è
- sd->sc_data[SC_SPIDERWEB].timer !=-1 || //ƒXƒpƒCƒ_[ƒEƒFƒbƒu
- (sd->sc_data[SC_DANCING].timer !=-1 && sd->sc_data[SC_DANCING].val4) || //‡‘tƒXƒLƒ‹‰‰‘t’†‚Í“®‚¯‚È‚¢
- (sd->sc_data[SC_GOSPEL].timer !=-1 && sd->sc_data[SC_GOSPEL].val4 == BCT_SELF) || // cannot move while gospel is in effect
- sd->sc_data[SC_CONFUSION].timer !=-1)
- return;
- if ((sd->status.option & 2) && pc_checkskill(sd, RG_TUNNELDRIVE) <= 0)
- return;
-
- if (sd->invincible_timer != -1)
- pc_delinvincibletimer(sd);
-
- pc_stopattack(sd);
-
- if (USE_PACKET_DB(sd)) {
- int cmd = RFIFOW(fd,0);
- x = RFIFOB(fd,packet_db[clif_config.packet_db_ver][cmd].pos[0]) * 4 +
- (RFIFOB(fd,packet_db[clif_config.packet_db_ver][cmd].pos[0] + 1) >> 6);
- y = ((RFIFOB(fd,packet_db[clif_config.packet_db_ver][cmd].pos[0]+1) & 0x3f) << 4) +
- (RFIFOB(fd,packet_db[clif_config.packet_db_ver][cmd].pos[0] + 2) >> 4);
- } else {
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 6:
- x = RFIFOB(fd,5) * 4 + (RFIFOB(fd,6) >> 6);
- y = ((RFIFOB(fd,6) & 0x3f) << 4) + (RFIFOB(fd,7) >> 4);
- break;
- case 7:
- x = RFIFOB(fd,6) * 4 + (RFIFOB(fd,7) >> 6);
- y = ((RFIFOB(fd,7) & 0x3f) << 4) + (RFIFOB(fd,8) >> 4);
- break;
- case 8:
- x = RFIFOB(fd,3) * 4 + (RFIFOB(fd,4) >> 6);
- y = ((RFIFOB(fd,4) & 0x3f) << 4) + (RFIFOB(fd,5) >> 4);
- break;
- case 9:
- x = RFIFOB(fd,12) * 4 + (RFIFOB(fd,13) >> 6);
- y = ((RFIFOB(fd,13) & 0x3f) << 4) + (RFIFOB(fd,14) >> 4);
- break;
- case 10:
- x = RFIFOB(fd,6) * 4 + (RFIFOB(fd,7) >> 6);
- y = ((RFIFOB(fd,7) & 0x3f) << 4) + (RFIFOB(fd,8) >> 4);
- break;
- case 11:
- x = RFIFOB(fd,11) * 4 + (RFIFOB(fd,12) >> 6);
- y = ((RFIFOB(fd,12) & 0x3f) << 4) + (RFIFOB(fd,13) >> 4);
- break;
- case 12:
- x = RFIFOB(fd,3) * 4 + (RFIFOB(fd,4) >> 6);
- y = ((RFIFOB(fd,4) & 0x3f) << 4) + (RFIFOB(fd,5) >> 4);
- break;
- case 13:
- case 14:
- x = RFIFOB(fd,3) * 4 + (RFIFOB(fd,4) >> 6);
- y = ((RFIFOB(fd,4) & 0x3f) << 4) + (RFIFOB(fd,5) >> 4);
- break;
- case 15:
- x = RFIFOB(fd,4) * 4 + (RFIFOB(fd,5) >> 6);
- y = ((RFIFOB(fd,5) & 0x3f) << 4) + (RFIFOB(fd,6) >> 4);
- break;
- case 16:
- x = RFIFOB(fd,10) * 4 + (RFIFOB(fd,11) >> 6);
- y = ((RFIFOB(fd,11) & 0x3f) << 4) + (RFIFOB(fd,12) >> 4);
- break;
- default: // old version by default
- x = RFIFOB(fd,2) * 4 + (RFIFOB(fd,3) >> 6);
- y = ((RFIFOB(fd,3) & 0x3f) << 4) + (RFIFOB(fd,4) >> 4);
- break;
- }
- }
- pc_walktoxy(sd, x, y);
-
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_QuitGame(int fd, struct map_session_data *sd) {
- unsigned int tick=gettick();
- struct skill_unit_group* sg;
-
- nullpo_retv(sd);
-
- WFIFOW(fd,0) = 0x18b;
- if ((!pc_isdead(sd) && (sd->opt1 || (sd->opt2 && !(night_flag == 1 && sd->opt2 == STATE_BLIND)))) ||
- sd->skilltimer != -1 ||
- (DIFF_TICK(tick, sd->canact_tick) < 0) ||
- (sd->sc_data && sd->sc_data[SC_DANCING].timer!=-1 && sd->sc_data[SC_DANCING].val4 && (sg=(struct skill_unit_group *)sd->sc_data[SC_DANCING].val2) && sg->src_id == sd->bl.id)) {
- WFIFOW(fd,2)=1;
- WFIFOSET(fd,packet_len_table[0x18b]);
- return;
- }
-
- /* Rovert's prevent logout option fixed [Valaris] */
- if ((battle_config.prevent_logout && (gettick() - sd->canlog_tick) >= 10000) || (!battle_config.prevent_logout)) {
- clif_setwaitclose(fd);
- WFIFOW(fd,2)=0;
- } else {
- WFIFOW(fd,2)=1;
- }
- WFIFOSET(fd,packet_len_table[0x18b]);
-
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_GetCharNameRequest(int fd, struct map_session_data *sd) {
- struct block_list *bl;
- int account_id;
-
- if (USE_PACKET_DB(sd)) {
- account_id = RFIFOL(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0]);
- } else {
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 8:
- account_id = RFIFOL(fd,11);
- break;
- case 9:
- account_id = RFIFOL(fd,8);
- break;
- case 10:
- account_id = RFIFOL(fd,10);
- break;
- case 11:
- account_id = RFIFOL(fd,6);
- break;
- case 12:
- account_id = RFIFOL(fd,11);
- break;
- case 13:
- case 14:
- account_id = RFIFOL(fd,6);
- break;
- case 15:
- account_id = RFIFOL(fd,9);
- break;
- case 16:
- account_id = RFIFOL(fd,4);
- break;
- default: // old version by default (+ packet version 6 and 7)
- account_id = RFIFOL(fd,2);
- break;
- }
- }
- bl = map_id2bl(account_id);
- if (bl == NULL)
- return;
-
- WFIFOW(fd,0) = 0x95;
- WFIFOL(fd,2) = account_id;
-
- switch(bl->type) {
- case BL_PC:
- {
- struct map_session_data *ssd = (struct map_session_data *)bl;
- struct party *p = NULL;
- struct guild *g = NULL;
-
- nullpo_retv(ssd);
-
- memcpy(WFIFOP(fd,6), ssd->status.name, 24);
- if (ssd->status.guild_id > 0 && (g = guild_search(ssd->status.guild_id)) != NULL &&
- (ssd->status.party_id == 0 || (p = party_search(ssd->status.party_id)) != NULL)) {
- // ƒMƒ‹ƒhŠ‘®‚È‚çƒpƒPƒbƒg0195‚ð•Ô‚·
- int i, ps = -1;
- for(i = 0; i < g->max_member; i++) {
- if (g->member[i].account_id == ssd->status.account_id &&
- g->member[i].char_id == ssd->status.char_id )
- ps = g->member[i].position;
- }
- if (ps >= 0 && ps < MAX_GUILDPOSITION) {
- WFIFOW(fd, 0) = 0x195;
- if (p)
- memcpy(WFIFOP(fd,30), p->name, 24);
- else
- WFIFOB(fd,30) = 0;
- memcpy(WFIFOP(fd,54), g->name,24);
- memcpy(WFIFOP(fd,78), g->position[ps].name, 24);
- WFIFOSET(fd,packet_len_table[0x195]);
- break;
- }
- }
- WFIFOSET(fd,packet_len_table[0x95]);
- }
- break;
- case BL_PET:
- memcpy(WFIFOP(fd,6), ((struct pet_data*)bl)->name, 24);
- WFIFOSET(fd,packet_len_table[0x95]);
- break;
- case BL_NPC:
- memcpy(WFIFOP(fd,6), ((struct npc_data*)bl)->name, 24);
- WFIFOSET(fd,packet_len_table[0x95]);
- break;
- case BL_MOB:
- {
- struct mob_data *md = (struct mob_data *)bl;
-
- nullpo_retv(md);
-
- memcpy(WFIFOP(fd,6), md->name, 24);
- if (md->class_ >= 1285 && md->class_ <= 1288 && md->guild_id) {
- struct guild *g;
- struct guild_castle *gc = guild_mapname2gc(map[md->bl.m].name);
- if (gc && gc->guild_id > 0 && (g = guild_search(gc->guild_id)) != NULL) {
- WFIFOW(fd, 0) = 0x195;
- WFIFOB(fd,30) = 0;
- memcpy(WFIFOP(fd,54), g->name, 24);
- memcpy(WFIFOP(fd,78), gc->castle_name, 24);
- WFIFOSET(fd,packet_len_table[0x195]);
- } else {
- WFIFOSET(fd,packet_len_table[0x95]);
- }
- } else if (battle_config.show_mob_hp == 1) {
- char mobhp[50];
- sprintf(mobhp, "hp: %d/%d", md->hp, mob_db[md->class_].max_hp);
- WFIFOW(fd, 0) = 0x195;
- memcpy(WFIFOP(fd,30), mobhp, 24);
- WFIFOB(fd,54) = 0;
- WFIFOB(fd,78) = 0;
- WFIFOSET(fd,packet_len_table[0x195]);
- } else {
- WFIFOSET(fd,packet_len_table[0x95]);
- }
- }
- break;
- default:
- if (battle_config.error_log)
- printf("clif_parse_GetCharNameRequest : bad type %d(%d)\n", bl->type, account_id);
- break;
- }
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_GlobalMessage(int fd, struct map_session_data *sd) { // S 008c <len>.w <str>.?B
- char *message;
- unsigned char *buf;
-
- nullpo_retv(sd);
- if ((is_atcommand(fd, sd, (char*)RFIFOP(fd,4), 0) != AtCommand_None) ||
- (is_charcommand(fd, sd, (char*)RFIFOP(fd,4),0)!= CharCommand_None) ||
- (sd->sc_data &&
- (sd->sc_data[SC_BERSERK].timer != -1 || //ƒo[ƒT[ƒNŽž‚͉ï˜b‚à•s‰Â
- sd->sc_data[SC_NOCHAT].timer != -1 ))) //ƒ`ƒƒƒbƒg‹ÖŽ~
- return;
-
- message = (char*)aCallocA(RFIFOW(fd,2) + 128, sizeof(char));
- buf = (unsigned char*)aCallocA(RFIFOW(fd,2) + 4, sizeof(char));
-
- //printf("clif_parse_GlobalMessage: message: '%s'.\n", RFIFOP(fd,4));
- if (strncmp((char*)RFIFOP(fd,4), sd->status.name, strlen(sd->status.name)) != 0) {
- printf("Hack on global message: character '%s' (account: %d), use an other name to send a (normal) message.\n", sd->status.name, sd->status.account_id);
-
- // information is sended to all online GM
- sprintf(message, "Hack on global message (normal message): character '%s' (account: %d) uses another name.", sd->status.name, sd->status.account_id);
- intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, message);
- if (strlen((char*)RFIFOP(fd,4)) == 0)
- strcpy(message, " This player sends a void name and a void message.");
- else
- sprintf(message, " This player sends (name:message): '%s'.", RFIFOP(fd,4));
- intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, message);
- // message about the ban
- if (battle_config.ban_spoof_namer > 0)
- sprintf(message, " This player has been banned for %d minute(s).", battle_config.ban_spoof_namer);
- else
- sprintf(message, " This player hasn't been banned (Ban option is disabled).");
- intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, message);
-
- // if we ban people
- if (battle_config.ban_spoof_namer > 0) {
- chrif_char_ask_name(-1, sd->status.name, 2, 0, 0, 0, 0, battle_config.ban_spoof_namer, 0); // type: 2 - ban (year, month, day, hour, minute, second)
- clif_setwaitclose(fd); // forced to disconnect because of the hack
-
- if(message) aFree(message);
- if(buf) aFree(buf);
-
- return;
- }
- // but for the hacker, we display on his screen (he see/look no difference).
- } else {
- // send message to others
- WBUFW(buf,0) = 0x8d;
- WBUFW(buf,2) = RFIFOW(fd,2) + 4; // len of message - 4 + 8
- WBUFL(buf,4) = sd->bl.id;
- memcpy(WBUFP(buf,8), RFIFOP(fd,4), RFIFOW(fd,2) - 4);
- clif_send(buf, WBUFW(buf,2), &sd->bl, sd->chatID ? CHAT_WOS : AREA_CHAT_WOC);
- }
-
- // send back message to the speaker
- memcpy(WFIFOP(fd,0), RFIFOP(fd,0), RFIFOW(fd,2));
- WFIFOW(fd,0) = 0x8e;
- WFIFOSET(fd, WFIFOW(fd,2));
-
-#ifdef PCRE_SUPPORT
- map_foreachinarea(npc_chat_sub, sd->bl.m, sd->bl.x-AREA_SIZE, sd->bl.y-AREA_SIZE, sd->bl.x+AREA_SIZE, sd->bl.y+AREA_SIZE, BL_NPC, RFIFOP(fd,4), strlen((char *) RFIFOP(fd,4)), &sd->bl);
-#endif
-
- // Celest
- if (pc_calc_base_job2 (sd->status.class_) == 23 ) {
- int next = pc_nextbaseexp(sd)>0 ? pc_nextbaseexp(sd) : sd->status.base_exp;
- if (next > 0 && (sd->status.base_exp*100/next)%10 == 0) {
- estr_lower((char*)RFIFOP(fd,4));
- if (sd->state.snovice_flag == 0 && strstr((char*)RFIFOP(fd,4), msg_txt(504)))
- sd->state.snovice_flag = 1;
- else if (sd->state.snovice_flag == 1) {
- sprintf(message, msg_txt(505), sd->status.name);
- estr_lower(message);
- if (strstr((char*)RFIFOP(fd,4), message))
- sd->state.snovice_flag = 2;
- }
- else if (sd->state.snovice_flag == 2 && strstr((char*)RFIFOP(fd,4), msg_txt(506)))
- sd->state.snovice_flag = 3;
- else if (sd->state.snovice_flag == 3) {
- int i;
- status_change_start(&sd->bl,SkillStatusChangeTable[MO_EXPLOSIONSPIRITS],1,0,0,0,skill_get_time(MO_EXPLOSIONSPIRITS,1),0 );
- for(i=0;i<5;i++)
- pc_addspiritball(sd,skill_get_time(MO_CALLSPIRITS,1),5);
- sd->state.snovice_flag = 0;
- }
- }
- }
-
- if(message) aFree(message);
- if(buf) aFree(buf);
-
- return;
-}
-
-int clif_message(struct block_list *bl, char* msg)
-{
- unsigned short msg_len = strlen(msg) + 1;
- unsigned char buf[256];
-
- nullpo_retr(0, bl);
-
- WBUFW(buf, 0) = 0x8d;
- WBUFW(buf, 2) = msg_len + 8;
- WBUFL(buf, 4) = bl->id;
- memcpy(WBUFP(buf, 8), msg, msg_len);
-
- clif_send(buf, WBUFW(buf,2), bl, AREA_CHAT_WOC); // by Gengar
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_MapMove(int fd, struct map_session_data *sd) {
-// /m /mapmove (as @rura GM command)
- char output[30]; // 17+4+4=26, 30 max.
- char map_name[17];
-
- nullpo_retv(sd);
-
-// not needed at all as far as sprintf is used // [Ilpalazzo-sama]
-// memset(output, '\0', sizeof(output));
-// not needed -- map_name[16]='\0'; will do
-// memset(map_name, '\0', sizeof(map_name));
-
- if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
- (pc_isGM(sd) >= get_atcommand_level(AtCommand_MapMove))) {
- memcpy(map_name, RFIFOP(fd,2), 16);
- map_name[16]='\0';
- sprintf(output, "%s %d %d", map_name, RFIFOW(fd,18), RFIFOW(fd,20));
- atcommand_rura(fd, sd, "@rura", output);
- }
-
- return;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_changed_dir(struct block_list *bl) {
- unsigned char buf[64];
- struct map_session_data *sd = NULL;
-
- if (bl->type == BL_PC)
- nullpo_retv (sd=(struct map_session_data *)bl);
-
- WBUFW(buf,0) = 0x9c;
- WBUFL(buf,2) = bl->id;
- if (sd)
- WBUFW(buf,6) = sd->head_dir;
- WBUFB(buf,8) = status_get_dir(bl);
- if (sd && sd->disguise > 23 && sd->disguise < 4001) // mob disguises [Valaris]
- clif_send(buf, packet_len_table[0x9c], &sd->bl, AREA);
- else
- clif_send(buf, packet_len_table[0x9c], bl, AREA_WOS);
-
- return;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_ChangeDir(int fd, struct map_session_data *sd) {
- short headdir, dir;
-
- nullpo_retv(sd);
-
- if (USE_PACKET_DB(sd)) {
- headdir = RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0]);
- dir = RFIFOB(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[1]);
- } else {
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 7:
- headdir = RFIFOW(fd,5);
- dir = RFIFOB(fd,12);
- break;
- case 8:
- headdir = RFIFOW(fd,5);
- dir = RFIFOB(fd,12);
- break;
- case 9:
- headdir = RFIFOW(fd,7);
- dir = RFIFOB(fd,11);
- break;
- case 10:
- headdir = RFIFOW(fd,4);
- dir = RFIFOB(fd,9);
- break;
- case 11:
- headdir = RFIFOW(fd,8);
- dir = RFIFOB(fd,17);
- break;
- case 12:
- headdir = RFIFOW(fd,5);
- dir = RFIFOB(fd,12);
- break;
- case 13:
- case 14:
- headdir = RFIFOW(fd,6);
- dir = RFIFOB(fd,14);
- break;
- case 15:
- headdir = RFIFOW(fd,3);
- dir = RFIFOB(fd,7);
- break;
- case 16:
- headdir = RFIFOW(fd,12);
- dir = RFIFOB(fd,22);
- break;
-
- default: // old version by default (and packet version 6)
- headdir = RFIFOW(fd,2);
- dir = RFIFOB(fd,4);
- break;
- }
- }
-
- pc_setdir(sd, dir, headdir);
-
- clif_changed_dir(&sd->bl);
- return;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_Emotion(int fd, struct map_session_data *sd) {
- unsigned char buf[64];
-
- nullpo_retv(sd);
-
- if (battle_config.basic_skill_check == 0 || pc_checkskill(sd, NV_BASIC) >= 2) {
- if (RFIFOB(fd,2) == 34) {// prevent use of the mute emote [Valaris]
- clif_skill_fail(sd, 1, 0, 1);
- return;
- }
- // fix flood of emotion icon (ro-proxy): flood only the hacker player
- if (sd->emotionlasttime >= time(NULL)) {
- sd->emotionlasttime = time(NULL) + 2; // not more than 1 every 2 seconds (normal client is every 3-4 seconds)
- clif_skill_fail(sd, 1, 0, 1);
- return;
- }
- sd->emotionlasttime = time(NULL) + 2; // not more than 1 every 2 seconds (normal client is every 3-4 seconds)
-
- WBUFW(buf,0) = 0xc0;
- WBUFL(buf,2) = sd->bl.id;
- WBUFB(buf,6) = RFIFOB(fd,2);
- clif_send(buf, packet_len_table[0xc0], &sd->bl, AREA);
- } else
- clif_skill_fail(sd, 1, 0, 1);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_HowManyConnections(int fd, struct map_session_data *sd) {
- WFIFOW(fd,0) = 0xc2;
- WFIFOL(fd,2) = map_getusers();
- WFIFOSET(fd,packet_len_table[0xc2]);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_ActionRequest(int fd, struct map_session_data *sd) {
- unsigned int tick;
- unsigned char buf[64];
- int action_type, target_id;
-
- nullpo_retv(sd);
-
- if (pc_isdead(sd)) {
- clif_clearchar_area(&sd->bl, 1);
- return;
- }
- if (sd->npc_id != 0 || sd->opt1 > 0 || sd->status.option & 2 ||
- (sd->sc_data &&
- (sd->sc_data[SC_TRICKDEAD].timer != -1 ||
- sd->sc_data[SC_AUTOCOUNTER].timer != -1 || //ƒI[ƒgƒJƒEƒ“ƒ^[
- sd->sc_data[SC_BLADESTOP].timer != -1 || //”’nŽæ‚è
- sd->sc_data[SC_DANCING].timer != -1))) //ƒ_ƒ“ƒX’†
- return;
-
- tick = gettick();
-
- pc_stop_walking(sd, 0);
- pc_stopattack(sd);
-
- if (USE_PACKET_DB(sd)) {
- target_id = RFIFOL(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0]);
- action_type = RFIFOB(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[1]);
- } else {
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 8:
- target_id = RFIFOL(fd,3);
- action_type = RFIFOB(fd,8);
- break;
- case 9:
- target_id = RFIFOL(fd,7);
- action_type = RFIFOB(fd,17);
- break;
- case 10:
- target_id = RFIFOL(fd,9);
- action_type = RFIFOB(fd,22);
- break;
- case 11:
- target_id = RFIFOL(fd,3);
- action_type = RFIFOB(fd,8);
- break;
- case 12:
- target_id = RFIFOL(fd,3);
- action_type = RFIFOB(fd,8);
- break;
- case 13:
- case 14:
- target_id = RFIFOL(fd,4);
- action_type = RFIFOB(fd,14);
- break;
- case 15:
- target_id = RFIFOL(fd,6);
- action_type = RFIFOB(fd,17);
- break;
- case 16:
- target_id = RFIFOL(fd,9);
- action_type = RFIFOB(fd,19);
- break;
-
- default: // old version by default (and packet version 6 and 7)
- target_id = RFIFOL(fd,2);
- action_type = RFIFOB(fd,6);
- break;
- }
- }
-
- switch(action_type) {
- case 0x00: // once attack
- case 0x07: // continuous attack
- if(sd->sc_data[SC_WEDDING].timer != -1 || sd->view_class==22)
- return;
- if (sd->vender_id != 0)
- return;
- if (!battle_config.sdelay_attack_enable && pc_checkskill(sd, SA_FREECAST) <= 0) {
- if (DIFF_TICK(tick, sd->canact_tick) < 0) {
- clif_skill_fail(sd, 1, 4, 0);
- return;
- }
- }
- if (sd->invincible_timer != -1)
- pc_delinvincibletimer(sd);
- if (sd->attacktarget > 0) // [Valaris]
- sd->attacktarget = 0;
- pc_attack(sd, target_id, action_type != 0);
- break;
- case 0x02: // sitdown
- if (battle_config.basic_skill_check == 0 || pc_checkskill(sd, NV_BASIC) >= 3) {
- pc_stop_walking(sd, 1);
- pc_setsit(sd);
- skill_gangsterparadise(sd, 1); // ƒMƒƒƒ“ƒOƒXƒ^[ƒpƒ‰ƒ_ƒCƒXÝ’è fixed Valaris
- clif_sitting(sd);
- } else
- clif_skill_fail(sd, 1, 0, 2);
- break;
- case 0x03: // standup
- pc_setstand(sd);
- skill_gangsterparadise(sd, 0); // ƒMƒƒƒ“ƒOƒXƒ^[ƒpƒ‰ƒ_ƒCƒX‰ðœ fixed Valaris
- WBUFW(buf, 0) = 0x8a;
- WBUFL(buf, 2) = sd->bl.id;
- WBUFB(buf,26) = 3;
- clif_send(buf, packet_len_table[0x8a], &sd->bl, AREA);
- break;
- }
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_Restart(int fd, struct map_session_data *sd) {
- nullpo_retv(sd);
-
- switch(RFIFOB(fd,2)) {
- case 0x00:
- if (pc_isdead(sd)) {
- pc_setstand(sd);
- pc_setrestartvalue(sd, 3);
- pc_setpos(sd, sd->status.save_point.map, sd->status.save_point.x, sd->status.save_point.y, 2);
- }
- // in case the player's status somehow wasn't updated yet [Celest]
- else if (sd->status.hp <= 0)
- pc_setdead(sd);
- break;
- case 0x01:
- if(!pc_isdead(sd) && (sd->opt1 || (sd->opt2 && !(night_flag == 1 && sd->opt2 == STATE_BLIND))))
- return;
-
- /* Rovert's Prevent logout option - Fixed [Valaris] */
- if ((battle_config.prevent_logout && (gettick() - sd->canlog_tick) >= 10000) || (!battle_config.prevent_logout)) {
- chrif_charselectreq(sd);
- } else {
- WFIFOW(fd,0)=0x18b;
- WFIFOW(fd,2)=1;
-
- WFIFOSET(fd,packet_len_table[0x018b]);
- }
- break;
- }
-}
-
-/*==========================================
- * Transmission of a wisp (S 0096 <len>.w <nick>.24B <message>.?B)
- *------------------------------------------
- */
-void clif_parse_Wis(int fd, struct map_session_data *sd) { // S 0096 <len>.w <nick>.24B <message>.?B // rewritten by [Yor]
- char *gm_command;
- struct map_session_data *dstsd;
- int i;
-
- //printf("clif_parse_Wis: message: '%s'.\n", RFIFOP(fd,28));
-
- gm_command = (char*)aCallocA(strlen((const char*)RFIFOP(fd,28)) + 28, sizeof(char)); // 24+3+(RFIFOW(fd,2)-28)+1 or 24+3+(strlen(RFIFOP(fd,28))+1 (size can be wrong with hacker)
-
- sprintf(gm_command, "%s : %s", sd->status.name, RFIFOP(fd,28));
- if ((is_charcommand(fd, sd, gm_command, 0) != CharCommand_None) ||
- (is_atcommand(fd, sd, gm_command, 0) != AtCommand_None) ||
- (sd && sd->sc_data &&
- (sd->sc_data[SC_BERSERK].timer!=-1 || //ƒo[ƒT[ƒNŽž‚͉ï˜b‚à•s‰Â
- sd->sc_data[SC_NOCHAT].timer != -1))) //ƒ`ƒƒƒbƒg‹ÖŽ~
- {
- if(gm_command) aFree(gm_command);
- return;
- }
-
- if(gm_command) aFree(gm_command);
-
- // searching destination character
- dstsd = map_nick2sd((char*)RFIFOP(fd,4));
- // player is not on this map-server
- if (dstsd == NULL ||
- // At this point, don't send wisp/page if it's not exactly the same name, because (example)
- // if there are 'Test' player on an other map-server and 'test' player on this map-server,
- // and if we ask for 'Test', we must not contact 'test' player
- // so, we send information to inter-server, which is the only one which decide (and copy correct name).
- strcmp(dstsd->status.name, (const char*)RFIFOP(fd,4)) != 0) // not exactly same name
- // send message to inter-server
- intif_wis_message(sd, (char*)RFIFOP(fd,4), (char*)RFIFOP(fd,28), RFIFOW(fd,2)-28);
- // player is on this map-server
- else {
- // if you send to your self, don't send anything to others
- if (dstsd->fd == fd) // but, normaly, it's impossible!
- clif_wis_message(fd, wisp_server_name, "You can not page yourself. Sorry.", strlen("You can not page yourself. Sorry.") + 1);
- // otherwise, send message and answer immediatly
- else {
- if (dstsd->ignoreAll == 1)
- clif_wis_end(fd, 2); // type: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- else {
- // if player ignore the source character
- for(i = 0; i < MAX_IGNORE_LIST; i++)
- if (strcmp(dstsd->ignore[i].name, sd->status.name) == 0) {
- clif_wis_end(fd, 2); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- break;
- }
- // if source player not found in ignore list
- if (i == MAX_IGNORE_LIST) {
- clif_wis_message(dstsd->fd, sd->status.name, (char*)RFIFOP(fd,28), RFIFOW(fd,2) - 28);
- clif_wis_end(fd, 0); // type: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- }
- }
- }
- }
-
- return;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_GMmessage(int fd, struct map_session_data *sd) {
-// /b
- nullpo_retv(sd);
-
- if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
- (pc_isGM(sd) >= get_atcommand_level(AtCommand_Broadcast)))
- intif_GMmessage((char*)RFIFOP(fd,4), RFIFOW(fd,2)-4, 0);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_TakeItem(int fd, struct map_session_data *sd) {
- struct flooritem_data *fitem;
- int map_object_id;
-
- nullpo_retv(sd);
-
- if (USE_PACKET_DB(sd)) {
- map_object_id = RFIFOL(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0]);
- } else {
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 7:
- map_object_id = RFIFOL(fd,6);
- break;
- case 8:
- map_object_id = RFIFOL(fd,6);
- break;
- case 9:
- map_object_id = RFIFOL(fd,9);
- break;
- case 10:
- map_object_id = RFIFOL(fd,7);
- break;
- case 11:
- map_object_id = RFIFOL(fd,10);
- break;
- case 12:
- map_object_id = RFIFOL(fd,6);
- break;
- case 13:
- case 14:
- map_object_id = RFIFOL(fd,5);
- break;
- case 15:
- map_object_id = RFIFOL(fd,3);
- break;
- case 16:
- map_object_id = RFIFOL(fd,5);
- break;
- default: // old version by default (and packet version 6)
- map_object_id = RFIFOL(fd,2);
- break;
- }
- }
- fitem = (struct flooritem_data*)map_id2bl(map_object_id);
-
- if (pc_isdead(sd)) {
- clif_clearchar_area(&sd->bl, 1);
- return;
- }
-
- if( sd->npc_id!=0 || sd->vender_id != 0 || sd->opt1 > 0 ||
- (sd->sc_data && (sd->sc_data[SC_TRICKDEAD].timer != -1 || //Ž€‚ñ‚¾‚Ó‚è
- sd->sc_data[SC_BLADESTOP].timer != -1 || //”’nŽæ‚è
- sd->sc_data[SC_BERSERK].timer!=-1 || //ƒo[ƒT[ƒN
- sd->sc_data[SC_NOCHAT].timer!=-1 )) ) //‰ï˜b‹ÖŽ~
- return;
-
- if (fitem == NULL || fitem->bl.m != sd->bl.m)
- return;
-
- pc_takeitem(sd, fitem);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_DropItem(int fd, struct map_session_data *sd) {
- int item_index, item_amount;
-
- nullpo_retv(sd);
-
- if (pc_isdead(sd)) {
- clif_clearchar_area(&sd->bl, 1);
- return;
- }
- if (sd->npc_id != 0 || sd->vender_id != 0 || sd->opt1 > 0 ||
- (sd->sc_data && (sd->sc_data[SC_AUTOCOUNTER].timer != -1 || //ƒI[ƒgƒJƒEƒ“ƒ^[
- sd->sc_data[SC_BLADESTOP].timer != -1 || //”’nŽæ‚è
- sd->sc_data[SC_BERSERK].timer != -1)) ) //ƒo[ƒT[ƒN
- return;
-
- if (USE_PACKET_DB(sd)) {
- item_index = RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0])-2;
- item_amount = RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[1]);
- } else {
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 8:
- item_index = RFIFOW(fd,5) - 2;
- item_amount = RFIFOW(fd,12);
- break;
- case 9:
- item_index = RFIFOW(fd,8) - 2;
- item_amount = RFIFOW(fd,15);
- break;
- case 10:
- item_index = RFIFOW(fd,6) - 2;
- item_amount = RFIFOW(fd,15);
- break;
- case 11:
- item_index = RFIFOW(fd,12) - 2;
- item_amount = RFIFOW(fd,17);
- break;
- case 12:
- item_index = RFIFOW(fd,5) - 2;
- item_amount = RFIFOW(fd,12);
- break;
- case 13:
- case 14:
- item_index = RFIFOW(fd,6) - 2;
- item_amount = RFIFOW(fd,10);
- break;
- case 15:
- item_index = RFIFOW(fd,4) - 2;
- item_amount = RFIFOW(fd,10);
- break;
- case 16:
- item_index = RFIFOW(fd,15) - 2;
- item_amount = RFIFOW(fd,18);
- break;
- default: // old version by default (+ packet version 6 and 7)
- item_index = RFIFOW(fd,2) - 2;
- item_amount = RFIFOW(fd,4);
- break;
- }
- }
-
- pc_dropitem(sd, item_index, item_amount);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_UseItem(int fd, struct map_session_data *sd) {
- nullpo_retv(sd);
-
- if (pc_isdead(sd)) {
- clif_clearchar_area(&sd->bl, 1);
- return;
- }
- if (sd->npc_id!=0 || sd->vender_id != 0 || (sd->opt1 > 0 && sd->opt1 != 6) ||
- (sd->sc_data && (sd->sc_data[SC_TRICKDEAD].timer != -1 || //Ž€‚ñ‚¾‚Ó‚è
- sd->sc_data[SC_BLADESTOP].timer != -1 || //”’nŽæ‚è
- sd->sc_data[SC_BERSERK].timer!=-1 || //ƒo[ƒT[ƒN
- sd->sc_data[SC_NOCHAT].timer!=-1 )) ) //‰ï˜b‹ÖŽ~
- return;
-
- if (sd->invincible_timer != -1)
- pc_delinvincibletimer(sd);
-
- if (USE_PACKET_DB(sd)) {
- pc_useitem(sd,RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0])-2);
- } else {
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 6:
- pc_useitem(sd,RFIFOW(fd,5)-2);
- break;
- case 7:
- pc_useitem(sd,RFIFOW(fd,6)-2);
- break;
- case 8:
- pc_useitem(sd,RFIFOW(fd,6)-2);
- break;
- case 9:
- pc_useitem(sd,RFIFOW(fd,9)-2);
- break;
- case 10:
- pc_useitem(sd,RFIFOW(fd,7)-2);
- break;
- case 11:
- pc_useitem(sd,RFIFOW(fd,10)-2);
- break;
- case 12:
- pc_useitem(sd,RFIFOW(fd,6)-2);
- break;
- case 13:
- case 14:
- pc_useitem(sd,RFIFOW(fd,5)-2);
- break;
- case 15:
- pc_useitem(sd,RFIFOW(fd,3)-2);
- break;
- case 16:
- pc_useitem(sd,RFIFOW(fd,5)-2);
- break;
- default: // old version by default
- pc_useitem(sd,RFIFOW(fd,2)-2);
- break;
- }
- }
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_EquipItem(int fd,struct map_session_data *sd)
-{
- int index;
-
- nullpo_retv(sd);
-
- if(pc_isdead(sd)) {
- clif_clearchar_area(&sd->bl,1);
- return;
- }
- index = RFIFOW(fd,2)-2;
- if(sd->npc_id!=0 || sd->vender_id != 0) return;
- if(sd->sc_data && ( sd->sc_data[SC_BLADESTOP].timer!=-1 || sd->sc_data[SC_BERSERK].timer!=-1 )) return;
-
- if(sd->status.inventory[index].identify != 1) { // –¢ŠÓ’è
- clif_equipitemack(sd,index,0,0); // fail
- return;
- }
- //ƒyƒbƒg—p‘•”õ‚Å‚ ‚é‚©‚È‚¢‚©
- if(sd->inventory_data[index]) {
- if(sd->inventory_data[index]->type != 8){
- if(sd->inventory_data[index]->type == 10)
- RFIFOW(fd,4)=0x8000; // –î‚ð–³—‚â‚è‘•”õ‚Å‚«‚é‚悤‚Éi||G
- pc_equipitem(sd,index,RFIFOW(fd,4));
- } else
- pet_equipitem(sd,index);
- }
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_UnequipItem(int fd,struct map_session_data *sd)
-{
- int index;
-
- nullpo_retv(sd);
-
- if(pc_isdead(sd)) {
- clif_clearchar_area(&sd->bl,1);
- return;
- }
- if(sd->npc_id!=0 || sd->vender_id != 0 || sd->opt1 > 0)
- return;
- index = RFIFOW(fd,2)-2;
-
- /*if(sd->status.inventory[index].attribute == 1 && sd->sc_data && sd->sc_data[SC_BROKNWEAPON].timer!=-1)
- status_change_end(&sd->bl,SC_BROKNWEAPON,-1);
- if(sd->status.inventory[index].attribute == 1 && sd->sc_data && sd->sc_data[SC_BROKNARMOR].timer!=-1)
- status_change_end(&sd->bl,SC_BROKNARMOR,-1);
- if(sd->sc_count && ( sd->sc_data[SC_BLADESTOP].timer!=-1 || sd->sc_data[SC_BERSERK].timer!=-1 ))
- return;*/
-
- pc_unequipitem(sd,index,1);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_NpcClicked(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- if(pc_isdead(sd)) {
- clif_clearchar_area(&sd->bl,1);
- return;
- }
- if(sd->npc_id!=0 || sd->vender_id != 0)
- return;
- npc_click(sd,RFIFOL(fd,2));
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_NpcBuySellSelected(int fd,struct map_session_data *sd)
-{
- npc_buysellsel(sd,RFIFOL(fd,2),RFIFOB(fd,6));
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_NpcBuyListSend(int fd,struct map_session_data *sd)
-{
- int fail=0,n;
- unsigned short *item_list;
-
- n = (RFIFOW(fd,2)-4) /4;
- item_list = (unsigned short*)RFIFOP(fd,4);
-
- fail = npc_buylist(sd,n,item_list);
-
- WFIFOW(fd,0)=0xca;
- WFIFOB(fd,2)=fail;
- WFIFOSET(fd,packet_len_table[0xca]);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_NpcSellListSend(int fd,struct map_session_data *sd)
-{
- int fail=0,n;
- unsigned short *item_list;
-
- n = (RFIFOW(fd,2)-4) /4;
- item_list = (unsigned short*)RFIFOP(fd,4);
-
- fail = npc_selllist(sd,n,item_list);
-
- WFIFOW(fd,0)=0xcb;
- WFIFOB(fd,2)=fail;
- WFIFOSET(fd,packet_len_table[0xcb]);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_CreateChatRoom(int fd,struct map_session_data *sd)
-{
- if(battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 4){
- chat_createchat(sd,RFIFOW(fd,4),RFIFOB(fd,6),(char*)RFIFOP(fd,7),(char*)RFIFOP(fd,15),RFIFOW(fd,2)-15);
- } else
- clif_skill_fail(sd,1,0,3);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_ChatAddMember(int fd,struct map_session_data *sd)
-{
- chat_joinchat(sd,RFIFOL(fd,2),(char*)RFIFOP(fd,6));
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_ChatRoomStatusChange(int fd,struct map_session_data *sd)
-{
- chat_changechatstatus(sd,RFIFOW(fd,4),RFIFOB(fd,6),(char*)RFIFOP(fd,7),(char*)RFIFOP(fd,15),RFIFOW(fd,2)-15);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_ChangeChatOwner(int fd,struct map_session_data *sd)
-{
- chat_changechatowner(sd,(char*)RFIFOP(fd,6));
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_KickFromChat(int fd,struct map_session_data *sd)
-{
- chat_kickchat(sd,(char*)RFIFOP(fd,2));
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_ChatLeave(int fd,struct map_session_data *sd)
-{
- chat_leavechat(sd);
-}
-
-/*==========================================
- * Žæˆø—v¿‚ð‘ŠŽè‚É‘—‚é
- *------------------------------------------
- */
-void clif_parse_TradeRequest(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- if(battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 1){
- trade_traderequest(sd,RFIFOL(sd->fd,2));
- } else
- clif_skill_fail(sd,1,0,0);
-}
-
-/*==========================================
- * Žæˆø—v¿
- *------------------------------------------
- */
-void clif_parse_TradeAck(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- trade_tradeack(sd,RFIFOB(sd->fd,2));
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€’ljÁ
- *------------------------------------------
- */
-void clif_parse_TradeAddItem(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- trade_tradeadditem(sd,RFIFOW(sd->fd,2),RFIFOL(sd->fd,4));
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€’ljÁŠ®—¹(ok‰Ÿ‚µ)
- *------------------------------------------
- */
-void clif_parse_TradeOk(int fd,struct map_session_data *sd)
-{
- trade_tradeok(sd);
-}
-
-/*==========================================
- * ŽæˆøƒLƒƒƒ“ƒZƒ‹
- *------------------------------------------
- */
-void clif_parse_TradeCancel(int fd,struct map_session_data *sd)
-{
- trade_tradecancel(sd);
-}
-
-/*==========================================
- * Žæˆø‹–‘ø(trade‰Ÿ‚µ)
- *------------------------------------------
- */
-void clif_parse_TradeCommit(int fd,struct map_session_data *sd)
-{
- trade_tradecommit(sd);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_StopAttack(int fd,struct map_session_data *sd)
-{
- pc_stopattack(sd);
-}
-
-/*==========================================
- * ƒJ[ƒg‚ÖƒAƒCƒeƒ€‚ðˆÚ‚·
- *------------------------------------------
- */
-void clif_parse_PutItemToCart(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- if(sd->npc_id!=0 || sd->vender_id != 0)
- return;
- pc_putitemtocart(sd,RFIFOW(fd,2)-2,RFIFOL(fd,4));
-}
-/*==========================================
- * ƒJ[ƒg‚©‚çƒAƒCƒeƒ€‚ðo‚·
- *------------------------------------------
- */
-void clif_parse_GetItemFromCart(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- if(sd->npc_id!=0 || sd->vender_id != 0) return;
- pc_getitemfromcart(sd,RFIFOW(fd,2)-2,RFIFOL(fd,4));
-}
-
-/*==========================================
- * •t‘®•i(‘é,ƒyƒR,ƒJ[ƒg)‚ð‚Í‚¸‚·
- *------------------------------------------
- */
-void clif_parse_RemoveOption(int fd,struct map_session_data *sd)
-{
- if(pc_isriding(sd)) { // jobchange when removing peco [Valaris]
- if(sd->status.class_==13)
- sd->status.class_=sd->view_class=7;
-
- if(sd->status.class_==21)
- sd->status.class_=sd->view_class=14;
-
- if(sd->status.class_==4014)
- sd->status.class_=sd->view_class=4008;
-
- if(sd->status.class_==4022)
- sd->status.class_=sd->view_class=4015;
- }
-
- pc_setoption(sd,0);
-}
-
-/*==========================================
- * ƒ`ƒFƒ“ƒWƒJ[ƒg
- *------------------------------------------
- */
-void clif_parse_ChangeCart(int fd,struct map_session_data *sd)
-{
- pc_setcart(sd,RFIFOW(fd,2));
-}
-
-/*==========================================
- * ƒXƒe[ƒ^ƒXƒAƒbƒv
- *------------------------------------------
- */
-void clif_parse_StatusUp(int fd,struct map_session_data *sd)
-{
- pc_statusup(sd,RFIFOW(fd,2));
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒŒƒxƒ‹ƒAƒbƒv
- *------------------------------------------
- */
-void clif_parse_SkillUp(int fd,struct map_session_data *sd)
-{
- pc_skillup(sd,RFIFOW(fd,2));
-}
-
-/*==========================================
- * ƒXƒLƒ‹Žg—piIDŽw’èj
- *------------------------------------------
- */
-void clif_parse_UseSkillToId(int fd, struct map_session_data *sd) {
- int skillnum, skilllv, lv, target_id;
- unsigned int tick = gettick();
-
- nullpo_retv(sd);
-
- if (sd->chatID || sd->npc_id != 0 || sd->vender_id != 0)
- return;
-
- if (USE_PACKET_DB(sd)) {
- skilllv = RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0]);
- skillnum = RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[1]);
- target_id = RFIFOL(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[2]);
- } else {
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 6:
- skilllv = RFIFOW(fd,4);
- skillnum = RFIFOW(fd,9);
- target_id = RFIFOL(fd,11);
- break;
- case 7:
- skilllv = RFIFOW(fd,7);
- skillnum = RFIFOW(fd,9);
- target_id = RFIFOL(fd,15);
- break;
- case 8:
- skilllv = RFIFOW(fd,7);
- skillnum = RFIFOW(fd,12);
- target_id = RFIFOL(fd,16);
- break;
- case 9:
- skilllv = RFIFOW(fd,11);
- skillnum = RFIFOW(fd,18);
- target_id = RFIFOL(fd,22);
- break;
- case 10:
- skilllv = RFIFOW(fd,9);
- skillnum = RFIFOW(fd,15);
- target_id = RFIFOL(fd,18);
- break;
- case 11:
- skilllv = RFIFOW(fd,4);
- skillnum = RFIFOW(fd,7);
- target_id = RFIFOL(fd,10);
- break;
- case 12:
- skilllv = RFIFOW(fd,7);
- skillnum = RFIFOW(fd,12);
- target_id = RFIFOL(fd,16);
- break;
- case 13:
- case 14:
- skilllv = RFIFOW(fd,4);
- skillnum = RFIFOW(fd,10);
- target_id = RFIFOL(fd,22);
- break;
- case 15:
- skilllv = RFIFOW(fd,8);
- skillnum = RFIFOW(fd,12);
- target_id = RFIFOL(fd,18);
- break;
- case 16:
- skilllv = RFIFOW(fd,8);
- skillnum = RFIFOW(fd,16);
- target_id = RFIFOL(fd,22);
- break;
- default: // old version by default
- skilllv = RFIFOW(fd,2);
- skillnum = RFIFOW(fd,4);
- target_id = RFIFOL(fd,6);
- break;
- }
- }
-
- if (skillnotok(skillnum, sd))
- return;
-
- if (sd->skilltimer != -1) {
- if (skillnum != SA_CASTCANCEL)
- return;
- } else if (DIFF_TICK(tick, sd->canact_tick) < 0 &&
- // allow monk combos to ignore this delay [celest]
- !(sd->sc_count && sd->sc_data[SC_COMBO].timer!=-1 &&
- (skillnum == MO_EXTREMITYFIST ||
- skillnum == MO_CHAINCOMBO ||
- skillnum == MO_COMBOFINISH ||
- skillnum == CH_PALMSTRIKE ||
- skillnum == CH_TIGERFIST ||
- skillnum == CH_CHAINCRUSH))) {
- clif_skill_fail(sd, skillnum, 4, 0);
- return;
- }
-
- if ((sd->sc_data[SC_TRICKDEAD].timer != -1 && skillnum != NV_TRICKDEAD) ||
- sd->sc_data[SC_BERSERK].timer != -1 || sd->sc_data[SC_NOCHAT].timer != -1 ||
- sd->sc_data[SC_WEDDING].timer != -1 || sd->view_class == 22)
- return;
- if (sd->invincible_timer != -1)
- pc_delinvincibletimer(sd);
- if (sd->skillitem >= 0 && sd->skillitem == skillnum) {
- if (skilllv != sd->skillitemlv)
- skilllv = sd->skillitemlv;
- skill_use_id(sd, target_id, skillnum, skilllv);
- } else {
- sd->skillitem = sd->skillitemlv = -1;
- if (skillnum == MO_EXTREMITYFIST) {
- if ((sd->sc_data[SC_COMBO].timer == -1 || (sd->sc_data[SC_COMBO].val1 != MO_COMBOFINISH && sd->sc_data[SC_COMBO].val1 != CH_CHAINCRUSH))) {
- if (!sd->state.skill_flag ) {
- sd->state.skill_flag = 1;
- clif_skillinfo(sd, MO_EXTREMITYFIST, 1, -1);
- return;
- } else if (sd->bl.id == target_id) {
- clif_skillinfo(sd, MO_EXTREMITYFIST, 1, -1);
- return;
- }
- }
- } else if (skillnum == CH_TIGERFIST) {
- if (sd->sc_data[SC_COMBO].timer == -1 || sd->sc_data[SC_COMBO].val1 != MO_COMBOFINISH) {
- if (!sd->state.skill_flag ) {
- sd->state.skill_flag = 1;
- if (!sd->attacktarget) {
- clif_skillinfo(sd, CH_TIGERFIST, 1, -2);
- return;
- } else
- target_id = sd->attacktarget;
- } else if (sd->bl.id == target_id) {
- clif_skillinfo(sd, CH_TIGERFIST, 1, -2);
- return;
- }
- }
- }
- if ((lv = pc_checkskill(sd, skillnum)) > 0) {
- if (skilllv > lv)
- skilllv = lv;
- skill_use_id(sd, target_id, skillnum, skilllv);
- if (sd->state.skill_flag)
- sd->state.skill_flag = 0;
- }
- }
-}
-
-/*==========================================
- * ƒXƒLƒ‹Žg—piꊎw’èj
- *------------------------------------------
- */
-void clif_parse_UseSkillToPos(int fd, struct map_session_data *sd) {
- int skillnum, skilllv, lv, x, y;
- unsigned int tick = gettick();
- int skillmoreinfo;
-
- nullpo_retv(sd);
-
- if (sd->npc_id != 0 || sd->vender_id != 0) return;
- if(sd->chatID) return;
-
- skillmoreinfo = -1;
- if (USE_PACKET_DB(sd)) {
- skilllv = RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0]);
- skillnum = RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[1]);
- x = RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[2]);
- y = RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[3]);
- } else {
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 6:
- skilllv = RFIFOW(fd,4);
- skillnum = RFIFOW(fd,9);
- x = RFIFOW(fd,11);
- y = RFIFOW(fd,13);
- if (RFIFOW(fd,0) == 0x190)
- skillmoreinfo = 15;
- break;
- case 7:
- skilllv = RFIFOW(fd,7);
- skillnum = RFIFOW(fd,9);
- x = RFIFOW(fd,15);
- y = RFIFOW(fd,17);
- if (RFIFOW(fd,0) == 0x190)
- skillmoreinfo = 19;
- break;
- case 8:
- skilllv = RFIFOW(fd,3);
- skillnum = RFIFOW(fd,6);
- x = RFIFOW(fd,17);
- y = RFIFOW(fd,21);
- if (RFIFOW(fd,0) == 0x0a2)
- skillmoreinfo = 23;
- break;
- case 9:
- skilllv = RFIFOW(fd,5);
- skillnum = RFIFOW(fd,15);
- x = RFIFOW(fd,29);
- y = RFIFOW(fd,38);
- if (RFIFOW(fd,0) == 0x0a2)
- skillmoreinfo = 40;
- break;
- case 10:
- skilllv = RFIFOW(fd,10);
- skillnum = RFIFOW(fd,14);
- x = RFIFOW(fd,18);
- y = RFIFOW(fd,23);
- if (RFIFOW(fd,0) == 0x08c)
- skillmoreinfo = 25;
- break;
- case 11:
- skilllv = RFIFOW(fd,6); // 16? to check.
- skillnum = RFIFOW(fd,20);
- x = RFIFOW(fd,23);
- y = RFIFOW(fd,27);
- if (RFIFOW(fd,0) == 0x08c)
- skillmoreinfo = 29;
- break;
- case 12:
- skilllv = RFIFOW(fd,3); // 2? to check.
- skillnum = RFIFOW(fd,6);
- x = RFIFOW(fd,17);
- y = RFIFOW(fd,21);
- if (RFIFOW(fd,0) == 0x08c)
- skillmoreinfo = 23;
- break;
- case 13:
- case 14:
- skilllv = RFIFOW(fd,6);
- skillnum = RFIFOW(fd,9);
- x = RFIFOW(fd,23);
- y = RFIFOW(fd,26);
- if (RFIFOW(fd,0) == 0x08c)
- skillmoreinfo = 28;
- break;
- case 15:
- skilllv = RFIFOW(fd,4);
- skillnum = RFIFOW(fd,9);
- x = RFIFOW(fd,22);
- y = RFIFOW(fd,28);
- if (RFIFOW(fd,0) == 0x113)
- skillmoreinfo = 30;
- break;
- case 16:
- skilllv = RFIFOW(fd,9);
- skillnum = RFIFOW(fd,18);
- x = RFIFOW(fd,22);
- y = RFIFOW(fd,32);
- if (RFIFOW(fd,0) == 0x07e)
- skillmoreinfo = 34;
- break;
- default: // old version by default
- skilllv = RFIFOW(fd,2);
- skillnum = RFIFOW(fd,4);
- x = RFIFOW(fd,6);
- y = RFIFOW(fd,8);
- if (RFIFOW(fd,0) == 0x190)
- skillmoreinfo = 10;
- break;
- }
- }
-
- if (skillnotok(skillnum, sd))
- return;
-
- if (skillmoreinfo != -1) {
- if (pc_issit(sd)) {
- clif_skill_fail(sd, skillnum, 0, 0);
- return;
- }
- memcpy(talkie_mes, RFIFOP(fd,skillmoreinfo), 80);
- }
-
- if (sd->skilltimer != -1)
- return;
- else if (DIFF_TICK(tick, sd->canact_tick) < 0 &&
- // allow monk combos to ignore this delay [celest]
- !(sd->sc_count && sd->sc_data[SC_COMBO].timer!=-1 &&
- (skillnum == MO_EXTREMITYFIST ||
- skillnum == MO_CHAINCOMBO ||
- skillnum == MO_COMBOFINISH ||
- skillnum == CH_PALMSTRIKE ||
- skillnum == CH_TIGERFIST ||
- skillnum == CH_CHAINCRUSH))) {
- clif_skill_fail(sd, skillnum, 4, 0);
- return;
- }
-
- if ((sd->sc_data[SC_TRICKDEAD].timer != -1 && skillnum != NV_TRICKDEAD) ||
- sd->sc_data[SC_BERSERK].timer != -1 || sd->sc_data[SC_NOCHAT].timer != -1 ||
- sd->sc_data[SC_WEDDING].timer != -1 || sd->view_class == 22)
- return;
- if (sd->invincible_timer != -1)
- pc_delinvincibletimer(sd);
- if (sd->skillitem >= 0 && sd->skillitem == skillnum) {
- if (skilllv != sd->skillitemlv)
- skilllv = sd->skillitemlv;
- skill_use_pos(sd, x, y, skillnum, skilllv);
- } else {
- sd->skillitem = sd->skillitemlv = -1;
- if ((lv = pc_checkskill(sd, skillnum)) > 0) {
- if (skilllv > lv)
- skilllv = lv;
- skill_use_pos(sd, x, y, skillnum,skilllv);
- }
- }
-}
-
-/*==========================================
- * ƒXƒLƒ‹Žg—pimapŽw’èj
- *------------------------------------------
- */
-void clif_parse_UseSkillMap(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- if(sd->chatID) return;
-
- if (sd->npc_id!=0 || sd->vender_id != 0 || (sd->sc_data &&
- (sd->sc_data[SC_TRICKDEAD].timer != -1 ||
- sd->sc_data[SC_BERSERK].timer!=-1 ||
- sd->sc_data[SC_NOCHAT].timer!=-1 ||
- sd->sc_data[SC_WEDDING].timer!=-1 ||
- sd->view_class==22)))
- return;
-
- if(sd->invincible_timer != -1)
- pc_delinvincibletimer(sd);
-
- skill_castend_map(sd,RFIFOW(fd,2),(char*)RFIFOP(fd,4));
-}
-/*==========================================
- * ƒƒ‚—v‹
- *------------------------------------------
- */
-void clif_parse_RequestMemo(int fd,struct map_session_data *sd)
-{
- pc_memo(sd,-1);
-}
-/*==========================================
- * ƒAƒCƒeƒ€‡¬
- *------------------------------------------
- */
-void clif_parse_ProduceMix(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- sd->state.produce_flag = 0;
- skill_produce_mix(sd,RFIFOW(fd,2),RFIFOW(fd,4),RFIFOW(fd,6),RFIFOW(fd,8));
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_NpcSelectMenu(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- sd->npc_menu=RFIFOB(fd,6);
- npc_scriptcont(sd,RFIFOL(fd,2));
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_NpcNextClicked(int fd,struct map_session_data *sd)
-{
- npc_scriptcont(sd,RFIFOL(fd,2));
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_NpcAmountInput(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
-#define RFIFOL_(fd,pos) (*(int*)(session[fd]->rdata+session[fd]->rdata_pos+(pos)))
- //Input Value overflow Exploit FIX
- sd->npc_amount=RFIFOL_(fd,6); //fixed by Lupus. npc_amount is (int) but was RFIFOL changing it to (unsigned int)
-
-#undef RFIFOL_
-
- npc_scriptcont(sd,RFIFOL(fd,2));
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_NpcStringInput(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- if(RFIFOW(fd,2)-7 >= sizeof(sd->npc_str)){
- printf("clif: input string too long !\n");
- memcpy(sd->npc_str,RFIFOP(fd,8),sizeof(sd->npc_str));
- sd->npc_str[sizeof(sd->npc_str)-1]=0;
- } else
- strcpy(sd->npc_str,(char*)RFIFOP(fd,8));
- npc_scriptcont(sd,RFIFOL(fd,4));
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_NpcCloseClicked(int fd,struct map_session_data *sd)
-{
- npc_scriptcont(sd,RFIFOL(fd,2));
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€ŠÓ’è
- *------------------------------------------
- */
-void clif_parse_ItemIdentify(int fd,struct map_session_data *sd)
-{
- pc_item_identify(sd,RFIFOW(fd,2)-2);
-}
-/*==========================================
- * –îì¬
- *------------------------------------------
- */
-void clif_parse_SelectArrow(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- sd->state.make_arrow_flag = 0;
- skill_arrow_create(sd,RFIFOW(fd,2));
-}
-/*==========================================
- * ƒI[ƒgƒXƒyƒ‹ŽóM
- *------------------------------------------
- */
-void clif_parse_AutoSpell(int fd,struct map_session_data *sd)
-{
- skill_autospell(sd,RFIFOW(fd,2));
-}
-/*==========================================
- * ƒJ[ƒhŽg—p
- *------------------------------------------
- */
-void clif_parse_UseCard(int fd,struct map_session_data *sd)
-{
- clif_use_card(sd,RFIFOW(fd,2)-2);
-}
-/*==========================================
- * ƒJ[ƒh‘}“ü‘•”õ‘I‘ð
- *------------------------------------------
- */
-void clif_parse_InsertCard(int fd,struct map_session_data *sd)
-{
- pc_insert_card(sd,RFIFOW(fd,2)-2,RFIFOW(fd,4)-2);
-}
-
-/*==========================================
- * 0193 ƒLƒƒƒ‰ID–¼‘Oˆø‚«
- *------------------------------------------
- */
-void clif_parse_SolveCharName(int fd, struct map_session_data *sd) {
- int char_id;
-
- if (USE_PACKET_DB(sd)) {
- char_id = RFIFOL(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0]);
- } else {
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 8:
- char_id = RFIFOL(fd,8);
- break;
- case 9:
- char_id = RFIFOL(fd,7);
- break;
- case 10:
- char_id = RFIFOL(fd,10);
- break;
- case 11:
- char_id = RFIFOL(fd,6);
- break;
- case 12:
- char_id = RFIFOL(fd,8);
- break;
- case 13:
- case 14:
- char_id = RFIFOL(fd,12);
- break;
- case 15:
- char_id = RFIFOL(fd,10);
- break;
- case 16:
- char_id = RFIFOL(fd,7);
- break;
- default: // old version by default (+ packet version 6 and 7)
- char_id = RFIFOL(fd,2);
- break;
- }
- }
- clif_solved_charname(sd, char_id);
-}
-
-/*==========================================
- * 0197 /resetskill /resetstate
- *------------------------------------------
- */
-void clif_parse_ResetChar(int fd, struct map_session_data *sd) {
- nullpo_retv(sd);
-
- if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
- pc_isGM(sd) >= get_atcommand_level(AtCommand_ResetState)) {
- switch(RFIFOW(fd,2)){
- case 0:
- pc_resetstate(sd);
- break;
- case 1:
- pc_resetskill(sd);
- break;
- }
- }
-}
-
-/*==========================================
- * 019c /lb“™
- *------------------------------------------
- */
-void clif_parse_LGMmessage(int fd, struct map_session_data *sd) {
- unsigned char buf[512];
-
- nullpo_retv(sd);
-
- if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
- (pc_isGM(sd) >= get_atcommand_level(AtCommand_LocalBroadcast))) {
- WBUFW(buf,0) = 0x9a;
- WBUFW(buf,2) = RFIFOW(fd,2);
- memcpy(WBUFP(buf,4), RFIFOP(fd,4), RFIFOW(fd,2) - 4);
- clif_send(buf, RFIFOW(fd,2), &sd->bl, ALL_SAMEMAP);
- }
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚Ö“ü‚ê‚é
- *------------------------------------------
- */
-void clif_parse_MoveToKafra(int fd, struct map_session_data *sd) {
- int item_index, item_amount;
-
- nullpo_retv(sd);
-
- if (sd->npc_id != 0 || sd->vender_id != 0)
- return;
-
- if (USE_PACKET_DB(sd)) {
- item_index = RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0])-2;
- item_amount = RFIFOL(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[1]);
- } else {
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 8:
- item_index = RFIFOW(fd,5) - 2;
- item_amount = RFIFOL(fd,12);
- break;
- case 9:
- item_index = RFIFOW(fd,5) - 2;
- item_amount = RFIFOL(fd,19);
- break;
- case 10:
- item_index = RFIFOW(fd,3) - 2;
- item_amount = RFIFOL(fd,15);
- break;
- case 11:
- item_index = RFIFOW(fd,6) - 2;
- item_amount = RFIFOL(fd,21);
- break;
- case 12:
- item_index = RFIFOW(fd,5) - 2;
- item_amount = RFIFOL(fd,12);
- break;
- case 13:
- case 14:
- item_index = RFIFOW(fd,6) - 2;
- item_amount = RFIFOL(fd,9);
- break;
- case 15:
- item_index = RFIFOW(fd,4) - 2;
- item_amount = RFIFOL(fd,10);
- break;
- case 16:
- item_index = RFIFOW(fd,10) - 2;
- item_amount = RFIFOL(fd,16);
- break;
- default: // old version by default (+ packet version 6 and 7)
- item_index = RFIFOW(fd,2) - 2;
- item_amount = RFIFOL(fd,4);
- break;
- }
- }
-
- if (item_index < 0 || item_index >= MAX_INVENTORY)
- return;
-
- if(itemdb_isdropable(sd->status.inventory[item_index].nameid) == 0)
- return;
-
- if (sd->state.storage_flag)
- storage_guild_storageadd(sd, item_index, item_amount);
- else
- storage_storageadd(sd, item_index, item_amount);
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚©‚ço‚·
- *------------------------------------------
- */
-void clif_parse_MoveFromKafra(int fd,struct map_session_data *sd) {
- int item_index, item_amount;
-
- nullpo_retv(sd);
-
- if (USE_PACKET_DB(sd)) {
- item_index = RFIFOW(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[0])-1;
- item_amount = RFIFOL(fd,packet_db[clif_config.packet_db_ver][RFIFOW(fd,0)].pos[1]);
- } else {
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 8:
- item_index = RFIFOW(fd,10) - 1;
- item_amount = RFIFOL(fd,22);
- break;
- case 9:
- item_index = RFIFOW(fd,11) - 1;
- item_amount = RFIFOL(fd,22);
- break;
- case 10:
- item_index = RFIFOW(fd,3) - 1;
- item_amount = RFIFOL(fd,13);
- break;
- case 11:
- item_index = RFIFOW(fd,4) - 1;
- item_amount = RFIFOL(fd,8);
- break;
- case 12:
- item_index = RFIFOW(fd,10) - 1;
- item_amount = RFIFOL(fd,22);
- break;
- case 13:
- case 14:
- item_index = RFIFOW(fd,12) - 1;
- item_amount = RFIFOL(fd,18);
- break;
- case 15:
- item_index = RFIFOW(fd,4) - 1;
- item_amount = RFIFOL(fd,17);
- break;
- case 16:
- item_index = RFIFOW(fd,11) - 1;
- item_amount = RFIFOL(fd,17);
- break;
- default: // old version by default (+ packet version 6 and 7)
- item_index = RFIFOW(fd,2) - 1;
- item_amount = RFIFOL(fd,4);
- break;
- }
- }
-
- if (sd->npc_id != 0 || sd->vender_id != 0)
- return;
-
- if (sd->state.storage_flag)
- storage_guild_storageget(sd, item_index, item_amount);
- else
- storage_storageget(sd, item_index, item_amount);
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚ÖƒJ[ƒg‚©‚ç“ü‚ê‚é
- *------------------------------------------
- */
-void clif_parse_MoveToKafraFromCart(int fd, struct map_session_data *sd) {
- nullpo_retv(sd);
-
- if (sd->npc_id != 0 || sd->vender_id != 0 || sd->trade_partner != 0)
- return;
- if (sd->state.storage_flag)
- storage_guild_storageaddfromcart(sd, RFIFOW(fd,2) - 2, RFIFOL(fd,4));
- else
- storage_storageaddfromcart(sd, RFIFOW(fd,2) - 2, RFIFOL(fd,4));
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚©‚ço‚·
- *------------------------------------------
- */
-void clif_parse_MoveFromKafraToCart(int fd, struct map_session_data *sd) {
- nullpo_retv(sd);
-
- if (sd->npc_id != 0 || sd->vender_id != 0)
- return;
- if (sd->state.storage_flag)
- storage_guild_storagegettocart(sd, RFIFOW(fd,2)-1, RFIFOL(fd,4));
- else
- storage_storagegettocart(sd, RFIFOW(fd,2)-1, RFIFOL(fd,4));
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚ð•Â‚¶‚é
- *------------------------------------------
- */
-void clif_parse_CloseKafra(int fd, struct map_session_data *sd) {
- nullpo_retv(sd);
-
- if (sd->state.storage_flag)
- storage_guild_storageclose(sd);
- else
- storage_storageclose(sd);
-}
-
-/*==========================================
- * ƒp[ƒeƒB‚ðì‚é
- *------------------------------------------
- */
-void clif_parse_CreateParty(int fd, struct map_session_data *sd) {
- if (battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 7) {
- party_create(sd,(char*)RFIFOP(fd,2),0,0);
- } else
- clif_skill_fail(sd,1,0,4);
-}
-
-/*==========================================
- * ƒp[ƒeƒB‚ðì‚é
- *------------------------------------------
- */
-void clif_parse_CreateParty2(int fd, struct map_session_data *sd) {
- if (battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 7){
- party_create(sd,(char*)RFIFOP(fd,2),RFIFOB(fd,26),RFIFOB(fd,27));
- } else
- clif_skill_fail(sd,1,0,4);
-}
-
-/*==========================================
- * ƒp[ƒeƒB‚ÉŠ©—U
- *------------------------------------------
- */
-void clif_parse_PartyInvite(int fd, struct map_session_data *sd) {
- party_invite(sd, RFIFOL(fd,2));
-}
-
-/*==========================================
- * ƒp[ƒeƒBŠ©—U•Ô“š
- *------------------------------------------
- */
-void clif_parse_ReplyPartyInvite(int fd,struct map_session_data *sd) {
- if(battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 5){
- party_reply_invite(sd,RFIFOL(fd,2),RFIFOL(fd,6));
- } else {
- party_reply_invite(sd,RFIFOL(fd,2),-1);
- clif_skill_fail(sd,1,0,4);
- }
-}
-
-/*==========================================
- * ƒp[ƒeƒB’E‘Þ—v‹
- *------------------------------------------
- */
-void clif_parse_LeaveParty(int fd, struct map_session_data *sd) {
- party_leave(sd);
-}
-
-/*==========================================
- * ƒp[ƒeƒBœ–¼—v‹
- *------------------------------------------
- */
-void clif_parse_RemovePartyMember(int fd, struct map_session_data *sd) {
- party_removemember(sd,RFIFOL(fd,2),(char*)RFIFOP(fd,6));
-}
-
-/*==========================================
- * ƒp[ƒeƒBÝ’è•ÏX—v‹
- *------------------------------------------
- */
-void clif_parse_PartyChangeOption(int fd, struct map_session_data *sd) {
- party_changeoption(sd, RFIFOW(fd,2), RFIFOW(fd,4));
-}
-
-/*==========================================
- * ƒp[ƒeƒBƒƒbƒZ[ƒW‘—M—v‹
- *------------------------------------------
- */
-void clif_parse_PartyMessage(int fd, struct map_session_data *sd) {
- nullpo_retv(sd);
-
- if (is_charcommand(fd, sd, (char*)RFIFOP(fd,4), 0) != CharCommand_None ||
- is_atcommand(fd, sd, (char*)RFIFOP(fd,4), 0) != AtCommand_None ||
- (sd->sc_data &&
- (sd->sc_data[SC_BERSERK].timer!=-1 || //ƒo[ƒT[ƒNŽž‚͉ï˜b‚à•s‰Â
- sd->sc_data[SC_NOCHAT].timer!=-1))) //ƒ`ƒƒƒbƒg‹ÖŽ~
- return;
-
- party_send_message(sd, (char*)RFIFOP(fd,4), RFIFOW(fd,2)-4);
-}
-
-/*==========================================
- * ˜I“X•Â½
- *------------------------------------------
- */
-void clif_parse_CloseVending(int fd, struct map_session_data *sd) {
- vending_closevending(sd);
-}
-
-/*==========================================
- * ˜I“XƒAƒCƒeƒ€ƒŠƒXƒg—v‹
- *------------------------------------------
- */
-void clif_parse_VendingListReq(int fd, struct map_session_data *sd) {
- nullpo_retv(sd);
-
- vending_vendinglistreq(sd,RFIFOL(fd,2));
- if(sd->npc_id)
- npc_event_dequeue(sd);
-}
-
-/*==========================================
- * ˜I“XƒAƒCƒeƒ€w“ü
- *------------------------------------------
- */
-void clif_parse_PurchaseReq(int fd, struct map_session_data *sd) {
- vending_purchasereq(sd, RFIFOW(fd,2), RFIFOL(fd,4), RFIFOP(fd,8));
-}
-
-/*==========================================
- * ˜I“XŠJÝ
- *------------------------------------------
- */
-void clif_parse_OpenVending(int fd,struct map_session_data *sd) {
- vending_openvending(sd, RFIFOW(fd,2), (char*)RFIFOP(fd,4), RFIFOB(fd,84), RFIFOP(fd,85));
-}
-
-/*==========================================
- * ƒMƒ‹ƒh‚ðì‚é
- *------------------------------------------
- */
-void clif_parse_CreateGuild(int fd,struct map_session_data *sd) {
- guild_create(sd, (char*)RFIFOP(fd,6));
-}
-
-/*==========================================
- * ƒMƒ‹ƒhƒ}ƒXƒ^[‚©‚Ç‚¤‚©Šm”F
- *------------------------------------------
- */
-void clif_parse_GuildCheckMaster(int fd, struct map_session_data *sd) {
- clif_guild_masterormember(sd);
-}
-
-/*==========================================
- * ƒMƒ‹ƒhî•ñ—v‹
- *------------------------------------------
- */
-void clif_parse_GuildRequestInfo(int fd, struct map_session_data *sd) {
- switch(RFIFOL(fd,2)){
- case 0: // ƒMƒ‹ƒhŠî–{î•ñA“¯–¿“G‘Îî•ñ
- clif_guild_basicinfo(sd);
- clif_guild_allianceinfo(sd);
- break;
- case 1: // ƒƒ“ƒo[ƒŠƒXƒgA–ðE–¼ƒŠƒXƒg
- clif_guild_positionnamelist(sd);
- clif_guild_memberlist(sd);
- break;
- case 2: // –ðE–¼ƒŠƒXƒgA–ðEî•ñƒŠƒXƒg
- clif_guild_positionnamelist(sd);
- clif_guild_positioninfolist(sd);
- break;
- case 3: // ƒXƒLƒ‹ƒŠƒXƒg
- clif_guild_skillinfo(sd);
- break;
- case 4: // ’Ç•úƒŠƒXƒg
- clif_guild_explusionlist(sd);
- break;
- default:
- if (battle_config.error_log)
- printf("clif: guild request info: unknown type %d\n", RFIFOL(fd,2));
- break;
- }
-}
-
-/*==========================================
- * ƒMƒ‹ƒh–ðE•ÏX
- *------------------------------------------
- */
-void clif_parse_GuildChangePositionInfo(int fd, struct map_session_data *sd) {
- int i;
-
- for(i = 4; i < RFIFOW(fd,2); i += 40 ){
- guild_change_position(sd, RFIFOL(fd,i), RFIFOL(fd,i+4), RFIFOL(fd,i+12), (char*)RFIFOP(fd,i+16));
- }
-}
-
-/*==========================================
- * ƒMƒ‹ƒhƒƒ“ƒo–ðE•ÏX
- *------------------------------------------
- */
-void clif_parse_GuildChangeMemberPosition(int fd, struct map_session_data *sd) {
- int i;
-
- nullpo_retv(sd);
-
- for(i=4;i<RFIFOW(fd,2);i+=12){
- guild_change_memberposition(sd->status.guild_id,
- RFIFOL(fd,i),RFIFOL(fd,i+4),RFIFOL(fd,i+8));
- }
-}
-
-/*==========================================
- * ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€—v‹
- *------------------------------------------
- */
-void clif_parse_GuildRequestEmblem(int fd,struct map_session_data *sd) {
- struct guild *g=guild_search(RFIFOL(fd,2));
- if(g!=NULL)
- clif_guild_emblem(sd,g);
-}
-
-/*==========================================
- * ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX
- *------------------------------------------
- */
-void clif_parse_GuildChangeEmblem(int fd,struct map_session_data *sd) {
- guild_change_emblem(sd,RFIFOW(fd,2)-4,(char*)RFIFOP(fd,4));
-}
-
-/*==========================================
- * ƒMƒ‹ƒh’m•ÏX
- *------------------------------------------
- */
-void clif_parse_GuildChangeNotice(int fd,struct map_session_data *sd) {
- guild_change_notice(sd,RFIFOL(fd,2),(char*)RFIFOP(fd,6),(char*)RFIFOP(fd,66));
-}
-
-/*==========================================
- * ƒMƒ‹ƒhŠ©—U
- *------------------------------------------
- */
-void clif_parse_GuildInvite(int fd,struct map_session_data *sd) {
- guild_invite(sd,RFIFOL(fd,2));
-}
-
-/*==========================================
- * ƒMƒ‹ƒhŠ©—U•ÔM
- *------------------------------------------
- */
-void clif_parse_GuildReplyInvite(int fd,struct map_session_data *sd) {
- guild_reply_invite(sd,RFIFOL(fd,2),RFIFOB(fd,6));
-}
-
-/*==========================================
- * ƒMƒ‹ƒh’E‘Þ
- *------------------------------------------
- */
-void clif_parse_GuildLeave(int fd,struct map_session_data *sd) {
- guild_leave(sd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),(char*)RFIFOP(fd,14));
-}
-
-/*==========================================
- * ƒMƒ‹ƒh’Ç•ú
- *------------------------------------------
- */
-void clif_parse_GuildExplusion(int fd,struct map_session_data *sd) {
- guild_explusion(sd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),(char*)RFIFOP(fd,14));
-}
-
-/*==========================================
- * ƒMƒ‹ƒh‰ï˜b
- *------------------------------------------
- */
-void clif_parse_GuildMessage(int fd,struct map_session_data *sd) {
- nullpo_retv(sd);
-
- if (is_charcommand(fd, sd, (char*)RFIFOP(fd, 4), 0) != CharCommand_None ||
- is_atcommand(fd, sd, (char*)RFIFOP(fd, 4), 0) != AtCommand_None ||
- (sd->sc_data &&
- (sd->sc_data[SC_BERSERK].timer!=-1 || //ƒo[ƒT[ƒNŽž‚͉ï˜b‚à•s‰Â
- sd->sc_data[SC_NOCHAT].timer!=-1))) //ƒ`ƒƒƒbƒg‹ÖŽ~
- return;
-
- guild_send_message(sd, (char*)RFIFOP(fd,4), RFIFOW(fd,2)-4);
-}
-
-/*==========================================
- * ƒMƒ‹ƒh“¯–¿—v‹
- *------------------------------------------
- */
-void clif_parse_GuildRequestAlliance(int fd, struct map_session_data *sd) {
- guild_reqalliance(sd,RFIFOL(fd,2));
-}
-
-/*==========================================
- * ƒMƒ‹ƒh“¯–¿—v‹•ÔM
- *------------------------------------------
- */
-void clif_parse_GuildReplyAlliance(int fd, struct map_session_data *sd) {
- guild_reply_reqalliance(sd,RFIFOL(fd,2),RFIFOL(fd,6));
-}
-
-/*==========================================
- * ƒMƒ‹ƒhŠÖŒW‰ðÁ
- *------------------------------------------
- */
-void clif_parse_GuildDelAlliance(int fd, struct map_session_data *sd) {
- guild_delalliance(sd,RFIFOL(fd,2),RFIFOL(fd,6));
-}
-
-/*==========================================
- * ƒMƒ‹ƒh“G‘Î
- *------------------------------------------
- */
-void clif_parse_GuildOpposition(int fd, struct map_session_data *sd) {
- guild_opposition(sd,RFIFOL(fd,2));
-}
-
-/*==========================================
- * ƒMƒ‹ƒh‰ðŽU
- *------------------------------------------
- */
-void clif_parse_GuildBreak(int fd, struct map_session_data *sd) {
- guild_break(sd,(char*)RFIFOP(fd,2));
-}
-
-// pet
-void clif_parse_PetMenu(int fd, struct map_session_data *sd) {
- pet_menu(sd,RFIFOB(fd,2));
-}
-
-void clif_parse_CatchPet(int fd, struct map_session_data *sd) {
- pet_catch_process2(sd,RFIFOL(fd,2));
-}
-
-void clif_parse_SelectEgg(int fd, struct map_session_data *sd) {
- pet_select_egg(sd,RFIFOW(fd,2)-2);
-}
-
-void clif_parse_SendEmotion(int fd, struct map_session_data *sd) {
- nullpo_retv(sd);
-
- if(sd->pd)
- clif_pet_emotion(sd->pd,RFIFOL(fd,2));
-}
-
-void clif_parse_ChangePetName(int fd, struct map_session_data *sd) {
- pet_change_name(sd,(char*)RFIFOP(fd,2));
-}
-
-// Kick (right click menu for GM "(name) force to quit")
-void clif_parse_GMKick(int fd, struct map_session_data *sd) {
- struct block_list *target;
- int tid = RFIFOL(fd,2);
-
- nullpo_retv(sd);
-
- if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
- (pc_isGM(sd) >= get_atcommand_level(AtCommand_Kick))) {
- target = map_id2bl(tid);
- if (target) {
- if (target->type == BL_PC) {
- struct map_session_data *tsd = (struct map_session_data *)target;
- if (pc_isGM(sd) > pc_isGM(tsd))
- clif_GM_kick(sd, tsd, 1);
- else
- clif_GM_kickack(sd, 0);
- } else if (target->type == BL_MOB) {
- struct mob_data *md = (struct mob_data *)target;
- sd->state.attack_type = 0;
- mob_damage(&sd->bl, md, md->hp, 2);
- } else
- clif_GM_kickack(sd, 0);
- } else
- clif_GM_kickack(sd, 0);
- }
-}
-
-/*==========================================
- * /shift
- *------------------------------------------
- */
-void clif_parse_Shift(int fd, struct map_session_data *sd) { // Rewriten by [Yor]
- char player_name[25];
-
- nullpo_retv(sd);
-
- memset(player_name, '\0', sizeof(player_name));
-
- if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
- (pc_isGM(sd) >= get_atcommand_level(AtCommand_JumpTo))) {
- memcpy(player_name, RFIFOP(fd,2), 24);
- atcommand_jumpto(fd, sd, "@jumpto", player_name); // as @jumpto
- }
-
- return;
-}
-
-/*==========================================
- * /recall
- *------------------------------------------
- */
-void clif_parse_Recall(int fd, struct map_session_data *sd) { // Added by RoVeRT
- char player_name[25];
-
- nullpo_retv(sd);
-
- memset(player_name, '\0', sizeof(player_name));
-
- if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
- (pc_isGM(sd) >= get_atcommand_level(AtCommand_Recall))) {
- memcpy(player_name, RFIFOP(fd,2), 24);
- atcommand_recall(fd, sd, "@recall", player_name); // as @recall
- }
-
- return;
-}
-
-/*==========================================
- * /monster /item rewriten by [Yor]
- *------------------------------------------
- */
-void clif_parse_GM_Monster_Item(int fd, struct map_session_data *sd) {
- char monster_item_name[25];
-
- nullpo_retv(sd);
-
- memset(monster_item_name, '\0', sizeof(monster_item_name));
-
- if (battle_config.atc_gmonly == 0 || pc_isGM(sd)) {
- memcpy(monster_item_name, RFIFOP(fd,2), 24);
-
- if (mobdb_searchname(monster_item_name) != 0) {
- if (pc_isGM(sd) >= get_atcommand_level(AtCommand_Monster))
- atcommand_spawn(fd, sd, "@spawn", monster_item_name); // as @spawn
- } else if (itemdb_searchname(monster_item_name) != NULL) {
- if (pc_isGM(sd) >= get_atcommand_level(AtCommand_Item))
- atcommand_item(fd, sd, "@item", monster_item_name); // as @item
- }
-
- }
-}
-
-void clif_parse_GMHide(int fd, struct map_session_data *sd) { // Modified by [Yor]
- nullpo_retv(sd);
-
- //printf("%2x %2x %2x\n", RFIFOW(fd,0), RFIFOW(fd,2), RFIFOW(fd,4)); // R 019d <Option_value>.2B <flag>.2B
- if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
- (pc_isGM(sd) >= get_atcommand_level(AtCommand_Hide))) {
- if (sd->status.option & OPTION_HIDE) { // OPTION_HIDE = 0x40
- sd->status.option &= ~OPTION_HIDE; // OPTION_HIDE = 0x40
- clif_displaymessage(fd, "Invisible: Off.");
- } else {
- sd->status.option |= OPTION_HIDE; // OPTION_HIDE = 0x40
- clif_displaymessage(fd, "Invisible: On.");
- }
- clif_changeoption(&sd->bl);
- }
-}
-
-/*==========================================
- * GM‚É‚æ‚éƒ`ƒƒƒbƒg‹ÖŽ~ŽžŠÔ•t—^
- *------------------------------------------
- */
-void clif_parse_GMReqNoChat(int fd,struct map_session_data *sd)
-{
- int tid = RFIFOL(fd,2);
- int type = RFIFOB(fd,6);
- int limit = RFIFOW(fd,7);
- struct block_list *bl = map_id2bl(tid);
- struct map_session_data *dstsd;
- int dstfd;
-
- nullpo_retv(sd);
-
- if(!battle_config.muting_players) {
- clif_displaymessage(fd, "Muting is disabled.");
- return;
- }
-
- if(type == 0)
- limit = 0 - limit;
- if(bl->type == BL_PC && (dstsd =(struct map_session_data *)bl)){
- if((tid == bl->id && type == 2 && !pc_isGM(sd)) || (pc_isGM(sd) > pc_isGM(dstsd)) ){
- dstfd = dstsd->fd;
- WFIFOW(dstfd,0)=0x14b;
- WFIFOB(dstfd,2)=(type==2)?1:type;
- memcpy(WFIFOP(dstfd,3),sd->status.name,24);
- WFIFOSET(dstfd,packet_len_table[0x14b]);
- dstsd->status.manner -= limit;
- if(dstsd->status.manner < 0)
- status_change_start(bl,SC_NOCHAT,0,0,0,0,0,0);
- else{
- dstsd->status.manner = 0;
- status_change_end(bl,SC_NOCHAT,-1);
- }
- printf("name:%s type:%d limit:%d manner:%d\n",dstsd->status.name,type,limit,dstsd->status.manner);
- }
- }
-
- return;
-}
-/*==========================================
- * GM‚É‚æ‚éƒ`ƒƒƒbƒg‹ÖŽ~ŽžŠÔŽQÆiHj
- *------------------------------------------
- */
-void clif_parse_GMReqNoChatCount(int fd, struct map_session_data *sd)
-{
- int tid = RFIFOL(fd,2);
-
- WFIFOW(fd,0) = 0x1e0;
- WFIFOL(fd,2) = tid;
- sprintf((char*)WFIFOP(fd,6),"%d",tid);
-// memcpy(WFIFOP(fd,6), "TESTNAME", 24);
- WFIFOSET(fd, packet_len_table[0x1e0]);
-
- return;
-}
-
-void clif_parse_PMIgnore(int fd, struct map_session_data *sd) { // Rewritten by [Yor]
- char output[512];
- char *nick; // S 00cf <nick>.24B <type>.B: 00 (/ex nick) deny speech from nick, 01 (/in nick) allow speech from nick
- int i, pos;
-
- memset(output, '\0', sizeof(output));
-
- nick = (char*)RFIFOP(fd,2); // speed up
- RFIFOB(fd,25) = '\0'; // to be sure that the player name have at maximum 23 characters
- //printf("Ignore: char '%s' state: %d\n", nick, RFIFOB(fd,26));
-
- WFIFOW(fd,0) = 0x0d1; // R 00d1 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail
- WFIFOB(fd,2) = RFIFOB(fd,26);
- // do nothing only if nick can not exist
- if (strlen(nick) < 4) {
- WFIFOB(fd,3) = 1; // fail
- WFIFOSET(fd, packet_len_table[0x0d1]);
- if (RFIFOB(fd,26) == 0) // type
- clif_wis_message(fd, wisp_server_name, "It's impossible to block this player.", strlen("It's impossible to block this player.") + 1);
- else
- clif_wis_message(fd, wisp_server_name, "It's impossible to unblock this player.", strlen("It's impossible to unblock this player.") + 1);
- return;
- // name can exist
- } else {
- // deny action (we add nick only if it's not already exist
- if (RFIFOB(fd,26) == 0) { // type
- pos = -1;
- for(i = 0; i < MAX_IGNORE_LIST; i++) {
- if (strcmp(sd->ignore[i].name, nick) == 0) {
- WFIFOB(fd,3) = 1; // fail
- WFIFOSET(fd, packet_len_table[0x0d1]);
- clif_wis_message(fd, wisp_server_name, "This player is already blocked.", strlen("This player is already blocked.") + 1);
- if (strcmp(wisp_server_name, nick) == 0) { // to found possible bot users who automaticaly ignore people.
- sprintf(output, "Character '%s' (account: %d) has tried AGAIN to block wisps from '%s' (wisp name of the server). Bot user?", sd->status.name, sd->status.account_id, wisp_server_name);
- intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, output);
- }
- return;
- } else if (pos == -1 && sd->ignore[i].name[0] == '\0')
- pos = i;
- }
- // if a position is found and name not found, we add it in the list
- if (pos != -1) {
- memcpy(sd->ignore[pos].name, nick, 24);
- WFIFOB(fd,3) = 0; // success
- WFIFOSET(fd, packet_len_table[0x0d1]);
- if (strcmp(wisp_server_name, nick) == 0) { // to found possible bot users who automaticaly ignore people.
- sprintf(output, "Character '%s' (account: %d) has tried to block wisps from '%s' (wisp name of the server). Bot user?", sd->status.name, sd->status.account_id, wisp_server_name);
- intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, output);
- // send something to be inform and force bot to ignore twice... If GM receiving block + block again, it's a bot :)
- clif_wis_message(fd, wisp_server_name, "Add me in your ignore list, doesn't block my wisps.", strlen("Add me in your ignore list, doesn't block my wisps.") + 1);
- }
- } else {
- WFIFOB(fd,3) = 1; // fail
- WFIFOSET(fd, packet_len_table[0x0d1]);
- clif_wis_message(fd, wisp_server_name, "You can not block more people.", strlen("You can not block more people.") + 1);
- if (strcmp(wisp_server_name, nick) == 0) { // to found possible bot users who automaticaly ignore people.
- sprintf(output, "Character '%s' (account: %d) has tried to block wisps from '%s' (wisp name of the server). Bot user?", sd->status.name, sd->status.account_id, wisp_server_name);
- intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, output);
- }
- }
- // allow action (we remove all same nicks if they exist)
- } else {
- pos = -1;
- for(i = 0; i < MAX_IGNORE_LIST; i++)
- if (strcmp(sd->ignore[i].name, nick) == 0) {
- memset(sd->ignore[i].name, 0, sizeof(sd->ignore[i].name));
- if (pos == -1) {
- WFIFOB(fd,3) = 0; // success
- WFIFOSET(fd, packet_len_table[0x0d1]);
- pos = i; // don't break, to remove ALL same nick
- }
- }
- if (pos == -1) {
- WFIFOB(fd,3) = 1; // fail
- WFIFOSET(fd, packet_len_table[0x0d1]);
- clif_wis_message(fd, wisp_server_name, "This player is not blocked by you.", strlen("This player is not blocked by you.") + 1);
- }
- }
- }
-
-// for(i = 0; i < MAX_IGNORE_LIST; i++) // for debug only
-// if (sd->ignore[i].name[0] != '\0')
-// printf("Ignored player: '%s'\n", sd->ignore[i].name);
-
- return;
-}
-
-void clif_parse_PMIgnoreAll(int fd, struct map_session_data *sd) { // Rewritten by [Yor]
- //printf("Ignore all: state: %d\n", RFIFOB(fd,2));
- if (RFIFOB(fd,2) == 0) {// S 00d0 <type>len.B: 00 (/exall) deny all speech, 01 (/inall) allow all speech
- WFIFOW(fd,0) = 0x0d2; // R 00d2 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail
- WFIFOB(fd,2) = 0;
- if (sd->ignoreAll == 0) {
- sd->ignoreAll = 1;
- WFIFOB(fd,3) = 0; // success
- WFIFOSET(fd, packet_len_table[0x0d2]);
- } else {
- WFIFOB(fd,3) = 1; // fail
- WFIFOSET(fd, packet_len_table[0x0d2]);
- clif_wis_message(fd, wisp_server_name, "You already block everyone.", strlen("You already block everyone.") + 1);
- }
- } else {
- WFIFOW(fd,0) = 0x0d2; // R 00d2 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail
- WFIFOB(fd,2) = 1;
- if (sd->ignoreAll == 1) {
- sd->ignoreAll = 0;
- WFIFOB(fd,3) = 0; // success
- WFIFOSET(fd, packet_len_table[0x0d2]);
- } else {
- WFIFOB(fd,3) = 1; // fail
- WFIFOSET(fd, packet_len_table[0x0d2]);
- clif_wis_message(fd, wisp_server_name, "You already allow everyone.", strlen("You already allow everyone.") + 1);
- }
- }
-
- return;
-}
-
-/*==========================================
- * Wis‹‘”ÛƒŠƒXƒg
- *------------------------------------------
- */
- int pstrcmp(const void *a, const void *b)
-{
- return strcmp((char *)a, (char *)b);
-}
-void clif_parse_PMIgnoreList(int fd,struct map_session_data *sd)
-{
- int i,j=0,count=0;
-
- qsort (sd->ignore[0].name, MAX_IGNORE_LIST, sizeof(sd->ignore[0].name), pstrcmp);
- for(i = 0; i < MAX_IGNORE_LIST; i++){ //’†g‚ª‚ ‚é‚̂𔂦‚é
- if(sd->ignore[i].name[0] != 0)
- count++;
- }
- WFIFOW(fd,0) = 0xd4;
- WFIFOW(fd,2) = 4 + (24 * count);
- for(i = 0; i < MAX_IGNORE_LIST; i++){
- if(sd->ignore[i].name[0] != 0){
- memcpy(WFIFOP(fd, 4 + j * 24),sd->ignore[i].name, 24);
- j++;
- }
- }
- WFIFOSET(fd, WFIFOW(fd,2));
- if(count >= MAX_IGNORE_LIST) //–žƒ^ƒ“‚È‚çÅŒã‚Ì1ŒÂ‚ðÁ‚·
- sd->ignore[MAX_IGNORE_LIST - 1].name[0] = 0;
-
- return;
-}
-
-void clif_parse_skillMessage(int fd, struct map_session_data *sd) { // Added by RoVeRT
- int skillid,skilllv, x, y;
- char *mes;
-
- skilllv = RFIFOW(fd,2);
- skillid = RFIFOW(fd,4);
-
- y = RFIFOB(fd,6);
- x = RFIFOB(fd,8);
-
- mes = (char*)RFIFOP(fd,10);
-
- // skill 220 = graffiti
-// printf("skill: %d %d location: %3d %3d message: %s\n", skillid, skilllv, x, y, (char*)mes);
-}
-
-int monk(struct map_session_data *sd, struct block_list *target, int type) {
-//R 01d1 <Monk id>L <Target monster id>L <Bool>L
- int fd=sd->fd;
- WFIFOW(fd,0)=0x1d1;
- WFIFOL(fd,2)=sd->bl.id;
- WFIFOL(fd,6)=target->id;
- WFIFOL(fd,10)=type;
- WFIFOSET(fd,packet_len_table[0x1d1]);
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒpƒmƒr‚Ì/doridori‚É‚æ‚éSPR2”{
- *------------------------------------------
- */
-void clif_parse_sn_doridori(int fd, struct map_session_data *sd) {
- if (sd)
- sd->doridori_counter = 1;
-
- return;
-}
-/*==========================================
- * ƒXƒpƒmƒr‚Ì”š—ô”g“®
- *------------------------------------------
- */
-void clif_parse_sn_explosionspirits(int fd, struct map_session_data *sd)
-{
- if(sd){
- int nextbaseexp=pc_nextbaseexp(sd);
- struct pc_base_job s_class = pc_calc_base_job(sd->status.class_);
- if (battle_config.etc_log){
- if(nextbaseexp != 0)
- printf("SuperNovice explosionspirits!! %d %d %d %d\n",sd->bl.id,s_class.job,sd->status.base_exp,(int)((double)1000*sd->status.base_exp/nextbaseexp));
- else
- printf("SuperNovice explosionspirits!! %d %d %d 000\n",sd->bl.id,s_class.job,sd->status.base_exp);
- }
- if(s_class.job == 23 && sd->status.base_exp > 0 && nextbaseexp > 0 && (int)((double)1000*sd->status.base_exp/nextbaseexp)%100==0){
- clif_skill_nodamage(&sd->bl,&sd->bl,MO_EXPLOSIONSPIRITS,5,1);
- status_change_start(&sd->bl,SkillStatusChangeTable[MO_EXPLOSIONSPIRITS],5,0,0,0,skill_get_time(MO_EXPLOSIONSPIRITS,5),0 );
- }
- }
- return;
-}
-
-/*==========================================
- * Friends List
- *------------------------------------------
- */
-void clif_friends_list_send(struct map_session_data *sd) {
- int i, n;
-
- // Send friends list
- n = 0;
- WFIFOW(sd->fd, 0) = 0x201;
- for(i = 0; i < 20; i++)
- if (sd->status.friend_id[i]) {
- WFIFOL(sd->fd,4 + 32 * n + 1) = sd->status.friend_id[i];
- //WFIFOB(sd->fd,4 + 32 * n + 5) = (online[n]) ? 0 : 1; // <- We don't know this yet. I'd reckon its 5 but... i could be wrong.
- memcpy(WFIFOP(sd->fd,4 + 32 * n + 8), &sd->status.friend_name[i], 23);
- n++;
- }
- WFIFOW(sd->fd,2) = 4 + 32 * n;
- WFIFOSET(sd->fd, WFIFOW(sd->fd,2));
-}
-
-void clif_parse_friends_list_add(int fd, struct map_session_data *sd) {
- struct map_session_data *f_sd;
- int i;
-
- f_sd = map_nick2sd((char*)RFIFOP(fd,2));
-
- // Friend doesn't exist (no player with this name)
- if (f_sd == NULL) {
- clif_displaymessage(fd, "This name (for a friend) doesn't exist.");
- return;
- }
-
- // Friend already exists
- for (i = 0; i < 20; i++)
- if (sd->status.friend_id[i] == f_sd->status.char_id) {
- clif_displaymessage(fd, "Friend already exists.");
- return;
- }
-
- // Find an empty slot
- for (i = 0; i < 20; i++)
- if (sd->status.friend_id[i] == 0)
- break;
- if (i == 20) {
- clif_displaymessage(fd, "Friends list is full.");
- return;
- }
-
- sd->status.friend_id[i] = f_sd->status.char_id;
- memset(sd->status.friend_name[i], 0, sizeof(sd->status.friend_name[i]));
- memcpy(sd->status.friend_name[i], f_sd->status.name, 23);
- clif_displaymessage(fd, "Friend added.");
-
- clif_friends_list_send(sd);
-
- //printf("clif_parse_friends_list_add");
-
- return;
-}
-
-void clif_parse_friends_list_remove(int fd, struct map_session_data *sd) {
- // 0x203 </o> <ID to be removed W 4B>
- int id = RFIFOL(fd,3);
- int i, j;
-
- // Search friend
- for (i = 0; i < 20; i ++)
- if (sd->status.friend_id[i] == id) {
- // move all chars down
- for(j = i + 1; j < 20; j++) {
- sd->status.friend_id[j-1] = sd->status.friend_id[j];
- memcpy(sd->status.friend_name[j-1], sd->status.friend_name[j], sizeof(sd->status.friend_name[j]));
- }
- sd->status.friend_id[19] = 0;
- memset(sd->status.friend_name[19], 0, sizeof(sd->status.friend_name[19]));
- clif_displaymessage(fd, "Friend removed");
- clif_friends_list_send(sd);
- break;
- }
-
- if (i == 20)
- clif_displaymessage(fd, "Name not found in list.");
-
- return;
-}
-
-/*==========================================
- * /killall
- *------------------------------------------
- */
-void clif_parse_GMkillall(int fd,struct map_session_data *sd)
-{
- char message[50];
-
- nullpo_retv(sd);
-
- strncpy(message,sd->status.name, 24);
- is_atcommand(fd, sd, strcat(message," : @kickall"),0);
-
- return;
-}
-
-/*==========================================
- * ƒpƒPƒbƒgƒfƒoƒbƒO
- *------------------------------------------
- */
-void clif_parse_debug(int fd,struct map_session_data *sd)
-{
- int i, cmd;
-
- cmd = RFIFOW(fd,0);
-
- printf("packet debug 0x%4X\n",cmd);
- printf("---- 00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F");
- for(i=0;i<packet_db[sd->packet_ver][cmd].len;i++){
- if((i&15)==0)
- printf("\n%04X ",i);
- printf("%02X ",RFIFOB(fd,i));
- }
- printf("\n");
-}
-
-// functions list
-static void (*clif_parse_func_table[MAX_PACKET_DB])(int, struct map_session_data *) = {
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-
- // 40
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-
- // 70
- NULL, NULL, clif_parse_WantToConnection, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, clif_parse_LoadEndAck, clif_parse_TickSend, NULL,
-
- // 80
- NULL, NULL, NULL, NULL, NULL, clif_parse_WalkToXY, NULL, NULL,
- NULL, clif_parse_ActionRequest, NULL, NULL, clif_parse_GlobalMessage, NULL, NULL, NULL,
- // 90
- clif_parse_NpcClicked, NULL, NULL, NULL, clif_parse_GetCharNameRequest, NULL, clif_parse_Wis, NULL,
- NULL, clif_parse_GMmessage, NULL, clif_parse_ChangeDir, NULL, NULL, NULL, clif_parse_TakeItem,
- // a0
- NULL, NULL, clif_parse_DropItem, NULL, NULL, NULL, NULL, clif_parse_UseItem,
- NULL, clif_parse_EquipItem, NULL, clif_parse_UnequipItem, NULL, NULL, NULL, NULL,
- // b0
- NULL, NULL, clif_parse_Restart, NULL, NULL, NULL, NULL, NULL,
- clif_parse_NpcSelectMenu, clif_parse_NpcNextClicked, NULL, clif_parse_StatusUp, NULL, NULL, NULL, clif_parse_Emotion,
-
- // c0
- NULL, clif_parse_HowManyConnections, NULL, NULL, NULL, clif_parse_NpcBuySellSelected, NULL, NULL,
- clif_parse_NpcBuyListSend, clif_parse_NpcSellListSend, NULL, NULL, clif_parse_GMKick, NULL, clif_parse_GMkillall, clif_parse_PMIgnore,
- // d0
- clif_parse_PMIgnoreAll, NULL, NULL, clif_parse_PMIgnoreList, NULL, clif_parse_CreateChatRoom, NULL, NULL,
- NULL, clif_parse_ChatAddMember, NULL, NULL, NULL, NULL, clif_parse_ChatRoomStatusChange, NULL,
- // e0
- clif_parse_ChangeChatOwner, NULL, clif_parse_KickFromChat, clif_parse_ChatLeave, clif_parse_TradeRequest, NULL, clif_parse_TradeAck, NULL,
- clif_parse_TradeAddItem, NULL, NULL, clif_parse_TradeOk, NULL, clif_parse_TradeCancel, NULL, clif_parse_TradeCommit,
- // f0
- NULL, NULL, NULL, clif_parse_MoveToKafra, NULL, clif_parse_MoveFromKafra, NULL, clif_parse_CloseKafra,
- NULL, clif_parse_CreateParty, NULL, NULL, clif_parse_PartyInvite, NULL, NULL, clif_parse_ReplyPartyInvite,
-
- // 100
- clif_parse_LeaveParty, NULL, clif_parse_PartyChangeOption, clif_parse_RemovePartyMember, NULL, NULL, NULL, NULL,
- clif_parse_PartyMessage, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- // 110
- NULL, NULL, clif_parse_SkillUp, clif_parse_UseSkillToId, NULL, NULL, clif_parse_UseSkillToPos, NULL,
- clif_parse_StopAttack, NULL, NULL, clif_parse_UseSkillMap, NULL, clif_parse_RequestMemo, NULL, NULL,
- // 120
- NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_PutItemToCart, clif_parse_GetItemFromCart,
- clif_parse_MoveFromKafraToCart, clif_parse_MoveToKafraFromCart, clif_parse_RemoveOption, NULL, NULL, NULL, clif_parse_CloseVending, NULL,
- // 130
- clif_parse_VendingListReq, NULL, NULL, NULL, clif_parse_PurchaseReq, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_GM_Monster_Item,
-
- // 140
- clif_parse_MapMove, NULL, NULL, clif_parse_NpcAmountInput, NULL, NULL, clif_parse_NpcCloseClicked, NULL,
- NULL, clif_parse_GMReqNoChat, NULL, NULL, NULL, clif_parse_GuildCheckMaster, NULL, clif_parse_GuildRequestInfo,
- // 150
- NULL, clif_parse_GuildRequestEmblem, NULL, clif_parse_GuildChangeEmblem, NULL, clif_parse_GuildChangeMemberPosition, NULL, NULL,
- NULL, clif_parse_GuildLeave, NULL, clif_parse_GuildExplusion, NULL, clif_parse_GuildBreak, NULL, NULL,
- // 160
- NULL, clif_parse_GuildChangePositionInfo, NULL, NULL, NULL, clif_parse_CreateGuild, NULL, NULL,
- clif_parse_GuildInvite, NULL, NULL, clif_parse_GuildReplyInvite, NULL, NULL, clif_parse_GuildChangeNotice, NULL,
- // 170
- clif_parse_GuildRequestAlliance, NULL, clif_parse_GuildReplyAlliance, NULL, NULL, NULL, NULL, NULL,
- clif_parse_ItemIdentify, NULL, clif_parse_UseCard, NULL, clif_parse_InsertCard, NULL, clif_parse_GuildMessage, NULL,
-
- // 180
- clif_parse_GuildOpposition, NULL, NULL, clif_parse_GuildDelAlliance, NULL, NULL, NULL, NULL,
- NULL, NULL, clif_parse_QuitGame, NULL, NULL, NULL, clif_parse_ProduceMix, NULL,
- // 190
- clif_parse_UseSkillToPos, NULL, NULL, clif_parse_SolveCharName, NULL, NULL, NULL, clif_parse_ResetChar,
- NULL, NULL, NULL, NULL, clif_parse_LGMmessage, clif_parse_GMHide, NULL, clif_parse_CatchPet,
- // 1a0
- NULL, clif_parse_PetMenu, NULL, NULL, NULL, clif_parse_ChangePetName, NULL, clif_parse_SelectEgg,
- NULL, clif_parse_SendEmotion, NULL, NULL, NULL, NULL, clif_parse_SelectArrow, clif_parse_ChangeCart,
- // 1b0
- NULL, NULL, clif_parse_OpenVending, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, clif_parse_Shift, clif_parse_Shift, clif_parse_Recall, clif_parse_Recall, NULL, NULL,
-
- // 1c0
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_AutoSpell,
- NULL,
- // 1d0
- NULL, NULL, NULL, NULL, NULL, clif_parse_NpcStringInput, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_GMReqNoChatCount,
- // 1e0
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_sn_doridori,
- clif_parse_CreateParty2, NULL, NULL, NULL, NULL, clif_parse_sn_explosionspirits, NULL, NULL,
- // 1f0
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_ReqAdopt,
- NULL, NULL, NULL, NULL, NULL, NULL,
-
- // 200
- NULL, NULL, clif_parse_friends_list_add, clif_parse_friends_list_remove, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- // 210
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-#if 0
- case 0xd3: clif_parse_IgnoreList
-#endif
-};
-
-/*==========================================
- * ƒNƒ‰ƒCƒAƒ“ƒg‚©‚ç‚̃pƒPƒbƒg‰ðÍ
- * socket.c‚Ìdo_parsepacket‚©‚çŒÄ‚Ño‚³‚ê‚é
- *------------------------------------------
- */
-static int clif_parse(int fd) {
- int packet_len = 0, cmd, packet_ver, dump = 0;
- struct map_session_data *sd;
-
- sd = (struct map_session_data*)session[fd]->session_data;
-
- // Ú‘±‚ªØ‚ê‚Ä‚é‚Ì‚ÅŒãŽn––
- if (!chrif_isconnect() || session[fd]->eof) { // charŽI‚ÉŒq‚ª‚Á‚Ä‚È‚¢ŠÔ‚ÍÚ‘±‹ÖŽ~ (!chrif_isconnect())
- if (sd && sd->state.auth) {
- clif_quitsave(fd, sd); // the function doesn't send to inter-server/char-server if it is not connected [Yor]
- if (sd->status.name != NULL)
- sprintf(tmp_output,"%sCharacter '"CL_WHITE"%s"CL_RESET"' logged off.\n", (pc_isGM(sd))?"GM ":"",sd->status.name); // Player logout display [Valaris]
- else
- sprintf(tmp_output,"%sCharacter with Account ID '"CL_WHITE"%d"CL_RESET"' logged off.\n", (pc_isGM(sd))?"GM ":"", sd->bl.id); // Player logout display [Yor]
- } else if (sd) { // not authentified! (refused by char-server or disconnect before to be authentified)
- sprintf(tmp_output,"Player not authenticated with Account ID '"CL_WHITE"%d"CL_RESET"' logged off.\n", sd->bl.id); // Player logout display [Yor]
-// if (chrif_isconnect())
-// clif_quitsave(fd, sd);
- map_deliddb(&sd->bl); // account_id has been included in the DB before auth answer [Yor]
-// sd = 0;
- } else {
- unsigned char *ip = (unsigned char *) &session[fd]->client_addr.sin_addr;
- sprintf(tmp_output,"Player not identified with IP '"CL_WHITE"%d.%d.%d.%d"CL_RESET"' logged off.\n", ip[0],ip[1],ip[2],ip[3]);
- }
- ShowInfo(tmp_output);
- close(fd);
-// if (sd) // ’ljÁ
-// map_deliddb(&sd->bl); // ’ljÁ
- delete_session(fd);
- return 0;
- }
-
- if (RFIFOREST(fd) < 2)
- return 0;
-
-// printf("clif_parse: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd));
-
- cmd = RFIFOW(fd,0);
-
- // ŠÇ——pƒpƒPƒbƒgˆ—
- if (cmd >= 30000) {
- switch(cmd) {
- case 0x7530: // Athenaî•ñŠ“¾
- WFIFOW(fd,0) = 0x7531;
- WFIFOB(fd,2) = ATHENA_MAJOR_VERSION;
- WFIFOB(fd,3) = ATHENA_MINOR_VERSION;
- WFIFOB(fd,4) = ATHENA_REVISION;
- WFIFOB(fd,5) = ATHENA_RELEASE_FLAG;
- WFIFOB(fd,6) = ATHENA_OFFICIAL_FLAG;
- WFIFOB(fd,7) = ATHENA_SERVER_MAP;
- WFIFOW(fd,8) = ATHENA_MOD_VERSION;
- WFIFOSET(fd,10);
- RFIFOSKIP(fd,2);
- break;
- case 0x7532: // Ú‘±‚ÌØ’f
- close(fd);
- session[fd]->eof=1;
- break;
- }
- return 0;
- }
-
- // get packet version before to parse
- packet_ver = 0;
- if (sd) {
- packet_ver = sd->packet_ver;
- if (packet_ver < 0 || packet_ver > MAX_PACKET_VER) { // unusual, but just in case
- close(fd);
- session[fd]->eof = 1;
- printf("clif_parse: session #%d, bad packet version -> disconnected.\n", fd);
- return 0;
- }
- // check authentification packet to know packet version
- } else {
- // packet DB
- if (IS_PACKET_DB_VER (cmd)) {
- if (RFIFOREST(fd) >= packet_db[clif_config.packet_db_ver][cmd].len &&
- (RFIFOB(fd,packet_db[clif_config.packet_db_ver][cmd].pos[4]) == 0 ||
- RFIFOB(fd,packet_db[clif_config.packet_db_ver][cmd].pos[4]) == 1)) {// 00 = Female, 01 = Male
- packet_ver = clif_config.packet_db_ver;
- }
- // 0x72
- } else if (cmd == 0x72) {
- if (RFIFOREST(fd) >= 39 && (RFIFOB(fd,38) == 0 || RFIFOB(fd,38) == 1)) // 00 = Female, 01 = Male
- packet_ver = 7; // 7: 13july04
- else if (RFIFOREST(fd) >= 22 && (RFIFOB(fd,21) == 0 || RFIFOB(fd,21) == 1)) // 00 = Female, 01 = Male
- packet_ver = 6; // 6: 7july04
- else if (RFIFOREST(fd) >= 19 && (RFIFOB(fd,18) == 0 || RFIFOB(fd,18) == 1)) // 00 = Female, 01 = Male
- packet_ver = 5; // 5: old
- // else probably incomplete packet
- else if (RFIFOREST(fd) < 19)
- return 0;
- // 0x7E
- } else if (cmd == 0x7E) {
- if (RFIFOREST(fd) >= 37 && (RFIFOB(fd,36) == 0 || RFIFOB(fd,36) == 1)) // 00 = Female, 01 = Male
- packet_ver = 9; // 9: 9aug04/16aug04/17aug04
- else if (RFIFOREST(fd) >= 33 && (RFIFOB(fd,32) == 0 || RFIFOB(fd,32) == 1)) // 00 = Female, 01 = Male
- packet_ver = 8; // 8: 26july04
- // else probably incomplete packet
- else if (RFIFOREST(fd) < 33)
- return 0;
- // 0xF5
- } else if (cmd == 0xF5) {
- if (RFIFOREST(fd) >= 34 && (RFIFOB(fd,33) == 0 || RFIFOB(fd,33) == 1)) // 00 = Female, 01 = Male
- packet_ver = 10; // 10: 6sept04
- else if (RFIFOREST(fd) >= 33 && (RFIFOB(fd,32) == 0 || RFIFOB(fd,32) == 1)) // 00 = Female, 01 = Male
- packet_ver = 12; // 12: 18oct04
- else if (RFIFOREST(fd) >= 32 && (RFIFOB(fd,31) == 0 || RFIFOB(fd,31) == 1)) // 00 = Female, 01 = Male
- packet_ver = 11; // 11: 21sept04
- else if (RFIFOREST(fd) >= 29 && (RFIFOB(fd,28) == 0 || RFIFOB(fd,28) == 1)) { // 00 = Female, 01 = Male
- if (RFIFOL(fd,3) > 700000 && RFIFOL(fd,10) >= 150000 && RFIFOL(fd,10) < 5000000) // account id / char id (more than 5.000.000 characters?) [Yor]
- packet_ver = 15; // 14: 6dec04
- else
- packet_ver = 13; // 13: 25oct04 (by [Yor])
- }
- // else probably incomplete packet
- else if (RFIFOREST(fd) < 29)
- return 0;
- // 0x9B
- } else if (cmd == 0x9B) {
- if (RFIFOREST(fd) >= 32 && (RFIFOB(fd,31) == 0 || RFIFOB(fd,31) == 1)) // 00 = Female, 01 = Male
- packet_ver = 16; // 16: 10jan05
- else if (RFIFOREST(fd) < 32)
- return 0;
- } else {
- // unknown client? leave packet ver as 0 so it'll disconnect anyway
- }
-
- // check if version is accepted
- if (packet_ver < 5 || // reject really old client versions
- (packet_ver <= 9 && (battle_config.packet_ver_flag & 1) == 0) || // older than 6sept04
- (packet_ver == 10 && (battle_config.packet_ver_flag & 2) == 0) ||
- (packet_ver == 11 && (battle_config.packet_ver_flag & 4) == 0) ||
- (packet_ver == 12 && (battle_config.packet_ver_flag & 8) == 0) ||
- (packet_ver == 13 && (battle_config.packet_ver_flag & 16) == 0) ||
- (packet_ver == 14 && (battle_config.packet_ver_flag & 32) == 0) ||
- (packet_ver == 15 && (battle_config.packet_ver_flag & 64) == 0) ||
- (packet_ver == 16 && (battle_config.packet_ver_flag & 128) == 0) ||
- packet_ver > MAX_PACKET_VER || // no packet version support yet
- // identified version, but unknown client?
- (!sd && packet_db[packet_ver][cmd].func != clif_parse_WantToConnection)) {
- WFIFOW(fd,0) = 0x6a;
- WFIFOB(fd,2) = 5; // 05 = Game's EXE is not the latest version
- WFIFOSET(fd,23);
- clif_setwaitclose(fd);
- return 0;
- }
- }
-
- // ƒQ[ƒ€—pˆÈŠOƒpƒPƒbƒg‚©A”FØ‚ðI‚¦‚é‘O‚É0072ˆÈŠO‚ª—ˆ‚½‚çAØ’f‚·‚é
- if (cmd >= MAX_PACKET_DB || packet_db[packet_ver][cmd].len == 0) { // if packet is not inside these values: session is incorrect?? or auth packet is unknown
- if (!fd)
- return 0;
- close(fd);
- session[fd]->eof = 1;
- printf("clif_parse: session #%d, packet 0x%x (%d bytes received) -> disconnected.\n", fd, cmd, RFIFOREST(fd));
- return 0;
- }
-
- // ƒpƒPƒbƒg’·‚ðŒvŽZ
- packet_len = packet_db[packet_ver][cmd].len;
- if (packet_len == -1) {
- if (RFIFOREST(fd) < 4)
- return 0; // ‰Â•Ï’·ƒpƒPƒbƒg‚Å’·‚³‚ÌŠ‚܂Ńf[ƒ^‚ª—ˆ‚Ä‚È‚¢
- packet_len = RFIFOW(fd,2);
- if (packet_len < 4 || packet_len > 32768) {
- close(fd);
- session[fd]->eof =1;
- return 0;
- }
- }
- if (RFIFOREST(fd) < packet_len)
- return 0; // ‚Ü‚¾1ƒpƒPƒbƒg•ªƒf[ƒ^‚ª‘µ‚Á‚Ä‚È‚¢
-
- #if DUMP_ALL_PACKETS
- dump = 1;
- #endif
-
- if (sd && sd->state.auth == 1 && sd->state.waitingdisconnect == 1) { // Ø’f‘Ò‚¿‚ÌꇃpƒPƒbƒg‚ðˆ—‚µ‚È‚¢
-
- } else if (packet_db[packet_ver][cmd].func) { // packet version 5-6-7 use same functions, but size are different
- // ƒpƒPƒbƒgˆ—
- packet_db[packet_ver][cmd].func(fd, sd);
- } else {
- // •s–¾‚ȃpƒPƒbƒg
- if (battle_config.error_log) {
-#if DUMP_UNKNOWN_PACKET
- {
- int i;
- FILE *fp;
- char packet_txt[256] = "save/packet.txt";
- time_t now;
- dump = 1;
-
- if ((fp = fopen(packet_txt, "a")) == NULL) {
- printf("clif.c: cant write [%s] !!! data is lost !!!\n", packet_txt);
- return 1;
- } else {
- time(&now);
- if (sd && sd->state.auth) {
- if (sd->status.name != NULL)
- fprintf(fp, "%sPlayer with account ID %d (character ID %d, player name %s) sent wrong packet:\n",
- asctime(localtime(&now)), sd->status.account_id, sd->status.char_id, sd->status.name);
- else
- fprintf(fp, "%sPlayer with account ID %d sent wrong packet:\n", asctime(localtime(&now)), sd->bl.id);
- } else if (sd) // not authentified! (refused by char-server or disconnect before to be authentified)
- fprintf(fp, "%sPlayer with account ID %d sent wrong packet:\n", asctime(localtime(&now)), sd->bl.id);
-
- fprintf(fp, "\t---- 00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F");
- for(i = 0; i < packet_len; i++) {
- if ((i & 15) == 0)
- fprintf(fp, "\n\t%04X ", i);
- fprintf(fp, "%02X ", RFIFOB(fd,i));
- }
- fprintf(fp, "\n\n");
- fclose(fp);
- }
- }
-#endif
- }
- }
-
- if (dump) {
- int i;
- if (fd)
- printf("\nclif_parse: session #%d, packet 0x%x, lenght %d\n", fd, cmd, packet_len);
- printf("---- 00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F");
- for(i = 0; i < packet_len; i++) {
- if ((i & 15) == 0)
- printf("\n%04X ",i);
- printf("%02X ", RFIFOB(fd,i));
- }
- if (sd && sd->state.auth) {
- if (sd->status.name != NULL)
- printf("\nAccount ID %d, character ID %d, player name %s.\n",
- sd->status.account_id, sd->status.char_id, sd->status.name);
- else
- printf("\nAccount ID %d.\n", sd->bl.id);
- } else if (sd) // not authentified! (refused by char-server or disconnect before to be authentified)
- printf("\nAccount ID %d.\n", sd->bl.id);
- }
-
- RFIFOSKIP(fd, packet_len);
-
- return 0;
-}
-
-/*==========================================
- * ƒpƒPƒbƒgƒf[ƒ^ƒx[ƒX“Ç‚Ýž‚Ý
- *------------------------------------------
- */
-static int packetdb_readdb(void)
-{
- FILE *fp;
- char line[1024];
- int ln=0;
- int cmd,j,k,packet_ver;
- char *str[64],*p,*str2[64],*p2,w1[64],w2[64];
-
- struct {
- void (*func)(int, struct map_session_data *);
- char *name;
- } clif_parse_func[]={
- {clif_parse_WantToConnection,"wanttoconnection"},
- {clif_parse_LoadEndAck,"loadendack"},
- {clif_parse_TickSend,"ticksend"},
- {clif_parse_WalkToXY,"walktoxy"},
- {clif_parse_QuitGame,"quitgame"},
- {clif_parse_GetCharNameRequest,"getcharnamerequest"},
- {clif_parse_GlobalMessage,"globalmessage"},
- {clif_parse_MapMove,"mapmove"},
- {clif_parse_ChangeDir,"changedir"},
- {clif_parse_Emotion,"emotion"},
- {clif_parse_HowManyConnections,"howmanyconnections"},
- {clif_parse_ActionRequest,"actionrequest"},
- {clif_parse_Restart,"restart"},
- {clif_parse_Wis,"wis"},
- {clif_parse_GMmessage,"gmmessage"},
- {clif_parse_TakeItem,"takeitem"},
- {clif_parse_DropItem,"dropitem"},
- {clif_parse_UseItem,"useitem"},
- {clif_parse_EquipItem,"equipitem"},
- {clif_parse_UnequipItem,"unequipitem"},
- {clif_parse_NpcClicked,"npcclicked"},
- {clif_parse_NpcBuySellSelected,"npcbuysellselected"},
- {clif_parse_NpcBuyListSend,"npcbuylistsend"},
- {clif_parse_NpcSellListSend,"npcselllistsend"},
- {clif_parse_CreateChatRoom,"createchatroom"},
- {clif_parse_ChatAddMember,"chataddmember"},
- {clif_parse_ChatRoomStatusChange,"chatroomstatuschange"},
- {clif_parse_ChangeChatOwner,"changechatowner"},
- {clif_parse_KickFromChat,"kickfromchat"},
- {clif_parse_ChatLeave,"chatleave"},
- {clif_parse_TradeRequest,"traderequest"},
- {clif_parse_TradeAck,"tradeack"},
- {clif_parse_TradeAddItem,"tradeadditem"},
- {clif_parse_TradeOk,"tradeok"},
- {clif_parse_TradeCancel,"tradecancel"},
- {clif_parse_TradeCommit,"tradecommit"},
- {clif_parse_StopAttack,"stopattack"},
- {clif_parse_PutItemToCart,"putitemtocart"},
- {clif_parse_GetItemFromCart,"getitemfromcart"},
- {clif_parse_RemoveOption,"removeoption"},
- {clif_parse_ChangeCart,"changecart"},
- {clif_parse_StatusUp,"statusup"},
- {clif_parse_SkillUp,"skillup"},
- {clif_parse_UseSkillToId,"useskilltoid"},
- {clif_parse_UseSkillToPos,"useskilltopos"},
- {clif_parse_UseSkillMap,"useskillmap"},
- {clif_parse_RequestMemo,"requestmemo"},
- {clif_parse_ProduceMix,"producemix"},
- {clif_parse_NpcSelectMenu,"npcselectmenu"},
- {clif_parse_NpcNextClicked,"npcnextclicked"},
- {clif_parse_NpcAmountInput,"npcamountinput"},
- {clif_parse_NpcStringInput,"npcstringinput"},
- {clif_parse_NpcCloseClicked,"npccloseclicked"},
- {clif_parse_ItemIdentify,"itemidentify"},
- {clif_parse_SelectArrow,"selectarrow"},
- {clif_parse_AutoSpell,"autospell"},
- {clif_parse_UseCard,"usecard"},
- {clif_parse_InsertCard,"insertcard"},
- {clif_parse_SolveCharName,"solvecharname"},
- {clif_parse_ResetChar,"resetchar"},
- {clif_parse_LGMmessage,"lgmmessage"},
- {clif_parse_MoveToKafra,"movetokafra"},
- {clif_parse_MoveFromKafra,"movefromkafra"},
- {clif_parse_MoveToKafraFromCart,"movetokafrafromcart"},
- {clif_parse_MoveFromKafraToCart,"movefromkafratocart"},
- {clif_parse_CloseKafra,"closekafra"},
- {clif_parse_CreateParty,"createparty"},
- {clif_parse_CreateParty2,"createparty2"},
- {clif_parse_PartyInvite,"partyinvite"},
- {clif_parse_ReplyPartyInvite,"replypartyinvite"},
- {clif_parse_LeaveParty,"leaveparty"},
- {clif_parse_RemovePartyMember,"removepartymember"},
- {clif_parse_PartyChangeOption,"partychangeoption"},
- {clif_parse_PartyMessage,"partymessage"},
- {clif_parse_CloseVending,"closevending"},
- {clif_parse_VendingListReq,"vendinglistreq"},
- {clif_parse_PurchaseReq,"purchasereq"},
- {clif_parse_OpenVending,"openvending"},
- {clif_parse_CreateGuild,"createguild"},
- {clif_parse_GuildCheckMaster,"guildcheckmaster"},
- {clif_parse_GuildRequestInfo,"guildrequestinfo"},
- {clif_parse_GuildChangePositionInfo,"guildchangepositioninfo"},
- {clif_parse_GuildChangeMemberPosition,"guildchangememberposition"},
- {clif_parse_GuildRequestEmblem,"guildrequestemblem"},
- {clif_parse_GuildChangeEmblem,"guildchangeemblem"},
- {clif_parse_GuildChangeNotice,"guildchangenotice"},
- {clif_parse_GuildInvite,"guildinvite"},
- {clif_parse_GuildReplyInvite,"guildreplyinvite"},
- {clif_parse_GuildLeave,"guildleave"},
- {clif_parse_GuildExplusion,"guildexplusion"},
- {clif_parse_GuildMessage,"guildmessage"},
- {clif_parse_GuildRequestAlliance,"guildrequestalliance"},
- {clif_parse_GuildReplyAlliance,"guildreplyalliance"},
- {clif_parse_GuildDelAlliance,"guilddelalliance"},
- {clif_parse_GuildOpposition,"guildopposition"},
- {clif_parse_GuildBreak,"guildbreak"},
- {clif_parse_PetMenu,"petmenu"},
- {clif_parse_CatchPet,"catchpet"},
- {clif_parse_SelectEgg,"selectegg"},
- {clif_parse_SendEmotion,"sendemotion"},
- {clif_parse_ChangePetName,"changepetname"},
- {clif_parse_GMKick,"gmkick"},
- {clif_parse_GMHide,"gmhide"},
- {clif_parse_GMReqNoChat,"gmreqnochat"},
- {clif_parse_GMReqNoChatCount,"gmreqnochatcount"},
- {clif_parse_sn_doridori,"sndoridori"},
- {clif_parse_sn_explosionspirits,"snexplosionspirits"},
- {clif_parse_PMIgnore,"wisexin"},
- {clif_parse_PMIgnoreList,"wisexlist"},
- {clif_parse_PMIgnoreAll,"wisall"},
- {clif_parse_friends_list_add,"friendslistadd"},
- {clif_parse_friends_list_remove,"friendslistremove"},
- {clif_parse_GMkillall,"killall"},
- {clif_parse_Recall,"summon"},
- {clif_parse_GM_Monster_Item,"itemmonster"},
- {clif_parse_Shift,"shift"},
- {clif_parse_debug,"debug"},
-
- {NULL,NULL}
- };
-
- if( (fp=fopen("db/packet_db.txt","r"))==NULL ){
- printf("can't read db/packet_db.txt\n");
- return 1;
- }
-
- clif_config.packet_db_ver = MAX_PACKET_VER;
- packet_ver = MAX_PACKET_VER; // read into packet_db's version by default
-
- while(fgets(line,1020,fp)){
- if(line[0]=='/' && line[1]=='/')
- continue;
- if (sscanf(line,"%[^:]: %[^\r\n]",w1,w2) == 2) {
- if(strcmpi(w1,"packet_ver")==0) {
- packet_ver = atoi(w2);
- // copy from previous version into new version and continue
- // - indicating all following packets should be read into the newer version
- // -- on 2nd thought, rereading everything isn't the best thing to do...
- // memcpy(&packet_db[packet_ver], &packet_db[packet_ver - 1], sizeof(packet_db[0]));
- continue;
- } else if(strcmpi(w1,"packet_db_ver")==0) {
- // optional: if you do not wish to read multiple versions from the packet_db,
- // remove all "packet_ver: ##" lines, and define the packet DB version with this
- if(strcmpi(w2,"default")==0)
- clif_config.packet_db_ver = MAX_PACKET_VER;
- else {
- // to manually set the packet DB version
- clif_config.packet_db_ver = atoi(w2);
- // check for invalid version
- if (clif_config.packet_db_ver > MAX_PACKET_VER ||
- clif_config.packet_db_ver < 0)
- clif_config.packet_db_ver = MAX_PACKET_VER;
- }
- continue;
- } else if(strcmpi(w1,"enable_packet_db")==0) {
- // whether we want to allow identifying clients via the packet DB
- clif_config.enable_packet_db = battle_config_switch(w2);
- // if we don't want to read the packet DB, and use hardcoded values only
- if (!clif_config.enable_packet_db)
- return 0;
- continue;
- } else if(strcmpi(w1,"prefer_packet_db")==0) {
- // whether the packet DB takes higher precedence over the hardcoded one (type 1)
- // and whether to overwrite predefined packet length and functions when reading
- // from the DB (type 2)
- clif_config.prefer_packet_db = battle_config_switch(w2); // not used for now
- continue;
- }
- }
-
- memset(str,0,sizeof(str));
- for(j=0,p=line;j<4 && p;j++){
- str[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
- if(str[0]==NULL)
- continue;
- cmd=strtol(str[0],(char **)NULL,0);
- if(cmd<=0 || cmd>=MAX_PACKET_DB)
- continue;
- if(str[1]==NULL){
- sprintf(tmp_output, "packet_db: packet len error\n");
- ShowError(tmp_output);
- continue;
- }
- k = atoi(str[1]);
- // if (packet_db[packet_ver][cmd].len != k && clif_config.prefer_packet_db) // not used for now
- packet_db[packet_ver][cmd].len = k;
-
- if(str[2]==NULL){
- ln++;
- continue;
- }
- for(j=0;j<sizeof(clif_parse_func)/sizeof(clif_parse_func[0]);j++){
- if(clif_parse_func[j].name != NULL &&
- strcmp(str[2],clif_parse_func[j].name)==0){
- // if (packet_db[packet_ver][cmd].func != clif_parse_func[j].func && !clif_config.prefer_packet_db)
- // break; // not used for now
- packet_db[packet_ver][cmd].func = clif_parse_func[j].func;
- break;
- }
- }
- // set the identifying cmd for the packet_db version
- if (strcmp(str[2],"wanttoconnection")==0){
- clif_config.connect_cmd = cmd;
- }
- if(str[3]==NULL){
- sprintf(tmp_output, "packet_db: packet error\n");
- ShowError(tmp_output);
- exit(1);
- }
- for(j=0,p2=str[3];p2;j++){
- str2[j]=p2;
- p2=strchr(p2,':');
- if(p2) *p2++=0;
- k = atoi(str2[j]);
- // if (packet_db[packet_ver][cmd].pos[j] != k && clif_config.prefer_packet_db) // not used for now
- packet_db[packet_ver][cmd].pos[j] = k;
- }
-
- ln++;
-// if(packet_db[clif_config.packet_db_ver][cmd].len > 2 /* && packet_db[cmd].pos[0] == 0 */)
-// printf("packet_db ver %d: %d 0x%x %d %s %p\n",packet_ver,ln,cmd,packet_db[packet_ver][cmd].len,str[2],packet_db[packet_ver][cmd].func);
- }
-
- fclose(fp);
- sprintf(tmp_output,"Done reading packet version '"CL_WHITE"%d"CL_RESET"' in '"CL_WHITE"%s"CL_RESET"'.\n", clif_config.packet_db_ver, "db/packet_db.txt");
- ShowStatus(tmp_output);
- return 0;
-
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int do_init_clif(void) {
- int i;
-
- clif_config.enable_packet_db = 1; // whether to use the packet DB for client connection
- clif_config.packet_db_ver = -1; // the main packet version of the DB
- clif_config.prefer_packet_db = 1; // whether the packet version takes precedence
- clif_config.connect_cmd = 0xF5; // the default packet used for connecting to the server
-
- memset(packet_db,0,sizeof(packet_db));
-
- // size of packet version 5 (old)
- for(i=0;i<sizeof(packet_len_table)/sizeof(packet_len_table[0]);i++){
- packet_db[0][i].len = packet_len_table[i];
- }
- // packet functions of version 5 (old)
- for(i=0;i<sizeof(clif_parse_func_table)/sizeof(clif_parse_func_table[0]);i++){
- packet_db[0][i].func = clif_parse_func_table[i];
- }
-
- // using hardcoded packet values isn't necessary with packet_db now,
- // but... just in case, i'll leave it to initialise for now ^^;
- // init packet version 5 and lower
- memcpy(&packet_db[1], &packet_db[0], sizeof(packet_db[0]));
- memcpy(&packet_db[2], &packet_db[1], sizeof(packet_db[0]));
- memcpy(&packet_db[3], &packet_db[2], sizeof(packet_db[0]));
- memcpy(&packet_db[4], &packet_db[3], sizeof(packet_db[0]));
- memcpy(&packet_db[5], &packet_db[4], sizeof(packet_db[0]));
-
-#ifndef PREFER_PACKET_DB
- // functions of packet version 5-6-7 are same, but size are different
- // size of packet version 6 (7july04)
- memcpy(&packet_db[6], &packet_db[5], sizeof(packet_db[0]));
- packet_db[6][0x072].len = 22;
- packet_db[6][0x085].len = 8;
- packet_db[6][0x0a7].len = 13;
- packet_db[6][0x113].len = 15;
- packet_db[6][0x116].len = 15;
- packet_db[6][0x190].len = 95;
- // size of packet version 7 (13july04)
- memcpy(&packet_db[7], &packet_db[6], sizeof(packet_db[0]));
- packet_db[7][0x072].len = 39;
- packet_db[7][0x085].len = 9;
- packet_db[7][0x09b].len = 13;
- packet_db[7][0x09f].len = 10;
- packet_db[7][0x0a7].len = 17;
- packet_db[7][0x113].len = 19;
- packet_db[7][0x116].len = 19;
- packet_db[7][0x190].len = 99;
- // init packet function calls for packet ver 8
- memcpy(packet_db[8], packet_db[7], sizeof(packet_db[0]));
- packet_db[8][0x072].func = clif_parse_DropItem;
- packet_db[8][0x07e].func = clif_parse_WantToConnection;
- packet_db[8][0x085].func = clif_parse_UseSkillToId;
- packet_db[8][0x089].func = clif_parse_GetCharNameRequest;
- packet_db[8][0x08c].func = clif_parse_UseSkillToPos;
- packet_db[8][0x094].func = clif_parse_TakeItem;
- packet_db[8][0x09b].func = clif_parse_WalkToXY;
- packet_db[8][0x09f].func = clif_parse_ChangeDir;
- packet_db[8][0x0a2].func = clif_parse_UseSkillToPos;
- packet_db[8][0x0a7].func = clif_parse_SolveCharName;
- packet_db[8][0x0f3].func = clif_parse_GlobalMessage;
- packet_db[8][0x0f5].func = clif_parse_UseItem;
- packet_db[8][0x0f7].func = clif_parse_TickSend;
- packet_db[8][0x113].func = clif_parse_MoveToKafra;
- packet_db[8][0x116].func = clif_parse_CloseKafra;
- packet_db[8][0x190].func = clif_parse_MoveFromKafra;
- packet_db[8][0x193].func = clif_parse_ActionRequest;
- // size of packet version 8 (26july04)
- packet_db[8][0x072].len = 14;
- packet_db[8][0x07e].len = 33;
- packet_db[8][0x085].len = 20;
- packet_db[8][0x089].len = 15;
- packet_db[8][0x08c].len = 23;
- packet_db[8][0x094].len = 10;
- packet_db[8][0x09b].len = 6;
- packet_db[8][0x09f].len = 13;
- packet_db[8][0x0a2].len = 103;
- packet_db[8][0x0a7].len = 12;
- packet_db[8][0x0f3].len = -1;
- packet_db[8][0x0f5].len = 17;
- packet_db[8][0x0f7].len = 10;
- packet_db[8][0x113].len = 16;
- packet_db[8][0x116].len = 2;
- packet_db[8][0x190].len = 26;
- packet_db[8][0x193].len = 9;
- // init packet function calls for packet ver 9 (same function of packet version 8, but size are different)
- memcpy(packet_db[9], packet_db[8], sizeof(packet_db[0]));
- // size of packet version 9 (9aug04/16aug04/17aug04)
- packet_db[9][0x072].len = 17;
- packet_db[9][0x07e].len = 37;
- packet_db[9][0x085].len = 26;
- packet_db[9][0x089].len = 12;
- packet_db[9][0x08c].len = 40;
- packet_db[9][0x094].len = 13;
- packet_db[9][0x09b].len = 15;
- packet_db[9][0x09f].len = 12;
- packet_db[9][0x0a2].len = 120;
- packet_db[9][0x0a7].len = 11;
-// packet_db[9][0x0f3].len = -1;
- packet_db[9][0x0f5].len = 24;
- packet_db[9][0x0f7].len = 13;
- packet_db[9][0x113].len = 23;
-// packet_db[9][0x116].len = 2;
- packet_db[9][0x190].len = 26;
- packet_db[9][0x193].len = 18;
- // new packet
- packet_db[9][0x20f].len = 10;
- packet_db[9][0x210].len = 22;
- packet_db[9][0x212].len = 26;
- packet_db[9][0x213].len = 26;
- packet_db[9][0x214].len = 42;
- // init packet function calls for packet ver 10
- memcpy(packet_db[10], packet_db[9], sizeof(packet_db[0]));
- packet_db[10][0x072].func = clif_parse_UseItem;
- packet_db[10][0x07e].func = clif_parse_MoveToKafra;
- packet_db[10][0x085].func = clif_parse_ActionRequest;
- packet_db[10][0x089].func = clif_parse_WalkToXY;
- packet_db[10][0x08c].func = clif_parse_UseSkillToPos;
- packet_db[10][0x094].func = clif_parse_DropItem;
- packet_db[10][0x09b].func = clif_parse_GetCharNameRequest;
- packet_db[10][0x09f].func = clif_parse_GlobalMessage;
- packet_db[10][0x0a2].func = clif_parse_SolveCharName;
- packet_db[10][0x0a7].func = clif_parse_UseSkillToPos;
- packet_db[10][0x0f3].func = clif_parse_ChangeDir;
- packet_db[10][0x0f5].func = clif_parse_WantToConnection;
- packet_db[10][0x0f7].func = clif_parse_CloseKafra;
- packet_db[10][0x113].func = clif_parse_TakeItem;
- packet_db[10][0x116].func = clif_parse_TickSend;
- packet_db[10][0x190].func = clif_parse_UseSkillToId;
- packet_db[10][0x193].func = clif_parse_MoveFromKafra;
- // size of packet version 10 (6sept04)
- packet_db[10][0x072].len = 20;
- packet_db[10][0x07e].len = 19;
- packet_db[10][0x085].len = 23;
- packet_db[10][0x089].len = 9;
- packet_db[10][0x08c].len = 105;
- packet_db[10][0x094].len = 17;
- packet_db[10][0x09b].len = 14;
- packet_db[10][0x09f].len = -1;
- packet_db[10][0x0a2].len = 14;
- packet_db[10][0x0a7].len = 25;
- packet_db[10][0x0f3].len = 10;
- packet_db[10][0x0f5].len = 34;
- packet_db[10][0x0f7].len = 2;
- packet_db[10][0x113].len = 11;
- packet_db[10][0x116].len = 11;
- packet_db[10][0x190].len = 22;
- packet_db[10][0x193].len = 17;
- // init packet function calls for packet ver 11 (same function of packet version 10, but size are different)
- memcpy(packet_db[11], packet_db[10], sizeof(packet_db[0]));
- // size of packet version 11 (21sept04)
- packet_db[11][0x072].len = 18;
- packet_db[11][0x07e].len = 25;
- packet_db[11][0x085].len = 9;
- packet_db[11][0x089].len = 14;
- packet_db[11][0x08c].len = 109;
- packet_db[11][0x094].len = 19;
- packet_db[11][0x09b].len = 10;
-// packet_db[11][0x09f].len = -1;
- packet_db[11][0x0a2].len = 10;
- packet_db[11][0x0a7].len = 29;
- packet_db[11][0x0f3].len = 18;
- packet_db[11][0x0f5].len = 32;
-// packet_db[11][0x0f7].len = 2;
- packet_db[11][0x113].len = 14;
- packet_db[11][0x116].len = 14;
- packet_db[11][0x190].len = 14;
- packet_db[11][0x193].len = 12;
- // init packet function calls for packet ver 12 (same function of packet version 11, but size are different)
- memcpy(packet_db[12], packet_db[11], sizeof(packet_db[0]));
- // size of packet version 12 (18oct04)
- packet_db[12][0x072].len = 17;
- packet_db[12][0x07e].len = 16;
-// packet_db[12][0x085].len = 9;
- packet_db[12][0x089].len = 6;
- packet_db[12][0x08c].len = 103;
- packet_db[12][0x094].len = 14;
- packet_db[12][0x09b].len = 15;
-// packet_db[12][0x09f].len = -1;
- packet_db[12][0x0a2].len = 12;
- packet_db[12][0x0a7].len = 23;
- packet_db[12][0x0f3].len = 13;
- packet_db[12][0x0f5].len = 33;
-// packet_db[12][0x0f7].len = 2;
- packet_db[12][0x113].len = 10;
- packet_db[12][0x116].len = 10;
- packet_db[12][0x190].len = 20;
- packet_db[12][0x193].len = 26;
- // init packet function calls for packet ver 13 (same function of packet version 12, but size are different)
- memcpy(packet_db[13], packet_db[12], sizeof(packet_db[0]));
- // size of packet version 13 (25oct04)
- packet_db[13][0x072].len = 13;
- packet_db[13][0x07e].len = 13;
- packet_db[13][0x085].len = 15;
-// packet_db[13][0x089].len = 6;
- packet_db[13][0x08c].len = 108;
- packet_db[13][0x094].len = 12;
- packet_db[13][0x09b].len = 10;
-// packet_db[13][0x09f].len = -1;
- packet_db[13][0x0a2].len = 16;
- packet_db[13][0x0a7].len = 28;
- packet_db[13][0x0f3].len = 15;
- packet_db[13][0x0f5].len = 29;
-// packet_db[13][0x0f7].len = 2;
- packet_db[13][0x113].len = 9;
- packet_db[13][0x116].len = 9;
- packet_db[13][0x190].len = 26;
- packet_db[13][0x193].len = 22;
- // init packet function calls for packet ver 14 (same function of packet version 13, but size are different)
- memcpy(packet_db[14], packet_db[13], sizeof(packet_db[0]));
- // size of packet version 14 - Added by nsstrunks (1nov04)
- packet_db[14][0x072].len = 13;
- packet_db[14][0x07e].len = 13;
- packet_db[14][0x085].len = 15;
- packet_db[14][0x089].len = 6;
- packet_db[14][0x08c].len = 108;
- packet_db[14][0x094].len = 12;
- packet_db[14][0x09b].len = 10;
- packet_db[14][0x09f].len = -1;
- packet_db[14][0x0a2].len = 16;
- packet_db[14][0x0a7].len = 28;
- packet_db[14][0x0f3].len = 15;
- packet_db[14][0x0f5].len = 29;
- packet_db[14][0x113].len = 9;
- packet_db[14][0x116].len = 9;
- packet_db[14][0x190].len = 26;
- packet_db[14][0x193].len = 22;
- packet_db[14][0x215].len = 6;
- packet_db[14][0x216].len = 6;
- packet_db[14][0x217].len = 2;
- packet_db[14][0x218].len = 2;
- packet_db[14][0x219].len = 282;
- packet_db[14][0x21a].len = 282;
- packet_db[14][0x21b].len = 10;
- packet_db[14][0x21c].len = 10;
-// packet_db[14][0x143].len = 23; // is this required? uncomment if it is
- // Init packet function calls for packet ver 15
- memcpy(packet_db[15], packet_db[14], sizeof(packet_db[0]));
- packet_db[15][0x072].func = clif_parse_UseSkillToId;
- packet_db[15][0x07e].func = clif_parse_UseSkillToPos;
- packet_db[15][0x089].func = clif_parse_TickSend;
- packet_db[15][0x085].func = clif_parse_GlobalMessage;
- packet_db[15][0x08c].func = clif_parse_GetCharNameRequest;
- packet_db[15][0x094].func = clif_parse_MoveToKafra;
- packet_db[15][0x09b].func = clif_parse_CloseKafra;
- packet_db[15][0x09f].func = clif_parse_ActionRequest;
- packet_db[15][0x0a2].func = clif_parse_TakeItem;
- packet_db[15][0x0a7].func = clif_parse_WalkToXY;
- packet_db[15][0x0f3].func = clif_parse_ChangeDir;
- packet_db[15][0x0f5].func = clif_parse_WantToConnection;
- packet_db[15][0x0f7].func = clif_parse_SolveCharName;
- packet_db[15][0x113].func = clif_parse_UseSkillToPos;
- packet_db[15][0x116].func = clif_parse_DropItem;
- packet_db[15][0x190].func = clif_parse_UseItem;
- packet_db[15][0x193].func = clif_parse_MoveFromKafra;
- // Size of packet version 15 - Added by nsstrunks (6dec04)
- packet_db[15][0x072].len = 22;
- packet_db[15][0x07e].len = 30;
- packet_db[15][0x094].len = 14;
- packet_db[15][0x09f].len = 18;
- packet_db[15][0x085].len = -1;
- packet_db[15][0x08c].len = 13;
- packet_db[15][0x089].len = 7;
- packet_db[15][0x09b].len = 2;
- packet_db[15][0x0a2].len = 7;
- packet_db[15][0x0a7].len = 7;
- packet_db[15][0x0f3].len = 8;
- packet_db[15][0x0f5].len = 29;
- packet_db[15][0x0f7].len = 14;
- packet_db[15][0x113].len = 110;
- packet_db[15][0x116].len = 12;
- packet_db[15][0x190].len = 15;
- packet_db[15][0x193].len = 21;
- packet_db[15][0x21d].len = 6;
- packet_db[15][0x222].len = 6;
- packet_db[15][0x221].len = -1;
- packet_db[15][0x223].len = 8;
- // Init packet function calls for packet ver 16
- memcpy(packet_db[16], packet_db[15], sizeof(packet_db[0]));
- packet_db[16][0x072].func = clif_parse_UseSkillToId;
- packet_db[16][0x07e].func = clif_parse_UseSkillToPos;
- packet_db[16][0x089].func = clif_parse_TickSend;
- packet_db[16][0x0f3].func = clif_parse_GlobalMessage;
- packet_db[16][0x08c].func = clif_parse_GetCharNameRequest;
- packet_db[16][0x094].func = clif_parse_MoveToKafra;
- packet_db[16][0x193].func = clif_parse_CloseKafra;
- packet_db[16][0x190].func = clif_parse_ActionRequest;
- packet_db[16][0x0f5].func = clif_parse_TakeItem;
- packet_db[16][0x0a7].func = clif_parse_WalkToXY;
- packet_db[16][0x085].func = clif_parse_ChangeDir;
- packet_db[16][0x09b].func = clif_parse_WantToConnection;
- packet_db[16][0x0a2].func = clif_parse_SolveCharName;
- packet_db[16][0x113].func = clif_parse_UseSkillToPos;
- packet_db[16][0x116].func = clif_parse_DropItem;
- packet_db[16][0x09f].func = clif_parse_UseItem;
- packet_db[16][0x0f7].func = clif_parse_MoveFromKafra;
- // Size of packet version 16 [10jan05]
- packet_db[16][0x072].len = 26;
- packet_db[16][0x07e].len = 114;
- packet_db[16][0x089].len = 9;
- packet_db[16][0x0f3].len = -1;
- packet_db[16][0x08c].len = 8;
- packet_db[16][0x094].len = 20;
- packet_db[16][0x193].len = 2;
- packet_db[16][0x190].len = 20;
- packet_db[16][0x0f5].len = 9;
- packet_db[16][0x0a7].len = 13;
- packet_db[16][0x085].len = 23;
- packet_db[16][0x09b].len = 32;
- packet_db[16][0x0a2].len = 11;
- packet_db[16][0x113].len = 34;
- packet_db[16][0x116].len = 20;
- packet_db[16][0x09f].len = 17;
- packet_db[16][0x0f7].len = 21;
- packet_db[16][0x143].len = 10;
- // Init packet function calls for the packet_db.txt (17)
- memcpy(packet_db[MAX_PACKET_VER], packet_db[MAX_PACKET_VER - 1], sizeof(packet_db[0]));
-#endif
-
- if (clif_config.enable_packet_db)
- packetdb_readdb();
-
- set_defaultparse(clif_parse);
-#ifdef __WIN32
- //if (!make_listen_port(map_port)) {
- if (!make_listen_bind(bind_ip,map_port)) {
- printf("cant bind game port\n");
- exit(1);
- }
-#else
- for(i = 0; i < 10; i++) {
- //if (make_listen_port(map_port))
- if (make_listen_bind(bind_ip,map_port))
- break;
- sleep(20);
- }
- if (i == 10) {
- printf("cant bind game port\n");
- exit(1);
- }
-#endif
-
- add_timer_func_list(clif_waitclose, "clif_waitclose");
- add_timer_func_list(clif_clearchar_delay_sub, "clif_clearchar_delay_sub");
-
- return 0;
-}
-
diff --git a/src/map/clif.h b/src/map/clif.h
deleted file mode 100644
index b23eed5a6..000000000
--- a/src/map/clif.h
+++ /dev/null
@@ -1,313 +0,0 @@
-// $Id: clif.h 1952 2004-10-23 14:05:01Z Yor $
-#ifndef _CLIF_H_
-#define _CLIF_H_
-
-#ifdef __WIN32
-typedef unsigned int in_addr_t;
-#else
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#endif
-
-#include "map.h"
-
-#define MAX_PACKET_DB 0x224
-#define MAX_PACKET_VER 17
-
-struct packet_db {
- short len;
- void (*func)(int, struct map_session_data *);
- short pos[20];
-};
-extern struct packet_db packet_db[MAX_PACKET_VER + 1][MAX_PACKET_DB];
-
-extern struct Clif_Config {
- int enable_packet_db;
- int packet_db_ver;
- int prefer_packet_db;
- int connect_cmd;
-} clif_config;
-
-void clif_setip(char*);
-void clif_setbindip(char*);
-void clif_setport(int);
-
-in_addr_t clif_getip(void);
-int clif_getport(void);
-int clif_countusers(void);
-void clif_setwaitclose(int);
-
-int clif_authok(struct map_session_data *);
-int clif_authfail_fd(int,int);
-int clif_charselectok(int);
-int clif_dropflooritem(struct flooritem_data *);
-int clif_clearflooritem(struct flooritem_data *,int);
-int clif_clearchar(struct block_list*,int); // area or fd
-int clif_clearchar_delay(unsigned int,struct block_list *,int);
-#define clif_clearchar_area(bl,type) clif_clearchar(bl,type)
-int clif_clearchar_id(int,int,int);
-int clif_spawnpc(struct map_session_data*); //area
-int clif_spawnnpc(struct npc_data*); // area
-int clif_spawnmob(struct mob_data*); // area
-int clif_spawnpet(struct pet_data*); // area
-int clif_walkok(struct map_session_data*); // self
-int clif_movechar(struct map_session_data*); // area
-int clif_movemob(struct mob_data*); //area
-int clif_movepet(struct pet_data *pd); //area
-int clif_movenpc(struct npc_data *nd); // [Valaris]
-int clif_changemap(struct map_session_data*,char*,int,int); //self
-int clif_changemapserver(struct map_session_data*,char*,int,int,int,int); //self
-int clif_fixpos(struct block_list *); // area
-int clif_fixmobpos(struct mob_data *md);
-int clif_fixpcpos(struct map_session_data *sd);
-int clif_fixpetpos(struct pet_data *pd);
-int clif_fixnpcpos(struct npc_data *nd); // [Valaris]
-int clif_npcbuysell(struct map_session_data*,int); //self
-int clif_buylist(struct map_session_data*,struct npc_data*); //self
-int clif_selllist(struct map_session_data*); //self
-int clif_scriptmes(struct map_session_data*,int,char*); //self
-int clif_scriptnext(struct map_session_data*,int); //self
-int clif_scriptclose(struct map_session_data*,int); //self
-int clif_scriptmenu(struct map_session_data*,int,char*); //self
-int clif_scriptinput(struct map_session_data*,int); //self
-int clif_scriptinputstr(struct map_session_data *sd,int npcid); // self
-int clif_cutin(struct map_session_data*,char*,int); //self
-int clif_viewpoint(struct map_session_data*,int,int,int,int,int,int); //self
-int clif_additem(struct map_session_data*,int,int,int); //self
-int clif_delitem(struct map_session_data*,int,int); //self
-int clif_updatestatus(struct map_session_data*,int); //self
-int clif_changestatus(struct block_list*,int,int); //area
-int clif_damage(struct block_list *,struct block_list *,unsigned int,int,int,int,int,int,int); // area
-#define clif_takeitem(src,dst) clif_damage(src,dst,0,0,0,0,0,1,0)
-int clif_changelook(struct block_list *,int,int); // area
-int clif_arrowequip(struct map_session_data *sd,int val); //self
-int clif_arrow_fail(struct map_session_data *sd,int type); //self
-int clif_arrow_create_list(struct map_session_data *sd); //self
-int clif_statusupack(struct map_session_data *,int,int,int); // self
-int clif_equipitemack(struct map_session_data *,int,int,int); // self
-int clif_unequipitemack(struct map_session_data *,int,int,int); // self
-int clif_misceffect(struct block_list*,int); // area
-int clif_misceffect2(struct block_list *bl,int type);
-int clif_changeoption(struct block_list*); // area
-int clif_useitemack(struct map_session_data*,int,int,int); // self
-void clif_GlobalMessage(struct block_list *bl,char *message);
-int clif_createchat(struct map_session_data*,int); // self
-int clif_dispchat(struct chat_data*,int); // area or fd
-int clif_joinchatfail(struct map_session_data*,int); // self
-int clif_joinchatok(struct map_session_data*,struct chat_data*); // self
-int clif_addchat(struct chat_data*,struct map_session_data*); // chat
-int clif_changechatowner(struct chat_data*,struct map_session_data*); // chat
-int clif_clearchat(struct chat_data*,int); // area or fd
-int clif_leavechat(struct chat_data*,struct map_session_data*); // chat
-int clif_changechatstatus(struct chat_data*); // chat
-int clif_refresh(struct map_session_data*); // self
-
-void clif_emotion(struct block_list *bl,int type);
-void clif_talkiebox(struct block_list *bl,char* talkie);
-void clif_wedding_effect(struct block_list *bl);
-//void clif_sitting(int fd, struct map_session_data *sd);
-//void clif_callpartner(struct map_session_data *sd);
-void clif_adopt_process(struct map_session_data *sd);
-void clif_sitting(struct map_session_data *sd);
-void clif_soundeffect(struct map_session_data *sd,struct block_list *bl,char *name,int type);
-int clif_soundeffectall(struct block_list *bl, char *name, int type);
-
-// trade
-int clif_traderequest(struct map_session_data *sd,char *name);
-int clif_tradestart(struct map_session_data *sd,int type);
-int clif_tradeadditem(struct map_session_data *sd,struct map_session_data *tsd,int index,int amount);
-int clif_tradeitemok(struct map_session_data *sd,int index,int fail);
-int clif_tradedeal_lock(struct map_session_data *sd,int fail);
-int clif_tradecancelled(struct map_session_data *sd);
-int clif_tradecompleted(struct map_session_data *sd,int fail);
-
-// storage
-#include "storage.h"
-int clif_storageitemlist(struct map_session_data *sd,struct storage *stor);
-int clif_storageequiplist(struct map_session_data *sd,struct storage *stor);
-int clif_updatestorageamount(struct map_session_data *sd,struct storage *stor);
-int clif_storageitemadded(struct map_session_data *sd,struct storage *stor,int index,int amount);
-int clif_storageitemremoved(struct map_session_data *sd,int index,int amount);
-int clif_storageclose(struct map_session_data *sd);
-int clif_guildstorageitemlist(struct map_session_data *sd,struct guild_storage *stor);
-int clif_guildstorageequiplist(struct map_session_data *sd,struct guild_storage *stor);
-int clif_updateguildstorageamount(struct map_session_data *sd,struct guild_storage *stor);
-int clif_guildstorageitemadded(struct map_session_data *sd,struct guild_storage *stor,int index,int amount);
-
-int clif_pcinsight(struct block_list *,va_list); // map_forallinmovearea callback
-int clif_pcoutsight(struct block_list *,va_list); // map_forallinmovearea callback
-int clif_mobinsight(struct block_list *,va_list); // map_forallinmovearea callback
-int clif_moboutsight(struct block_list *,va_list); // map_forallinmovearea callback
-int clif_petoutsight(struct block_list *bl,va_list ap);
-int clif_petinsight(struct block_list *bl,va_list ap);
-int clif_npcoutsight(struct block_list *bl,va_list ap);
-int clif_npcinsight(struct block_list *bl,va_list ap);
-
-int clif_class_change(struct block_list *bl,int class_,int type);
-int clif_mob_class_change(struct mob_data *md,int class_);
-int clif_mob_equip(struct mob_data *md,int nameid); // [Valaris]
-
-int clif_skillinfo(struct map_session_data *sd,int skillid,int type,int range);
-int clif_skillinfoblock(struct map_session_data *sd);
-int clif_skillup(struct map_session_data *sd,int skill_num);
-
-int clif_skillcasting(struct block_list* bl,
- int src_id,int dst_id,int dst_x,int dst_y,int skill_num,int casttime);
-int clif_skillcastcancel(struct block_list* bl);
-int clif_skill_fail(struct map_session_data *sd,int skill_id,int type,int btype);
-int clif_skill_damage(struct block_list *src,struct block_list *dst,
- unsigned int tick,int sdelay,int ddelay,int damage,int div,
- int skill_id,int skill_lv,int type);
-int clif_skill_damage2(struct block_list *src,struct block_list *dst,
- unsigned int tick,int sdelay,int ddelay,int damage,int div,
- int skill_id,int skill_lv,int type);
-int clif_skill_nodamage(struct block_list *src,struct block_list *dst,
- int skill_id,int heal,int fail);
-int clif_skill_poseffect(struct block_list *src,int skill_id,
- int val,int x,int y,int tick);
-int clif_skill_estimation(struct map_session_data *sd,struct block_list *dst);
-int clif_skill_warppoint(struct map_session_data *sd,int skill_num,
- const char *map1,const char *map2,const char *map3,const char *map4);
-int clif_skill_memo(struct map_session_data *sd,int flag);
-int clif_skill_teleportmessage(struct map_session_data *sd,int flag);
-int clif_skill_produce_mix_list(struct map_session_data *sd,int trigger);
-
-int clif_produceeffect(struct map_session_data *sd,int flag,int nameid);
-
-int clif_skill_setunit(struct skill_unit *unit);
-int clif_skill_delunit(struct skill_unit *unit);
-
-int clif_01ac(struct block_list *bl);
-
-int clif_autospell(struct map_session_data *sd,int skilllv);
-int clif_devotion(struct map_session_data *sd,int target);
-int clif_spiritball(struct map_session_data *sd);
-int clif_combo_delay(struct block_list *src,int wait);
-int clif_bladestop(struct block_list *src,struct block_list *dst,int bool_);
-int clif_changemapcell(int m,int x,int y,int cell_type,int type);
-
-int clif_status_change(struct block_list *bl,int type,int flag);
-
-int clif_wis_message(int fd,char *nick,char *mes,int mes_len);
-int clif_wis_end(int fd,int flag);
-
-int clif_solved_charname(struct map_session_data *sd,int char_id);
-int clif_update_mobhp(struct mob_data *md);
-
-int clif_use_card(struct map_session_data *sd,int idx);
-int clif_insert_card(struct map_session_data *sd,int idx_equip,int idx_card,int flag);
-
-int clif_itemlist(struct map_session_data *sd);
-int clif_equiplist(struct map_session_data *sd);
-
-int clif_cart_additem(struct map_session_data*,int,int,int);
-int clif_cart_delitem(struct map_session_data*,int,int);
-int clif_cart_itemlist(struct map_session_data *sd);
-int clif_cart_equiplist(struct map_session_data *sd);
-
-int clif_item_identify_list(struct map_session_data *sd);
-int clif_item_identified(struct map_session_data *sd,int idx,int flag);
-int clif_item_repair_list(struct map_session_data *sd);
-int clif_item_refine_list(struct map_session_data *sd);
-
-int clif_item_skill(struct map_session_data *sd,int skillid,int skilllv,const char *name);
-
-int clif_mvp_effect(struct map_session_data *sd);
-int clif_mvp_item(struct map_session_data *sd,int nameid);
-int clif_mvp_exp(struct map_session_data *sd,int exp);
-void clif_changed_dir(struct block_list *bl);
-
-// vending
-int clif_openvendingreq(struct map_session_data *sd,int num);
-int clif_showvendingboard(struct block_list* bl,char *message,int fd);
-int clif_closevendingboard(struct block_list* bl,int fd);
-int clif_vendinglist(struct map_session_data *sd,int id,struct vending *vending);
-int clif_buyvending(struct map_session_data *sd,int index,int amount,int fail);
-int clif_openvending(struct map_session_data *sd,int id,struct vending *vending);
-int clif_vendingreport(struct map_session_data *sd,int index,int amount);
-
-int clif_movetoattack(struct map_session_data *sd,struct block_list *bl);
-
-// party
-int clif_party_created(struct map_session_data *sd,int flag);
-int clif_party_info(struct party *p,int fd);
-int clif_party_invite(struct map_session_data *sd,struct map_session_data *tsd);
-int clif_party_inviteack(struct map_session_data *sd,char *nick,int flag);
-int clif_party_option(struct party *p,struct map_session_data *sd,int flag);
-int clif_party_leaved(struct party *p,struct map_session_data *sd,int account_id,char *name,int flag);
-int clif_party_message(struct party *p,int account_id,char *mes,int len);
-int clif_party_move(struct party *p,struct map_session_data *sd,int online);
-int clif_party_xy(struct party *p,struct map_session_data *sd);
-int clif_party_hp(struct party *p,struct map_session_data *sd);
-int clif_hpmeter(struct map_session_data *sd);
-
-// guild
-int clif_guild_created(struct map_session_data *sd,int flag);
-int clif_guild_belonginfo(struct map_session_data *sd,struct guild *g);
-int clif_guild_basicinfo(struct map_session_data *sd);
-int clif_guild_allianceinfo(struct map_session_data *sd);
-int clif_guild_memberlist(struct map_session_data *sd);
-int clif_guild_skillinfo(struct map_session_data *sd);
-int clif_guild_memberlogin_notice(struct guild *g,int idx,int flag);
-int clif_guild_invite(struct map_session_data *sd,struct guild *g);
-int clif_guild_inviteack(struct map_session_data *sd,int flag);
-int clif_guild_leave(struct map_session_data *sd,const char *name,const char *mes);
-int clif_guild_explusion(struct map_session_data *sd,const char *name,const char *mes,
- int account_id);
-int clif_guild_positionchanged(struct guild *g,int idx);
-int clif_guild_memberpositionchanged(struct guild *g,int idx);
-int clif_guild_emblem(struct map_session_data *sd,struct guild *g);
-int clif_guild_notice(struct map_session_data *sd,struct guild *g);
-int clif_guild_message(struct guild *g,int account_id,const char *mes,int len);
-int clif_guild_skillup(struct map_session_data *sd,int skill_num,int lv);
-int clif_guild_reqalliance(struct map_session_data *sd,int account_id,const char *name);
-int clif_guild_allianceack(struct map_session_data *sd,int flag);
-int clif_guild_delalliance(struct map_session_data *sd,int guild_id,int flag);
-int clif_guild_oppositionack(struct map_session_data *sd,int flag);
-int clif_guild_broken(struct map_session_data *sd,int flag);
-
-
-// atcommand
-int clif_displaymessage(const int fd,char* mes);
-int clif_disp_onlyself(struct map_session_data *sd,char *mes,int len);
-int clif_GMmessage(struct block_list *bl,char* mes,int len,int flag);
-int clif_heal(int fd,int type,int val);
-int clif_resurrection(struct block_list *bl,int type);
-int clif_set0199(int fd,int type);
-int clif_pvpset(struct map_session_data *sd, int pvprank, int pvpnum,int type);
-int clif_send0199(int map,int type);
-int clif_refine(int fd,struct map_session_data *sd,int fail,int index,int val);
-
-//petsystem
-int clif_catch_process(struct map_session_data *sd);
-int clif_pet_rulet(struct map_session_data *sd,int data);
-int clif_sendegg(struct map_session_data *sd);
-int clif_send_petdata(struct map_session_data *sd,int type,int param);
-int clif_send_petstatus(struct map_session_data *sd);
-int clif_pet_emotion(struct pet_data *pd,int param);
-int clif_pet_performance(struct block_list *bl,int param);
-int clif_pet_equip(struct pet_data *pd,int nameid);
-int clif_pet_food(struct map_session_data *sd,int foodid,int fail);
-
-//friends list
-void clif_friends_list_send(struct map_session_data *sd);
-void clif_parse_friends_list_add(int fd,struct map_session_data *sd);
-void clif_parse_friends_list_remove(int fd,struct map_session_data *sd);
-
-int clif_specialeffect(struct block_list *bl,int type, int flag); // special effects [Valaris]
-int clif_message(struct block_list *bl, char* msg); // messages (from mobs/npcs) [Valaris]
-
-int clif_GM_kickack(struct map_session_data *sd,int id);
-int clif_GM_kick(struct map_session_data *sd,struct map_session_data *tsd,int type);
-int clif_timedout(struct map_session_data *sd);
-
-int clif_foreachclient(int (*)(struct map_session_data*,va_list),...);
-
-int do_final_clif(void);
-int do_init_clif(void);
-
-#endif
-
-
diff --git a/src/map/guild.c b/src/map/guild.c
deleted file mode 100644
index 935377e19..000000000
--- a/src/map/guild.c
+++ /dev/null
@@ -1,1717 +0,0 @@
-// $Id: guild.c,v 1.5 2004/09/25 05:32:18 MouseJstr Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "guild.h"
-#include "storage.h"
-#include "db.h"
-#include "timer.h"
-#include "socket.h"
-#include "nullpo.h"
-#include "malloc.h"
-#include "battle.h"
-#include "npc.h"
-#include "pc.h"
-#include "status.h"
-#include "map.h"
-#include "mob.h"
-#include "intif.h"
-#include "clif.h"
-#include "skill.h"
-#include "showmsg.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-static struct dbt *guild_db;
-static struct dbt *castle_db;
-static struct dbt *guild_expcache_db;
-static struct dbt *guild_infoevent_db;
-static struct dbt *guild_castleinfoevent_db;
-
-struct eventlist {
- char name[50];
- struct eventlist *next;
-};
-
-// ƒMƒ‹ƒh‚ÌEXPƒLƒƒƒbƒVƒ…‚̃tƒ‰ƒbƒVƒ…‚ÉŠÖ˜A‚·‚é’è”
-#define GUILD_PAYEXP_INVERVAL 10000 // ŠÔŠu(ƒLƒƒƒbƒVƒ…‚Ìő嶑¶ŽžŠÔAƒ~ƒŠ•b)
-#define GUILD_PAYEXP_LIST 8192 // ƒLƒƒƒbƒVƒ…‚ÌÅ‘å”
-
-// ƒMƒ‹ƒh‚ÌEXPƒLƒƒƒbƒVƒ…
-struct guild_expcache {
- int guild_id, account_id, char_id, exp;
-};
-
-// timer for auto saving guild data during WoE
-#define GUILD_SAVE_INTERVAL 300000
-int guild_save_timer = -1;
-
-int guild_payexp_timer(int tid,unsigned int tick,int id,int data);
-int guild_gvg_eliminate_timer(int tid,unsigned int tick,int id,int data);
-int guild_save_sub(int tid,unsigned int tick,int id,int data);
-
-// ƒMƒ‹ƒhƒXƒLƒ‹db‚̃AƒNƒZƒTi¡‚Í’¼‘Å‚¿‚Å‘ã—pj
-int guild_skill_get_inf(int id) { // Modified for new skills [Sara]
- if (id==GD_BATTLEORDER) return 4;
- else if (id==GD_REGENERATION) return 4;
- else if (id==GD_RESTORE) return 4;
- else if (id==GD_EMERGENCYCALL) return 4;
- else return 0;
-}
-int guild_skill_get_sp(int id,int lv){ return 0; }
-int guild_skill_get_range(int id){ return 0; }
-int guild_skill_get_max(int id) { // Modified for new skills [Sara]
- switch (id) {
- case GD_GUARDUP:
- return 3;
- case GD_EXTENSION:
- return 10;
- case GD_LEADERSHIP:
- case GD_GLORYWOUNDS:
- case GD_SOULCOLD:
- case GD_HAWKEYES:
- return 5;
- case GD_REGENERATION:
- return 3;
- default:
- return 1;
- }
-}
-
-// ƒMƒ‹ƒhƒXƒLƒ‹‚ª‚ ‚é‚©Šm”F
-int guild_checkskill(struct guild *g,int id)
-{
- int idx = id-GD_SKILLBASE;
- if (idx < 0 || idx >= MAX_GUILDSKILL)
- return 0;
- return g->skill[idx].lv;
-}
-
-static int guild_read_castledb(void)
-{
- FILE *fp;
- char line[1024];
- int j,ln=0;
- char *str[32],*p;
- struct guild_castle *gc;
-
- if( (fp=fopen("db/castle_db.txt","r"))==NULL){
- printf("can't read db/castle_db.txt\n");
- return -1;
- }
-
- while(fgets(line,1020,fp)){
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(str,0,sizeof(str));
- gc=(struct guild_castle *)aCalloc(1,sizeof(struct guild_castle));
- for(j=0,p=line;j<6 && p;j++){
- str[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
-
- gc->guild_id=0; // <Agit> Clear Data for Initialize
- gc->economy=0; gc->defense=0; gc->triggerE=0; gc->triggerD=0; gc->nextTime=0; gc->payTime=0;
- gc->createTime=0; gc->visibleC=0; gc->visibleG0=0; gc->visibleG1=0; gc->visibleG2=0;
- gc->visibleG3=0; gc->visibleG4=0; gc->visibleG5=0; gc->visibleG6=0; gc->visibleG7=0;
- gc->Ghp0=0; gc->Ghp1=0; gc->Ghp2=0; gc->Ghp3=0; gc->Ghp4=0; gc->Ghp5=0; gc->Ghp6=0; gc->Ghp7=0; // guardian HP [Valaris]
-
- gc->castle_id=atoi(str[0]);
- memcpy(gc->map_name,str[1],24);
- memcpy(gc->castle_name,str[2],24);
- memcpy(gc->castle_event,str[3],24);
-
- numdb_insert(castle_db,gc->castle_id,gc);
-
- //intif_guild_castle_info(gc->castle_id);
-
- ln++;
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,"db/castle_db.txt");
- ShowStatus(tmp_output);
- return 0;
-}
-
-// ‰Šú‰»
-void do_init_guild(void)
-{
- guild_db=numdb_init();
- castle_db=numdb_init();
- guild_expcache_db=numdb_init();
- guild_infoevent_db=numdb_init();
- guild_castleinfoevent_db=numdb_init();
-
- guild_read_castledb();
-
- add_timer_func_list(guild_gvg_eliminate_timer,"guild_gvg_eliminate_timer");
- add_timer_func_list(guild_payexp_timer,"guild_payexp_timer");
- add_timer_func_list(guild_save_sub, "guild_save_sub");
- add_timer_interval(gettick()+GUILD_PAYEXP_INVERVAL,guild_payexp_timer,0,0,GUILD_PAYEXP_INVERVAL);
-}
-
-
-// ŒŸõ
-struct guild *guild_search(int guild_id)
-{
- return (struct guild *) numdb_search(guild_db,guild_id);
-}
-int guild_searchname_sub(void *key,void *data,va_list ap)
-{
- struct guild *g=(struct guild *)data,**dst;
- char *str;
- str=va_arg(ap,char *);
- dst=va_arg(ap,struct guild **);
- if(strcmpi(g->name,str)==0)
- *dst=g;
- return 0;
-}
-// ƒMƒ‹ƒh–¼ŒŸõ
-struct guild* guild_searchname(char *str)
-{
- struct guild *g=NULL;
- numdb_foreach(guild_db,guild_searchname_sub,str,&g);
- return g;
-}
-struct guild_castle *guild_castle_search(int gcid)
-{
- return (struct guild_castle *) numdb_search(castle_db,gcid);
-}
-
-// mapname‚ɑΉž‚µ‚½ƒAƒWƒg‚Ìgc‚ð•Ô‚·
-struct guild_castle *guild_mapname2gc(char *mapname)
-{
- int i;
- struct guild_castle *gc=NULL;
- for(i=0;i<MAX_GUILDCASTLE;i++){
- gc=guild_castle_search(i);
- if(!gc) continue;
- if(strcmp(gc->map_name,mapname)==0) return gc;
- }
- return NULL;
-}
-
-// ƒƒOƒCƒ“’†‚̃Mƒ‹ƒhƒƒ“ƒo[‚Ì‚Pl‚Ìsd‚ð•Ô‚·
-struct map_session_data *guild_getavailablesd(struct guild *g)
-{
- int i;
-
- nullpo_retr(NULL, g);
-
- for(i=0;i<g->max_member;i++)
- if(g->member[i].sd!=NULL)
- return g->member[i].sd;
- return NULL;
-}
-
-// ƒMƒ‹ƒhƒƒ“ƒo[‚̃Cƒ“ƒfƒbƒNƒX‚ð•Ô‚·
-int guild_getindex(struct guild *g,int account_id,int char_id)
-{
- int i;
- if(g==NULL)
- return -1;
- for(i=0;i<g->max_member;i++)
- if( g->member[i].account_id==account_id &&
- g->member[i].char_id==char_id )
- return i;
- return -1;
-}
-// ƒMƒ‹ƒhƒƒ“ƒo[‚Ì–ðE‚ð•Ô‚·
-int guild_getposition(struct map_session_data *sd,struct guild *g)
-{
- int i;
-
- nullpo_retr(-1, sd);
-
- if(g==NULL && (g=guild_search(sd->status.guild_id))==NULL)
- return -1;
- for(i=0;i<g->max_member;i++)
- if( g->member[i].account_id==sd->status.account_id &&
- g->member[i].char_id==sd->status.char_id )
- return g->member[i].position;
- return -1;
-}
-
-// ƒƒ“ƒo[î•ñ‚Ìì¬
-void guild_makemember(struct guild_member *m,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- memset(m,0,sizeof(struct guild_member));
- m->account_id =sd->status.account_id;
- m->char_id =sd->status.char_id;
- m->hair =sd->status.hair;
- m->hair_color =sd->status.hair_color;
- m->gender =sd->sex;
- m->class_ =sd->status.class_;
- m->lv =sd->status.base_level;
- m->exp =0;
- m->exp_payper =0;
- m->online =1;
- m->position =MAX_GUILDPOSITION-1;
- memcpy(m->name,sd->status.name,24);
- return;
-}
-// ƒMƒ‹ƒh‹£‡Šm”F
-int guild_check_conflict(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- intif_guild_checkconflict(sd->status.guild_id,
- sd->status.account_id,sd->status.char_id);
- return 0;
-}
-
-// ƒMƒ‹ƒh‚ÌEXPƒLƒƒƒbƒVƒ…‚ðinterŽI‚Ƀtƒ‰ƒbƒVƒ…‚·‚é
-int guild_payexp_timer_sub(void *key,void *data,va_list ap)
-{
- int i, *dellist,*delp, dataid=(int)key;
- struct guild_expcache *c;
- struct guild *g;
-
- nullpo_retr(0, ap);
- nullpo_retr(0, c=(struct guild_expcache *)data);
- nullpo_retr(0, dellist=va_arg(ap,int *));
- nullpo_retr(0, delp=va_arg(ap,int *));
-
- if( *delp>=GUILD_PAYEXP_LIST || (g=guild_search(c->guild_id))==NULL )
- return 0;
- if( ( i=guild_getindex(g,c->account_id,c->char_id) )<0 )
- return 0;
-
- g->member[i].exp+=c->exp;
- intif_guild_change_memberinfo(g->guild_id,c->account_id,c->char_id,
- GMI_EXP,&g->member[i].exp,sizeof(g->member[i].exp));
- c->exp=0;
-
- dellist[(*delp)++]=dataid;
- aFree(c);
- return 0;
-}
-int guild_payexp_timer(int tid,unsigned int tick,int id,int data)
-{
- int dellist[GUILD_PAYEXP_LIST],delp=0,i;
- numdb_foreach(guild_expcache_db,guild_payexp_timer_sub,
- dellist,&delp);
- for(i=0;i<delp;i++)
- numdb_erase(guild_expcache_db,dellist[i]);
-// if(battle_config.etc_log)
-// printf("guild exp %d charactor's exp flushed !\n",delp);
- return 0;
-}
-
-//------------------------------------------------------------------------
-
-// 쬗v‹
-int guild_create(struct map_session_data *sd,char *name)
-{
- nullpo_retr(0, sd);
-
- if(sd->status.guild_id==0){
- if(!battle_config.guild_emperium_check || pc_search_inventory(sd,714) >= 0) {
- struct guild_member m;
- guild_makemember(&m,sd);
- m.position=0;
- intif_guild_create(name,&m);
- } else
- clif_guild_created(sd,3); // ƒGƒ“ƒyƒŠƒEƒ€‚ª‚¢‚È‚¢
- }else
- clif_guild_created(sd,1); // ‚·‚Å‚ÉŠ‘®‚µ‚Ä‚¢‚é
-
- return 0;
-}
-
-// 쬉”Û
-int guild_created(int account_id,int guild_id)
-{
- struct map_session_data *sd=map_id2sd(account_id);
-
- if(sd==NULL)
- return 0;
- if(guild_id>0) {
- struct guild *g;
- sd->status.guild_id=guild_id;
- sd->guild_sended=0;
- if((g=(struct guild *) numdb_search(guild_db,guild_id))!=NULL){
- printf("guild: id already exists!\n");
- exit(1);
- }
- clif_guild_created(sd,0);
- if(battle_config.guild_emperium_check)
- pc_delitem(sd,pc_search_inventory(sd,714),1,0); // ƒGƒ“ƒyƒŠƒEƒ€Á–Õ
- } else {
- clif_guild_created(sd,2); // 쬎¸”si“¯–¼ƒMƒ‹ƒh‘¶Ýj
- }
- return 0;
-}
-
-// î•ñ—v‹
-int guild_request_info(int guild_id)
-{
-// if(battle_config.etc_log)
-// printf("guild_request_info\n");
- return intif_guild_request_info(guild_id);
-}
-// ƒCƒxƒ“ƒg•t‚«î•ñ—v‹
-int guild_npc_request_info(int guild_id,const char *event)
-{
- struct eventlist *ev;
-
- if( guild_search(guild_id) ){
- if(event && *event)
- npc_event_do(event);
- return 0;
- }
-
- if(event==NULL || *event==0)
- return guild_request_info(guild_id);
-
- ev=(struct eventlist *)aCalloc(1,sizeof(struct eventlist));
- memcpy(ev->name,event,strlen(event));
- ev->next=(struct eventlist *)numdb_search(guild_infoevent_db,guild_id);
- numdb_insert(guild_infoevent_db,guild_id,ev);
- return guild_request_info(guild_id);
-}
-
-// Š‘®ƒLƒƒƒ‰‚ÌŠm”F
-int guild_check_member(const struct guild *g)
-{
- int i;
- struct map_session_data *sd;
-
- nullpo_retr(0, g);
-
- for(i=0;i<fd_max;i++){
- if(session[i] && (sd=(struct map_session_data *) session[i]->session_data) && sd->state.auth && !sd->state.waitingdisconnect){
- if(sd->status.guild_id==g->guild_id){
- int j,f=1;
- for(j=0;j<MAX_GUILD;j++){ // ƒf[ƒ^‚ª‚ ‚é‚©
- if( g->member[j].account_id==sd->status.account_id &&
- g->member[j].char_id==sd->status.char_id)
- f=0;
- }
- if(f){
- sd->status.guild_id=0;
- sd->guild_sended=0;
- sd->guild_emblem_id=0;
- if(battle_config.error_log)
- printf("guild: check_member %d[%s] is not member\n",sd->status.account_id,sd->status.name);
- }
- }
- }
- }
- return 0;
-}
-// î•ñŠ“¾Ž¸”si‚»‚ÌID‚̃Lƒƒƒ‰‚ð‘S•”–¢Š‘®‚É‚·‚éj
-int guild_recv_noinfo(int guild_id)
-{
- int i;
- struct map_session_data *sd;
- for(i=0;i<fd_max;i++){
- if(session[i] && (sd=(struct map_session_data *) session[i]->session_data) && sd->state.auth && !sd->state.waitingdisconnect){
- if(sd->status.guild_id==guild_id)
- sd->status.guild_id=0;
- }
- }
- return 0;
-}
-// î•ñŠ“¾
-int guild_recv_info(struct guild *sg)
-{
- struct guild *g,before;
- int i,bm,m;
- struct eventlist *ev,*ev2;
-
- nullpo_retr(0, sg);
-
- if((g=(struct guild *) numdb_search(guild_db,sg->guild_id))==NULL){
- g=(struct guild *)aCalloc(1,sizeof(struct guild));
- numdb_insert(guild_db,sg->guild_id,g);
- before=*sg;
-
- // ʼn‚̃[ƒh‚Ȃ̂ц[ƒU[‚̃`ƒFƒbƒN‚ðs‚¤
- guild_check_member(sg);
- }else
- before=*g;
- memcpy(g,sg,sizeof(struct guild));
-
- for(i=bm=m=0;i<g->max_member;i++){ // sd‚ÌÝ’è‚Æl”‚ÌŠm”F
- if(g->member[i].account_id>0){
- struct map_session_data *sd = map_id2sd(g->member[i].account_id);
- if (sd && sd->status.char_id == g->member[i].char_id &&
- sd->status.guild_id == g->guild_id &&
- !sd->state.waitingdisconnect)
- g->member[i].sd = sd;
- else sd = NULL;
- m++;
- }else
- g->member[i].sd=NULL;
- if(before.member[i].account_id>0)
- bm++;
- }
-
- for(i=0;i<g->max_member;i++){ // î•ñ‚Ì‘—M
- struct map_session_data *sd = g->member[i].sd;
- if( sd==NULL )
- continue;
-
- if( before.guild_lv!=g->guild_lv || bm!=m ||
- before.max_member!=g->max_member ){
- clif_guild_basicinfo(sd); // Šî–{î•ñ‘—M
- clif_guild_emblem(sd,g); // ƒGƒ“ƒuƒŒƒ€‘—M
- }
-
- if(bm!=m){ // ƒƒ“ƒo[î•ñ‘—M
- clif_guild_memberlist(g->member[i].sd);
- }
-
- if( before.skill_point!=g->skill_point)
- clif_guild_skillinfo(sd); // ƒXƒLƒ‹î•ñ‘—M
-
- if( sd->guild_sended==0){ // –¢‘—M‚Ȃ犑®î•ñ‚à‘—‚é
- clif_guild_belonginfo(sd,g);
- clif_guild_notice(sd,g);
- sd->guild_emblem_id=g->emblem_id;
- sd->guild_sended=1;
- }
- }
-
- // ƒCƒxƒ“ƒg‚Ì”­¶
- if( (ev=(struct eventlist *)numdb_search(guild_infoevent_db,sg->guild_id))!=NULL ){
- numdb_erase(guild_infoevent_db,sg->guild_id);
- while(ev){
- npc_event_do(ev->name);
- ev2=ev->next;
- aFree(ev);
- ev=ev2;
- }
- }
-
- return 0;
-}
-
-
-// ƒMƒ‹ƒh‚Ö‚ÌŠ©—U
-int guild_invite(struct map_session_data *sd,int account_id)
-{
- struct map_session_data *tsd;
- struct guild *g;
- int i;
-
- nullpo_retr(0, sd);
-
- tsd= map_id2sd(account_id);
- g=guild_search(sd->status.guild_id);
-
- if(tsd==NULL || g==NULL)
- return 0;
- if(!battle_config.invite_request_check) {
- if (tsd->party_invite>0 || tsd->trade_partner) { // ‘ŠŽè‚ªŽæˆø’†‚©‚Ç‚¤‚©
- clif_guild_inviteack(sd,0);
- return 0;
- }
- }
- if( tsd->status.guild_id>0 || tsd->guild_invite>0 ){ // ‘ŠŽè‚ÌŠ‘®Šm”F
- clif_guild_inviteack(sd,0);
- return 0;
- }
-
- // ’èˆõŠm”F
- for(i=0;i<g->max_member;i++)
- if(g->member[i].account_id==0)
- break;
- if(i==g->max_member){
- clif_guild_inviteack(sd,3);
- return 0;
- }
-
- tsd->guild_invite=sd->status.guild_id;
- tsd->guild_invite_account=sd->status.account_id;
-
- clif_guild_invite(tsd,g);
- return 0;
-}
-// ƒMƒ‹ƒhŠ©—U‚Ö‚Ì•Ô“š
-int guild_reply_invite(struct map_session_data *sd,int guild_id,int flag)
-{
- struct map_session_data *tsd;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, tsd= map_id2sd( sd->guild_invite_account ));
-
- if(sd->guild_invite!=guild_id) // Š©—U‚ƃMƒ‹ƒhID‚ªˆá‚¤
- return 0;
-
- if(flag==1){ // ³‘ø
- struct guild_member m;
- struct guild *g;
- int i;
-
- // ’èˆõŠm”F
- if( (g=guild_search(tsd->status.guild_id))==NULL ){
- sd->guild_invite=0;
- sd->guild_invite_account=0;
- return 0;
- }
- for(i=0;i<g->max_member;i++)
- if(g->member[i].account_id==0)
- break;
- if(i==g->max_member){
- sd->guild_invite=0;
- sd->guild_invite_account=0;
- clif_guild_inviteack(tsd,3);
- return 0;
- }
-
-
- //interŽI‚֒ljÁ—v‹
- guild_makemember(&m,sd);
- intif_guild_addmember( sd->guild_invite, &m );
- return 0;
- }else{ // ‹‘”Û
- sd->guild_invite=0;
- sd->guild_invite_account=0;
- if(tsd==NULL)
- return 0;
- clif_guild_inviteack(tsd,1);
- }
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒo‚ª’ljÁ‚³‚ꂽ
-int guild_member_added(int guild_id,int account_id,int char_id,int flag)
-{
- struct map_session_data *sd= map_id2sd(account_id),*sd2;
- struct guild *g;
-
- if( (g=guild_search(guild_id))==NULL )
- return 0;
-
- if(sd==NULL || sd->guild_invite==0){
- // ƒLƒƒƒ‰‘¤‚É“o˜^‚Å‚«‚È‚©‚Á‚½‚½‚ß’E‘Þ—v‹‚ðo‚·
- if (flag == 0) {
- if(battle_config.error_log)
- printf("guild: member added error %d is not online\n",account_id);
- intif_guild_leave(guild_id,account_id,char_id,0,"**“o˜^Ž¸”s**");
- }
- return 0;
- }
- sd2 = map_id2sd(sd->guild_invite_account);
- sd->guild_invite = 0;
- sd->guild_invite_account = 0;
-
- if(flag==1){ // Ž¸”s
- if( sd2!=NULL )
- clif_guild_inviteack(sd2,3);
- return 0;
- }
-
- // ¬Œ÷
- sd->guild_sended=0;
- sd->status.guild_id=guild_id;
-
- if( sd2!=NULL )
- clif_guild_inviteack(sd2,2);
-
- // ‚¢‚¿‚¨‚¤‹£‡Šm”F
- guild_check_conflict(sd);
-
- return 0;
-}
-
-// ƒMƒ‹ƒh’E‘Þ—v‹
-int guild_leave(struct map_session_data *sd,int guild_id,
- int account_id,int char_id,const char *mes)
-{
- struct guild *g;
- int i;
-
- nullpo_retr(0, sd);
-
- g = guild_search(sd->status.guild_id);
-
- if(g==NULL)
- return 0;
-
- if( sd->status.account_id!=account_id ||
- sd->status.char_id!=char_id || sd->status.guild_id!=guild_id)
- return 0;
-
- for(i=0;i<g->max_member;i++){ // Š‘®‚µ‚Ä‚¢‚é‚©
- if( g->member[i].account_id==sd->status.account_id &&
- g->member[i].char_id==sd->status.char_id ){
- intif_guild_leave(g->guild_id,sd->status.account_id,sd->status.char_id,0,mes);
- return 0;
- }
- }
- return 0;
-}
-// ƒMƒ‹ƒh’Ç•ú—v‹
-int guild_explusion(struct map_session_data *sd,int guild_id,
- int account_id,int char_id,const char *mes)
-{
- struct guild *g;
- int i,ps;
-
- nullpo_retr(0, sd);
-
- g = guild_search(sd->status.guild_id);
-
- if(g==NULL)
- return 0;
-
- if( sd->status.guild_id!=guild_id)
- return 0;
-
- if( (ps=guild_getposition(sd,g))<0 || !(g->position[ps].mode&0x0010) )
- return 0; // ˆ”±Œ ŒÀ–³‚µ
-
- for(i=0;i<g->max_member;i++){ // Š‘®‚µ‚Ä‚¢‚é‚©
- if( g->member[i].account_id==account_id &&
- g->member[i].char_id==char_id ){
- intif_guild_leave(g->guild_id,account_id,char_id,1,mes);
- return 0;
- }
- }
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒo‚ª’E‘Þ‚µ‚½
-int guild_member_leaved(int guild_id,int account_id,int char_id,int flag,
- const char *name,const char *mes)
-{
- struct map_session_data *sd=map_id2sd(account_id);
- struct guild *g=guild_search(guild_id);
-
- if(g!=NULL){
- int i;
- for(i=0;i<g->max_member;i++) {
- if( g->member[i].account_id==account_id &&
- g->member[i].char_id==char_id ){
- struct map_session_data *sd2=sd;
- if(sd2==NULL)
- sd2=guild_getavailablesd(g);
- else
- {
- if(flag==0)
- clif_guild_leave(sd2,name,mes);
- else
- clif_guild_explusion(sd2,name,mes,account_id);
- }
- g->member[i].account_id=0;
- g->member[i].sd=NULL;
- }
- // ƒƒ“ƒo[ƒŠƒXƒg‚ð‘Sˆõ‚ÉÄ’Ê’m
- for(i=0;i<g->max_member;i++){
- if( g->member[i].sd!=NULL )
- clif_guild_memberlist(g->member[i].sd);
- }
- }
- }
- if(sd!=NULL) {
- if (sd->status.guild_id==guild_id){
- sd->status.guild_id=0;
- sd->guild_emblem_id=0;
- sd->guild_sended=0;
- }
- }
-
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒo‚̃Iƒ“ƒ‰ƒCƒ“ó‘Ô/LvXV‘—M
-int guild_send_memberinfoshort(struct map_session_data *sd,int online)
-{
- struct guild *g;
-
- nullpo_retr(0, sd);
-
- if(sd->status.guild_id<=0)
- return 0;
- g=guild_search(sd->status.guild_id);
- if(g==NULL)
- return 0;
-
- intif_guild_memberinfoshort(g->guild_id,
- sd->status.account_id,sd->status.char_id,online,sd->status.base_level,sd->status.class_);
-
- if( !online ){ // ƒƒOƒAƒEƒg‚·‚é‚È‚çsd‚ðƒNƒŠƒA‚µ‚ÄI—¹
- int i=guild_getindex(g,sd->status.account_id,sd->status.char_id);
- if(i>=0)
- g->member[i].sd=NULL;
- return 0;
- }
-
- if( sd->guild_sended!=0 ) // ƒMƒ‹ƒh‰Šú‘—Mƒf[ƒ^‚Í‘—MÏ‚Ý
- return 0;
-
- // ‹£‡Šm”F
- guild_check_conflict(sd);
-
- // ‚ ‚é‚È‚çƒMƒ‹ƒh‰Šú‘—Mƒf[ƒ^‘—M
- if( (g=guild_search(sd->status.guild_id))!=NULL ){
- guild_check_member(g); // Š‘®‚ðŠm”F‚·‚é
- if(sd->status.guild_id==g->guild_id){
- clif_guild_belonginfo(sd,g);
- clif_guild_notice(sd,g);
- sd->guild_sended=1;
- sd->guild_emblem_id=g->emblem_id;
- }
- }
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒo‚̃Iƒ“ƒ‰ƒCƒ“ó‘Ô/LvXV’Ê’m
-int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int online,int lv,int class_)
-{
- int i,alv,c,idx=0,om=0,oldonline=-1;
- struct guild *g=guild_search(guild_id);
- if(g==NULL)
- return 0;
- for(i=0,alv=0,c=0,om=0;i<g->max_member;i++){
- struct guild_member *m=&g->member[i];
- if(m->account_id==account_id && m->char_id==char_id ){
- oldonline=m->online;
- m->online=online;
- m->lv=lv;
- m->class_=class_;
- idx=i;
- }
- if(m->account_id>0){
- alv+=m->lv;
- c++;
- }
- if(m->online)
- om++;
- }
- if(idx==g->max_member){
- if(battle_config.error_log)
- printf("guild: not found member %d,%d on %d[%s]\n", account_id,char_id,guild_id,g->name);
- return 0;
- }
- g->average_lv=alv/c;
- g->connect_member=om;
-
- if(oldonline!=online) // ƒIƒ“ƒ‰ƒCƒ“ó‘Ô‚ª•Ï‚í‚Á‚½‚Ì‚Å’Ê’m
- clif_guild_memberlogin_notice(g,idx,online);
-
- for(i=0;i<g->max_member;i++){ // sdÄÝ’è
- struct map_session_data *sd= map_id2sd(g->member[i].account_id);
- if (sd && sd->status.char_id == g->member[i].char_id &&
- sd->status.guild_id == g->guild_id &&
- !sd->state.waitingdisconnect)
- g->member[i].sd = sd;
- else sd = NULL;
- }
-
- // ‚±‚±‚ɃNƒ‰ƒCƒAƒ“ƒg‚É‘—Mˆ—‚ª•K—v
-
- return 0;
-}
-// ƒMƒ‹ƒh‰ï˜b‘—M
-int guild_send_message(struct map_session_data *sd,char *mes,int len)
-{
- nullpo_retr(0, sd);
-
- if(sd->status.guild_id==0)
- return 0;
- intif_guild_message(sd->status.guild_id,sd->status.account_id,mes,len);
- guild_recv_message(sd->status.guild_id,sd->status.account_id,mes,len);
-
- return 0;
-}
-// ƒMƒ‹ƒh‰ï˜bŽóM
-int guild_recv_message(int guild_id,int account_id,char *mes,int len)
-{
- struct guild *g;
- if( (g=guild_search(guild_id))==NULL)
- return 0;
- clif_guild_message(g,account_id,mes,len);
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒo‚Ì–ðE•ÏX
-int guild_change_memberposition(int guild_id,int account_id,int char_id,int idx)
-{
- return intif_guild_change_memberinfo(
- guild_id,account_id,char_id,GMI_POSITION,&idx,sizeof(idx));
-}
-// ƒMƒ‹ƒhƒƒ“ƒo‚Ì–ðE•ÏX’Ê’m
-int guild_memberposition_changed(struct guild *g,int idx,int pos)
-{
- nullpo_retr(0, g);
-
- g->member[idx].position=pos;
- clif_guild_memberpositionchanged(g,idx);
- return 0;
-}
-// ƒMƒ‹ƒh–ðE•ÏX
-int guild_change_position(struct map_session_data *sd,int idx,
- int mode,int exp_mode,const char *name)
-{
- struct guild_position p;
-
- nullpo_retr(0, sd);
-
- if(exp_mode>battle_config.guild_exp_limit)
- exp_mode=battle_config.guild_exp_limit;
- if(exp_mode<0)exp_mode=0;
- p.mode=mode;
- p.exp_mode=exp_mode;
- memcpy(p.name,name,24);
- return intif_guild_position(sd->status.guild_id,idx,&p);
-}
-// ƒMƒ‹ƒh–ðE•ÏX’Ê’m
-int guild_position_changed(int guild_id,int idx,struct guild_position *p)
-{
- struct guild *g=guild_search(guild_id);
- if(g==NULL)
- return 0;
- memcpy(&g->position[idx],p,sizeof(struct guild_position));
- clif_guild_positionchanged(g,idx);
- return 0;
-}
-// ƒMƒ‹ƒh’m•ÏX
-int guild_change_notice(struct map_session_data *sd,int guild_id,const char *mes1,const char *mes2)
-{
- nullpo_retr(0, sd);
-
- if(guild_id!=sd->status.guild_id)
- return 0;
- return intif_guild_notice(guild_id,mes1,mes2);
-}
-// ƒMƒ‹ƒh’m•ÏX’Ê’m
-int guild_notice_changed(int guild_id,const char *mes1,const char *mes2)
-{
- int i;
- struct map_session_data *sd;
- struct guild *g=guild_search(guild_id);
- if(g==NULL)
- return 0;
-
- memcpy(g->mes1,mes1,60);
- memcpy(g->mes2,mes2,120);
-
- for(i=0;i<g->max_member;i++){
- if((sd=g->member[i].sd)!=NULL)
- clif_guild_notice(sd,g);
- }
- return 0;
-}
-// ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX
-int guild_change_emblem(struct map_session_data *sd,int len,const char *data)
-{
- struct guild *g;
- nullpo_retr(0, sd);
-
- if (battle_config.require_glory_guild &&
- !((g = guild_search(sd->status.guild_id)) && guild_checkskill(g, GD_GLORYGUILD)>0)) {
- clif_skill_fail(sd,GD_GLORYGUILD,0,0);
- return 0;
- }
-
- return intif_guild_emblem(sd->status.guild_id,len,data);
-}
-// ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX’Ê’m
-int guild_emblem_changed(int len,int guild_id,int emblem_id,const char *data)
-{
- int i;
- struct map_session_data *sd;
- struct guild *g=guild_search(guild_id);
- if(g==NULL)
- return 0;
-
- memcpy(g->emblem_data,data,len);
- g->emblem_len=len;
- g->emblem_id=emblem_id;
-
- for(i=0;i<g->max_member;i++){
- if((sd=g->member[i].sd)!=NULL){
- sd->guild_emblem_id=emblem_id;
- clif_guild_belonginfo(sd,g);
- clif_guild_emblem(sd,g);
- }
- }
- return 0;
-}
-
-// ƒMƒ‹ƒh‚ÌEXPã”[
-int guild_payexp(struct map_session_data *sd,int exp)
-{
- struct guild *g;
- struct guild_expcache *c;
- int per,exp2;
-
- nullpo_retr(0, sd);
-
- if(sd->status.guild_id==0 || (g=guild_search(sd->status.guild_id))==NULL )
- return 0;
- if( (per=g->position[guild_getposition(sd,g)].exp_mode)<=0 )
- return 0;
- if( per>100 )per=100;
-
- if( (exp2=exp*per/100)<=0 )
- return 0;
-
- if( (c=(struct guild_expcache *) numdb_search(guild_expcache_db,sd->status.char_id))==NULL ){
- c=(struct guild_expcache *)aCallocA(1,sizeof(struct guild_expcache));
- c->guild_id=sd->status.guild_id;
- c->account_id=sd->status.account_id;
- c->char_id=sd->status.char_id;
- c->exp=exp2;
- numdb_insert(guild_expcache_db,c->char_id,c);
- }else{
- c->exp+=exp2;
- }
- return exp2;
-}
-
-// Celest
-int guild_getexp(struct map_session_data *sd,int exp)
-{
- struct guild *g;
- struct guild_expcache *c;
-
- nullpo_retr(0, sd);
-
- if(sd->status.guild_id==0 || (g=guild_search(sd->status.guild_id))==NULL )
- return 0;
-
- if( (c=(struct guild_expcache *) numdb_search(guild_expcache_db,sd->status.char_id))==NULL ){
- c=(struct guild_expcache *)aCallocA(1,sizeof(struct guild_expcache));
- c->guild_id=sd->status.guild_id;
- c->account_id=sd->status.account_id;
- c->char_id=sd->status.char_id;
- c->exp=exp;
- numdb_insert(guild_expcache_db,c->char_id,c);
- }else{
- c->exp+=exp;
- }
- return exp;
-}
-
-// ƒXƒLƒ‹ƒ|ƒCƒ“ƒgŠ„‚èU‚è
-int guild_skillup(struct map_session_data *sd,int skill_num,int flag)
-{
- struct guild *g;
- int idx = skill_num - GD_SKILLBASE;
-
- nullpo_retr(0, sd);
-
- if(idx < 0 || idx >= MAX_GUILDSKILL)
-
- return 0;
- if(sd->status.guild_id==0 || (g=guild_search(sd->status.guild_id))==NULL)
- return 0;
- if(strcmp(sd->status.name,g->master))
- return 0;
-
- if( (g->skill_point>0 || flag&1) &&
- g->skill[idx].id!=0 &&
- g->skill[idx].lv < guild_skill_get_max(skill_num) ){
- intif_guild_skillup(g->guild_id,skill_num,sd->status.account_id,flag);
- }
- status_calc_pc (sd, 0); // Celest
-
- return 0;
-}
-// ƒXƒLƒ‹ƒ|ƒCƒ“ƒgŠ„‚èU‚è’Ê’m
-int guild_skillupack(int guild_id,int skill_num,int account_id)
-{
- struct map_session_data *sd=map_id2sd(account_id);
- struct guild *g=guild_search(guild_id);
- int i;
- if(g==NULL)
- return 0;
- if(sd!=NULL)
- clif_guild_skillup(sd,skill_num,g->skill[skill_num-GD_SKILLBASE].lv);
- // ‘Sˆõ‚É’Ê’m
- for(i=0;i<g->max_member;i++)
- if((sd=g->member[i].sd)!=NULL)
- clif_guild_skillinfo(sd);
- return 0;
-}
-
-// ƒMƒ‹ƒh“¯–¿”Š“¾
-int guild_get_alliance_count(struct guild *g,int flag)
-{
- int i,c;
-
- nullpo_retr(0, g);
-
- for(i=c=0;i<MAX_GUILDALLIANCE;i++){
- if( g->alliance[i].guild_id>0 &&
- g->alliance[i].opposition==flag )
- c++;
- }
- return c;
-}
-// “¯–¿ŠÖŒW‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
-// “¯–¿‚È‚ç1A‚»‚êˆÈŠO‚Í0
-int guild_check_alliance(int guild_id1, int guild_id2, int flag)
-{
- struct guild *g;
- int i;
-
- g = guild_search(guild_id1);
- if (g == NULL)
- return 0;
-
- for (i=0; i<MAX_GUILDALLIANCE; i++)
- if ((g->alliance[i].guild_id == guild_id2) && (g->alliance[i].opposition == flag))
- return 1;
-
- return 0;
-}
-// ƒMƒ‹ƒh“¯–¿—v‹
-int guild_reqalliance(struct map_session_data *sd,int account_id)
-{
- struct map_session_data *tsd= map_id2sd(account_id);
- struct guild *g[2];
- int i;
-
- if(agit_flag) { // Disable alliance creation during woe [Valaris]
- clif_displaymessage(sd->fd,"Alliances cannot be made during Guild Wars!");
- return 0;
- } // end addition [Valaris]
-
-
- nullpo_retr(0, sd);
-
- if(tsd==NULL || tsd->status.guild_id<=0)
- return 0;
-
- g[0]=guild_search(sd->status.guild_id);
- g[1]=guild_search(tsd->status.guild_id);
-
- if(g[0]==NULL || g[1]==NULL)
- return 0;
-
- if( guild_get_alliance_count(g[0],0)>3 ) // “¯–¿”Šm”F
- clif_guild_allianceack(sd,4);
- if( guild_get_alliance_count(g[1],0)>3 )
- clif_guild_allianceack(sd,3);
-
- if( tsd->guild_alliance>0 ){ // ‘ŠŽè‚ª“¯–¿—v¿ó‘Ô‚©‚Ç‚¤‚©Šm”F
- clif_guild_allianceack(sd,1);
- return 0;
- }
-
- for(i=0;i<MAX_GUILDALLIANCE;i++){ // ‚·‚Å‚É“¯–¿ó‘Ô‚©Šm”F
- if( g[0]->alliance[i].guild_id==tsd->status.guild_id &&
- g[0]->alliance[i].opposition==0){
- clif_guild_allianceack(sd,0);
- return 0;
- }
- }
-
- tsd->guild_alliance=sd->status.guild_id;
- tsd->guild_alliance_account=sd->status.account_id;
-
- clif_guild_reqalliance(tsd,sd->status.account_id,g[0]->name);
- return 0;
-}
-// ƒMƒ‹ƒhŠ©—U‚Ö‚Ì•Ô“š
-int guild_reply_reqalliance(struct map_session_data *sd,int account_id,int flag)
-{
- struct map_session_data *tsd;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, tsd= map_id2sd( account_id ));
-
- if(sd->guild_alliance!=tsd->status.guild_id) // Š©—U‚ƃMƒ‹ƒhID‚ªˆá‚¤
- return 0;
-
- if(flag==1){ // ³‘ø
- int i;
-
- struct guild *g; // “¯–¿”ÄŠm”F
- if( (g=guild_search(sd->status.guild_id))==NULL ||
- guild_get_alliance_count(g,0)>3 ){
- clif_guild_allianceack(sd,4);
- clif_guild_allianceack(tsd,3);
- return 0;
- }
- if( (g=guild_search(tsd->status.guild_id))==NULL ||
- guild_get_alliance_count(g,0)>3 ){
- clif_guild_allianceack(sd,3);
- clif_guild_allianceack(tsd,4);
- return 0;
- }
-
- // “G‘Ί֌W‚È‚ç“G‘΂ðŽ~‚ß‚é
- if((g=guild_search(sd->status.guild_id)) == NULL)
- return 0;
- for(i=0;i<MAX_GUILDALLIANCE;i++){
- if( g->alliance[i].guild_id==tsd->status.guild_id &&
- g->alliance[i].opposition==1)
- intif_guild_alliance( sd->status.guild_id,tsd->status.guild_id,
- sd->status.account_id,tsd->status.account_id,9 );
- }
- if((g=guild_search(tsd->status.guild_id)) == NULL)
- return 0;
- for(i=0;i<MAX_GUILDALLIANCE;i++){
- if( g->alliance[i].guild_id==sd->status.guild_id &&
- g->alliance[i].opposition==1)
- intif_guild_alliance( tsd->status.guild_id,sd->status.guild_id,
- tsd->status.account_id,sd->status.account_id,9 );
- }
-
- // interŽI‚Ö“¯–¿—v¿
- intif_guild_alliance( sd->status.guild_id,tsd->status.guild_id,
- sd->status.account_id,tsd->status.account_id,0 );
- return 0;
- }else{ // ‹‘”Û
- sd->guild_alliance=0;
- sd->guild_alliance_account=0;
- if(tsd!=NULL)
- clif_guild_allianceack(tsd,3);
- }
- return 0;
-}
-// ƒMƒ‹ƒhŠÖŒW‰ðÁ
-int guild_delalliance(struct map_session_data *sd,int guild_id,int flag)
-{
- if(agit_flag) { // Disable alliance breaking during woe [Valaris]
- clif_displaymessage(sd->fd,"Alliances cannot be broken during Guild Wars!");
- return 0;
- } // end addition [Valaris]
-
- nullpo_retr(0, sd);
-
- intif_guild_alliance( sd->status.guild_id,guild_id,
- sd->status.account_id,0,flag|8 );
- return 0;
-}
-// ƒMƒ‹ƒh“G‘Î
-int guild_opposition(struct map_session_data *sd,int char_id)
-{
- struct map_session_data *tsd=map_id2sd(char_id);
- struct guild *g;
- int i;
-
- nullpo_retr(0, sd);
-
- g=guild_search(sd->status.guild_id);
- if(g==NULL || tsd==NULL)
- return 0;
-
- if( guild_get_alliance_count(g,1)>3 ) // “G‘ΔŠm”F
- clif_guild_oppositionack(sd,1);
-
- for(i=0;i<MAX_GUILDALLIANCE;i++){ // ‚·‚Å‚ÉŠÖŒW‚ðŽ‚Á‚Ä‚¢‚é‚©Šm”F
- if(g->alliance[i].guild_id==tsd->status.guild_id){
- if(g->alliance[i].opposition==1){ // ‚·‚Å‚É“G‘Î
- clif_guild_oppositionack(sd,2);
- return 0;
- }else // “¯–¿”jŠü
- intif_guild_alliance( sd->status.guild_id,tsd->status.guild_id,
- sd->status.account_id,tsd->status.account_id,8 );
- }
- }
-
- // interŽI‚É“G‘Ηv¿
- intif_guild_alliance( sd->status.guild_id,tsd->status.guild_id,
- sd->status.account_id,tsd->status.account_id,1 );
- return 0;
-}
-// ƒMƒ‹ƒh“¯–¿/“G‘Î’Ê’m
-int guild_allianceack(int guild_id1,int guild_id2,int account_id1,int account_id2,
- int flag,const char *name1,const char *name2)
-{
- struct guild *g[2];
- int guild_id[2];
- const char *guild_name[2];
- struct map_session_data *sd[2];
- int j,i;
-
- guild_id[0] = guild_id1;
- guild_id[1] = guild_id2;
- guild_name[0] = name1;
- guild_name[1] = name2;
- sd[0] = map_id2sd(account_id1);
- sd[1] = map_id2sd(account_id2);
-
- g[0]=guild_search(guild_id1);
- g[1]=guild_search(guild_id2);
-
- if(sd[0]!=NULL && (flag&0x0f)==0){
- sd[0]->guild_alliance=0;
- sd[0]->guild_alliance_account=0;
- }
-
- if(flag&0x70){ // Ž¸”s
- for(i=0;i<2-(flag&1);i++)
- if( sd[i]!=NULL )
- clif_guild_allianceack(sd[i],((flag>>4)==i+1)?3:4);
- return 0;
- }
-// if(battle_config.etc_log)
-// printf("guild alliance_ack %d %d %d %d %d %s %s\n",guild_id1,guild_id2,account_id1,account_id2,flag,name1,name2);
-
- if(!(flag&0x08)){ // ŠÖŒW’ljÁ
- for(i=0;i<2-(flag&1);i++)
- if(g[i]!=NULL)
- for(j=0;j<MAX_GUILDALLIANCE;j++)
- if(g[i]->alliance[j].guild_id==0){
- g[i]->alliance[j].guild_id=guild_id[1-i];
- memcpy(g[i]->alliance[j].name,guild_name[1-i],24);
- g[i]->alliance[j].opposition=flag&1;
- break;
- }
- }else{ // ŠÖŒW‰ðÁ
- for(i=0;i<2-(flag&1);i++){
- if(g[i]!=NULL)
- for(j=0;j<MAX_GUILDALLIANCE;j++)
- if( g[i]->alliance[j].guild_id==guild_id[1-i] &&
- g[i]->alliance[j].opposition==(flag&1)){
- g[i]->alliance[j].guild_id=0;
- break;
- }
- if( sd[i]!=NULL ) // ‰ðÁ’Ê’m
- clif_guild_delalliance(sd[i],guild_id[1-i],(flag&1));
- }
- }
-
- if((flag&0x0f)==0){ // “¯–¿’Ê’m
- if( sd[1]!=NULL )
- clif_guild_allianceack(sd[1],2);
- }else if((flag&0x0f)==1){ // “G‘Î’Ê’m
- if( sd[0]!=NULL )
- clif_guild_oppositionack(sd[0],0);
- }
-
-
- for(i=0;i<2-(flag&1);i++){ // “¯–¿/“G‘΃ŠƒXƒg‚ÌÄ‘—M
- struct map_session_data *sd;
- if(g[i]!=NULL)
- for(j=0;j<g[i]->max_member;j++)
- if((sd=g[i]->member[j].sd)!=NULL)
- clif_guild_allianceinfo(sd);
- }
- return 0;
-}
-// ƒMƒ‹ƒh‰ðŽU’Ê’m—p
-int guild_broken_sub(void *key,void *data,va_list ap)
-{
- struct guild *g=(struct guild *)data;
- int guild_id=va_arg(ap,int);
- int i,j;
- struct map_session_data *sd=NULL;
-
- nullpo_retr(0, g);
-
- for(i=0;i<MAX_GUILDALLIANCE;i++){ // ŠÖŒW‚ð”jŠü
- if(g->alliance[i].guild_id==guild_id){
- for(j=0;j<g->max_member;j++)
- if( (sd=g->member[j].sd)!=NULL )
- clif_guild_delalliance(sd,guild_id,g->alliance[i].opposition);
- g->alliance[i].guild_id=0;
- }
- }
- return 0;
-}
-// ƒMƒ‹ƒh‰ðŽU’Ê’m
-int guild_broken(int guild_id,int flag)
-{
- struct guild *g=guild_search(guild_id);
- struct map_session_data *sd;
- int i;
- if(flag!=0 || g==NULL)
- return 0;
-
- for(i=0;i<g->max_member;i++){ // ƒMƒ‹ƒh‰ðŽU‚ð’Ê’m
- if((sd=g->member[i].sd)!=NULL){
- if(sd->state.storage_flag)
- storage_guild_storage_quit(sd,1);
- sd->status.guild_id=0;
- sd->guild_sended=0;
- clif_guild_broken(g->member[i].sd,0);
- }
- }
-
- numdb_foreach(guild_db,guild_broken_sub,guild_id);
- numdb_erase(guild_db,guild_id);
- guild_storage_delete(guild_id);
- aFree(g);
- return 0;
-}
-
-// ƒMƒ‹ƒh‰ðŽU
-int guild_break(struct map_session_data *sd,char *name)
-{
- struct guild *g;
- int i;
-
- nullpo_retr(0, sd);
-
- if( (g=guild_search(sd->status.guild_id))==NULL )
- return 0;
- if(strcmp(g->name,name)!=0)
- return 0;
- if(strcmp(sd->status.name,g->master)!=0)
- return 0;
- for(i=0;i<g->max_member;i++){
- if( g->member[i].account_id>0 && (
- g->member[i].account_id!=sd->status.account_id ||
- g->member[i].char_id!=sd->status.char_id ))
- break;
- }
- if(i<g->max_member){
- clif_guild_broken(sd,2);
- return 0;
- }
-
- intif_guild_break(g->guild_id);
- return 0;
-}
-
-// ƒMƒ‹ƒhéƒf[ƒ^—v‹
-int guild_castledataload(int castle_id,int index)
-{
- return intif_guild_castle_dataload(castle_id,index);
-}
-// ƒMƒ‹ƒhéî•ñŠ“¾ŽžƒCƒxƒ“ƒg’ljÁ
-int guild_addcastleinfoevent(int castle_id,int index,const char *name)
-{
- struct eventlist *ev;
- int code=castle_id|(index<<16);
-
- if( name==NULL || *name==0 )
- return 0;
-
- ev=(struct eventlist *)aCalloc(1,sizeof(struct eventlist));
- memcpy(ev->name,name,sizeof(ev->name));
- ev->next=(struct eventlist *) numdb_search(guild_castleinfoevent_db,code);
- numdb_insert(guild_castleinfoevent_db,code,ev);
- return 0;
-}
-
-// ƒMƒ‹ƒhéƒf[ƒ^—v‹•ÔM
-int guild_castledataloadack(int castle_id,int index,int value)
-{
- struct guild_castle *gc=guild_castle_search(castle_id);
- int code=castle_id|(index<<16);
- struct eventlist *ev,*ev2;
-
- if(gc==NULL){
- return 0;
- }
- switch(index){
- case 1: gc->guild_id = value; break;
- case 2: gc->economy = value; break;
- case 3: gc->defense = value; break;
- case 4: gc->triggerE = value; break;
- case 5: gc->triggerD = value; break;
- case 6: gc->nextTime = value; break;
- case 7: gc->payTime = value; break;
- case 8: gc->createTime = value; break;
- case 9: gc->visibleC = value; break;
- case 10: gc->visibleG0 = value; break;
- case 11: gc->visibleG1 = value; break;
- case 12: gc->visibleG2 = value; break;
- case 13: gc->visibleG3 = value; break;
- case 14: gc->visibleG4 = value; break;
- case 15: gc->visibleG5 = value; break;
- case 16: gc->visibleG6 = value; break;
- case 17: gc->visibleG7 = value; break;
- case 18: gc->Ghp0 = value; break; // guardian HP [Valaris]
- case 19: gc->Ghp1 = value; break;
- case 20: gc->Ghp2 = value; break;
- case 21: gc->Ghp3 = value; break;
- case 22: gc->Ghp4 = value; break;
- case 23: gc->Ghp5 = value; break;
- case 24: gc->Ghp6 = value; break;
- case 25: gc->Ghp7 = value; break; // end additions [Valaris]
- default:
- printf("guild_castledataloadack ERROR!! (Not found index=%d)\n", index);
- return 0;
- }
- if( (ev=(struct eventlist *) numdb_search(guild_castleinfoevent_db,code))!=NULL ){
- numdb_erase(guild_castleinfoevent_db,code);
- while(ev){
- npc_event_do(ev->name);
- ev2=ev->next;
- aFree(ev);
- ev=ev2;
- }
- }
- return 1;
-}
-// ƒMƒ‹ƒhéƒf[ƒ^•ÏX—v‹
-int guild_castledatasave(int castle_id,int index,int value)
-{
- return intif_guild_castle_datasave(castle_id,index,value);
-}
-
-// ƒMƒ‹ƒhéƒf[ƒ^•ÏX’Ê’m
-int guild_castledatasaveack(int castle_id,int index,int value)
-{
- struct guild_castle *gc=guild_castle_search(castle_id);
- if(gc==NULL){
- return 0;
- }
- switch(index){
- case 1: gc->guild_id = value; break;
- case 2: gc->economy = value; break;
- case 3: gc->defense = value; break;
- case 4: gc->triggerE = value; break;
- case 5: gc->triggerD = value; break;
- case 6: gc->nextTime = value; break;
- case 7: gc->payTime = value; break;
- case 8: gc->createTime = value; break;
- case 9: gc->visibleC = value; break;
- case 10: gc->visibleG0 = value; break;
- case 11: gc->visibleG1 = value; break;
- case 12: gc->visibleG2 = value; break;
- case 13: gc->visibleG3 = value; break;
- case 14: gc->visibleG4 = value; break;
- case 15: gc->visibleG5 = value; break;
- case 16: gc->visibleG6 = value; break;
- case 17: gc->visibleG7 = value; break;
- case 18: gc->Ghp0 = value; break; // guardian HP [Valaris]
- case 19: gc->Ghp1 = value; break;
- case 20: gc->Ghp2 = value; break;
- case 21: gc->Ghp3 = value; break;
- case 22: gc->Ghp4 = value; break;
- case 23: gc->Ghp5 = value; break;
- case 24: gc->Ghp6 = value; break;
- case 25: gc->Ghp7 = value; break; // end additions [Valaris]
- default:
- printf("guild_castledatasaveack ERROR!! (Not found index=%d)\n", index);
- return 0;
- }
- return 1;
-}
-
-// ƒMƒ‹ƒhƒf[ƒ^ˆêŠ‡ŽóMi‰Šú‰»Žžj
-int guild_castlealldataload(int len,struct guild_castle *gc)
-{
- int i;
- int n = (len-4) / sizeof(struct guild_castle), ev = -1;
-
- nullpo_retr(0, gc);
-
- // ƒCƒxƒ“ƒg•t‚«‚Å—v‹‚·‚éƒf[ƒ^ˆÊ’u‚ð’T‚·(ÅŒã‚Ìè‹’ƒf[ƒ^)
- for(i = 0; i < n; i++) {
- if ((gc + i)->guild_id)
- ev = i;
- }
-
- // éƒf[ƒ^Ši”[‚ƃMƒ‹ƒhî•ñ—v‹
- for(i = 0; i < n; i++, gc++) {
- struct guild_castle *c = guild_castle_search(gc->castle_id);
- if (!c) {
- printf("guild_castlealldataload ??\n");
- continue;
- }
- memcpy(&c->guild_id,&gc->guild_id,
- sizeof(struct guild_castle) - ((int)&c->guild_id - (int)c) );
- if( c->guild_id ){
- if(i!=ev)
- guild_request_info(c->guild_id);
- else
- guild_npc_request_info(c->guild_id, "::OnAgitInit");
- }
- }
- if (ev == -1)
- npc_event_doall("OnAgitInit");
- return 0;
-}
-
-int guild_agit_start(void)
-{ // Run All NPC_Event[OnAgitStart]
- int c = npc_event_doall("OnAgitStart");
- printf("NPC_Event:[OnAgitStart] Run (%d) Events by @AgitStart.\n",c);
- // Start auto saving
- guild_save_timer = add_timer_interval (gettick() + GUILD_SAVE_INTERVAL, guild_save_sub, 0, 0, GUILD_SAVE_INTERVAL);
- return 0;
-}
-
-int guild_agit_end(void)
-{ // Run All NPC_Event[OnAgitEnd]
- int c = npc_event_doall("OnAgitEnd");
- printf("NPC_Event:[OnAgitEnd] Run (%d) Events by @AgitEnd.\n",c);
- // Stop auto saving
- delete_timer (guild_save_timer, guild_save_sub);
- return 0;
-}
-
-int guild_gvg_eliminate_timer(int tid,unsigned int tick,int id,int data)
-{ // Run One NPC_Event[OnAgitEliminate]
- char *name = (char*)data;
- size_t len = (name) ? strlen(name) : 0;
- // the rest is dangerous, but let it crash,
- // if this happens, it's ruined anyway
- char *evname=(char*)aMalloc( (len + 4) * sizeof(char));
- int c=0;
-
- if(agit_flag) // Agit not already End
- {
- memcpy(evname,name,len - 5);
- strcpy(evname + len - 5,"Eliminate");
- c = npc_event_do(evname);
- printf("NPC_Event:[%s] Run (%d) Events.\n",evname,c);
- }
- if(name) aFree(name);
- return 0;
-}
-
-static int Ghp[MAX_GUILDCASTLE][8]; // so save only if HP are changed // experimental code [Yor]
-static int Gid[MAX_GUILDCASTLE];
-int guild_save_sub(int tid,unsigned int tick,int id,int data)
-{
- struct guild_castle *gc;
- int i;
-
- for(i = 0; i < MAX_GUILDCASTLE; i++) { // [Yor]
- gc = guild_castle_search(i);
- if (!gc) continue;
- if (gc->guild_id != Gid[i]) {
- // Re-save guild id if its owner guild has changed
- // This should already be done in gldfunc_ev_agit.txt,
- // but since people have complained... Well x3
- guild_castledatasave(gc->castle_id, 1, gc->guild_id);
- Gid[i] = gc->guild_id;
- }
- if (gc->visibleG0 == 1 && Ghp[i][0] != gc->Ghp0) {
- guild_castledatasave(gc->castle_id, 18, gc->Ghp0);
- Ghp[i][0] = gc->Ghp0;
- }
- if (gc->visibleG1 == 1 && Ghp[i][1] != gc->Ghp1) {
- guild_castledatasave(gc->castle_id, 19, gc->Ghp1);
- Ghp[i][1] = gc->Ghp1;
- }
- if (gc->visibleG2 == 1 && Ghp[i][2] != gc->Ghp2) {
- guild_castledatasave(gc->castle_id, 20, gc->Ghp2);
- Ghp[i][2] = gc->Ghp2;
- }
- if (gc->visibleG3 == 1 && Ghp[i][3] != gc->Ghp3) {
- guild_castledatasave(gc->castle_id, 21, gc->Ghp3);
- Ghp[i][3] = gc->Ghp3;
- }
- if (gc->visibleG4 == 1 && Ghp[i][4] != gc->Ghp4) {
- guild_castledatasave(gc->castle_id, 22, gc->Ghp4);
- Ghp[i][4] = gc->Ghp4;
- }
- if (gc->visibleG5 == 1 && Ghp[i][5] != gc->Ghp5) {
- guild_castledatasave(gc->castle_id, 23, gc->Ghp5);
- Ghp[i][5] = gc->Ghp5;
- }
- if (gc->visibleG6 == 1 && Ghp[i][6] != gc->Ghp6) {
- guild_castledatasave(gc->castle_id, 24, gc->Ghp6);
- Ghp[i][6] = gc->Ghp6;
- }
- if (gc->visibleG7 == 1 && Ghp[i][7] != gc->Ghp7) {
- guild_castledatasave(gc->castle_id, 25, gc->Ghp7);
- Ghp[i][7] = gc->Ghp7;
- }
- }
-
- return 0;
-}
-
-int guild_agit_break(struct mob_data *md)
-{ // Run One NPC_Event[OnAgitBreak]
- char *evname;
-
- nullpo_retr(0, md);
-
- evname=(char *)aCallocA(strlen(md->npc_event) + 1, sizeof(char));
-
- strcpy(evname,md->npc_event);
-// Now By User to Run [OnAgitBreak] NPC Event...
-// It's a little impossible to null point with player disconnect in this!
-// But Script will be stop, so nothing...
-// Maybe will be changed in the futher..
-// int c = npc_event_do(evname);
- if(!agit_flag) return 0; // Agit already End
- add_timer(gettick()+battle_config.gvg_eliminate_time,guild_gvg_eliminate_timer,md->bl.m,(int)evname);
- return 0;
-}
-
-// [MouseJstr]
-// How many castles does this guild have?
-int guild_checkcastles(struct guild *g) {
- int i,nb_cas=0, id,cas_id=0;
- struct guild_castle *gc;
- id=g->guild_id;
- for(i=0;i<MAX_GUILDCASTLE;i++){
- gc=guild_castle_search(i);
- cas_id=gc->guild_id;
- if(g->guild_id==cas_id)
- nb_cas=nb_cas+1;
- } //end for
- return nb_cas;
-}
-
-// [MouseJstr]
-// is this guild allied with this castle?
-int guild_isallied(struct guild *g, struct guild_castle *gc)
-{
- int i;
-
- nullpo_retr(0, g);
-
- if(g->guild_id == gc->guild_id)
- return 1;
-
- if (gc->guild_id == 0)
- return 0;
-
-
- for(i=0;i<MAX_GUILDALLIANCE;i++)
- if(g->alliance[i].guild_id == gc->guild_id) {
- if(g->alliance[i].opposition == 0)
- return 1;
- else
- return 0;
- }
-
- return 0;
-}
-
-static int guild_db_final(void *key,void *data,va_list ap)
-{
- struct guild *g=(struct guild *) data;
-
- aFree(g);
-
- return 0;
-}
-static int castle_db_final(void *key,void *data,va_list ap)
-{
- struct guild_castle *gc=(struct guild_castle *) data;
-
- aFree(gc);
-
- return 0;
-}
-static int guild_expcache_db_final(void *key,void *data,va_list ap)
-{
- struct guild_expcache *c=(struct guild_expcache *) data;
-
- aFree(c);
-
- return 0;
-}
-static int guild_infoevent_db_final(void *key,void *data,va_list ap)
-{
- struct eventlist *ev=(struct eventlist *) data;
-
- aFree(ev);
-
- return 0;
-}
-void do_final_guild(void)
-{
- if(guild_db)
- numdb_final(guild_db,guild_db_final);
- if(castle_db)
- numdb_final(castle_db,castle_db_final);
- if(guild_expcache_db)
- numdb_final(guild_expcache_db,guild_expcache_db_final);
- if(guild_infoevent_db)
- numdb_final(guild_infoevent_db,guild_infoevent_db_final);
- if(guild_castleinfoevent_db)
- numdb_final(guild_castleinfoevent_db,guild_infoevent_db_final);
-}
diff --git a/src/map/guild.h b/src/map/guild.h
deleted file mode 100644
index 1dee350a1..000000000
--- a/src/map/guild.h
+++ /dev/null
@@ -1,89 +0,0 @@
-// $Id: guild.h,v 1.4 2004/09/25 05:32:18 MouseJstr Exp $
-#ifndef _GUILD_H_
-#define _GUILD_H_
-
-struct map_session_data;
-struct mob_data;
-struct guild;
-struct guild_member;
-struct guild_position;
-struct guild_castle;
-
-int guild_skill_get_inf(int id);
-int guild_skill_get_sp(int id,int lv);
-int guild_skill_get_range(int id);
-int guild_skill_get_max(int id);
-
-int guild_checkskill(struct guild *g,int id);
-int guild_checkcastles(struct guild *g); // [MouseJstr]
-int guild_isallied(struct guild *g, struct guild_castle *gc);
-
-void do_init_guild(void);
-struct guild *guild_search(int guild_id);
-struct guild *guild_searchname(char *str);
-struct guild_castle *guild_castle_search(int gcid);
-
-struct guild_castle *guild_mapname2gc(char *mapname);
-
-struct map_session_data *guild_getavailablesd(struct guild *g);
-int guild_getindex(struct guild *g,int account_id,int char_id);
-int guild_getposition(struct map_session_data *sd,struct guild *g);
-int guild_payexp(struct map_session_data *sd,int exp);
-int guild_getexp(struct map_session_data *sd,int exp); // [Celest]
-
-int guild_create(struct map_session_data *sd,char *name);
-int guild_created(int account_id,int guild_id);
-int guild_request_info(int guild_id);
-int guild_recv_noinfo(int guild_id);
-int guild_recv_info(struct guild *sg);
-int guild_npc_request_info(int guild_id,const char *ev);
-int guild_invite(struct map_session_data *sd,int account_id);
-int guild_reply_invite(struct map_session_data *sd,int guild_id,int flag);
-int guild_member_added(int guild_id,int account_id,int char_id,int flag);
-int guild_leave(struct map_session_data *sd,int guild_id,
- int account_id,int char_id,const char *mes);
-int guild_member_leaved(int guild_id,int account_id,int char_id,int flag,
- const char *name,const char *mes);
-int guild_explusion(struct map_session_data *sd,int guild_id,
- int account_id,int char_id,const char *mes);
-int guild_skillup(struct map_session_data *sd,int skill_num,int flag);
-int guild_reqalliance(struct map_session_data *sd,int account_id);
-int guild_reply_reqalliance(struct map_session_data *sd,int account_id,int flag);
-int guild_alliance(int guild_id1,int guild_id2,int account_id1,int account_id2);
-int guild_allianceack(int guild_id1,int guild_id2,int account_id1,int account_id2,
- int flag,const char *name1,const char *name2);
-int guild_delalliance(struct map_session_data *sd,int guild_id,int flag);
-int guild_opposition(struct map_session_data *sd,int char_id);
-int guild_check_alliance(int guild_id1, int guild_id2, int flag);
-
-int guild_send_memberinfoshort(struct map_session_data *sd,int online);
-int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int online,int lv,int class_);
-int guild_change_memberposition(int guild_id,int account_id,int char_id,int idx);
-int guild_memberposition_changed(struct guild *g,int idx,int pos);
-int guild_change_position(struct map_session_data *sd,int idx,
- int mode,int exp_mode,const char *name);
-int guild_position_changed(int guild_id,int idx,struct guild_position *p);
-int guild_change_notice(struct map_session_data *sd,int guild_id,const char *mes1,const char *mes2);
-int guild_notice_changed(int guild_id,const char *mes1,const char *mes2);
-int guild_change_emblem(struct map_session_data *sd,int len,const char *data);
-int guild_emblem_changed(int len,int guild_id,int emblem_id,const char *data);
-int guild_send_message(struct map_session_data *sd,char *mes,int len);
-int guild_recv_message(int guild_id,int account_id,char *mes,int len);
-int guild_skillupack(int guild_id,int skill_num,int account_id);
-int guild_break(struct map_session_data *sd,char *name);
-int guild_broken(int guild_id,int flag);
-
-int guild_addcastleinfoevent(int castle_id,int index,const char *name);
-int guild_castledataload(int castle_id,int index);
-int guild_castledataloadack(int castle_id,int index,int value);
-int guild_castledatasave(int castle_id,int index,int value);
-int guild_castledatasaveack(int castle_id,int index,int value);
-int guild_castlealldataload(int len,struct guild_castle *gc);
-
-int guild_agit_start(void);
-int guild_agit_end(void);
-int guild_agit_break(struct mob_data *md);
-
-void do_final_guild(void);
-
-#endif
diff --git a/src/map/intif.c b/src/map/intif.c
deleted file mode 100644
index 3aa472ad8..000000000
--- a/src/map/intif.c
+++ /dev/null
@@ -1,1167 +0,0 @@
-// $Id: intif.c,v 1.2 2004/09/25 05:32:18 MouseJstr Exp $
-#include <sys/types.h>
-#ifdef _WIN32
-#include <winsock.h>
-#else
-#include <sys/socket.h>
-#include <netinet/in.h>
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#ifndef _WIN32
-#include <sys/time.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-#include <arpa/inet.h>
-#endif
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-
-#include "socket.h"
-#include "timer.h"
-#include "map.h"
-#include "battle.h"
-#include "chrif.h"
-#include "clif.h"
-#include "pc.h"
-#include "intif.h"
-#include "storage.h"
-#include "party.h"
-#include "guild.h"
-#include "pet.h"
-#include "nullpo.h"
-#include "malloc.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-static const int packet_len_table[]={
- -1,-1,27,-1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- -1, 7, 0, 0, 0, 0, 0, 0, -1,11, 0, 0, 0, 0, 0, 0,
- 35,-1,11,15, 34,29, 7,-1, 0, 0, 0, 0, 0, 0, 0, 0,
- 10,-1,15, 0, 79,19, 7,-1, 0,-1,-1,-1, 14,67,186,-1,
- 9, 9,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 11,-1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-extern int char_fd; // inter server‚Ìfd‚Íchar_fd‚ðŽg‚¤
-#define inter_fd (char_fd) // ƒGƒCƒŠƒAƒX
-
-//-----------------------------------------------------------------
-// inter server‚Ö‚Ì‘—M
-
-int CheckForCharServer() {
- return ((char_fd == -1) || session[char_fd] == NULL || session[char_fd]->wdata == NULL);
-}
-
-// pet
-int intif_create_pet(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 incuvate,char *pet_name)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd,0) = 0x3080;
- WFIFOL(inter_fd,2) = account_id;
- WFIFOL(inter_fd,6) = char_id;
- WFIFOW(inter_fd,10) = pet_class;
- WFIFOW(inter_fd,12) = pet_lv;
- WFIFOW(inter_fd,14) = pet_egg_id;
- WFIFOW(inter_fd,16) = pet_equip;
- WFIFOW(inter_fd,18) = intimate;
- WFIFOW(inter_fd,20) = hungry;
- WFIFOB(inter_fd,22) = rename_flag;
- WFIFOB(inter_fd,23) = incuvate;
- memcpy(WFIFOP(inter_fd,24),pet_name,24);
- WFIFOSET(inter_fd,48);
-
- return 0;
-}
-
-int intif_request_petdata(int account_id,int char_id,int pet_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd,0) = 0x3081;
- WFIFOL(inter_fd,2) = account_id;
- WFIFOL(inter_fd,6) = char_id;
- WFIFOL(inter_fd,10) = pet_id;
- WFIFOSET(inter_fd,14);
-
- return 0;
-}
-
-int intif_save_petdata(int account_id,struct s_pet *p)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd,0) = 0x3082;
- WFIFOW(inter_fd,2) = sizeof(struct s_pet) + 8;
- WFIFOL(inter_fd,4) = account_id;
- memcpy(WFIFOP(inter_fd,8),p,sizeof(struct s_pet));
- WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
-
- return 0;
-}
-
-int intif_delete_petdata(int pet_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd,0) = 0x3083;
- WFIFOL(inter_fd,2) = pet_id;
- WFIFOSET(inter_fd,6);
-
- return 0;
-}
-
-// GMƒƒbƒZ[ƒW‚ð‘—M
-int intif_GMmessage(char* mes,int len,int flag)
-{
- int lp = (flag&0x10) ? 8 : 4;
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd,0) = 0x3000;
- WFIFOW(inter_fd,2) = lp + len;
- WFIFOL(inter_fd,4) = 0x65756c62;
- memcpy(WFIFOP(inter_fd,lp), mes, len);
- WFIFOSET(inter_fd, WFIFOW(inter_fd,2));
-
- // Send to the local players
- clif_GMmessage(NULL, mes, len, 0);
-
- return 0;
-}
-
-// The transmission of Wisp/Page to inter-server (player not found on this server)
-int intif_wis_message(struct map_session_data *sd, char *nick, char *mes, int mes_len) {
- nullpo_retr(0, sd);
- if (CheckForCharServer())
- return 0;
-
- WFIFOW(inter_fd,0) = 0x3001;
- WFIFOW(inter_fd,2) = mes_len + 52;
- memcpy(WFIFOP(inter_fd,4), sd->status.name, 24);
- memcpy(WFIFOP(inter_fd,28), nick, 24);
- memcpy(WFIFOP(inter_fd,52), mes, mes_len);
- WFIFOSET(inter_fd, WFIFOW(inter_fd,2));
-
- if (battle_config.etc_log)
- printf("intif_wis_message from %s to %s (message: '%s')\n", sd->status.name, nick, mes);
-
- return 0;
-}
-
-// The reply of Wisp/page
-int intif_wis_replay(int id, int flag) {
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd,0) = 0x3002;
- WFIFOL(inter_fd,2) = id;
- WFIFOB(inter_fd,6) = flag; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- WFIFOSET(inter_fd,7);
-
- if (battle_config.etc_log)
- printf("intif_wis_replay: id: %d, flag:%d\n", id, flag);
-
- return 0;
-}
-
-// The transmission of GM only Wisp/Page from server to inter-server
-int intif_wis_message_to_gm(char *Wisp_name, int min_gm_level, char *mes) {
- int mes_len;
- if (CheckForCharServer())
- return 0;
- mes_len = strlen(mes) + 1; // + null
- WFIFOW(inter_fd,0) = 0x3003;
- WFIFOW(inter_fd,2) = mes_len + 30;
- memcpy(WFIFOP(inter_fd,4), Wisp_name, 24);
- WFIFOW(inter_fd,28) = (short)min_gm_level;
- memcpy(WFIFOP(inter_fd,30), mes, mes_len);
- WFIFOSET(inter_fd, WFIFOW(inter_fd,2));
-
- if (battle_config.etc_log)
- printf("intif_wis_message_to_gm: from: '%s', min level: %d, message: '%s'.\n", Wisp_name, min_gm_level, mes);
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒg•Ï”‘—M
-int intif_saveaccountreg(struct map_session_data *sd) {
- int j,p;
- if (CheckForCharServer())
- return 0;
-
- nullpo_retr(0, sd);
-
- if (sd->status.account_reg_num == -1)
- return 0;
-
- WFIFOW(inter_fd,0) = 0x3004;
- WFIFOL(inter_fd,4) = sd->bl.id;
- for(j=0,p=8;j<sd->status.account_reg_num;j++,p+=36){
- memcpy(WFIFOP(inter_fd,p),sd->status.account_reg[j].str,32);
- WFIFOL(inter_fd,p+32)=sd->status.account_reg[j].value;
- }
- WFIFOW(inter_fd,2)=p;
- WFIFOSET(inter_fd,p);
- return 0;
-}
-// ƒAƒJƒEƒ“ƒg•Ï”—v‹
-int intif_request_accountreg(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
- if (CheckForCharServer())
- return 0;
-
- WFIFOW(inter_fd,0) = 0x3005;
- WFIFOL(inter_fd,2) = sd->bl.id;
- WFIFOSET(inter_fd,6);
-
- sd->status.account_reg_num = -1;
-
- return 0;
-}
-
-// ‘qŒÉƒf[ƒ^—v‹
-int intif_request_storage(int account_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd,0) = 0x3010;
- WFIFOL(inter_fd,2) = account_id;
- WFIFOSET(inter_fd,6);
- return 0;
-}
-// ‘qŒÉƒf[ƒ^‘—M
-int intif_send_storage(struct storage *stor)
-{
- if (CheckForCharServer())
- return 0;
- nullpo_retr(0, stor);
- WFIFOW(inter_fd,0) = 0x3011;
- WFIFOW(inter_fd,2) = sizeof(struct storage)+8;
- WFIFOL(inter_fd,4) = stor->account_id;
- memcpy( WFIFOP(inter_fd,8),stor, sizeof(struct storage) );
- WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
- return 0;
-}
-
-int intif_request_guild_storage(int account_id,int guild_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd,0) = 0x3018;
- WFIFOL(inter_fd,2) = account_id;
- WFIFOL(inter_fd,6) = guild_id;
- WFIFOSET(inter_fd,10);
- return 0;
-}
-int intif_send_guild_storage(int account_id,struct guild_storage *gstor)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd,0) = 0x3019;
- WFIFOW(inter_fd,2) = sizeof(struct guild_storage)+12;
- WFIFOL(inter_fd,4) = account_id;
- WFIFOL(inter_fd,8) = gstor->guild_id;
- memcpy( WFIFOP(inter_fd,12),gstor, sizeof(struct guild_storage) );
- WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
- return 0;
-}
-
-// ƒp[ƒeƒB쬗v‹
-int intif_create_party(struct map_session_data *sd,char *name,int item,int item2)
-{
- if (CheckForCharServer())
- return 0;
- nullpo_retr(0, sd);
-
- WFIFOW(inter_fd,0) = 0x3020;
- WFIFOL(inter_fd,2) = sd->status.account_id;
- memcpy(WFIFOP(inter_fd, 6),name,24);
- memcpy(WFIFOP(inter_fd,30),sd->status.name,24);
- memcpy(WFIFOP(inter_fd,54),map[sd->bl.m].name,16);
- WFIFOW(inter_fd,70)= sd->status.base_level;
- WFIFOB(inter_fd,72)= item;
- WFIFOB(inter_fd,73)= item2;
- WFIFOSET(inter_fd,74);
-// if(battle_config.etc_log)
-// printf("intif: create party\n");
- return 0;
-}
-// ƒp[ƒeƒBî•ñ—v‹
-int intif_request_partyinfo(int party_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd,0) = 0x3021;
- WFIFOL(inter_fd,2) = party_id;
- WFIFOSET(inter_fd,6);
-// if(battle_config.etc_log)
-// printf("intif: request party info\n");
- return 0;
-}
-// ƒp[ƒeƒB’ljÁ—v‹
-int intif_party_addmember(int party_id,int account_id)
-{
- struct map_session_data *sd;
- if (CheckForCharServer())
- return 0;
- sd=map_id2sd(account_id);
-// if(battle_config.etc_log)
-// printf("intif: party add member %d %d\n",party_id,account_id);
- if(sd!=NULL){
- WFIFOW(inter_fd,0)=0x3022;
- WFIFOL(inter_fd,2)=party_id;
- WFIFOL(inter_fd,6)=account_id;
- memcpy(WFIFOP(inter_fd,10),sd->status.name,24);
- memcpy(WFIFOP(inter_fd,34),map[sd->bl.m].name,16);
- WFIFOW(inter_fd,50)=sd->status.base_level;
- WFIFOSET(inter_fd,52);
- }
- return 0;
-}
-// ƒp[ƒeƒBÝ’è•ÏX
-int intif_party_changeoption(int party_id,int account_id,int exp,int item)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd,0)=0x3023;
- WFIFOL(inter_fd,2)=party_id;
- WFIFOL(inter_fd,6)=account_id;
- WFIFOW(inter_fd,10)=exp;
- WFIFOW(inter_fd,12)=item;
- WFIFOSET(inter_fd,14);
- return 0;
-}
-// ƒp[ƒeƒB’E‘Þ—v‹
-int intif_party_leave(int party_id,int account_id)
-{
- if (CheckForCharServer())
- return 0;
-// if(battle_config.etc_log)
-// printf("intif: party leave %d %d\n",party_id,account_id);
- WFIFOW(inter_fd,0)=0x3024;
- WFIFOL(inter_fd,2)=party_id;
- WFIFOL(inter_fd,6)=account_id;
- WFIFOSET(inter_fd,10);
- return 0;
-}
-// ƒp[ƒeƒBˆÚ“®—v‹
-int intif_party_changemap(struct map_session_data *sd,int online)
-{
- if (CheckForCharServer())
- return 0;
- if(sd!=NULL){
- WFIFOW(inter_fd,0)=0x3025;
- WFIFOL(inter_fd,2)=sd->status.party_id;
- WFIFOL(inter_fd,6)=sd->status.account_id;
- memcpy(WFIFOP(inter_fd,10),map[sd->bl.m].name,16);
- WFIFOB(inter_fd,26)=online;
- WFIFOW(inter_fd,27)=sd->status.base_level;
- WFIFOSET(inter_fd,29);
- }
-// if(battle_config.etc_log)
-// printf("party: change map\n");
- return 0;
-}
-// ƒp[ƒeƒB[‰ðŽU—v‹
-int intif_break_party(int party_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd,0)=0x3026;
- WFIFOL(inter_fd,2)=party_id;
- WFIFOSET(inter_fd,6);
- return 0;
-}
-// ƒp[ƒeƒB‰ï˜b‘—M
-int intif_party_message(int party_id,int account_id,char *mes,int len)
-{
- if (CheckForCharServer())
- return 0;
-// if(battle_config.etc_log)
-// printf("intif_party_message: %s\n",mes);
- WFIFOW(inter_fd,0)=0x3027;
- WFIFOW(inter_fd,2)=len+12;
- WFIFOL(inter_fd,4)=party_id;
- WFIFOL(inter_fd,8)=account_id;
- memcpy(WFIFOP(inter_fd,12),mes,len);
- WFIFOSET(inter_fd,len+12);
- return 0;
-}
-// ƒp[ƒeƒB‹£‡ƒ`ƒFƒbƒN—v‹
-int intif_party_checkconflict(int party_id,int account_id,char *nick)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd,0)=0x3028;
- WFIFOL(inter_fd,2)=party_id;
- WFIFOL(inter_fd,6)=account_id;
- memcpy(WFIFOP(inter_fd,10),nick,24);
- WFIFOSET(inter_fd,34);
- return 0;
-}
-
-// ƒMƒ‹ƒh쬗v‹
-int intif_guild_create(const char *name,const struct guild_member *master)
-{
- if (CheckForCharServer())
- return 0;
- nullpo_retr(0, master);
-
- WFIFOW(inter_fd,0)=0x3030;
- WFIFOW(inter_fd,2)=sizeof(struct guild_member)+32;
- WFIFOL(inter_fd,4)=master->account_id;
- memcpy(WFIFOP(inter_fd,8),name,24);
- memcpy(WFIFOP(inter_fd,32),master,sizeof(struct guild_member));
- WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
- return 0;
-}
-// ƒMƒ‹ƒhî•ñ—v‹
-int intif_guild_request_info(int guild_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd,0) = 0x3031;
- WFIFOL(inter_fd,2) = guild_id;
- WFIFOSET(inter_fd,6);
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒo’ljÁ—v‹
-int intif_guild_addmember(int guild_id,struct guild_member *m)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd,0) = 0x3032;
- WFIFOW(inter_fd,2) = sizeof(struct guild_member)+8;
- WFIFOL(inter_fd,4) = guild_id;
- memcpy(WFIFOP(inter_fd,8),m,sizeof(struct guild_member));
- WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒo’E‘Þ/’Ç•ú—v‹
-int intif_guild_leave(int guild_id,int account_id,int char_id,int flag,const char *mes)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd, 0) = 0x3034;
- WFIFOL(inter_fd, 2) = guild_id;
- WFIFOL(inter_fd, 6) = account_id;
- WFIFOL(inter_fd,10) = char_id;
- WFIFOB(inter_fd,14) = flag;
- memcpy(WFIFOP(inter_fd,15),mes,40);
- WFIFOSET(inter_fd,55);
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒo‚̃Iƒ“ƒ‰ƒCƒ“ó‹µ/LvXV—v‹
-int intif_guild_memberinfoshort(int guild_id,
- int account_id,int char_id,int online,int lv,int class_)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd, 0) = 0x3035;
- WFIFOL(inter_fd, 2) = guild_id;
- WFIFOL(inter_fd, 6) = account_id;
- WFIFOL(inter_fd,10) = char_id;
- WFIFOB(inter_fd,14) = online;
- WFIFOW(inter_fd,15) = lv;
- WFIFOW(inter_fd,17) = class_;
- WFIFOSET(inter_fd,19);
- return 0;
-}
-// ƒMƒ‹ƒh‰ðŽU’Ê’m
-int intif_guild_break(int guild_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd, 0) = 0x3036;
- WFIFOL(inter_fd, 2) = guild_id;
- WFIFOSET(inter_fd,6);
- return 0;
-}
-// ƒMƒ‹ƒh‰ï˜b‘—M
-int intif_guild_message(int guild_id,int account_id,char *mes,int len)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd,0)=0x3037;
- WFIFOW(inter_fd,2)=len+12;
- WFIFOL(inter_fd,4)=guild_id;
- WFIFOL(inter_fd,8)=account_id;
- memcpy(WFIFOP(inter_fd,12),mes,len);
- WFIFOSET(inter_fd,len+12);
-
- return 0;
-}
-// ƒMƒ‹ƒh‹£‡ƒ`ƒFƒbƒN—v‹
-int intif_guild_checkconflict(int guild_id,int account_id,int char_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd, 0)=0x3038;
- WFIFOL(inter_fd, 2)=guild_id;
- WFIFOL(inter_fd, 6)=account_id;
- WFIFOL(inter_fd,10)=char_id;
- WFIFOSET(inter_fd,14);
- return 0;
-}
-// ƒMƒ‹ƒhŠî–{î•ñ•ÏX—v‹
-int intif_guild_change_basicinfo(int guild_id,int type,const void *data,int len)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd,0)=0x3039;
- WFIFOW(inter_fd,2)=len+10;
- WFIFOL(inter_fd,4)=guild_id;
- WFIFOW(inter_fd,8)=type;
- memcpy(WFIFOP(inter_fd,10),data,len);
- WFIFOSET(inter_fd,len+10);
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒoî•ñ•ÏX—v‹
-int intif_guild_change_memberinfo(int guild_id,int account_id,int char_id,
- int type,const void *data,int len)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd, 0)=0x303a;
- WFIFOW(inter_fd, 2)=len+18;
- WFIFOL(inter_fd, 4)=guild_id;
- WFIFOL(inter_fd, 8)=account_id;
- WFIFOL(inter_fd,12)=char_id;
- WFIFOW(inter_fd,16)=type;
- memcpy(WFIFOP(inter_fd,18),data,len);
- WFIFOSET(inter_fd,len+18);
- return 0;
-}
-// ƒMƒ‹ƒh–ðE•ÏX—v‹
-int intif_guild_position(int guild_id,int idx,struct guild_position *p)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd,0)=0x303b;
- WFIFOW(inter_fd,2)=sizeof(struct guild_position)+12;
- WFIFOL(inter_fd,4)=guild_id;
- WFIFOL(inter_fd,8)=idx;
- memcpy(WFIFOP(inter_fd,12),p,sizeof(struct guild_position));
- WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
- return 0;
-}
-// ƒMƒ‹ƒhƒXƒLƒ‹ƒAƒbƒv—v‹
-int intif_guild_skillup(int guild_id,int skill_num,int account_id,int flag)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd, 0)=0x303c;
- WFIFOL(inter_fd, 2)=guild_id;
- WFIFOL(inter_fd, 6)=skill_num;
- WFIFOL(inter_fd,10)=account_id;
- //WFIFOL(inter_fd,14)=flag;
- WFIFOSET(inter_fd,14);
- return 0;
-}
-// ƒMƒ‹ƒh“¯–¿/“G‘Ηv‹
-int intif_guild_alliance(int guild_id1,int guild_id2,int account_id1,int account_id2,int flag)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd, 0)=0x303d;
- WFIFOL(inter_fd, 2)=guild_id1;
- WFIFOL(inter_fd, 6)=guild_id2;
- WFIFOL(inter_fd,10)=account_id1;
- WFIFOL(inter_fd,14)=account_id2;
- WFIFOB(inter_fd,18)=flag;
- WFIFOSET(inter_fd,19);
- return 0;
-}
-// ƒMƒ‹ƒh’m•ÏX—v‹
-int intif_guild_notice(int guild_id,const char *mes1,const char *mes2)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd,0)=0x303e;
- WFIFOL(inter_fd,2)=guild_id;
- memcpy(WFIFOP(inter_fd,6),mes1,60);
- memcpy(WFIFOP(inter_fd,66),mes2,120);
- WFIFOSET(inter_fd,186);
- return 0;
-}
-// ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX—v‹
-int intif_guild_emblem(int guild_id,int len,const char *data)
-{
- if (CheckForCharServer())
- return 0;
- if(guild_id<=0 || len<0 || len>2000)
- return 0;
- WFIFOW(inter_fd,0)=0x303f;
- WFIFOW(inter_fd,2)=len+12;
- WFIFOL(inter_fd,4)=guild_id;
- WFIFOL(inter_fd,8)=0;
- memcpy(WFIFOP(inter_fd,12),data,len);
- WFIFOSET(inter_fd,len+12);
- return 0;
-}
-//Œ»Ý‚̃Mƒ‹ƒhéè—̃Mƒ‹ƒh‚𒲂ׂé
-int intif_guild_castle_dataload(int castle_id,int index)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd,0)=0x3040;
- WFIFOW(inter_fd,2)=castle_id;
- WFIFOB(inter_fd,4)=index;
- WFIFOSET(inter_fd,5);
- return 0;
-}
-
-//ƒMƒ‹ƒhéè—̃Mƒ‹ƒh•ÏX—v‹
-int intif_guild_castle_datasave(int castle_id,int index, int value)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOW(inter_fd,0)=0x3041;
- WFIFOW(inter_fd,2)=castle_id;
- WFIFOB(inter_fd,4)=index;
- WFIFOL(inter_fd,5)=value;
- WFIFOSET(inter_fd,9);
- return 0;
-}
-
-//-----------------------------------------------------------------
-// Packets receive from inter server
-
-// Wisp/Page reception
-int intif_parse_WisMessage(int fd) { // rewritten by [Yor]
- struct map_session_data* sd;
- char *wisp_source;
- int id=RFIFOL(fd,4);
- int i=0; //,j=0;
-
-// if(battle_config.etc_log)
-// printf("intif_parse_wismessage: %d %s %s %s\n",id,RFIFOP(fd,6),RFIFOP(fd,30),RFIFOP(fd,54) );
-
- sd=(struct map_session_data *) map_nick2sd((char *) RFIFOP(fd,32)); // ‘—Mæ‚ð’T‚·
- if(sd!=NULL && strcmp((char *) sd->status.name, (char *) RFIFOP(fd,32)) == 0){
-/*
- for(i=0;i<MAX_WIS_REFUSAL;i++){ //‹‘”ÛƒŠƒXƒg‚É–¼‘O‚ª‚ ‚é‚©‚Ç‚¤‚©”»’肵‚Ä‚ ‚ê‚΋‘”Û
- if(strcmp(sd->wis_refusal[i],RFIFOP(fd,8))==0){
- j++;
- break;
- }
- }
-*/
- if(sd->ignoreAll == 1)
- intif_wis_replay(RFIFOL(fd,4), 2); // ŽóM‹‘”Û
-/*
- else if(j>0)
- intif_wis_replay(id,2); // ŽóM‹‘”Û
-
- else{
-*/
- else {
- wisp_source = (char *) RFIFOP(fd,8); // speed up [Yor]
- for(i=0;i<MAX_IGNORE_LIST;i++){ //‹‘”ÛƒŠƒXƒg‚É–¼‘O‚ª‚ ‚é‚©‚Ç‚¤‚©”»’肵‚Ä‚ ‚ê‚΋‘”Û
- if(strcmp(sd->ignore[i].name, wisp_source)==0){
- break;
- }
- }
- if(i==MAX_IGNORE_LIST) // run out of list, so we are not ignored
- {
- clif_wis_message(sd->fd, wisp_source, (char*)RFIFOP(fd,56),RFIFOW(fd,2)-56);
- intif_wis_replay(id,0); // ‘—M¬Œ÷
- }
- else
- intif_wis_replay(id, 2); // ŽóM‹‘”Û
- }
- }else
- intif_wis_replay(id,1); // ‚»‚ñ‚Èl‚¢‚Ü‚¹‚ñ
- return 0;
-}
-
-// Wisp/page transmission result reception
-int intif_parse_WisEnd(int fd) {
- struct map_session_data* sd;
-
- if (battle_config.etc_log)
- printf("intif_parse_wisend: player: %s, flag: %d\n", RFIFOP(fd,2), RFIFOB(fd,26)); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- sd = (struct map_session_data *)map_nick2sd((char *) RFIFOP(fd,2));
- if (sd != NULL)
- clif_wis_end(sd->fd, RFIFOB(fd,26));
-
- return 0;
-}
-
-// Received wisp message from map-server via char-server for ALL gm
-int mapif_parse_WisToGM(int fd) { // 0x3003/0x3803 <packet_len>.w <wispname>.24B <min_gm_level>.w <message>.?B
- int i, min_gm_level;
- struct map_session_data *pl_sd;
- char Wisp_name[24];
- char mbuf[255];
- char *message = (char *) (((RFIFOW(fd,2) - 30) >= sizeof(mbuf)) ? (char *) aMallocA((RFIFOW(fd,2) - 30)) : mbuf);
-
- min_gm_level = (int)RFIFOW(fd,28);
- memcpy(Wisp_name, RFIFOP(fd,4), 24);
- Wisp_name[23] = '\0';
- memcpy(message, RFIFOP(fd,30), RFIFOW(fd,2) - 30);
- message[sizeof(message) - 1] = '\0';
- // information is sended to all online GM
- for (i = 0; i < fd_max; i++)
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth)
- if (pc_isGM(pl_sd) >= min_gm_level)
- clif_wis_message(i, Wisp_name, message, strlen(message) + 1);
-
- if (message != mbuf)
- aFree(message);
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒg•Ï”’Ê’m
-int intif_parse_AccountReg(int fd) {
- int j,p;
- struct map_session_data *sd;
-
- if( (sd=map_id2sd(RFIFOL(fd,4)))==NULL )
- return 1;
- for(p=8,j=0;p<RFIFOW(fd,2) && j<ACCOUNT_REG_NUM;p+=36,j++){
- memcpy(sd->status.account_reg[j].str,RFIFOP(fd,p),32);
- sd->status.account_reg[j].value=RFIFOL(fd,p+32);
- }
- sd->status.account_reg_num = j;
-// printf("intif: accountreg\n");
-
- return 0;
-}
-
-// ‘qŒÉƒf[ƒ^ŽóM
-int intif_parse_LoadStorage(int fd) {
- struct storage *stor;
- struct map_session_data *sd;
-
- stor = account2storage( RFIFOL(fd,4));
-
- if (stor->storage_status == 1) { // Already open.. lets ignore this update
- if (battle_config.error_log)
- printf("intif_parse_LoadStorage: storage received for a client already open\n");
- return 0;
- }
-
- if (RFIFOW(fd,2)-8 != sizeof(struct storage)) {
- if (battle_config.error_log)
- printf("intif_parse_LoadStorage: data size error %d %d\n", RFIFOW(fd,2)-8, sizeof(struct storage));
- return 1;
- }
- sd=map_id2sd( RFIFOL(fd,4) );
- if(sd==NULL){
- if(battle_config.error_log)
- printf("intif_parse_LoadStorage: user not found %d\n",RFIFOL(fd,4));
- return 1;
- }
- if(battle_config.save_log)
- printf("intif_openstorage: %d\n",RFIFOL(fd,4) );
- memcpy(stor,RFIFOP(fd,8),sizeof(struct storage));
- stor->dirty=0;
- stor->storage_status=1;
- sd->state.storage_flag = 0;
- clif_storageitemlist(sd,stor);
- clif_storageequiplist(sd,stor);
- clif_updatestorageamount(sd,stor);
-
- return 0;
-}
-
-// ‘qŒÉƒf[ƒ^‘—M¬Œ÷
-int intif_parse_SaveStorage(int fd)
-{
- if(battle_config.save_log)
- printf("intif_savestorage: done %d %d\n",RFIFOL(fd,2),RFIFOB(fd,6) );
- return 0;
-}
-
-int intif_parse_LoadGuildStorage(int fd)
-{
- struct guild_storage *gstor;
- struct map_session_data *sd;
- int guild_id = RFIFOL(fd,8);
- if(guild_id > 0) {
- gstor=guild2storage(guild_id);
- if(!gstor) {
- if(battle_config.error_log)
- printf("intif_parse_LoadGuildStorage: error guild_id %d not exist\n",guild_id);
- return 1;
- }
- if( RFIFOW(fd,2)-12 != sizeof(struct guild_storage) ){
- gstor->storage_status = 0;
- if(battle_config.error_log)
- printf("intif_parse_LoadGuildStorage: data size error %d %d\n",RFIFOW(fd,2)-12 , sizeof(struct guild_storage));
- return 1;
- }
- sd=map_id2sd( RFIFOL(fd,4) );
- if(sd==NULL){
- if(battle_config.error_log)
- printf("intif_parse_LoadGuildStorage: user not found %d\n",RFIFOL(fd,4));
- return 1;
- }
- if(battle_config.save_log)
- printf("intif_open_guild_storage: %d\n",RFIFOL(fd,4) );
- memcpy(gstor,RFIFOP(fd,12),sizeof(struct guild_storage));
- gstor->storage_status = 1;
- sd->state.storage_flag = 1;
- clif_guildstorageitemlist(sd,gstor);
- clif_guildstorageequiplist(sd,gstor);
- clif_updateguildstorageamount(sd,gstor);
- }
- return 0;
-}
-int intif_parse_SaveGuildStorage(int fd)
-{
- if(battle_config.save_log) {
- printf("intif_save_guild_storage: done %d %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOB(fd,10) );
- }
- return 0;
-}
-
-// ƒp[ƒeƒB쬉”Û
-int intif_parse_PartyCreated(int fd)
-{
- if(battle_config.etc_log)
- printf("intif: party created\n");
- party_created(RFIFOL(fd,2), RFIFOB(fd,6),RFIFOL(fd,7),(char *) RFIFOP(fd,11));
- return 0;
-}
-// ƒp[ƒeƒBî•ñ
-int intif_parse_PartyInfo(int fd)
-{
- if( RFIFOW(fd,2)==8){
- if(battle_config.error_log)
- printf("intif: party noinfo %d\n",RFIFOL(fd,4));
- party_recv_noinfo(RFIFOL(fd,4));
- return 0;
- }
-
-// printf("intif: party info %d\n",RFIFOL(fd,4));
- if( RFIFOW(fd,2)!=sizeof(struct party)+4 ){
- if(battle_config.error_log)
- printf("intif: party info : data size error %d %d %d\n",RFIFOL(fd,4),RFIFOW(fd,2),sizeof(struct party)+4);
- }
- party_recv_info((struct party *)RFIFOP(fd,4));
- return 0;
-}
-// ƒp[ƒeƒB’ljÁ’Ê’m
-int intif_parse_PartyMemberAdded(int fd)
-{
- if(battle_config.etc_log)
- printf("intif: party member added %d %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOB(fd,10));
- party_member_added(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOB(fd,10));
- return 0;
-}
-// ƒp[ƒeƒBÝ’è•ÏX’Ê’m
-int intif_parse_PartyOptionChanged(int fd)
-{
- party_optionchanged(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOW(fd,10),RFIFOW(fd,12),RFIFOB(fd,14));
- return 0;
-}
-// ƒp[ƒeƒB’E‘Þ’Ê’m
-int intif_parse_PartyMemberLeaved(int fd)
-{
- if(battle_config.etc_log)
- printf("intif: party member leaved %d %d %s\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10));
- party_member_leaved(RFIFOL(fd,2),RFIFOL(fd,6),(char *) RFIFOP(fd,10));
- return 0;
-}
-// ƒp[ƒeƒB‰ðŽU’Ê’m
-int intif_parse_PartyBroken(int fd)
-{
- party_broken(RFIFOL(fd,2));
- return 0;
-}
-// ƒp[ƒeƒBˆÚ“®’Ê’m
-int intif_parse_PartyMove(int fd)
-{
-// if(battle_config.etc_log)
-// printf("intif: party move %d %d %s %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10),RFIFOB(fd,26),RFIFOW(fd,27));
- party_recv_movemap(RFIFOL(fd,2),RFIFOL(fd,6),(char *) RFIFOP(fd,10),RFIFOB(fd,26),RFIFOW(fd,27));
- return 0;
-}
-// ƒp[ƒeƒBƒƒbƒZ[ƒW
-int intif_parse_PartyMessage(int fd)
-{
-// if(battle_config.etc_log)
-// printf("intif_parse_PartyMessage: %s\n",RFIFOP(fd,12));
- party_recv_message(RFIFOL(fd,4),RFIFOL(fd,8),(char *) RFIFOP(fd,12),RFIFOW(fd,2)-12);
- return 0;
-}
-
-// ƒMƒ‹ƒh쬉”Û
-int intif_parse_GuildCreated(int fd)
-{
- guild_created(RFIFOL(fd,2),RFIFOL(fd,6));
- return 0;
-}
-// ƒMƒ‹ƒhî•ñ
-int intif_parse_GuildInfo(int fd)
-{
- if( RFIFOW(fd,2)==8){
- if(battle_config.error_log)
- printf("intif: guild noinfo %d\n",RFIFOL(fd,4));
- guild_recv_noinfo(RFIFOL(fd,4));
- return 0;
- }
-
-// if(battle_config.etc_log)
-// printf("intif: guild info %d\n",RFIFOL(fd,4));
- if( RFIFOW(fd,2)!=sizeof(struct guild)+4 ){
- if(battle_config.error_log)
- printf("intif: guild info : data size error\n %d %d %d",RFIFOL(fd,4),RFIFOW(fd,2),sizeof(struct guild)+4);
- }
- guild_recv_info((struct guild *)RFIFOP(fd,4));
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒo’ljÁ’Ê’m
-int intif_parse_GuildMemberAdded(int fd)
-{
- if(battle_config.etc_log)
- printf("intif: guild member added %d %d %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14));
- guild_member_added(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14));
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒo’E‘Þ/’Ç•ú’Ê’m
-int intif_parse_GuildMemberLeaved(int fd)
-{
- guild_member_leaved(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),
- (char *) RFIFOP(fd,55), (char *) RFIFOP(fd,15));
- return 0;
-}
-
-// ƒMƒ‹ƒhƒƒ“ƒoƒIƒ“ƒ‰ƒCƒ“ó‘Ô/Lv•ÏX’Ê’m
-int intif_parse_GuildMemberInfoShort(int fd)
-{
- guild_recv_memberinfoshort(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),RFIFOW(fd,15),RFIFOW(fd,17));
- return 0;
-}
-// ƒMƒ‹ƒh‰ðŽU’Ê’m
-int intif_parse_GuildBroken(int fd)
-{
- guild_broken(RFIFOL(fd,2),RFIFOB(fd,6));
- return 0;
-}
-
-// ƒMƒ‹ƒhŠî–{î•ñ•ÏX’Ê’m
-int intif_parse_GuildBasicInfoChanged(int fd)
-{
- int type=RFIFOW(fd,8),guild_id=RFIFOL(fd,4);
- void *data=RFIFOP(fd,10);
- struct guild *g=guild_search(guild_id);
- short dw=*((short *)data);
- int dd=*((int *)data);
- if( g==NULL )
- return 0;
- switch(type){
- case GBI_EXP: g->exp=dd; break;
- case GBI_GUILDLV: g->guild_lv=dw; break;
- case GBI_SKILLPOINT: g->skill_point=dd; break;
- }
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒoî•ñ•ÏX’Ê’m
-int intif_parse_GuildMemberInfoChanged(int fd)
-{
- int type=RFIFOW(fd,16),guild_id=RFIFOL(fd,4);
- int account_id=RFIFOL(fd,8),char_id=RFIFOL(fd,12);
- void *data=RFIFOP(fd,18);
- struct guild *g=guild_search(guild_id);
- int idx,dd=*((int *)data);
- if( g==NULL )
- return 0;
- idx=guild_getindex(g,account_id,char_id);
- switch(type){
- case GMI_POSITION:
- g->member[idx].position=dd;
- guild_memberposition_changed(g,idx,dd);
- break;
- case GMI_EXP:
- g->member[idx].exp=dd;
- break;
- }
- return 0;
-}
-
-// ƒMƒ‹ƒh–ðE•ÏX’Ê’m
-int intif_parse_GuildPosition(int fd)
-{
- if( RFIFOW(fd,2)!=sizeof(struct guild_position)+12 ){
- if(battle_config.error_log)
- printf("intif: guild info : data size error\n %d %d %d",RFIFOL(fd,4),RFIFOW(fd,2),sizeof(struct guild_position)+12);
- }
- guild_position_changed(RFIFOL(fd,4),RFIFOL(fd,8),(struct guild_position *)RFIFOP(fd,12));
- return 0;
-}
-// ƒMƒ‹ƒhƒXƒLƒ‹Š„‚èU‚è’Ê’m
-int intif_parse_GuildSkillUp(int fd)
-{
- guild_skillupack(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10));
- return 0;
-}
-// ƒMƒ‹ƒh“¯–¿/“G‘Î’Ê’m
-int intif_parse_GuildAlliance(int fd)
-{
- guild_allianceack(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOL(fd,14),
- RFIFOB(fd,18),(char *) RFIFOP(fd,19),(char *) RFIFOP(fd,43));
- return 0;
-}
-// ƒMƒ‹ƒh’m•ÏX’Ê’m
-int intif_parse_GuildNotice(int fd)
-{
- guild_notice_changed(RFIFOL(fd,2),(char *) RFIFOP(fd,6),(char *) RFIFOP(fd,66));
- return 0;
-}
-// ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX’Ê’m
-int intif_parse_GuildEmblem(int fd)
-{
- guild_emblem_changed(RFIFOW(fd,2)-12,RFIFOL(fd,4),RFIFOL(fd,8), (char *)RFIFOP(fd,12));
- return 0;
-}
-// ƒMƒ‹ƒh‰ï˜bŽóM
-int intif_parse_GuildMessage(int fd)
-{
- guild_recv_message(RFIFOL(fd,4),RFIFOL(fd,8),(char *) RFIFOP(fd,12),RFIFOW(fd,2)-12);
- return 0;
-}
-// ƒMƒ‹ƒhéƒf[ƒ^—v‹•ÔM
-int intif_parse_GuildCastleDataLoad(int fd)
-{
- return guild_castledataloadack(RFIFOW(fd,2),RFIFOB(fd,4),RFIFOL(fd,5));
-}
-// ƒMƒ‹ƒhéƒf[ƒ^•ÏX’Ê’m
-int intif_parse_GuildCastleDataSave(int fd)
-{
- return guild_castledatasaveack(RFIFOW(fd,2),RFIFOB(fd,4),RFIFOL(fd,5));
-}
-
-// ƒMƒ‹ƒhéƒf[ƒ^ˆêŠ‡ŽóM(‰Šú‰»Žž)
-int intif_parse_GuildCastleAllDataLoad(int fd)
-{
- return guild_castlealldataload(RFIFOW(fd,2),(struct guild_castle *)RFIFOP(fd,4));
-}
-
-// pet
-int intif_parse_CreatePet(int fd)
-{
- pet_get_egg(RFIFOL(fd,2),RFIFOL(fd,7),RFIFOB(fd,6));
-
- return 0;
-}
-
-int intif_parse_RecvPetData(int fd)
-{
- struct s_pet p;
- int len=RFIFOW(fd,2);
- if(sizeof(struct s_pet)!=len-9) {
- if(battle_config.etc_log)
- printf("intif: pet data: data size error %d %d\n",sizeof(struct s_pet),len-9);
- }
- else{
- memcpy(&p,RFIFOP(fd,9),sizeof(struct s_pet));
- pet_recv_petdata(RFIFOL(fd,4),&p,RFIFOB(fd,8));
- }
-
- return 0;
-}
-int intif_parse_SavePetOk(int fd)
-{
- if(RFIFOB(fd,6) == 1) {
- if(battle_config.error_log)
- printf("pet data save failure\n");
- }
-
- return 0;
-}
-
-int intif_parse_DeletePetOk(int fd)
-{
- if(RFIFOB(fd,2) == 1) {
- if(battle_config.error_log)
- printf("pet data delete failure\n");
- }
-
- return 0;
-}
-//-----------------------------------------------------------------
-// inter server‚©‚ç‚Ì’ÊM
-// ƒGƒ‰[‚ª‚ ‚ê‚Î0(false)‚ð•Ô‚·‚±‚Æ
-// ƒpƒPƒbƒg‚ªˆ—‚Å‚«‚ê‚Î1,ƒpƒPƒbƒg’·‚ª‘«‚è‚È‚¯‚ê‚Î2‚ð•Ô‚·‚±‚Æ
-int intif_parse(int fd)
-{
- int packet_len;
- int cmd = RFIFOW(fd,0);
- // ƒpƒPƒbƒg‚ÌIDŠm”F
- if(cmd<0x3800 || cmd>=0x3800+(sizeof(packet_len_table)/sizeof(packet_len_table[0])) ||
- packet_len_table[cmd-0x3800]==0){
- return 0;
- }
- // ƒpƒPƒbƒg‚Ì’·‚³Šm”F
- packet_len = packet_len_table[cmd-0x3800];
- if(packet_len==-1){
- if(RFIFOREST(fd)<4)
- return 2;
- packet_len = RFIFOW(fd,2);
- }
-// if(battle_config.etc_log)
-// printf("intif_parse %d %x %d %d\n",fd,cmd,packet_len,RFIFOREST(fd));
- if(RFIFOREST(fd)<packet_len){
- return 2;
- }
- // ˆ—•ªŠò
- switch(cmd){
- case 0x3800: clif_GMmessage(NULL,(char *) RFIFOP(fd,4),packet_len-4,0); break;
- case 0x3801: intif_parse_WisMessage(fd); break;
- case 0x3802: intif_parse_WisEnd(fd); break;
- case 0x3803: mapif_parse_WisToGM(fd); break;
- case 0x3804: intif_parse_AccountReg(fd); break;
- case 0x3810: intif_parse_LoadStorage(fd); break;
- case 0x3811: intif_parse_SaveStorage(fd); break;
- case 0x3818: intif_parse_LoadGuildStorage(fd); break;
- case 0x3819: intif_parse_SaveGuildStorage(fd); break;
- case 0x3820: intif_parse_PartyCreated(fd); break;
- case 0x3821: intif_parse_PartyInfo(fd); break;
- case 0x3822: intif_parse_PartyMemberAdded(fd); break;
- case 0x3823: intif_parse_PartyOptionChanged(fd); break;
- case 0x3824: intif_parse_PartyMemberLeaved(fd); break;
- case 0x3825: intif_parse_PartyMove(fd); break;
- case 0x3826: intif_parse_PartyBroken(fd); break;
- case 0x3827: intif_parse_PartyMessage(fd); break;
- case 0x3830: intif_parse_GuildCreated(fd); break;
- case 0x3831: intif_parse_GuildInfo(fd); break;
- case 0x3832: intif_parse_GuildMemberAdded(fd); break;
- case 0x3834: intif_parse_GuildMemberLeaved(fd); break;
- case 0x3835: intif_parse_GuildMemberInfoShort(fd); break;
- case 0x3836: intif_parse_GuildBroken(fd); break;
- case 0x3837: intif_parse_GuildMessage(fd); break;
- case 0x3839: intif_parse_GuildBasicInfoChanged(fd); break;
- case 0x383a: intif_parse_GuildMemberInfoChanged(fd); break;
- case 0x383b: intif_parse_GuildPosition(fd); break;
- case 0x383c: intif_parse_GuildSkillUp(fd); break;
- case 0x383d: intif_parse_GuildAlliance(fd); break;
- case 0x383e: intif_parse_GuildNotice(fd); break;
- case 0x383f: intif_parse_GuildEmblem(fd); break;
- case 0x3840: intif_parse_GuildCastleDataLoad(fd); break;
- case 0x3841: intif_parse_GuildCastleDataSave(fd); break;
- case 0x3842: intif_parse_GuildCastleAllDataLoad(fd); break;
- case 0x3880: intif_parse_CreatePet(fd); break;
- case 0x3881: intif_parse_RecvPetData(fd); break;
- case 0x3882: intif_parse_SavePetOk(fd); break;
- case 0x3883: intif_parse_DeletePetOk(fd); break;
- default:
- if(battle_config.error_log)
- printf("intif_parse : unknown packet %d %x\n",fd,RFIFOW(fd,0));
- return 0;
- }
- // ƒpƒPƒbƒg“Ç‚Ý”ò‚΂µ
- RFIFOSKIP(fd,packet_len);
- return 1;
-}
diff --git a/src/map/intif.h b/src/map/intif.h
deleted file mode 100644
index 17d6045ac..000000000
--- a/src/map/intif.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// $Id: intif.h,v 1.2 2004/09/25 05:32:18 MouseJstr Exp $
-#ifndef _INTIF_H_
-#define _INFIF_H_
-
-int intif_parse(int fd);
-
-int intif_GMmessage(char* mes,int len,int flag);
-
-int intif_wis_message(struct map_session_data *sd,char *nick,char *mes,int mes_len);
-int intif_wis_message_to_gm(char *Wisp_name, int min_gm_level, char *mes);
-
-int intif_saveaccountreg(struct map_session_data *sd);
-int intif_request_accountreg(struct map_session_data *sd);
-
-int intif_request_storage(int account_id);
-int intif_send_storage(struct storage *stor);
-int intif_request_guild_storage(int account_id, int guild_id);
-int intif_send_guild_storage(int account_id, struct guild_storage *gstor);
-
-
-int intif_create_party(struct map_session_data *sd,char *name,int item,int item2);
-int intif_request_partyinfo(int party_id);
-int intif_party_addmember(int party_id, int account_id);
-int intif_party_changeoption(int party_id, int account_id, int exp, int item);
-int intif_party_leave(int party_id, int accound_id);
-int intif_party_changemap(struct map_session_data *sd, int online);
-int intif_break_party(int party_id);
-int intif_party_message(int party_id, int account_id, char *mes,int len);
-int intif_party_checkconflict(int party_id, int account_id, char *nick);
-
-
-int intif_guild_create(const char *name, const struct guild_member *master);
-int intif_guild_request_info(int guild_id);
-int intif_guild_addmember(int guild_id, struct guild_member *m);
-int intif_guild_leave(int guild_id, int account_id, int char_id, int flag, const char *mes);
-int intif_guild_memberinfoshort(int guild_id, int account_id, int char_id, int online, int lv, int class_);
-int intif_guild_break(int guild_id);
-int intif_guild_message(int guild_id, int account_id, char *mes, int len);
-int intif_guild_checkconflict(int guild_id, int account_id, int char_id);
-int intif_guild_change_basicinfo(int guild_id, int type, const void *data, int len);
-int intif_guild_change_memberinfo(int guild_id, int account_id, int char_id, int type, const void *data, int len);
-int intif_guild_position(int guild_id, int idx, struct guild_position *p);
-int intif_guild_skillup(int guild_id, int skill_num, int account_id, int flag);
-int intif_guild_alliance(int guild_id1, int guild_id2, int account_id1, int account_id2, int flag);
-int intif_guild_notice(int guild_id, const char *mes1, const char *mes2);
-int intif_guild_emblem(int guild_id, int len, const char *data);
-int intif_guild_castle_dataload(int castle_id, int index);
-int intif_guild_castle_datasave(int castle_id, int index, int value);
-
-int intif_create_pet(int account_id, int char_id, short pet_type, short pet_lv, short pet_egg_id,
- short pet_equip, short intimate, short hungry, char rename_flag, char incuvate, char *pet_name);
-int intif_request_petdata(int account_id, int char_id, int pet_id);
-int intif_save_petdata(int account_id, struct s_pet *p);
-int intif_delete_petdata(int pet_id);
-
-#endif
diff --git a/src/map/itemdb.c b/src/map/itemdb.c
deleted file mode 100644
index 91ec58c81..000000000
--- a/src/map/itemdb.c
+++ /dev/null
@@ -1,975 +0,0 @@
-// $Id: itemdb.c,v 1.3 2004/09/25 05:32:18 MouseJstr Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "db.h"
-#include "grfio.h"
-#include "nullpo.h"
-#include "malloc.h"
-#include "map.h"
-#include "battle.h"
-#include "itemdb.h"
-#include "script.h"
-#include "pc.h"
-#include "showmsg.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-#define MAX_RANDITEM 2000
-
-// ** ITEMDB_OVERRIDE_NAME_VERBOSE **
-// ’è‹`‚·‚é‚ÆAitemdb.txt‚Ægrf‚Å–¼‘O‚ªˆÙ‚È‚éê‡A•\Ž¦‚µ‚Ü‚·.
-//#define ITEMDB_OVERRIDE_NAME_VERBOSE 1
-
-static struct dbt* item_db;
-
-static struct random_item_data blue_box[MAX_RANDITEM], violet_box[MAX_RANDITEM], card_album[MAX_RANDITEM], gift_box[MAX_RANDITEM], scroll[MAX_RANDITEM], finding_ore[MAX_RANDITEM];
-static int blue_box_count=0, violet_box_count=0, card_album_count=0, gift_box_count=0, scroll_count=0, finding_ore_count = 0;
-static int blue_box_default=0, violet_box_default=0, card_album_default=0, gift_box_default=0, scroll_default=0, finding_ore_default = 0;
-
-// Function declarations
-
-static void itemdb_read(void);
-static int itemdb_readdb(void);
-#ifndef TXT_ONLY
-static int itemdb_read_sqldb(void);
-#endif /* not TXT_ONLY */
-static int itemdb_read_randomitem();
-static int itemdb_read_itemavail(void);
-static int itemdb_read_itemnametable(void);
-static int itemdb_read_itemslottable(void);
-static int itemdb_read_itemslotcounttable(void);
-static int itemdb_read_cardillustnametable(void);
-static int itemdb_read_noequip(void);
-static int itemdb_read_norefine(void);
-void itemdb_reload(void);
-
-/*==========================================
- * –¼‘O‚ÅŒŸõ—p
- *------------------------------------------
- */
-// name = item alias, so we should find items aliases first. if not found then look for "jname" (full name)
-int itemdb_searchname_sub(void *key,void *data,va_list ap)
-{
- struct item_data *item=(struct item_data *)data,**dst;
- char *str;
- str=va_arg(ap,char *);
- dst=va_arg(ap,struct item_data **);
-// if( strcmpi(item->name,str)==0 || strcmp(item->jname,str)==0 ||
-// memcmp(item->name,str,24)==0 || memcmp(item->jname,str,24)==0 )
- if( strcmpi(item->name,str)==0 ) //by lupus
- *dst=item;
- return 0;
-}
-
-/*==========================================
- * –¼‘O‚ÅŒŸõ—p
- *------------------------------------------
- */
-int itemdb_searchjname_sub(void *key,void *data,va_list ap)
-{
- struct item_data *item=(struct item_data *)data,**dst;
- char *str;
- str=va_arg(ap,char *);
- dst=va_arg(ap,struct item_data **);
- if( strcmpi(item->jname,str)==0 )
- *dst=item;
- return 0;
-}
-/*==========================================
- * –¼‘O‚ÅŒŸõ
- *------------------------------------------
- */
-struct item_data* itemdb_searchname(const char *str)
-{
- struct item_data *item=NULL;
- numdb_foreach(item_db,itemdb_searchname_sub,str,&item);
- return item;
-}
-
-/*==========================================
- * ” ŒnƒAƒCƒeƒ€ŒŸõ
- *------------------------------------------
- */
-int itemdb_searchrandomid(int flags)
-{
- int nameid=0,i,index,count;
- struct random_item_data *list=NULL;
-
- struct {
- int nameid,count;
- struct random_item_data *list;
- } data[7];
-
- // for BCC32 compile error
- data[0].nameid = 0; data[0].count = 0; data[0].list = NULL;
- data[1].nameid = blue_box_default; data[1].count = blue_box_count; data[1].list = blue_box;
- data[2].nameid = violet_box_default; data[2].count = violet_box_count; data[2].list = violet_box;
- data[3].nameid = card_album_default; data[3].count = card_album_count; data[3].list = card_album;
- data[4].nameid = gift_box_default; data[4].count = gift_box_count; data[4].list = gift_box;
- data[5].nameid = scroll_default; data[5].count = scroll_count; data[5].list = scroll;
- data[6].nameid = finding_ore_default; data[6].count = finding_ore_count; data[6].list = finding_ore;
-
- if(flags>=1 && flags<=6){
- nameid=data[flags].nameid;
- count=data[flags].count;
- list=data[flags].list;
-
- if(count > 0) {
- for(i=0;i<1000;i++) {
- index = rand()%count;
- if( rand()%1000000 < list[index].per) {
- nameid = list[index].nameid;
- break;
- }
- }
- }
- }
- return nameid;
-}
-
-/*==========================================
- * DB‚Ì‘¶ÝŠm”F
- *------------------------------------------
- */
-struct item_data* itemdb_exists(int nameid)
-{
- return (struct item_data *) numdb_search(item_db,nameid);
-}
-/*==========================================
- * DB‚ÌŒŸõ
- *------------------------------------------
- */
-struct item_data* itemdb_search(int nameid)
-{
- struct item_data *id;
-
- id=(struct item_data *) numdb_search(item_db,nameid);
- if(id) return id;
-
- id=(struct item_data *)aCalloc(1,sizeof(struct item_data));
- numdb_insert(item_db,nameid,id);
-
- id->nameid=nameid;
- id->value_buy=10;
- id->value_sell=id->value_buy/2;
- id->weight=10;
- id->sex=2;
- id->elv=0;
- id->class_=0xffffffff;
- id->flag.available=0;
- id->flag.value_notdc=0; //ˆê‰žEEE
- id->flag.value_notoc=0;
- id->flag.no_equip=0;
- id->view_id=0;
-
- if(nameid>500 && nameid<600)
- id->type=0; //heal item
- else if(nameid>600 && nameid<700)
- id->type=2; //use item
- else if((nameid>700 && nameid<1100) ||
- (nameid>7000 && nameid<8000))
- id->type=3; //correction
- else if(nameid>=1750 && nameid<1771)
- id->type=10; //arrow
- else if(nameid>1100 && nameid<2000)
- id->type=4; //weapon
- else if((nameid>2100 && nameid<3000) ||
- (nameid>5000 && nameid<6000))
- id->type=5; //armor
- else if(nameid>4000 && nameid<5000)
- id->type=6; //card
- else if(nameid>9000 && nameid<10000)
- id->type=7; //egg
- else if(nameid>10000)
- id->type=8; //petequip
-
- return id;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int itemdb_isequip(int nameid)
-{
- int type=itemdb_type(nameid);
- if(type==0 || type==2 || type==3 || type==6 || type==10)
- return 0;
- return 1;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int itemdb_isequip2(struct item_data *data)
-{
- if(data) {
- int type=data->type;
- if(type==0 || type==2 || type==3 || type==6 || type==10)
- return 0;
- else
- return 1;
- }
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int itemdb_isequip3(int nameid)
-{
- int type=itemdb_type(nameid);
- if(type==4 || type==5 || type == 8)
- return 1;
- return 0;
-}
-
-/*==========================================
- * ŽÌ‚Ä‚ç‚ê‚éƒAƒCƒeƒ€‚Í1A‚»‚¤‚Å‚È‚¢ƒAƒCƒeƒ€‚Í0
- *------------------------------------------
- */
-int itemdb_isdropable(int nameid)
-{
- //Œ‹¥Žw—Ö‚ÍŽÌ‚Ä‚ç‚ê‚È‚¢
- switch(nameid){
- case 2634: //Œ‹¥Žw—Ö
- case 2635: //Œ‹¥Žw—Ö
- return 0;
- }
-
- return 1;
-}
-
-/*====================================
- * Removed item_value_db, don't re-add
- *------------------------------------
- */
-static void itemdb_read(void)
-{
- #ifndef TXT_ONLY
- if (db_use_sqldbs)
- {
- itemdb_read_sqldb();
- }
- else
- {
- itemdb_readdb();
- }
- /* not TXT_ONLY */
- #else
- itemdb_readdb();
- #endif /* TXT_ONLY */
-
- itemdb_read_randomitem();
- itemdb_read_itemavail();
- itemdb_read_noequip();
- itemdb_read_norefine();
- if (battle_config.cardillust_read_grffile)
- itemdb_read_cardillustnametable();
- if (battle_config.item_equip_override_grffile)
- itemdb_read_itemslottable();
- if (battle_config.item_slots_override_grffile)
- itemdb_read_itemslotcounttable();
- if (battle_config.item_name_override_grffile)
- itemdb_read_itemnametable();
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€ƒf[ƒ^ƒx[ƒX‚Ì“Ç‚Ýž‚Ý
- *------------------------------------------
- */
-static int itemdb_readdb(void)
-{
- FILE *fp;
- char line[1024];
- int ln=0,lines=0;
- int nameid,j;
- char *str[32],*p,*np;
- struct item_data *id;
- int i=0;
- char *filename[]={ "db/item_db.txt","db/item_db2.txt" };
-
- for(i=0;i<2;i++){
-
- fp=fopen(filename[i],"r");
- if(fp==NULL){
- if(i>0)
- continue;
- printf("can't read %s\n",filename[i]);
- exit(1);
- }
-
- lines=0;
- while(fgets(line,1020,fp)){
- lines++;
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(str,0,sizeof(str));
- for(j=0,np=p=line;j<17 && p;j++){
- str[j]=p;
- p=strchr(p,',');
- if(p){ *p++=0; np=p; }
- }
- if(str[0]==NULL)
- continue;
-
- nameid=atoi(str[0]);
- if(nameid<=0 || nameid>=20000)
- continue;
- ln++;
-
- //ID,Name,Jname,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Gender,Loc,wLV,eLV,View
- id=itemdb_search(nameid);
- memcpy(id->name,str[1],24);
- memcpy(id->jname,str[2],24);
- id->type=atoi(str[3]);
-
- {
- int buy = atoi(str[4]), sell = atoi(str[5]);
- // if buying price > selling price * 2 consider it valid and don't change it [celest]
- if (buy && sell && buy > sell*2){
- id->value_buy = buy;
- id->value_sell = sell;
- } else {
- // buy‚sell*2 ‚Í item_value_db.txt ‚ÅŽw’肵‚Ä‚­‚¾‚³‚¢B
- if (sell) { // sell’l‚ð—Dæ‚Æ‚·‚é
- id->value_buy = sell*2;
- id->value_sell = sell;
- } else {
- id->value_buy = buy;
- id->value_sell = buy/2;
- }
- }
- // check for bad prices that can possibly cause exploits
- if (id->value_buy*75/100 < id->value_sell*124/100) {
- sprintf (tmp_output, "Item %s [%d] buying:%d < selling:%d\n",
- id->name, id->nameid, id->value_buy*75/100, id->value_sell*124/100);
- ShowWarning (tmp_output);
- }
- }
- id->weight=atoi(str[6]);
- id->atk=atoi(str[7]);
- id->def=atoi(str[8]);
- id->range=atoi(str[9]);
- id->slot=atoi(str[10]);
- id->class_=atoi(str[11]);
- id->sex=atoi(str[12]);
- if(id->equip != atoi(str[13])){
- id->equip=atoi(str[13]);
- }
- id->wlv=atoi(str[14]);
- id->elv=atoi(str[15]);
- id->look=atoi(str[16]);
- id->flag.available=1;
- id->flag.value_notdc=0;
- id->flag.value_notoc=0;
- id->view_id=0;
-
- id->use_script=NULL;
- id->equip_script=NULL;
-
- if((p=strchr(np,'{'))==NULL)
- continue;
- id->use_script = parse_script((unsigned char *) p,lines);
- if((p=strchr(p+1,'{'))==NULL)
- continue;
- id->equip_script = parse_script((unsigned char *) p,lines);
- }
- fclose(fp);
- if (ln > 0) {
- sprintf(tmp_output,"Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,filename[i]);
- ShowStatus(tmp_output);
- }
- ln=0; // reset to 0
- }
- return 0;
-}
-
-// Removed item_value_db, don't re-add!
-
-/*==========================================
- * ƒ‰ƒ“ƒ_ƒ€ƒAƒCƒeƒ€oŒ»ƒf[ƒ^‚Ì“Ç‚Ýž‚Ý
- *------------------------------------------
- */
-static int itemdb_read_randomitem()
-{
- FILE *fp;
- char line[1024];
- int ln=0;
- int nameid,i,j;
- char *str[10],*p;
-
- const struct {
- char filename[64];
- struct random_item_data *pdata;
- int *pcount,*pdefault;
- } data[] = {
- {"db/item_bluebox.txt", blue_box, &blue_box_count, &blue_box_default },
- {"db/item_violetbox.txt", violet_box, &violet_box_count, &violet_box_default },
- {"db/item_cardalbum.txt", card_album, &card_album_count, &card_album_default },
- {"db/item_giftbox.txt", gift_box, &gift_box_count, &gift_box_default },
- {"db/item_scroll.txt", scroll, &scroll_count, &scroll_default },
- {"db/item_findingore.txt", finding_ore,&finding_ore_count, &finding_ore_default },
- };
-
- for(i=0;i<sizeof(data)/sizeof(data[0]);i++){
- struct random_item_data *pd=data[i].pdata;
- int *pc=data[i].pcount;
- int *pdefault=data[i].pdefault;
- char *fn=(char *) data[i].filename;
-
- *pdefault = 0;
- if( (fp=fopen(fn,"r"))==NULL ){
- printf("can't read %s\n",fn);
- continue;
- }
-
- while(fgets(line,1020,fp)){
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(str,0,sizeof(str));
- for(j=0,p=line;j<3 && p;j++){
- str[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
-
- if(str[0]==NULL)
- continue;
-
- nameid=atoi(str[0]);
- if(nameid<0 || nameid>=20000)
- continue;
- if(nameid == 0) {
- if(str[2])
- *pdefault = atoi(str[2]);
- continue;
- }
-
- if(str[2]){
- pd[ *pc ].nameid = nameid;
- pd[(*pc)++].per = atoi(str[2]);
- }
-
- if(ln >= MAX_RANDITEM)
- break;
- ln++;
- }
- fclose(fp);
- if (*pc > 0) {
- sprintf(tmp_output,"Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",*pc,fn);
- ShowStatus(tmp_output);
- }
- }
-
- return 0;
-}
-/*==========================================
- * ƒAƒCƒeƒ€Žg—p‰Â”\ƒtƒ‰ƒO‚̃I[ƒo[ƒ‰ƒCƒh
- *------------------------------------------
- */
-static int itemdb_read_itemavail(void)
-{
- FILE *fp;
- char line[1024];
- int ln=0;
- int nameid,j,k;
- char *str[10],*p;
-
- if( (fp=fopen("db/item_avail.txt","r"))==NULL ){
- printf("can't read db/item_avail.txt\n");
- return -1;
- }
-
- while(fgets(line,1020,fp)){
- struct item_data *id;
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(str,0,sizeof(str));
- for(j=0,p=line;j<2 && p;j++){
- str[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
-
- if(str[0]==NULL)
- continue;
-
- nameid=atoi(str[0]);
- if(nameid<0 || nameid>=20000 || !(id=itemdb_exists(nameid)) )
- continue;
- k=atoi(str[1]);
- if(k > 0) {
- id->flag.available = 1;
- id->view_id = k;
- }
- else
- id->flag.available = 0;
- ln++;
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,"db/item_avail.txt");
- ShowStatus(tmp_output);
- return 0;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€‚Ì–¼‘Oƒe[ƒuƒ‹‚ð“Ç‚Ýž‚Þ
- *------------------------------------------
- */
-static int itemdb_read_itemnametable(void)
-{
- char *buf,*p;
- int s;
-
- buf=(char *) grfio_reads("data\\idnum2itemdisplaynametable.txt",&s);
-
- if(buf==NULL)
- return -1;
-
- buf[s]=0;
- for(p=buf;p-buf<s;){
- int nameid;
- char buf2[64];
-
- if( sscanf(p,"%d#%[^#]#",&nameid,buf2)==2 ){
-
-#ifdef ITEMDB_OVERRIDE_NAME_VERBOSE
- if( itemdb_exists(nameid) &&
- strncmp(itemdb_search(nameid)->jname,buf2,24)!=0 ){
- printf("[override] %d %s => %s\n",nameid
- ,itemdb_search(nameid)->jname,buf2);
- }
-#endif
-
- memcpy(itemdb_search(nameid)->jname,buf2,24);
- }
-
- p=strchr(p,10);
- if(!p) break;
- p++;
- }
- aFree(buf);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","data\\idnum2itemdisplaynametable.txt");
- ShowStatus(tmp_output);
-
- return 0;
-}
-
-/*==========================================
- * ƒJ[ƒhƒCƒ‰ƒXƒg‚̃Šƒ\[ƒX–¼‘Oƒe[ƒuƒ‹‚ð“Ç‚Ýž‚Þ
- *------------------------------------------
- */
-static int itemdb_read_cardillustnametable(void)
-{
- char *buf,*p;
- int s;
-
- buf=(char *) grfio_reads("data\\num2cardillustnametable.txt",&s);
-
- if(buf==NULL)
- return -1;
-
- buf[s]=0;
- for(p=buf;p-buf<s;){
- int nameid;
- char buf2[64];
-
- if( sscanf(p,"%d#%[^#]#",&nameid,buf2)==2 ){
- strcat(buf2,".bmp");
- memcpy(itemdb_search(nameid)->cardillustname,buf2,64);
-// printf("%d %s\n",nameid,itemdb_search(nameid)->cardillustname);
- }
-
- p=strchr(p,10);
- if(!p) break;
- p++;
- }
- aFree(buf);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","data\\num2cardillustnametable.txt");
- ShowStatus(tmp_output);
-
- return 0;
-}
-
-//
-// ‰Šú‰»
-//
-/*==========================================
- *
- *------------------------------------------
- */
-static int itemdb_read_itemslottable(void)
-{
- char *buf,*p;
- int s;
-
- buf=(char *) grfio_read("data\\itemslottable.txt");
- if(buf==NULL)
- return -1;
- s=grfio_size("data\\itemslottable.txt");
- buf[s]=0;
- for(p=buf;p-buf<s;){
- int nameid,equip;
- struct item_data* item;
- sscanf(p,"%d#%d#",&nameid,&equip);
- item = itemdb_search(nameid);
- if (item && itemdb_isequip2(item))
- item->equip=equip;
- p=strchr(p,10);
- if(!p) break;
- p++;
- p=strchr(p,10);
- if(!p) break;
- p++;
- }
- aFree(buf);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","data\\itemslottable.txt");
- ShowStatus(tmp_output);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int itemdb_read_itemslotcounttable(void)
-{
- char *buf,*p;
- int s;
-
- buf=(char *) grfio_read("data\\itemslotcounttable.txt");
- if(buf==NULL)
- return -1;
- s=grfio_size("data\\itemslotcounttable.txt");
- buf[s]=0;
- for(p=buf;p-buf<s;){
- int nameid,slot;
- sscanf(p,"%d#%d#",&nameid,&slot);
- itemdb_search(nameid)->slot=slot;
- p=strchr(p,10);
- if(!p) break;
- p++;
- p=strchr(p,10);
- if(!p) break;
- p++;
- }
- aFree(buf);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","data\\itemslotcounttable.txt");
- ShowStatus(tmp_output);
-
- return 0;
-}
-
-/*==========================================
- * ‘•”õ§ŒÀƒtƒ@ƒCƒ‹“Ç‚Ýo‚µ
- *------------------------------------------
- */
-static int itemdb_read_noequip(void)
-{
- FILE *fp;
- char line[1024];
- int ln=0;
- int nameid,j;
- char *str[32],*p;
- struct item_data *id;
-
- if( (fp=fopen("db/item_noequip.txt","r"))==NULL ){
- printf("can't read db/item_noequip.txt\n");
- return -1;
- }
- while(fgets(line,1020,fp)){
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(str,0,sizeof(str));
- for(j=0,p=line;j<2 && p;j++){
- str[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
- if(str[0]==NULL)
- continue;
-
- nameid=atoi(str[0]);
- if(nameid<=0 || nameid>=20000 || !(id=itemdb_exists(nameid)))
- continue;
-
- id->flag.no_equip=atoi(str[1]);
-
- ln++;
-
- }
- fclose(fp);
- if (ln > 0) {
- sprintf(tmp_output,"Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,"db/item_noequip.txt");
- ShowStatus(tmp_output);
- }
- return 0;
-}
-
-/*================================================
- * Whether the item can be refined or not [Celest]
- *------------------------------------------------
- */
-static int itemdb_read_norefine(void)
-{
- int i, nameid;
- struct item_data *id;
- // To-do: let it read from a text file later
- int cant_refine[] = {
- 1243, 1530, 2110, 2112, 2201, 2202, 2203, 2204, 2205, 2210,
- 2212, 2218, 2219, 2237, 2238, 2239, 2240, 2241, 2242, 2243,
- 2250, 2253, 2260, 2262, 2263, 2264, 2265, 2266, 2267, 2268,
- 2269, 2270, 2271, 2276, 2278, 2279, 2281, 2282, 2286, 2288,
- 2289, 2290, 2291, 2292, 2293, 2295, 2296, 2297, 2298, 2352,
- 2410, 2413, 2414, 2509, 2510, 2601, 2602, 2603, 2604, 2605,
- 2607, 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, 2616,
- 2617, 2618, 2619, 2620, 2621, 2622, 2623, 2624, 2625, 2626,
- 2627, 2628, 2629, 2630, 2631, 2634, 2635, 2636, 2637, 2638,
- 2639, 2640, 5004, 5005, 5006, 5008, 5014, 5015, 5037, 5039,
- 5040, 5043, 5046, 5049, 5050, 5051, 5053, 5054, 5055, 5058,
- 5068, 5074, 5085, 5086, 5087, 5088, 5089, 5090, 5096, 5098, 0
- };
-
- for (i=0; i < (int)(sizeof(cant_refine) / sizeof(cant_refine[0])); i++) {
- nameid = cant_refine[i];
- if(nameid<=0 || nameid>=20000 || !(id=itemdb_exists(nameid)))
- continue;
- id->flag.no_refine = 1;
- }
-
- return 1;
-}
-
-#ifndef TXT_ONLY
-
-/*======================================
-* SQL
-*===================================
-*/
-static int itemdb_read_sqldb(void)
-{
- unsigned short nameid;
- struct item_data *id;
- char script[65535 + 2 + 1]; // Maximum length of MySQL TEXT type (65535) + 2 bytes for curly brackets + 1 byte for terminator
-
- // ----------
-
- sprintf(tmp_sql, "SELECT * FROM `%s`", item_db_db);
-
- // Execute the query; if the query execution succeeded...
- if (mysql_query(&mmysql_handle, tmp_sql) == 0)
- {
- sql_res = mysql_store_result(&mmysql_handle);
-
- // If the storage of the query result succeeded...
- if (sql_res)
- {
- // Parse each row in the query result into sql_row
- while ((sql_row = mysql_fetch_row(sql_res)))
- {
- /* +----+--------------+---------------+------+-----------+------------+--------+--------+---------+-------+-------+------------+---------------+-----------------+--------------+-------------+------+------------+--------------+
- | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
- +----+--------------+---------------+------+-----------+------------+--------+--------+---------+-------+-------+------------+---------------+-----------------+--------------+-------------+------+------------+--------------+
- | id | name_english | name_japanese | type | price_buy | price_sell | weight | attack | defence | range | slots | equip_jobs | equip_genders | equip_locations | weapon_level | equip_level | view | script_use | script_equip |
- +----+--------------+---------------+------+-----------+------------+--------+--------+---------+-------+-------+------------+---------------+-----------------+--------------+-------------+------+------------+--------------+ */
-
- nameid = atoi(sql_row[0]);
-
- // If the identifier is not within the valid range, process the next row
- if (nameid == 0 || nameid >= 20000)
- {
- continue;
- }
-
- // Insert a new row into the item database
-
- /*id = aCalloc(sizeof(struct item_data), 1);
-
- if (id == NULL)
- {
- printf("out of memory : itemdb_read_sqldb\n");
- exit(1);
- }
-
- memset(id, 0, sizeof(struct item_data));
- numdb_insert(item_db, (int) nameid, id);*/
-
- // ----------
- id=itemdb_search(nameid);
-
- memcpy(id->name, sql_row[1], 25);
- memcpy(id->jname, sql_row[2], 25);
-
- id->type = atoi(sql_row[3]);
-
- // If price_buy is not NULL and price_sell is not NULL...
- if ((sql_row[4] != NULL) && (sql_row[5] != NULL))
- {
- id->value_buy = atoi(sql_row[4]);
- id->value_sell = atoi(sql_row[5]);
- }
- // If price_buy is not NULL and price_sell is NULL...
- else if ((sql_row[4] != NULL) && (sql_row[5] == NULL))
- {
- id->value_buy = atoi(sql_row[4]);
- id->value_sell = atoi(sql_row[4]) / 2;
- }
- // If price_buy is NULL and price_sell is not NULL...
- else if ((sql_row[4] == NULL) && (sql_row[5] != NULL))
- {
- id->value_buy = atoi(sql_row[5]) * 2;
- id->value_sell = atoi(sql_row[5]);
- }
- // If price_buy is NULL and price_sell is NULL...
- if ((sql_row[4] == NULL) && (sql_row[5] == NULL))
- {
- id->value_buy = 0;
- id->value_sell = 0;
- }
-
- id->weight = atoi(sql_row[6]);
-
- id->atk = (sql_row[7] != NULL) ? atoi(sql_row[7]) : 0;
- id->def = (sql_row[8] != NULL) ? atoi(sql_row[8]) : 0;
- id->range = (sql_row[9] != NULL) ? atoi(sql_row[9]) : 0;
- id->slot = (sql_row[10] != NULL) ? atoi(sql_row[10]) : 0;
- id->class_ = (sql_row[11] != NULL) ? atoi(sql_row[11]) : 0;
- id->sex = (sql_row[12] != NULL) ? atoi(sql_row[12]) : 0;
- id->equip = (sql_row[13] != NULL) ? atoi(sql_row[13]) : 0;
- id->wlv = (sql_row[14] != NULL) ? atoi(sql_row[14]) : 0;
- id->elv = (sql_row[15] != NULL) ? atoi(sql_row[15]) : 0;
- id->look = (sql_row[16] != NULL) ? atoi(sql_row[16]) : 0;
-
- id->view_id = 0;
-
- // ----------
-
- if (sql_row[17] != NULL)
- {
- if (sql_row[17][0] == '{')
- id->use_script = parse_script((unsigned char *) sql_row[17], 0);
- else {
- sprintf(script, "{%s}", sql_row[17]);
- id->use_script = parse_script((unsigned char *) script, 0);
- }
- }
- else
- {
- id->use_script = NULL;
- }
-
- if (sql_row[18] != NULL)
- {
- if (sql_row[18][0] == '{')
- id->equip_script = parse_script((unsigned char *) sql_row[18], 0);
- else {
- sprintf(script, "{%s}", sql_row[18]);
- id->equip_script = parse_script((unsigned char *) script, 0);
- }
- }
- else
- {
- id->equip_script = NULL;
- }
-
- // ----------
-
- id->flag.available = 1;
- id->flag.value_notdc = 0;
- id->flag.value_notoc = 0;
- }
-
- // If the retrieval failed, output an error
- if (mysql_errno(&mmysql_handle))
- {
- printf("Database server error (retrieving rows from %s): %s\n", item_db_db, mysql_error(&mmysql_handle));
- }
- sprintf(tmp_output,"Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",(unsigned long) mysql_num_rows(sql_res),item_db_db);
- ShowStatus(tmp_output);
- }
- else
- {
- printf("MySQL error (storing query result for %s): %s\n", item_db_db, mysql_error(&mmysql_handle));
- }
-
- // Free the query result
- mysql_free_result(sql_res);
- }
- else
- {
- printf("Database server error (executing query for %s): %s\n", item_db_db, mysql_error(&mmysql_handle));
- }
-
- return 0;
-}
-
-#endif /* not TXT_ONLY */
-/*==========================================
- *
- *------------------------------------------
- */
-static int itemdb_final(void *key,void *data,va_list ap)
-{
- struct item_data *id;
-
- nullpo_retr(0, id= (struct item_data *) data);
-
- if(id->use_script)
- aFree(id->use_script);
- if(id->equip_script)
- aFree(id->equip_script);
- aFree(id);
-
- return 0;
-}
-
-void itemdb_reload(void)
-{
- numdb_final(item_db,itemdb_final);
- do_init_itemdb();
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void do_final_itemdb(void)
-{
- if(item_db){
- numdb_final(item_db,itemdb_final);
- item_db=NULL;
- }
-}
-
-/*
-static FILE *dfp;
-static int itemdebug(void *key,void *data,va_list ap){
-// struct item_data *id=(struct item_data *)data;
- fprintf(dfp,"%6d",(int)key);
- return 0;
-}
-void itemdebugtxt()
-{
- dfp=fopen("itemdebug.txt","wt");
- numdb_foreach(item_db,itemdebug);
- fclose(dfp);
-}
-*/
-/*==========================================
- *
- *------------------------------------------
- */
-int do_init_itemdb(void)
-{
- item_db = numdb_init();
-
- itemdb_read();
-
- return 0;
-}
diff --git a/src/map/itemdb.h b/src/map/itemdb.h
deleted file mode 100644
index 2ba6ae7f6..000000000
--- a/src/map/itemdb.h
+++ /dev/null
@@ -1,85 +0,0 @@
-// $Id: itemdb.h,v 1.3 2004/09/25 05:32:18 MouseJstr Exp $
-#ifndef _ITEMDB_H_
-#define _ITEMDB_H_
-
-#include "map.h"
-
-struct item_data {
- int nameid;
- char name[24],jname[24];
- char prefix[24],suffix[24];
- char cardillustname[64];
- int value_buy;
- int value_sell;
- int type;
- int class_;
- int sex;
- int equip;
- int weight;
- int atk;
- int def;
- int range;
- int slot;
- int look;
- int elv;
- int wlv;
- int refine;
- char *use_script; // ‰ñ•œ‚Æ‚©‚à‘S•”‚±‚Ì’†‚Å‚â‚낤‚©‚È‚Æ
- char *equip_script; // UŒ‚,–hŒä‚Ì‘®«Ý’è‚à‚±‚Ì’†‚ʼn”\‚©‚È?
- struct {
- unsigned available : 1;
- unsigned value_notdc : 1;
- unsigned value_notoc : 1;
- unsigned no_equip : 3;
- unsigned no_drop : 1;
- unsigned no_use : 1;
- unsigned no_refine : 1; // [celest]
- } flag;
- int view_id;
-};
-
-struct random_item_data {
- int nameid;
- int per;
-};
-
-struct item_data* itemdb_searchname(const char *name);
-struct item_data* itemdb_search(int nameid);
-struct item_data* itemdb_exists(int nameid);
-#define itemdb_type(n) itemdb_search(n)->type
-#define itemdb_atk(n) itemdb_search(n)->atk
-#define itemdb_def(n) itemdb_search(n)->def
-#define itemdb_look(n) itemdb_search(n)->look
-#define itemdb_weight(n) itemdb_search(n)->weight
-#define itemdb_equip(n) itemdb_search(n)->equip
-#define itemdb_usescript(n) itemdb_search(n)->use_script
-#define itemdb_equipscript(n) itemdb_search(n)->equip_script
-#define itemdb_wlv(n) itemdb_search(n)->wlv
-#define itemdb_range(n) itemdb_search(n)->range
-#define itemdb_slot(n) itemdb_search(n)->slot
-#define itemdb_available(n) (itemdb_exists(n) && itemdb_search(n)->flag.available)
-#define itemdb_viewid(n) (itemdb_search(n)->view_id)
-
-int itemdb_searchrandomid(int flags);
-
-#define itemdb_value_buy(n) itemdb_search(n)->value_buy
-#define itemdb_value_sell(n) itemdb_search(n)->value_sell
-#define itemdb_value_notdc(n) itemdb_search(n)->flag.value_notdc
-#define itemdb_value_notoc(n) itemdb_search(n)->flag.value_notoc
-
-int itemdb_isequip(int);
-int itemdb_isequip2(struct item_data *);
-int itemdb_isequip3(int);
-int itemdb_isdropable(int nameid);
-
-// itemdb_equipƒ}ƒNƒ‚Æitemdb_equippoint‚Ƃ̈Ⴂ‚Í
-// ‘OŽÒ‚ªŽI‘¤db‚Å’è‹`‚³‚ꂽ’l‚»‚Ì‚à‚Ì‚ð•Ô‚·‚̂ɑ΂µ
-// ŒãŽÒ‚Ísessiondata‚ðl—¶‚µ‚½ˆÆ‘¤‚Å‚Ì‘•”õ‰Â”\êŠ
-// ‚·‚ׂĂ̑g‚݇‚킹‚ð•Ô‚·
-
-void itemdb_reload(void);
-
-void do_final_itemdb(void);
-int do_init_itemdb(void);
-
-#endif
diff --git a/src/map/log.c b/src/map/log.c
deleted file mode 100644
index 7cf4dfcf4..000000000
--- a/src/map/log.c
+++ /dev/null
@@ -1,687 +0,0 @@
-// Logging functions by Azndragon & Codemaster
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "../common/strlib.h"
-#include "../common/nullpo.h"
-#include "itemdb.h"
-#include "map.h"
-#include "log.h"
-
-struct Log_Config log_config;
-
-char timestring[255];
-time_t curtime;
-
-//FILTER OPTIONS
-//0 = Don't log
-//1 = Log any item
-//Bits: ||
-//2 - Healing items (0)
-//3 - Etc Items(3) + Arrows (10)
-//4 - Usable Items(2)
-//5 - Weapon(4)
-//6 - Shields,Armor,Headgears,Accessories,etc(5)
-//7 - Cards(6)
-//8 - Pet Accessories(8) + Eggs(7) (well, monsters don't drop 'em but we'll use the same system for ALL logs)
-//9 - Log expensive items ( >= price_log)
-//10 - Log big amount of items ( >= amount_log)
-//11 - Log refined items (if their refine >= refine_log )
-//12 - Log rare items (if their drop chance <= rare_log )
-
-//check if this item should be logger according the settings
-int should_log_item(int filter, int nameid) {
- struct item_data *item_data;
- if (nameid<512 || (item_data= itemdb_search(nameid)) == NULL) return 0;
- if ( (filter&1) || // Filter = 1, we log any item
- (filter&2 && item_data->type == 0 ) || //healing items
- (filter&4 && (item_data->type == 3 || item_data->type == 10) ) || //etc+arrows
- (filter&8 && item_data->type == 2 ) || //usable
- (filter&16 && item_data->type == 4 ) || //weapon
- (filter&32 && item_data->type == 5 ) || //armor
- (filter&64 && item_data->type == 6 ) || //cards
- (filter&128 && (item_data->type == 7 || item_data->type == 8) ) || //eggs+pet access
- (filter&256 && item_data->value_buy >= log_config.price_items_log ) ||
- (filter&512 && item_data->refine >= log_config.refine_items_log )
- ) return item_data->nameid;
-
- return 0;
-}
-
-int log_branch(struct map_session_data *sd)
-{
-#ifndef TXT_ONLY
- char t_name[100];
-#endif
- FILE *logfp;
-
- if(log_config.enable_logs <= 0)
- return 0;
- nullpo_retr(0, sd);
-#ifndef TXT_ONLY
- if(log_config.sql_logs > 0)
- {
- sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`branch_date`, `account_id`, `char_id`, `char_name`, `map`) VALUES (NOW(), '%d', '%d', '%s', '%s')",
- log_config.log_branch_db, sd->status.account_id, sd->status.char_id, jstrescapecpy(t_name, sd->status.name), sd->mapname);
- if(mysql_query(&mmysql_handle, tmp_sql))
- printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
- } else {
-#endif
- if((logfp=fopen(log_config.log_branch,"a+")) != NULL) {
- time(&curtime);
- strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
- fprintf(logfp,"%s - %s[%d:%d]\t%s%s", timestring, sd->status.name, sd->status.account_id, sd->status.char_id, sd->mapname, RETCODE);
- fclose(logfp);
- }
-#ifndef TXT_ONLY
- }
-#endif
- return 0;
-}
-
-int log_drop(struct map_session_data *sd, int monster_id, int *log_drop)
-{
- FILE *logfp;
- int i,flag = 0;
-
- if(log_config.enable_logs <= 0)
- return 0;
- nullpo_retr(0, sd);
- for (i = 0; i<10; i++) { //Should we log these items? [Lupus]
- flag += should_log_item(log_config.drop,log_drop[i]);
- }
- if (flag==0) return 0; //we skip logging this items set - they doesn't met our logging conditions [Lupus]
-
-#ifndef TXT_ONLY
- if(log_config.sql_logs > 0)
- {
- sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`drop_date`, `kill_char_id`, `monster_id`, `item1`, `item2`, `item3`, `item4`, `item5`, `item6`, `item7`, `item8`, `item9`, `itemCard`, `map`) VALUES (NOW(), '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s') ", log_config.log_drop_db, sd->status.char_id, monster_id, log_drop[0], log_drop[1], log_drop[2], log_drop[3], log_drop[4], log_drop[5], log_drop[6], log_drop[7], log_drop[8], log_drop[9], sd->mapname);
- if(mysql_query(&mmysql_handle, tmp_sql))
- printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
- } else {
-#endif
- if((logfp=fopen(log_config.log_drop,"a+")) != NULL) {
-
-
- time_t curtime;
- time(&curtime);
- strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
- fprintf(logfp,"%s - %s[%d:%d]\t%d\t%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%s", timestring, sd->status.name, sd->status.account_id, sd->status.char_id, monster_id, log_drop[0], log_drop[1], log_drop[2], log_drop[3], log_drop[4], log_drop[5], log_drop[6], log_drop[7], log_drop[8], log_drop[9], RETCODE);
- fclose(logfp);
- }
-#ifndef TXT_ONLY
- }
-#endif
- return 1; //Logged
-}
-
-int log_mvpdrop(struct map_session_data *sd, int monster_id, int *log_mvp)
-{
- FILE *logfp;
-
- if(log_config.enable_logs <= 0)
- return 0;
- nullpo_retr(0, sd);
-#ifndef TXT_ONLY
- if(log_config.sql_logs > 0)
- {
- sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`mvp_date`, `kill_char_id`, `monster_id`, `prize`, `mvpexp`, `map`) VALUES (NOW(), '%d', '%d', '%d', '%d', '%s') ", log_config.log_mvpdrop_db, sd->status.char_id, monster_id, log_mvp[0], log_mvp[1], sd->mapname);
- if(mysql_query(&mmysql_handle, tmp_sql))
- printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
- } else {
-#endif
- if((logfp=fopen(log_config.log_mvpdrop,"a+")) != NULL) {
- time(&curtime);
- strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
- fprintf(logfp,"%s - %s[%d:%d]\t%d\t%d,%d%s", timestring, sd->status.name, sd->status.account_id, sd->status.char_id, monster_id, log_mvp[0], log_mvp[1], RETCODE);
- fclose(logfp);
- }
-#ifndef TXT_ONLY
- }
-#endif
- return 0;
-}
-
-int log_present(struct map_session_data *sd, int source_type, int nameid)
-{
- FILE *logfp;
-#ifndef TXT_ONLY
- char t_name[100];
-#endif
-
- if(log_config.enable_logs <= 0)
- return 0;
- nullpo_retr(0, sd);
- if(!should_log_item(log_config.present,nameid)) return 0; //filter [Lupus]
-#ifndef TXT_ONLY
- if(log_config.sql_logs > 0)
- {
- sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`present_date`, `src_id`, `account_id`, `char_id`, `char_name`, `nameid`, `map`) VALUES (NOW(), '%d', '%d', '%d', '%s', '%d', '%s') ",
- log_config.log_present_db, source_type, sd->status.account_id, sd->status.char_id, jstrescapecpy(t_name, sd->status.name), nameid, sd->mapname);
- if(mysql_query(&mmysql_handle, tmp_sql))
- printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
- } else {
-#endif
- if((logfp=fopen(log_config.log_present,"a+")) != NULL) {
- time(&curtime);
- strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
- fprintf(logfp,"%s - %s[%d:%d]\t%d\t%d%s", timestring, sd->status.name, sd->status.account_id, sd->status.char_id, source_type, nameid, RETCODE);
- fclose(logfp);
- }
-#ifndef TXT_ONLY
- }
-#endif
- return 0;
-}
-
-int log_produce(struct map_session_data *sd, int nameid, int slot1, int slot2, int slot3, int success)
-{
- FILE *logfp;
-#ifndef TXT_ONLY
- char t_name[100];
-#endif
-
- if(log_config.enable_logs <= 0)
- return 0;
- nullpo_retr(0, sd);
- if(!should_log_item(log_config.produce,nameid)) return 0; //filter [Lupus]
-#ifndef TXT_ONLY
- if(log_config.sql_logs > 0)
- {
- sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`produce_date`, `account_id`, `char_id`, `char_name`, `nameid`, `slot1`, `slot2`, `slot3`, `map`, `success`) VALUES (NOW(), '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%s', '%d') ",
- log_config.log_produce_db, sd->status.account_id, sd->status.char_id, jstrescapecpy(t_name, sd->status.name), nameid, slot1, slot2, slot3, sd->mapname, success);
- if(mysql_query(&mmysql_handle, tmp_sql))
- printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
- } else {
-#endif
- if((logfp=fopen(log_config.log_produce,"a+")) != NULL) {
- time(&curtime);
- strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
- fprintf(logfp,"%s - %s[%d:%d]\t%d\t%d,%d,%d\t%d%s", timestring, sd->status.name, sd->status.account_id, sd->status.char_id, nameid, slot1, slot2, slot3, success, RETCODE);
- fclose(logfp);
- }
-#ifndef TXT_ONLY
- }
-#endif
- return 0;
-}
-
-int log_refine(struct map_session_data *sd, int n, int success)
-{
- FILE *logfp;
- int log_card[4];
- int item_level;
- int i;
-#ifndef TXT_ONLY
- char t_name[100];
-#endif
-
- if(log_config.enable_logs <= 0)
- return 0;
-
- nullpo_retr(0, sd);
-
- if(success == 0)
- item_level = 0;
- else
- item_level = sd->status.inventory[n].refine + 1;
- if(!should_log_item(log_config.refine,sd->status.inventory[n].nameid)) return 0; //filter [Lupus]
- for(i=0;i<4;i++)
- log_card[i] = sd->status.inventory[n].card[i];
-
-#ifndef TXT_ONLY
- if(log_config.sql_logs > 0)
- {
- sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`refine_date`, `account_id`, `char_id`, `char_name`, `nameid`, `refine`, `card0`, `card1`, `card2`, `card3`, `map`, `success`, `item_level`) VALUES (NOW(), '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%s', '%d', '%d')",
- log_config.log_refine_db, sd->status.account_id, sd->status.char_id, jstrescapecpy(t_name, sd->status.name), sd->status.inventory[n].nameid, sd->status.inventory[n].refine, log_card[0], log_card[1], log_card[2], log_card[3], sd->mapname, success, item_level);
- if(mysql_query(&mmysql_handle, tmp_sql))
- printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
- } else {
-#endif
- if((logfp=fopen(log_config.log_refine,"a+")) != NULL) {
- time(&curtime);
- strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
- fprintf(logfp,"%s - %s[%d:%d]\t%d,%d\t%d%d%d%d\t%d,%d%s", timestring, sd->status.name, sd->status.account_id, sd->status.char_id, sd->status.inventory[n].nameid, sd->status.inventory[n].refine, log_card[0], log_card[1], log_card[2], log_card[3], success, item_level, RETCODE);
- fclose(logfp);
- }
-#ifndef TXT_ONLY
- }
-#endif
- return 0;
-}
-
-int log_tostorage(struct map_session_data *sd,int n, int guild)
-{
- FILE *logfp;
-
- if(log_config.enable_logs <= 0 || log_config.storage == 0 || log_config.log_storage[0] == '\0')
- return 0;
-
- nullpo_retr(0, sd);
- if(sd->status.inventory[n].nameid==0 || sd->inventory_data[n] == NULL)
- return 1;
-
- if(sd->status.inventory[n].amount < 0)
- return 1;
-
- if((logfp=fopen(log_config.log_trade,"a+")) != NULL) {
- time(&curtime);
- strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
- fprintf(logfp,"%s - to %s: %s[%d:%d]\t%d\t%d\t%d\t%d,%d,%d,%d%s", timestring, guild ? "guild_storage": "storage", sd->status.name, sd->status.account_id, sd->status.char_id,
- sd->status.inventory[n].nameid,
- sd->status.inventory[n].amount,
- sd->status.inventory[n].refine,
- sd->status.inventory[n].card[0],
- sd->status.inventory[n].card[1],
- sd->status.inventory[n].card[2],
- sd->status.inventory[n].card[3], RETCODE);
- fclose(logfp);
- }
- return 0;
-}
-
-int log_fromstorage(struct map_session_data *sd,int n, int guild)
-{
- FILE *logfp;
-
- if(log_config.enable_logs <= 0 || log_config.storage == 0 || log_config.log_storage[0] == '\0')
- return 0;
-
- nullpo_retr(0, sd);
-
- if(sd->status.inventory[n].nameid==0 || sd->inventory_data[n] == NULL)
- return 1;
-
- if(sd->status.inventory[n].amount < 0)
- return 1;
-
- if((logfp=fopen(log_config.log_trade,"a+")) != NULL) {
- time(&curtime);
- strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
- fprintf(logfp,"%s - from %s: %s[%d:%d]\t%d\t%d\t%d\t%d,%d,%d,%d%s", timestring, guild ? "guild_storage": "storage", sd->status.name, sd->status.account_id, sd->status.char_id,
- sd->status.inventory[n].nameid,
- sd->status.inventory[n].amount,
- sd->status.inventory[n].refine,
- sd->status.inventory[n].card[0],
- sd->status.inventory[n].card[1],
- sd->status.inventory[n].card[2],
- sd->status.inventory[n].card[3], RETCODE);
- fclose(logfp);
- }
- return 0;
-}
-
-int log_trade(struct map_session_data *sd, struct map_session_data *target_sd, int n,int amount)
-{
- FILE *logfp;
- int log_nameid, log_amount, log_refine, log_card[4];
- int i;
-#ifndef TXT_ONLY
- char t_name[100],t_name2[100];
-#endif
-
- if(log_config.enable_logs <= 0)
- return 0;
-
- nullpo_retr(0, sd);
-
- if(sd->status.inventory[n].nameid==0 || amount <= 0 || sd->status.inventory[n].amount<amount || sd->inventory_data[n] == NULL)
- return 1;
-
- if(sd->status.inventory[n].amount < 0)
- return 1;
- if(!should_log_item(log_config.trade,sd->status.inventory[n].nameid)) return 0; //filter [Lupus]
- log_nameid = sd->status.inventory[n].nameid;
- log_amount = sd->status.inventory[n].amount;
- log_refine = sd->status.inventory[n].refine;
-
- for(i=0;i<4;i++)
- log_card[i] = sd->status.inventory[n].card[i];
-
-#ifndef TXT_ONLY
- if(log_config.sql_logs > 0)
- {
- sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`trade_date`, `src_account_id`, `src_char_id`, `src_char_name`, `des_account_id`, `des_char_id`, `des_char_name`, `nameid`, `amount`, `refine`, `card0`, `card1`, `card2`, `card3`, `map`) VALUES (NOW(), '%d', '%d', '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s')",
- log_config.log_trade_db, sd->status.account_id, sd->status.char_id, jstrescapecpy(t_name, sd->status.name), target_sd->status.account_id, target_sd->status.char_id, jstrescapecpy(t_name2, target_sd->status.name), log_nameid, log_amount, log_refine, log_card[0], log_card[1], log_card[2], log_card[3], sd->mapname);
- if(mysql_query(&mmysql_handle, tmp_sql))
- printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
- } else {
-#endif
- if((logfp=fopen(log_config.log_trade,"a+")) != NULL) {
- time(&curtime);
- strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
- fprintf(logfp,"%s - %s[%d:%d]\t%s[%d:%d]\t%d\t%d\t%d\t%d,%d,%d,%d%s", timestring, sd->status.name, sd->status.account_id, sd->status.char_id, target_sd->status.name, target_sd->status.account_id, target_sd->status.char_id, log_nameid, log_amount, log_refine, log_card[0], log_card[1], log_card[2], log_card[3], RETCODE);
- fclose(logfp);
- }
-#ifndef TXT_ONLY
- }
-#endif
- return 0;
-}
-
-int log_vend(struct map_session_data *sd,struct map_session_data *vsd,int n,int amount, int zeny)
-{
- FILE *logfp;
- int log_nameid, log_amount, log_refine, log_card[4];
- int i;
-#ifndef TXT_ONLY
- char t_name[100],t_name2[100];
-#endif
-
- if(log_config.enable_logs <= 0)
- return 0;
- nullpo_retr(0, sd);
-
- if(sd->status.inventory[n].nameid==0 || amount <= 0 || sd->status.inventory[n].amount<amount || sd->inventory_data[n] == NULL)
- return 1;
- if(sd->status.inventory[n].amount< 0)
- return 1;
- if(!should_log_item(log_config.vend,sd->status.inventory[n].nameid)) return 0; //filter [Lupus]
- log_nameid = sd->status.inventory[n].nameid;
- log_amount = sd->status.inventory[n].amount;
- log_refine = sd->status.inventory[n].refine;
- for(i=0;i<4;i++)
- log_card[i] = sd->status.inventory[n].card[i];
-
-#ifndef TXT_ONLY
- if(log_config.sql_logs > 0)
- {
- sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`vend_date`, `vend_account_id`, `vend_char_id`, `vend_char_name`, `buy_account_id`, `buy_char_id`, `buy_char_name`, `nameid`, `amount`, `refine`, `card0`, `card1`, `card2`, `card3`, `map`, `zeny`) VALUES (NOW(), '%d', '%d', '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s', '%d')",
- log_config.log_vend_db, sd->status.account_id, sd->status.char_id, jstrescapecpy(t_name, sd->status.name), vsd->status.account_id, vsd->status.char_id, jstrescapecpy(t_name2, vsd->status.name), log_nameid, log_amount, log_refine, log_card[0], log_card[1], log_card[2], log_card[3], sd->mapname, zeny);
- if(mysql_query(&mmysql_handle, tmp_sql))
- printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
- } else {
-#endif
- if((logfp=fopen(log_config.log_vend,"a+")) != NULL) {
- time(&curtime);
- strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
- fprintf(logfp,"%s - %s[%d:%d]\t%s[%d:%d]\t%d\t%d\t%d\t%d,%d,%d,%d\t%d%s", timestring, sd->status.name, sd->status.account_id, sd->status.char_id, vsd->status.name, vsd->status.account_id, vsd->status.char_id, log_nameid, log_amount, log_refine, log_card[0], log_card[1], log_card[2], log_card[3], zeny, RETCODE);
- fclose(logfp);
- }
-#ifndef TXT_ONLY
- }
-#endif
- return 0;
-}
-
-int log_zeny(struct map_session_data *sd, struct map_session_data *target_sd,int amount)
-{
- FILE *logfp;
-#ifndef TXT_ONLY
- char t_name[100],t_name2[100];
-#endif
-
- if(log_config.enable_logs <= 0)
- return 0;
- nullpo_retr(0, sd);
-#ifndef TXT_ONLY
- if(log_config.sql_logs > 0)
- {
- sprintf(tmp_sql,"INSERT DELAYED INTO `%s` (`trade_date`, `src_account_id`, `src_char_id`, `src_char_name`, `des_account_id`, `des_char_id`, `des_char_name`, `map`, `zeny`) VALUES (NOW(), '%d', '%d', '%s', '%d', '%d', '%s', '%s', '%d')",
- log_config.log_trade_db, sd->status.account_id, sd->status.char_id, jstrescapecpy(t_name, sd->status.name), target_sd->status.account_id, target_sd->status.char_id, jstrescapecpy(t_name2, target_sd->status.name), sd->mapname, sd->deal_zeny);
- if(mysql_query(&mmysql_handle, tmp_sql))
- printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
- } else {
-#endif
- if((logfp=fopen(log_config.log_trade,"a+")) != NULL) {
- time(&curtime);
- strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
- fprintf(logfp,"%s - %s[%d]\t%s[%d]\t%d\t%s", timestring, sd->status.name, sd->status.account_id, target_sd->status.name, target_sd->status.account_id, sd->deal_zeny, RETCODE);
- fclose(logfp);
- }
-#ifndef TXT_ONLY
- }
-#endif
- return 0;
-}
-
-int log_atcommand(struct map_session_data *sd, const char *message)
-{
- FILE *logfp;
-#ifndef TXT_ONLY
- char t_name[100];
-#endif
-
- if(log_config.enable_logs <= 0)
- return 0;
- nullpo_retr(0, sd);
-#ifndef TXT_ONLY
- if(log_config.sql_logs > 0)
- {
- sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`atcommand_date`, `account_id`, `char_id`, `char_name`, `map`, `command`) VALUES(NOW(), '%d', '%d', '%s', '%s', '%s') ",
- log_config.log_gm_db, sd->status.account_id, sd->status.char_id, jstrescapecpy(t_name, sd->status.name), sd->mapname, message);
- if(mysql_query(&mmysql_handle, tmp_sql))
- printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
- } else {
-#endif
- if((logfp=fopen(log_config.log_gm,"a+")) != NULL) {
- time(&curtime);
- strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
- fprintf(logfp,"%s - %s[%d]: %s%s",timestring,sd->status.name,sd->status.account_id,message,RETCODE);
- fclose(logfp);
- }
-#ifndef TXT_ONLY
- }
-#endif
- return 0;
-}
-
-int log_npc(struct map_session_data *sd, const char *message)
-{ //[Lupus]
- FILE *logfp;
- #ifndef TXT_ONLY
- char t_name[100];
- #endif
-
- if(log_config.enable_logs <= 0)
- return 0;
- nullpo_retr(0, sd);
-#ifndef TXT_ONLY
- if(log_config.sql_logs > 0)
- {
- sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`npc_date`, `account_id`, `char_id`, `char_name`, `map`, `mes`) VALUES(NOW(), '%d', '%d', '%s', '%s', '%s') ",
- log_config.log_npc_db, sd->status.account_id, sd->status.char_id, jstrescapecpy(t_name, sd->status.name), sd->mapname, message);
- if(mysql_query(&mmysql_handle, tmp_sql))
- printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
- } else {
-#endif
- if((logfp=fopen(log_config.log_npc,"a+")) != NULL) {
- time(&curtime);
- strftime(timestring, 254, "%m/%d/%Y %H:%M:%S", localtime(&curtime));
- fprintf(logfp,"%s - %s[%d]: %s%s",timestring,sd->status.name,sd->status.account_id,message,RETCODE);
- fclose(logfp);
- }
-#ifndef TXT_ONLY
- }
-#endif
- return 0;
-}
-
-int log_config_read(char *cfgName)
-{
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- memset(&log_config, 0, sizeof(log_config));
-
- if((fp = fopen(cfgName, "r")) == NULL)
- {
- printf("Log configuration file not found at: %s\n", cfgName);
- return 1;
- }
-
- //LOG FILTER Default values
- log_config.refine_items_log = 7; //log refined items, with refine >= +7
- log_config.rare_items_log = 100; //log rare items. drop chance <= 1%
- log_config.price_items_log = 1000; //1000z
- log_config.amount_items_log = 100;
-
- while(fgets(line, sizeof(line) -1, fp))
- {
- if(line[0] == '/' && line[1] == '/')
- continue;
-
- if(sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2)
- {
- if(strcmpi(w1,"enable_logs") == 0) {
- log_config.enable_logs = (atoi(w2));
- } else if(strcmpi(w1,"sql_logs") == 0) {
- log_config.sql_logs = (atoi(w2));
-//start of common filter settings
- } else if(strcmpi(w1,"rare_items_log") == 0) {
- log_config.rare_items_log = (atoi(w2));
- } else if(strcmpi(w1,"refine_items_log") == 0) {
- log_config.refine_items_log = (atoi(w2));
- } else if(strcmpi(w1,"price_items_log") == 0) {
- log_config.price_items_log = (atoi(w2));
- } else if(strcmpi(w1,"amount_items_log") == 0) {
- log_config.amount_items_log = (atoi(w2));
-//end of common filter settings
- } else if(strcmpi(w1,"log_branch") == 0) {
- log_config.branch = (atoi(w2));
- } else if(strcmpi(w1,"log_drop") == 0) {
- log_config.drop = (atoi(w2));
- } else if(strcmpi(w1,"log_mvpdrop") == 0) {
- log_config.mvpdrop = (atoi(w2));
- } else if(strcmpi(w1,"log_present") == 0) {
- log_config.present = (atoi(w2));
- } else if(strcmpi(w1,"log_produce") == 0) {
- log_config.produce = (atoi(w2));
- } else if(strcmpi(w1,"log_refine") == 0) {
- log_config.refine = (atoi(w2));
- } else if(strcmpi(w1,"log_trade") == 0) {
- log_config.trade = (atoi(w2));
- } else if(strcmpi(w1,"log_storage") == 0) {
- log_config.storage = (atoi(w2));
- } else if(strcmpi(w1,"log_vend") == 0) {
- log_config.vend = (atoi(w2));
- } else if(strcmpi(w1,"log_zeny") == 0) {
- if(log_config.trade != 1)
- log_config.zeny = 0;
- else
- log_config.zeny = (atoi(w2));
- } else if(strcmpi(w1,"log_gm") == 0) {
- log_config.gm = (atoi(w2));
- } else if(strcmpi(w1,"log_npc") == 0) {
- log_config.npc = (atoi(w2));
- }
-
-#ifndef TXT_ONLY
- else if(strcmpi(w1, "log_branch_db") == 0) {
- strcpy(log_config.log_branch_db, w2);
- if(log_config.branch == 1)
- printf("Logging Dead Branch Usage to table `%s`\n", w2);
- } else if(strcmpi(w1, "log_drop_db") == 0) {
- strcpy(log_config.log_drop_db, w2);
- if(log_config.drop == 1)
- printf("Logging Item Drops to table `%s`\n", w2);
- } else if(strcmpi(w1, "log_mvpdrop_db") == 0) {
- strcpy(log_config.log_mvpdrop_db, w2);
- if(log_config.mvpdrop == 1)
- printf("Logging MVP Drops to table `%s`\n", w2);
- } else if(strcmpi(w1, "log_present_db") == 0) {
- strcpy(log_config.log_present_db, w2);
- if(log_config.present == 1)
- printf("Logging Present Usage & Results to table `%s`\n", w2);
- } else if(strcmpi(w1, "log_produce_db") == 0) {
- strcpy(log_config.log_produce_db, w2);
- if(log_config.produce == 1)
- printf("Logging Producing to table `%s`\n", w2);
- } else if(strcmpi(w1, "log_refine_db") == 0) {
- strcpy(log_config.log_refine_db, w2);
- if(log_config.refine == 1)
- printf("Logging Refining to table `%s`\n", w2);
- } else if(strcmpi(w1, "log_trade_db") == 0) {
- strcpy(log_config.log_trade_db, w2);
- if(log_config.trade == 1)
- {
- printf("Logging Item Trades");
- if(log_config.zeny == 1)
- printf("and Zeny Trades");
- printf(" to table `%s`\n", w2);
- }
-// } else if(strcmpi(w1, "log_storage_db") == 0) {
-// strcpy(log_config.log_storage_db, w2);
-// if(log_config.storage == 1)
-// {
-// printf("Logging Item Storages");
-// printf(" to table `%s`\n", w2);
-// }
- } else if(strcmpi(w1, "log_vend_db") == 0) {
- strcpy(log_config.log_vend_db, w2);
- if(log_config.vend == 1)
- printf("Logging Vending to table `%s`\n", w2);
- } else if(strcmpi(w1, "log_gm_db") == 0) {
- strcpy(log_config.log_gm_db, w2);
- if(log_config.gm > 0)
- printf("Logging GM Level %d Commands to table `%s`\n", log_config.gm, w2);
- } else if(strcmpi(w1, "log_npc_db") == 0) {
- strcpy(log_config.log_npc_db, w2);
- if(log_config.npc > 0)
- printf("Logging NPC 'logmes' to table `%s`\n", w2);
- }
-#endif
-
- else if(strcmpi(w1, "log_branch_file") == 0) {
- strcpy(log_config.log_branch, w2);
- if(log_config.branch > 0 && log_config.sql_logs < 1)
- printf("Logging Dead Branch Usage to file `%s`.txt\n", w2);
- } else if(strcmpi(w1, "log_drop_file") == 0) {
- strcpy(log_config.log_drop, w2);
- if(log_config.drop > 0 && log_config.sql_logs < 1)
- printf("Logging Item Drops to file `%s`.txt\n", w2);
- } else if(strcmpi(w1, "log_mvpdrop_file") == 0) {
- strcpy(log_config.log_mvpdrop, w2);
- if(log_config.mvpdrop > 0 && log_config.sql_logs < 1)
- printf("Logging MVP Drops to file `%s`.txt\n", w2);
- } else if(strcmpi(w1, "log_present_file") == 0) {
- strcpy(log_config.log_present, w2);
- if(log_config.present > 0 && log_config.sql_logs < 1)
- printf("Logging Present Usage & Results to file `%s`.txt\n", w2);
- } else if(strcmpi(w1, "log_produce_file") == 0) {
- strcpy(log_config.log_produce, w2);
- if(log_config.produce > 0 && log_config.sql_logs < 1)
- printf("Logging Producing to file `%s`.txt\n", w2);
- } else if(strcmpi(w1, "log_refine_file") == 0) {
- strcpy(log_config.log_refine, w2);
- if(log_config.refine > 0 && log_config.sql_logs < 1)
- printf("Logging Refining to file `%s`.txt\n", w2);
- } else if(strcmpi(w1, "log_trade_file") == 0) {
- strcpy(log_config.log_trade, w2);
- if(log_config.trade > 0 && log_config.sql_logs < 1)
- {
- printf("Logging Item Trades");
- if(log_config.zeny > 0)
- printf("and Zeny Trades");
- printf(" to file `%s`.txt\n", w2);
- }
- } else if(strcmpi(w1, "log_storage_file") == 0) {
- strcpy(log_config.log_storage, w2);
- if(log_config.storage > 0 && log_config.sql_logs < 1)
- {
- printf("Logging Item Storages");
- printf(" to file `%s`.txt\n", w2);
- }
- } else if(strcmpi(w1, "log_vend_file") == 0) {
- strcpy(log_config.log_vend, w2);
- if(log_config.vend > 0 && log_config.sql_logs < 1)
- printf("Logging Vending to file `%s`.txt\n", w2);
- } else if(strcmpi(w1, "log_gm_file") == 0) {
- strcpy(log_config.log_gm, w2);
- if(log_config.gm > 0 && log_config.sql_logs < 1)
- printf("Logging GM Level %d Commands to file `%s`.txt\n", log_config.gm, w2);
- } else if(strcmpi(w1, "log_npc_file") == 0) {
- strcpy(log_config.log_npc, w2);
- if(log_config.npc > 0 && log_config.sql_logs < 1)
- printf("Logging NPC 'logmes' to file `%s`.txt\n", w2);
- //support the import command, just like any other config
- } else if(strcmpi(w1,"import") == 0) {
- log_config_read(w2);
- }
- }
- }
-
- fclose(fp);
- return 0;
-}
diff --git a/src/map/log.h b/src/map/log.h
deleted file mode 100644
index cdb543f0d..000000000
--- a/src/map/log.h
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef _LOG_H_
-#define _LOG_H_
-
-#include "map.h"
-
-#ifndef TXT_ONLY
-
-extern char db_server_logdb[32];
-
-#endif //NOT TXT_ONLY
-
-int log_branch(struct map_session_data *sd);
-int log_drop(struct map_session_data *sd, int monster_id, int *log_drop);
-int log_mvpdrop(struct map_session_data *sd, int monster_id, int *log_mvp);
-int log_present(struct map_session_data *sd, int source_type, int nameid);
-int log_produce(struct map_session_data *sd, int nameid, int slot1, int slot2, int slot3, int success);
-int log_refine(struct map_session_data *sd, int n, int success);
-int log_trade(struct map_session_data *sd,struct map_session_data *target_sd,int n,int amount);
-int log_tostorage(struct map_session_data *sd,int n, int guild);
-int log_fromstorage(struct map_session_data *sd,int n, int guild);
-
-int log_vend(struct map_session_data *sd,struct map_session_data *vsd,int n,int amount,int zeny);
-int log_zeny(struct map_session_data *sd, struct map_session_data *target_sd,int amount);
-int log_atcommand(struct map_session_data *sd, const char *message);
-int log_npc(struct map_session_data *sd, const char *message);
-
-int log_config_read(char *cfgName);
-
-extern struct Log_Config {
- int enable_logs;
- int sql_logs;
- int rare_items_log,refine_items_log,price_items_log,amount_items_log;
- int branch, drop, mvpdrop, present, produce, refine, trade, vend, zeny, gm, npc, storage;
- char log_branch[32], log_drop[32], log_mvpdrop[32], log_present[32], log_produce[32], log_refine[32], log_trade[32], log_vend[32], log_gm[32], log_npc[32], log_storage[32];
- char log_branch_db[32], log_drop_db[32], log_mvpdrop_db[32], log_present_db[32], log_produce_db[32], log_refine_db[32], log_trade_db[32], log_vend_db[32], log_gm_db[32], log_npc_db[32];
- int uptime;
- char log_uptime[32];
-} log_config;
-
-#endif
diff --git a/src/map/mail.c b/src/map/mail.c
deleted file mode 100644
index 42a83de52..000000000
--- a/src/map/mail.c
+++ /dev/null
@@ -1,337 +0,0 @@
-#ifndef TXT_ONLY
-// Mail System for eAthena SQL
-// Created by Valaris
-// moved all strings to msg_athena.conf [Lupus]
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "../common/strlib.h"
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/nullpo.h"
-
-#include "map.h"
-#include "clif.h"
-#include "chrif.h"
-#include "intif.h"
-#include "atcommand.h"
-#include "pc.h"
-#include "mail.h"
-
-char mail_db[32] = "mail";
-
-int MAIL_CHECK_TIME = 120000;
-int mail_timer;
-//extern char *msg_table[1000]; // Server messages (0-499 reserved for GM commands, 500-999 reserved for others)
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-int mail_check(struct map_session_data *sd,int type)
-{
- int i = 0, new_ = 0, priority = 0;
- char message[50];
-
- nullpo_retr (0, sd);
-
- sprintf(tmp_msql,"SELECT `message_id`,`to_account_id`,`from_char_name`,`read_flag`,`priority`,`check_flag` "
- "FROM `%s` WHERE `to_account_id` = \"%d\" ORDER by `message_id`", mail_db, sd->status.account_id);
-
- if (mysql_query(&mail_handle, tmp_msql)) {
- printf("Database server error (executing query for %s): %s\n", mail_db, mysql_error(&mail_handle));
- return 0;
- }
-
- mail_res = mysql_store_result(&mail_handle);
- if(mail_res) {
- if (mysql_num_rows(mail_res) == 0) {
- //clif_displaymessage(sd->fd,"You have no messages.");
- clif_displaymessage(sd->fd, msg_txt(516));
-
- mysql_free_result(mail_res);
- return 0;
- }
-
- while ((mail_row = mysql_fetch_row(mail_res))) {
- i++;
- if(!atoi(mail_row[5])) {
- sprintf(tmp_msql,"UPDATE `%s` SET `check_flag`='1' WHERE `message_id`= \"%d\"", mail_db, atoi(mail_row[0]));
- if(mysql_query(&mail_handle, tmp_msql) ) {
- printf("DB server Error (update Read `%s`)- %s\n", mail_db, mysql_error(&mail_handle) );
- }
- }
-
- if(!atoi(mail_row[3])) {
- new_++;
- if(atoi(mail_row[4]))
- priority++;
- if(type==2 || type==3) {
- if(atoi(mail_row[4])) {
- //sprintf(message, "%d - From : %s (New - Priority)", i, mail_row[2]);
- sprintf(message, msg_txt(511), i, mail_row[2]);
-
- clif_displaymessage(sd->fd, jstrescape(message));
- } else {
- //sprintf(message, "%d - From : %s (New)", i, mail_row[2]);
- sprintf(message, msg_txt(512), i, mail_row[2]);
- clif_displaymessage(sd->fd, jstrescape(message));
- }
- }
- } else if(type==2){
- //sprintf(message, "%d - From : %s", i, mail_row[2]);
- sprintf(message, msg_txt(513), i, mail_row[2]);
- clif_displaymessage(sd->fd, jstrescape(message));
- }
- }
-
- mysql_free_result(mail_res);
- } else {
- printf("MySQL error (storing query result for %s): %s\n", mail_db, mysql_error(&mail_handle));
- return 0;
- }
-
- if(i>0 && new_>0 && type==1) {
- //sprintf(message, "You have %d new messages.", new_);
- sprintf(message, msg_txt(514), new_);
-
- clif_displaymessage(sd->fd, jstrescape(message));
- }
- if(i>0 && new_>0 && priority>0 && type==1) {
- //sprintf(message, "You have %d unread priority messages.", priority);
- sprintf(message, msg_txt(515), priority);
- clif_displaymessage(sd->fd, jstrescape(message));
- }
- if(!new_) {
- //clif_displaymessage(sd->fd, "You have no new messages.");
- clif_displaymessage(sd->fd, msg_txt(516));
- }
-
- return 0;
-}
-
-int mail_read(struct map_session_data *sd, int message_id)
-{
-
- char message[80];
-
- nullpo_retr (0, sd);
-
- sprintf(tmp_msql,"SELECT `message_id`,`to_account_id`,`from_char_name`,`message`,`read_flag`,`priority`,`check_flag` from `%s` WHERE `to_account_id` = \"%d\" ORDER by `message_id` LIMIT %d, 1",mail_db,sd->status.account_id,message_id-1);
-
- if (mysql_query(&mail_handle, tmp_msql)) {
- printf("Database server error (executing query for %s): %s\n", mail_db, mysql_error(&mail_handle));
- return 0;
- }
-
- mail_res = mysql_store_result(&mail_handle);
- if(mail_res) {
- if (mysql_num_rows(mail_res) == 0) {
- mysql_free_result(mail_res);
- //clif_displaymessage(sd->fd, "Message not found.");
- clif_displaymessage(sd->fd, msg_txt(517));
- return 0;
- }
-
- if ((mail_row = mysql_fetch_row(mail_res))) {
- if(!atoi(mail_row[6])) {
- sprintf(tmp_msql,"UPDATE `%s` SET `check_flag`='1' WHERE `message_id`= \"%d\"", mail_db, atoi(mail_row[0]));
- if(mysql_query(&mail_handle, tmp_msql) ) {
- printf("DB server Error (update Read `%s`)- %s\n", mail_db, mysql_error(&mail_handle) );
- }
- }
-
- //sprintf(message, "Reading message from %s", mail_row[2]);
- sprintf(message, msg_txt(518), mail_row[2]);
- clif_displaymessage(sd->fd, jstrescape(message));
-
- sprintf(message, "%s", mail_row[3]);
- clif_displaymessage(sd->fd, jstrescape(message));
-
- sprintf(tmp_msql,"UPDATE `%s` SET `read_flag`='1' WHERE `message_id`= \"%d\"", mail_db, atoi(mail_row[0]));
- if(mysql_query(&mail_handle, tmp_msql) ) {
- printf("DB server Error (update Read `%s`)- %s\n", mail_db, mysql_error(&mail_handle) );
- }
- }
-
- mysql_free_result(mail_res);
-
- } else {
- printf("MySQL error (storing query result for %s): %s\n", mail_db, mysql_error(&mail_handle));
- }
-
- return 0;
-}
-
-int mail_delete(struct map_session_data *sd, int message_id)
-{
- nullpo_retr (0, sd);
-
- sprintf(tmp_msql,"SELECT `message_id`,`to_account_id`,`read_flag`,`priority`,`check_flag` from `%s` WHERE `to_account_id` = \"%d\" ORDER by `message_id` LIMIT %d, 1",mail_db,sd->status.account_id,message_id-1);
-
- if (mysql_query(&mail_handle, tmp_msql)) {
- printf("Database server error (executing query for %s): %s\n", mail_db, mysql_error(&mail_handle));
- return 0;
- }
-
- mail_res = mysql_store_result(&mail_handle);
- if(mail_res) {
- if (mysql_num_rows(mail_res) == 0) {
- mysql_free_result(mail_res);
- //clif_displaymessage(sd->fd, "Message not found.");
- clif_displaymessage(sd->fd, msg_txt(517));
- return 0;
- }
-
- if ((mail_row = mysql_fetch_row(mail_res))) {
- if(!atoi(mail_row[2]) && atoi(mail_row[3])) {
- mysql_free_result(mail_res);
- //clif_displaymessage(sd->fd,"Cannot delete unread priority mail.");
- clif_displaymessage(sd->fd,msg_txt(519));
-
- return 0;
- }
- if(!atoi(mail_row[4])) {
- mysql_free_result(mail_res);
- //clif_displaymessage(sd->fd,"You have recieved new mail, use @listmail before deleting.");
- clif_displaymessage(sd->fd,msg_txt(520));
- return 0;
- }
- sprintf(tmp_msql,"DELETE FROM `%s` WHERE `message_id` = \"%d\"", mail_db, atoi(mail_row[0]));
- if(mysql_query(&mail_handle, tmp_msql) ) {
- mysql_free_result(mail_res);
- printf("DB server Error (update Read `%s`)- %s\n", mail_db, mysql_error(&mail_handle) );
- return 0;
- }
- //else clif_displaymessage(sd->fd,"Message deleted.");
- else clif_displaymessage(sd->fd,msg_txt(521));
- }
-
- mysql_free_result(mail_res);
-
- } else {
- printf("MySQL error (delete query result for %s): %s\n", mail_db, mysql_error(&mail_handle));
- }
-
- return 0;
-}
-
-int mail_send(struct map_session_data *sd, char *name, char *message, int flag)
-{
- nullpo_retr (0, sd);
-
- if(pc_isGM(sd) < 80 && sd->mail_counter > 0) {
- //clif_displaymessage(sd->fd,"You must wait 10 minutes before sending another message");
- clif_displaymessage(sd->fd,msg_txt(522));
- return 0;
- }
-
- if(strcmp(name,"*")==0) {
- if(pc_isGM(sd) < 80) {
- //clif_displaymessage(sd->fd, "Access Denied.");
- clif_displaymessage(sd->fd, msg_txt(523));
- return 0;
- }
- else
- sprintf(tmp_msql,"SELECT DISTINCT `account_id` FROM `%s` WHERE `account_id` <> '%d' ORDER BY `account_id`", char_db, sd->status.account_id);
- }
- else
- sprintf(tmp_msql,"SELECT `account_id`,`name` FROM `%s` WHERE `name` = \"%s\"", char_db, jstrescape(name));
-
- if (mysql_query(&mail_handle, tmp_msql)) {
- printf("Database server error (executing query for %s): %s\n", char_db, mysql_error(&mail_handle));
- return 0;
- }
-
- mail_res = mysql_store_result(&mail_handle);
- if(mail_res) {
- if (mysql_num_rows(mail_res) == 0) {
- mysql_free_result(mail_res);
- //clif_displaymessage(sd->fd,"Character does not exist.");
- clif_displaymessage(sd->fd,msg_txt(524));
- return 0;
- }
-
- while ((mail_row = mysql_fetch_row(mail_res))) {
- if(strcmp(name,"*")==0) {
- sprintf(tmp_msql, "INSERT DELAYED INTO `%s` (`to_account_id`,`from_account_id`,`from_char_name`,`message`,`priority`)"
- " VALUES ('%d', '%d', '%s', '%s', '%d')",mail_db, atoi(mail_row[0]), sd->status.account_id, sd->status.name, jstrescape(message), flag);
- }
- else {
- sprintf(tmp_msql, "INSERT DELAYED INTO `%s` (`to_account_id`,`to_char_name`,`from_account_id`,`from_char_name`,`message`,`priority`)"
- " VALUES ('%d', '%s', '%d', '%s', '%s', '%d')",mail_db, atoi(mail_row[0]), mail_row[1], sd->status.account_id, sd->status.name, jstrescape(message), flag);
- if(pc_isGM(sd) < 80)
- sd->mail_counter=5;
- }
-
- if(mysql_query(&mail_handle, tmp_msql) ) {
- mysql_free_result(mail_res);
- printf("DB server Error (insert `mail_db`)- %s\n", mysql_error(&mail_handle) );
- return 0;
- }
- }
- }
-
- //clif_displaymessage(sd->fd,"Mail has been sent.");
- clif_displaymessage(sd->fd,msg_txt(525));
-
- return 0;
-}
-
-int mail_check_timer(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd = NULL;
- int i;
-
- if(mail_timer != tid)
- return 0;
-
- sprintf(tmp_msql,"SELECT DISTINCT `to_account_id` FROM `%s` WHERE `read_flag` = '0' AND `check_flag` = '0'", mail_db);
-
- if (mysql_query(&mail_handle, tmp_msql)) {
- printf("Database server error (executing query for %s): %s\n", char_db, mysql_error(&mail_handle));
- mail_timer=add_timer(gettick()+MAIL_CHECK_TIME,mail_check_timer,0,0);
- return 0;
- }
-
- mail_res = mysql_store_result(&mail_handle);
-
- if (mail_res) {
- if (mysql_num_rows(mail_res) == 0) {
- mysql_free_result(mail_res);
- mail_timer=add_timer(gettick()+MAIL_CHECK_TIME,mail_check_timer,0,0);
- return 0;
- }
-
- while ((mail_row = mysql_fetch_row(mail_res))) {
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (sd = (struct map_session_data *) session[i]->session_data) && sd->state.auth){
- if(pc_isGM(sd) < 80 && sd->mail_counter > 0)
- sd->mail_counter--;
- if(sd->status.account_id==atoi(mail_row[0]))
- //clif_displaymessage(sd->fd, "You have new mail.");
- clif_displaymessage(sd->fd, msg_txt(526));
- }
- }
- }
- }
-
- sprintf(tmp_msql,"UPDATE `%s` SET `check_flag`='1' WHERE `check_flag`= '0' ", mail_db);
- if(mysql_query(&mail_handle, tmp_msql) ) {
- printf("DB server Error (update Read `%s`)- %s\n", mail_db, mysql_error(&mail_handle) );
- }
-
- mail_timer=add_timer(gettick()+MAIL_CHECK_TIME,mail_check_timer,0,0);
- return 0;
-}
-
-int do_init_mail(void)
-{
- add_timer_func_list(mail_check_timer,"mail_check_timer");
- mail_timer=add_timer(gettick()+MAIL_CHECK_TIME,mail_check_timer,0,0);
- return 0;
-}
-
-#endif
diff --git a/src/map/mail.h b/src/map/mail.h
deleted file mode 100644
index 6bd8e510c..000000000
--- a/src/map/mail.h
+++ /dev/null
@@ -1,9 +0,0 @@
-// Mail System for eAthena
-// Created by Valaris
-
-int mail_check(struct map_session_data *sd, int type);
-int mail_read(struct map_session_data *sd, int message_id);
-int mail_delete(struct map_session_data *sd, int message_id);
-int mail_send(struct map_session_data *sd, char *name, char *message, int flag);
-
-int do_init_mail(void);
diff --git a/src/map/map.c b/src/map/map.c
deleted file mode 100644
index 386b38954..000000000
--- a/src/map/map.c
+++ /dev/null
@@ -1,3437 +0,0 @@
-// $Id: map.c,v 1.6 2004/09/25 17:37:01 MouseJstr Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#ifdef _WIN32
-#include <winsock.h>
-#else
-#include <netdb.h>
-#endif
-#include <math.h>
-
-#include "core.h"
-#include "timer.h"
-#include "db.h"
-#include "grfio.h"
-#include "malloc.h"
-#include "version.h"
-
-#include "map.h"
-#include "chrif.h"
-#include "clif.h"
-#include "intif.h"
-#include "npc.h"
-#include "pc.h"
-#include "status.h"
-#include "mob.h"
-#include "chat.h"
-#include "itemdb.h"
-#include "storage.h"
-#include "skill.h"
-#include "trade.h"
-#include "party.h"
-#include "battle.h"
-#include "script.h"
-#include "guild.h"
-#include "pet.h"
-#include "atcommand.h"
-#include "charcommand.h"
-#include "nullpo.h"
-#include "socket.h"
-#include "log.h"
-#include "showmsg.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-// maybe put basic macros to somewhere else
-#define swap(a,b) ((a == b) || ((a ^= b), (b ^= a), (a ^= b)))
-
-#ifndef TXT_ONLY
-
-#include "mail.h" // mail system [Valaris]
-
-MYSQL mmysql_handle;
-MYSQL_RES* sql_res ;
-MYSQL_ROW sql_row ;
-char tmp_sql[65535]="";
-
-MYSQL lmysql_handle;
-MYSQL_RES* lsql_res ;
-MYSQL_ROW lsql_row ;
-char tmp_lsql[65535]="";
-
-MYSQL mail_handle; // mail system [Valaris]
-MYSQL_RES* mail_res ;
-MYSQL_ROW mail_row ;
-char tmp_msql[65535]="";
-
-int map_server_port = 3306;
-char map_server_ip[16] = "127.0.0.1";
-char map_server_id[32] = "ragnarok";
-char map_server_pw[32] = "ragnarok";
-char map_server_db[32] = "ragnarok";
-int db_use_sqldbs = 0;
-
-int login_server_port = 3306;
-char login_server_ip[16] = "127.0.0.1";
-char login_server_id[32] = "ragnarok";
-char login_server_pw[32] = "ragnarok";
-char login_server_db[32] = "ragnarok";
-
-char item_db_db[32] = "item_db";
-char mob_db_db[32] = "mob_db";
-char login_db[32] = "login";
-char login_db_level[32] = "level";
-char login_db_account_id[32] = "account_id";
-
-char log_db[32] = "log";
-char log_db_ip[16] = "127.0.0.1";
-char log_db_id[32] = "ragnarok";
-char log_db_pw[32] = "ragnarok";
-int log_db_port = 3306;
-
-char gm_db[32] = "login";
-char gm_db_level[32] = "level";
-char gm_db_account_id[32] = "account_id";
-
-int lowest_gm_level = 1;
-int read_gm_interval = 600000;
-
-char char_db[32] = "char";
-
-static int online_timer(int,unsigned int,int,int);
-int CHECK_INTERVAL = 3600000; // [Valaris]
-
-#endif /* not TXT_ONLY */
-
-char *INTER_CONF_NAME;
-char *LOG_CONF_NAME;
-char *MAP_CONF_NAME;
-char *BATTLE_CONF_FILENAME;
-char *ATCOMMAND_CONF_FILENAME;
-char *CHARCOMMAND_CONF_FILENAME;
-char *SCRIPT_CONF_NAME;
-char *MSG_CONF_NAME;
-char *GRF_PATH_FILENAME;
-
-#define USE_AFM
-#define USE_AF2
-
-// ‹É—Í static‚Ń?ƒJƒ‹‚É?‚ß‚é
-static struct dbt * id_db=NULL;
-static struct dbt * map_db=NULL;
-static struct dbt * nick_db=NULL;
-static struct dbt * charid_db=NULL;
-
-static int users=0;
-static struct block_list *objects[MAX_FLOORITEM];
-static int first_free_object_id=0,last_object_id=0;
-
-#define block_free_max 1048576
-static void *block_free[block_free_max];
-static int block_free_count = 0, block_free_lock = 0;
-
-#define BL_LIST_MAX 1048576
-static struct block_list *bl_list[BL_LIST_MAX];
-static int bl_list_count = 0;
-
-static char afm_dir[1024] = ""; // [Valaris]
-
-struct map_data map[MAX_MAP_PER_SERVER];
-int map_num = 0;
-
-int map_port=0;
-
-int autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
-int agit_flag = 0;
-int night_flag = 0; // 0=day, 1=night [Yor]
-
-//Added for Mugendai's I'm Alive mod
-int imalive_on=0;
-int imalive_time=60;
-//Added by Mugendai for GUI
-int flush_on=1;
-int flush_time=100;
-
-struct charid2nick {
- char nick[24];
- int req_id;
-};
-
-// «Þ«Ã«×«­«ã«Ã«·«å××éÄ«Õ«é«°(map_athana.conf?ªÎread_map_from_cacheªÇò¦E)
-// 0:××éĪ·ªÊª¤ 1:Þª?õêÜÁðí 2:?õêÜÁðí
-int map_read_flag = READ_FROM_GAT;
-char map_cache_file[256]="db/map.info"; // «Þ«Ã«×«­«ã«Ã«·«å«Õ«¡«¤«E£
-
-char motd_txt[256] = "conf/motd.txt";
-char help_txt[256] = "conf/help.txt";
-
-char wisp_server_name[24] = "Server"; // can be modified in char-server configuration file
-
-int console = 0;
-
-/*==========================================
- * ‘SmapŽI?Œv‚Å‚ÌÚ??Ý’è
- * (charŽI‚©‚ç‘—‚ç‚ê‚Ä‚­‚é)
- *------------------------------------------
- */
-void map_setusers(int fd)
-{
- users = RFIFOL(fd,2);
- // send some anser
- WFIFOW(fd,0) = 0x2718;
- WFIFOSET(fd,2);
-}
-
-/*==========================================
- * ‘SmapŽI?Œv‚Å‚ÌÚ??Žæ“¾ (/w‚Ö‚Ì?“š—p)
- *------------------------------------------
- */
-int map_getusers(void) {
- return users;
-}
-
-//
-// block휂̈À‘S«Šm•Û?—
-//
-
-/*==========================================
- * block‚ðfree‚·‚é‚Æ‚«free‚Ì?‚í‚è‚ɌĂÔ
- * ƒƒbƒN‚³‚ê‚Ä‚¢‚é‚Æ‚«‚̓oƒbƒtƒ@‚É‚½‚ß‚é
- *------------------------------------------
- */
-int map_freeblock( void *bl )
-{
- if(block_free_lock==0){
- aFree(bl);
- bl = NULL;
- }
- else{
- if( block_free_count>=block_free_max ) {
- if(battle_config.error_log)
- printf("map_freeblock: *WARNING* too many free block! %d %d\n",
- block_free_count,block_free_lock);
- }
- else
- block_free[block_free_count++]=bl;
- }
- return block_free_lock;
-}
-/*==========================================
- * block‚Ìfree‚ðˆêŽž“I‚É‹ÖŽ~‚·‚é
- *------------------------------------------
- */
-int map_freeblock_lock(void) {
- return ++block_free_lock;
-}
-
-/*==========================================
- * block‚Ìfree‚̃ƒbƒN‚ð‰ðœ‚·‚é
- * ‚±‚Ì‚Æ‚«AƒƒbƒN‚ªŠ®‘S‚É‚È‚­‚È‚é‚Æ
- * ƒoƒbƒtƒ@‚É‚½‚Ü‚Á‚Ä‚¢‚½block‚ð‘S•”íœ
- *------------------------------------------
- */
-int map_freeblock_unlock(void) {
- if ((--block_free_lock) == 0) {
- int i;
-// if(block_free_count>0) {
-// if(battle_config.error_log)
-// printf("map_freeblock_unlock: free %d object\n",block_free_count);
-// }
- for(i=0;i<block_free_count;i++){
- aFree(block_free[i]);
- block_free[i] = NULL;
- }
- block_free_count=0;
- }else if(block_free_lock<0){
- if(battle_config.error_log)
- printf("map_freeblock_unlock: lock count < 0 !\n");
- block_free_lock = 0; // ŽŸ‰ñˆÈ~‚̃ƒbƒN‚ÉŽxႪo‚Ä‚­‚é‚̂ŃŠƒZƒbƒg
- }
- return block_free_lock;
-}
-
-// map_freeblock_lock() ‚ðŒÄ‚ñ‚Å map_freeblock_unlock() ‚ðŒÄ‚΂Ȃ¢
-// ŠÖ”‚ª‚ ‚Á‚½‚Ì‚ÅA’èŠú“I‚Éblock_free_lock‚ðƒŠƒZƒbƒg‚·‚é‚悤‚É‚·‚éB
-// ‚±‚ÌŠÖ”‚ÍAdo_timer() ‚̃gƒbƒvƒŒƒxƒ‹‚©‚çŒÄ‚΂ê‚é‚Ì‚ÅA
-// block_free_lock ‚ð’¼Ú‚¢‚¶‚Á‚Ä‚àŽxá–³‚¢‚Í‚¸B
-
-int map_freeblock_timer(int tid,unsigned int tick,int id,int data) {
- if(block_free_lock > 0) {
- printf("map_freeblock_timer: block_free_lock(%d) is invalid.\n",block_free_lock);
- block_free_lock = 1;
- map_freeblock_unlock();
- }
- // else {
- // printf("map_freeblock_timer: check ok\n");
- // }
- return 0;
-}
-
-//
-// block‰»?—
-//
-/*==========================================
- * map[]‚Ìblock_list‚©‚ç?‚ª‚Á‚Ä‚¢‚éꇂÉ
- * bl->prev‚Ébl_head‚̃AƒhƒŒƒX‚ð“ü‚ê‚Ä‚¨‚­
- *------------------------------------------
- */
-static struct block_list bl_head;
-
-/*==========================================
- * map[]‚Ìblock_list‚ɒljÁ
- * mob‚Í?‚ª‘½‚¢‚̂ŕʃŠƒXƒg
- *
- * ?‚Élink?‚Ý‚©‚ÌŠm”F‚ª–³‚¢BŠë?‚©‚à
- *------------------------------------------
- */
-int map_addblock(struct block_list *bl)
-{
- int m,x,y;
-
- nullpo_retr(0, bl);
-
- if(bl->prev != NULL){
- if(battle_config.error_log)
- printf("map_addblock error : bl->prev!=NULL\n");
- return 0;
- }
-
- m=bl->m;
- x=bl->x;
- y=bl->y;
- if(m<0 || m>=map_num ||
- x<0 || x>=map[m].xs ||
- y<0 || y>=map[m].ys)
- return 1;
-
- if(bl->type==BL_MOB){
- bl->next = map[m].block_mob[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs];
- bl->prev = &bl_head;
- if(bl->next) bl->next->prev = bl;
- map[m].block_mob[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs] = bl;
- map[m].block_mob_count[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs]++;
- } else {
- bl->next = map[m].block[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs];
- bl->prev = &bl_head;
- if(bl->next) bl->next->prev = bl;
- map[m].block[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs] = bl;
- map[m].block_count[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs]++;
- if(bl->type==BL_PC)
- map[m].users++;
- }
-
- return 0;
-}
-
-/*==========================================
- * map[]‚Ìblock_list‚©‚çŠO‚·
- * prev‚ªNULL‚Ìê‡list‚É?‚ª‚Á‚Ä‚È‚¢
- *------------------------------------------
- */
-int map_delblock(struct block_list *bl)
-{
- int b;
- nullpo_retr(0, bl);
-
- // ?‚Éblocklist‚©‚ç?‚¯‚Ä‚¢‚é
- if(bl->prev==NULL){
- if(bl->next!=NULL){
- // prev‚ªNULL‚Ånext‚ªNULL‚Å‚È‚¢‚Ì‚Í—L‚Á‚Ä‚Í‚È‚ç‚È‚¢
- if(battle_config.error_log)
- printf("map_delblock error : bl->next!=NULL\n");
- }
- return 0;
- }
-
- b = bl->x/BLOCK_SIZE+(bl->y/BLOCK_SIZE)*map[bl->m].bxs;
-
- if(bl->type==BL_PC)
- map[bl->m].users--;
- if(bl->next)
- bl->next->prev = bl->prev;
- if(bl->prev==&bl_head){
- // ƒŠƒXƒg‚Ì“ª‚È‚Ì‚ÅAmap[]‚Ìblock_list‚ðXV‚·‚é
- if(bl->type==BL_MOB){
- map[bl->m].block_mob[b] = bl->next;
- if((map[bl->m].block_mob_count[b]--) < 0)
- map[bl->m].block_mob_count[b] = 0;
- } else {
- map[bl->m].block[b] = bl->next;
- if((map[bl->m].block_count[b]--) < 0)
- map[bl->m].block_count[b] = 0;
- }
- } else {
- bl->prev->next = bl->next;
- }
- bl->next = NULL;
- bl->prev = NULL;
-
- return 0;
-}
-
-/*==========================================
- * Žü?‚ÌPCl?‚ð?‚¦‚é (Œ»Ý–¢Žg—p)
- *------------------------------------------
- */
-int map_countnearpc(int m, int x, int y) {
- int bx,by,c=0;
- struct block_list *bl=NULL;
-
- if(map[m].users==0)
- return 0;
- for(by=y/BLOCK_SIZE-AREA_SIZE/BLOCK_SIZE-1;by<=y/BLOCK_SIZE+AREA_SIZE/BLOCK_SIZE+1;by++){
- if(by<0 || by>=map[m].bys)
- continue;
- for(bx=x/BLOCK_SIZE-AREA_SIZE/BLOCK_SIZE-1;bx<=x/BLOCK_SIZE+AREA_SIZE/BLOCK_SIZE+1;bx++){
- if(bx<0 || bx>=map[m].bxs)
- continue;
- bl = map[m].block[bx+by*map[m].bxs];
- for(;bl;bl=bl->next){
- if(bl->type==BL_PC)
- c++;
- }
- }
- }
- return c;
-}
-
-/*==========================================
- * ƒZƒ‹ã‚ÌPC‚ÆMOB‚Ì?‚ð?‚¦‚é (ƒOƒ‰ƒ“ƒhƒNƒƒX—p)
- *------------------------------------------
- */
-int map_count_oncell(int m, int x, int y) {
- int bx,by;
- struct block_list *bl=NULL;
- int i,c;
- int count = 0;
-
- if (x < 0 || y < 0 || (x >= map[m].xs) || (y >= map[m].ys))
- return 1;
- bx = x/BLOCK_SIZE;
- by = y/BLOCK_SIZE;
-
- bl = map[m].block[bx+by*map[m].bxs];
- c = map[m].block_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next){
- if(bl->x == x && bl->y == y && bl->type == BL_PC) count++;
- }
- bl = map[m].block_mob[bx+by*map[m].bxs];
- c = map[m].block_mob_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next){
- if(bl->x == x && bl->y == y) count++;
- }
- if(!count) count = 1;
- return count;
-}
-/*
- * «»«E¾ªÎõÌôøªË̸ªÄª±ª¿«¹«­«Eæ«Ë«Ã«ÈªòÚ÷ª¹
- */
-struct skill_unit *map_find_skill_unit_oncell(struct block_list *target,int x,int y,int skill_id,struct skill_unit *out_unit)
-{
- int m,bx,by;
- struct block_list *bl;
- int i,c;
- struct skill_unit *unit;
- m = target->m;
-
- if (x < 0 || y < 0 || (x >= map[m].xs) || (y >= map[m].ys))
- return NULL;
- bx = x/BLOCK_SIZE;
- by = y/BLOCK_SIZE;
-
- bl = map[m].block[bx+by*map[m].bxs];
- c = map[m].block_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next){
- if (bl->x != x || bl->y != y || bl->type != BL_SKILL)
- continue;
- unit = (struct skill_unit *) bl;
- if (unit==out_unit || !unit->alive ||
- !unit->group || unit->group->skill_id!=skill_id)
- continue;
- if (battle_check_target(&unit->bl,target,unit->group->target_flag)>0)
- return unit;
- }
- return NULL;
-}
-
-/*==========================================
- * map m (x0,y0)-(x1,y1)?‚Ì‘Sobj‚É?‚µ‚Ä
- * func‚ðŒÄ‚Ô
- * type!=0 ‚È‚ç‚»‚ÌŽí—Þ‚Ì‚Ý
- *------------------------------------------
- */
-void map_foreachinarea(int (*func)(struct block_list*,va_list),int m,int x0,int y0,int x1,int y1,int type,...) {
- va_list ap;
- int bx,by;
- struct block_list *bl=NULL;
- int blockcount=bl_list_count,i,c;
-
- if(m < 0)
- return;
- va_start(ap,type);
- if (x0 < 0) x0 = 0;
- if (y0 < 0) y0 = 0;
- if (x1 >= map[m].xs) x1 = map[m].xs-1;
- if (y1 >= map[m].ys) y1 = map[m].ys-1;
- if (type == 0 || type != BL_MOB)
- for (by = y0 / BLOCK_SIZE; by <= y1 / BLOCK_SIZE; by++) {
- for(bx=x0/BLOCK_SIZE;bx<=x1/BLOCK_SIZE;bx++){
- bl = map[m].block[bx+by*map[m].bxs];
- c = map[m].block_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next){
- if(bl && type && bl->type!=type)
- continue;
- if(bl && bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1 && bl_list_count<BL_LIST_MAX)
- bl_list[bl_list_count++]=bl;
- }
- }
- }
- if(type==0 || type==BL_MOB)
- for(by=y0/BLOCK_SIZE;by<=y1/BLOCK_SIZE;by++){
- for(bx=x0/BLOCK_SIZE;bx<=x1/BLOCK_SIZE;bx++){
- bl = map[m].block_mob[bx+by*map[m].bxs];
- c = map[m].block_mob_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next){
- if(bl && bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1 && bl_list_count<BL_LIST_MAX)
- bl_list[bl_list_count++]=bl;
- }
- }
- }
-
- if(bl_list_count>=BL_LIST_MAX) {
- if(battle_config.error_log)
- printf("map_foreachinarea: *WARNING* block count too many!\n");
- }
-
- map_freeblock_lock(); // ƒƒ‚ƒŠ‚©‚ç‚̉ð•ú‚ð‹ÖŽ~‚·‚é
-
- for(i=blockcount;i<bl_list_count;i++)
- if(bl_list[i]->prev) // —L?‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
- func(bl_list[i],ap);
-
- map_freeblock_unlock(); // ‰ð•ú‚ð‹–‰Â‚·‚é
-
- va_end(ap);
- bl_list_count = blockcount;
-}
-
-/*==========================================
- * ‹éŒ`(x0,y0)-(x1,y1)‚ª(dx,dy)ˆÚ“®‚µ‚½Žž‚Ì
- * —̈æŠO‚É‚È‚é—̈æ(‹éŒ`‚©LŽšŒ`)?‚Ìobj‚É
- * ?‚µ‚Äfunc‚ðŒÄ‚Ô
- *
- * dx,dy‚Í-1,0,1‚Ì‚Ý‚Æ‚·‚éi‚Ç‚ñ‚È’l‚Å‚à‚¢‚¢‚Á‚Û‚¢Hj
- *------------------------------------------
- */
-void map_foreachinmovearea(int (*func)(struct block_list*,va_list),int m,int x0,int y0,int x1,int y1,int dx,int dy,int type,...) {
- int bx,by;
- struct block_list *bl=NULL;
- va_list ap;
- int blockcount=bl_list_count,i,c;
-
- va_start(ap,type);
- if(dx==0 || dy==0){
- // ‹éŒ`—̈æ‚Ìê‡
- if(dx==0){
- if(dy<0){
- y0=y1+dy+1;
- } else {
- y1=y0+dy-1;
- }
- } else if(dy==0){
- if(dx<0){
- x0=x1+dx+1;
- } else {
- x1=x0+dx-1;
- }
- }
- if(x0<0) x0=0;
- if(y0<0) y0=0;
- if(x1>=map[m].xs) x1=map[m].xs-1;
- if(y1>=map[m].ys) y1=map[m].ys-1;
- for(by=y0/BLOCK_SIZE;by<=y1/BLOCK_SIZE;by++){
- for(bx=x0/BLOCK_SIZE;bx<=x1/BLOCK_SIZE;bx++){
- bl = map[m].block[bx+by*map[m].bxs];
- c = map[m].block_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next){
- if(bl && type && bl->type!=type)
- continue;
- if(bl && bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1 && bl_list_count<BL_LIST_MAX)
- bl_list[bl_list_count++]=bl;
- }
- bl = map[m].block_mob[bx+by*map[m].bxs];
- c = map[m].block_mob_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next){
- if(bl && type && bl->type!=type)
- continue;
- if(bl && bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1 && bl_list_count<BL_LIST_MAX)
- bl_list[bl_list_count++]=bl;
- }
- }
- }
- }else{
- // LŽš—̈æ‚Ìê‡
-
- if(x0<0) x0=0;
- if(y0<0) y0=0;
- if(x1>=map[m].xs) x1=map[m].xs-1;
- if(y1>=map[m].ys) y1=map[m].ys-1;
- for(by=y0/BLOCK_SIZE;by<=y1/BLOCK_SIZE;by++){
- for(bx=x0/BLOCK_SIZE;bx<=x1/BLOCK_SIZE;bx++){
- bl = map[m].block[bx+by*map[m].bxs];
- c = map[m].block_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next){
- if(bl && type && bl->type!=type)
- continue;
- if((bl) && !(bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1))
- continue;
- if((bl) && ((dx>0 && bl->x<x0+dx) || (dx<0 && bl->x>x1+dx) ||
- (dy>0 && bl->y<y0+dy) || (dy<0 && bl->y>y1+dy)) &&
- bl_list_count<BL_LIST_MAX)
- bl_list[bl_list_count++]=bl;
- }
- bl = map[m].block_mob[bx+by*map[m].bxs];
- c = map[m].block_mob_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next){
- if(bl && type && bl->type!=type)
- continue;
- if((bl) && !(bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1))
- continue;
- if((bl) && ((dx>0 && bl->x<x0+dx) || (dx<0 && bl->x>x1+dx) ||
- (dy>0 && bl->y<y0+dy) || (dy<0 && bl->y>y1+dy)) &&
- bl_list_count<BL_LIST_MAX)
- bl_list[bl_list_count++]=bl;
- }
- }
- }
-
- }
-
- if(bl_list_count>=BL_LIST_MAX) {
- if(battle_config.error_log)
- printf("map_foreachinarea: *WARNING* block count too many!\n");
- }
-
- map_freeblock_lock(); // ƒƒ‚ƒŠ‚©‚ç‚̉ð•ú‚ð‹ÖŽ~‚·‚é
-
- for(i=blockcount;i<bl_list_count;i++)
- if(bl_list[i]->prev) { // —L?‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
- if (bl_list[i]->type == BL_PC
- && session[((struct map_session_data *) bl_list[i])->fd] == NULL)
- continue;
- func(bl_list[i],ap);
- }
-
- map_freeblock_unlock(); // ‰ð•ú‚ð‹–‰Â‚·‚é
-
- va_end(ap);
- bl_list_count = blockcount;
-}
-
-// -- moonsoul (added map_foreachincell which is a rework of map_foreachinarea but
-// which only checks the exact single x/y passed to it rather than an
-// area radius - may be more useful in some instances)
-//
-void map_foreachincell(int (*func)(struct block_list*,va_list),int m,int x,int y,int type,...) {
- int bx,by;
- struct block_list *bl=NULL;
- va_list ap;
- int blockcount=bl_list_count,i,c;
-
- va_start(ap,type);
-
- by=y/BLOCK_SIZE;
- bx=x/BLOCK_SIZE;
-
- if(type==0 || type!=BL_MOB)
- {
- bl = map[m].block[bx+by*map[m].bxs];
- c = map[m].block_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next)
- {
- if(type && bl && bl->type!=type)
- continue;
- if(bl && bl->x==x && bl->y==y && bl_list_count<BL_LIST_MAX)
- bl_list[bl_list_count++]=bl;
- }
- }
-
- if(type==0 || type==BL_MOB)
- {
- bl = map[m].block_mob[bx+by*map[m].bxs];
- c = map[m].block_mob_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next)
- {
- if(bl && bl->x==x && bl->y==y && bl_list_count<BL_LIST_MAX)
- bl_list[bl_list_count++]=bl;
- }
- }
-
- if(bl_list_count>=BL_LIST_MAX) {
- if(battle_config.error_log)
- printf("map_foreachincell: *WARNING* block count too many!\n");
- }
-
- map_freeblock_lock(); // ƒƒ‚ƒŠ‚©‚ç‚̉ð•ú‚ð‹ÖŽ~‚·‚é
-
- for(i=blockcount;i<bl_list_count;i++)
- if(bl_list[i]->prev) // —L?‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
- func(bl_list[i],ap);
-
- map_freeblock_unlock(); // ‰ð•ú‚ð‹–‰Â‚·‚é
-
- va_end(ap);
- bl_list_count = blockcount;
-}
-
-/*============================================================
-* For checking a path between two points (x0, y0) and (x1, y1)
-*------------------------------------------------------------
- */
-void map_foreachinpath(int (*func)(struct block_list*,va_list),int m,int x0,int y0,int x1,int y1,int range,int type,...)
-{
-/* va_list ap;
- double deltax = 0.0;
- double deltay = 0.0;
- int t, bx, by;
- int *xs, *ys;
- int blockcount = bl_list_count, i, c;
- struct block_list *bl = NULL;
-
- if(m < 0)
- return;
- va_start(ap,type);
- if (x0 < 0) x0 = 0;
- if (y0 < 0) y0 = 0;
- if (x1 >= map[m].xs) x1 = map[m].xs-1;
- if (y1 >= map[m].ys) y1 = map[m].ys-1;
-
- // I'm not finished thinking on it
- // but first it might better use a parameter equation
- // x=(x1-x0)*t+x0; y=(y1-y0)*t+y0; t=[0,1]
- // would not need special case aproximating for infinity/zero slope
- // so maybe this way:
-
- // find maximum runindex
- int tmax = abs(y1-y0);
- if(tmax < abs(x1-x0))
- tmax = abs(x1-x0);
-
- xs = (int *)aCallocA(tmax + 1, sizeof(int));
- ys = (int *)aCallocA(tmax + 1, sizeof(int));
-
- // pre-calculate delta values for x and y destination
- // should speed up cause you don't need to divide in the loop
- if(tmax>0)
- {
- deltax = ((double)(x1-x0)) / ((double)tmax);
- deltay = ((double)(y1-y0)) / ((double)tmax);
- }
- // go along the index
- for(t=0; t<=tmax; t++)
- {
- int x = (int)floor(deltax * (double)t +0.5)+x0;
- int y = (int)floor(deltay * (double)t +0.5)+y0;
- // the xy pairs of points in line between x0y0 and x1y1
- // including start and end point
- xs[t] = x;
- ys[t] = y;
- }
-
- if (type == 0 || type != BL_MOB)
-
-
-this here is wrong,
-there is no check if x0<x1 and y0<y1
-but this is not valid in 3 of 4 cases,
-so in this case here you check only blocks when shooting to a positive direction
-shooting in other directions just do nothing like the skill has failed
-if you want to keep this that way then check and swap x0,y0 with x1,y1
-
- for (by = y0 / BLOCK_SIZE; by <= y1 / BLOCK_SIZE; by++) {
- for(bx=x0/BLOCK_SIZE;bx<=x1/BLOCK_SIZE;bx++){
- bl = map[m].block[bx+by*map[m].bxs];
- c = map[m].block_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next){
- if(bl) {
- if (type && bl->type!=type)
- continue;
- for(t=0; t<=tmax; t++)
- if(bl->x==xs[t] && bl->y==ys[t] && bl_list_count<BL_LIST_MAX)
- bl_list[bl_list_count++]=bl;
- }
- }
- }
- }
- if(type==0 || type==BL_MOB)
- for(by=y0/BLOCK_SIZE;by<=y1/BLOCK_SIZE;by++){
- for(bx=x0/BLOCK_SIZE;bx<=x1/BLOCK_SIZE;bx++){
- bl = map[m].block_mob[bx+by*map[m].bxs];
- c = map[m].block_mob_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next){
- if(bl) {
- for(t=0; t<=tmax; t++)
- if(bl->x==xs[t] && bl->y==ys[t] && bl_list_count<BL_LIST_MAX)
- bl_list[bl_list_count++]=bl;
- }
- }
- }
- }
-
- if(bl_list_count>=BL_LIST_MAX) {
- if(battle_config.error_log)
- printf("map_foreachinarea: *WARNING* block count too many!\n");
- }
-
- map_freeblock_lock(); // ƒƒ‚ƒŠ‚©‚ç‚̉ð•ú‚ð‹ÖŽ~‚·‚é
-
- for(i=blockcount;i<bl_list_count;i++)
- if(bl_list[i]->prev) // —L?‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
- func(bl_list[i],ap);
-
- map_freeblock_unlock(); // ‰ð•ú‚ð‹–‰Â‚·‚é
-
- bl_list_count = blockcount;
- aFree (xs);
- aFree (ys);
- va_end(ap);
-
-*/
-
-/*
-//////////////////////////////////////////////////////////////
-//
-// sharp shooting 1
-//
-//////////////////////////////////////////////////////////////
-// problem:
-// finding targets standing on and within some range of a line
-// (t1,t2 t3 and t4 get hit)
-//
-// target 1
-// x t4
-// t2
-// t3 x
-// x
-// S
-//////////////////////////////////////////////////////////////
-// solution 1 (straight forward, but a bit calculation expensive)
-// calculating perpendiculars from quesionable mobs to the straight line
-// if the mob is hit then depends on the distance to the line
-//
-// solution 2 (complex, need to handle many cases, but maybe faster)
-// make a formula to deside if a given (x,y) is within a shooting area
-// the shape can be ie. rectangular or triangular
-// if the mob is hit then depends on if the mob is inside or outside the area
-// I'm not going to implement this, but if somebody is interested
-// in vector algebra, it might be some fun
-
-//////////////////////////////////////////////////////////////
-// possible shooting ranges (I prefer the second one)
-//////////////////////////////////////////////////////////////
-//
-// ---------------- ------
-// ---------------- ------------
-// Sxxxxxxxxxxxxxxxxtarget Sxxxxxxxxxxxxxxxxtarget
-// ---------------- ------------
-// ---------------- -----
-//
-// the original code implemented the left structure
-// might be not that realistic, so I changed to the other one
-// I take "range" as max distance from the line
-//////////////////////////////////////////////////////////////
-
- va_list ap;
- int i, blockcount = bl_list_count;
- struct block_list *bl;
- int c1,c2;
-
-///////////
- double deltax,deltay;
- double k,kfact,knorm;
- double v1,v2,distance;
- double xm,ym,rd;
- int bx,by,bx0,bx1,by0,by1;
-//////////////
- // no map
- if(m < 0) return;
-
- // xy out of range
- if (x0 < 0) x0 = 0;
- if (y0 < 0) y0 = 0;
- if (x1 >= map[m].xs) x1 = map[m].xs-1;
- if (y1 >= map[m].ys) y1 = map[m].ys-1;
-
- ///////////////////////////////
- // stuff for a linear equation in xy coord to calculate
- // the perpendicular from a block xy to the straight line
- deltax = (x1-x0);
- deltay = (y1-y0);
- kfact = (deltax*deltax+deltay*deltay); // the sqare length of the line
- knorm = -deltax*x0-deltay*y0; // the offset vector param
-
-//printf("(%i,%i)(%i,%i) range: %i\n",x0,y0,x1,y1,range);
-
- if(kfact==0) return; // shooting at the standing position should not happen
- kfact = 1/kfact; // divide here and multiply in the loop
-
- range *= range; // compare with range^2 so we can skip a sqrt and signs
-
- ///////////////////////////////
- // prepare shooting area check
- xm = (x1+x0)/2.0;
- ym = (y1+y0)/2.0;// middle point on the shooting line
- // the sqared radius of a circle around the shooting range
- // plus the sqared radius of a block
- rd = (x0-xm)*(x0-xm) + (y0-ym)*(y0-ym) + (range*range)
- +BLOCK_SIZE*BLOCK_SIZE/2;
- // so whenever a block midpoint is within this circle
- // some of the block area is possibly within the shooting range
-
- ///////////////////////////////
- // what blocks we need to test
- // blocks covered by the xy position of begin and end of the line
- bx0 = x0/BLOCK_SIZE;
- bx1 = x1/BLOCK_SIZE;
- by0 = y0/BLOCK_SIZE;
- by1 = y1/BLOCK_SIZE;
- // swap'em for a smallest-to-biggest run
- if(bx0>bx1) swap(bx0,bx1);
- if(by0>by1) swap(by0,by1);
-
- // enlarge the block area by a range value and 1
- // so we can be sure to process all blocks that might touch the shooting area
- // in this case here with BLOCK_SIZE=8 and range=2 it will be only enlarged by 1
- // but I implement it anyway just in case that ranges will be larger
- // or BLOCK_SIZE smaller in future
- i = (range/BLOCK_SIZE+1);//temp value
- if(bx0>i) bx0 -=i; else bx0=0;
- if(by0>i) by0 -=i; else by0=0;
- if(bx1+i<map[m].bxs) bx1 +=i; else bx1=map[m].bxs-1;
- if(by1+i<map[m].bys) by1 +=i; else by1=map[m].bys-1;
-
-
-//printf("run for (%i,%i)(%i,%i)\n",bx0,by0,bx1,by1);
- for(bx=bx0; bx<=bx1; bx++)
- for(by=by0; by<=by1; by++)
- { // block xy
- c1 = map[m].block_count[bx+by*map[m].bxs]; // number of elements in the block
- c2 = map[m].block_mob_count[bx+by*map[m].bxs]; // number of mobs in the mob block
- if( (c1==0) && (c2==0) ) continue; // skip if nothing in the blocks
-
-//printf("block(%i,%i) %i %i\n",bx,by,c1,c2);fflush(stdout);
- // test if the mid-point of the block is too far away
- // so we could skip the whole block in this case
- v1 = (bx*BLOCK_SIZE+BLOCK_SIZE/2-xm)*(bx*BLOCK_SIZE+BLOCK_SIZE/2-xm)
- +(by*BLOCK_SIZE+BLOCK_SIZE/2-ym)*(by*BLOCK_SIZE+BLOCK_SIZE/2-ym);
-//printf("block(%i,%i) v1=%f rd=%f\n",bx,by,v1,rd);fflush(stdout);
- // check for the worst case scenario
- if(v1 > rd) continue;
-
- // it seems that the block is at least partially covered by the shooting range
- // so we go into it
- if(type==0 || type!=BL_MOB) {
- bl = map[m].block[bx+by*map[m].bxs]; // a block with the elements
- for(i=0;i<c1 && bl;i++,bl=bl->next){ // go through all elements
- if( bl && ( !type || bl->type==type ) && bl_list_count<BL_LIST_MAX )
- {
- // calculate the perpendicular from block xy to the straight line
- k = kfact*(deltax*bl->x + deltay*bl->y + knorm);
- // check if the perpendicular is within start and end of our line
- if(k>=0 && k<=1)
- { // calculate the distance
- v1 = deltax*k+x0 - bl->x;
- v2 = deltay*k+y0 - bl->y;
- distance = v1*v1+v2*v2;
- // triangular shooting range
- if( distance <= range*k )
- bl_list[bl_list_count++]=bl;
- }
- }
- }//end for elements
- }
-
- if(type==0 || type==BL_MOB) {
- bl = map[m].block_mob[bx+by*map[m].bxs]; // and the mob block
- for(i=0;i<c2 && bl;i++,bl=bl->next){
- if(bl && bl_list_count<BL_LIST_MAX) {
- // calculate the perpendicular from block xy to the straight line
- k = kfact*(deltax*bl->x + deltay*bl->y + knorm);
-//printf("mob: (%i,%i) k=%f ",bl->x,bl->y, k);
- // check if the perpendicular is within start and end of our line
- if(k>=0 && k<=1)
- {
- v1 = deltax*k+x0 - bl->x;
- v2 = deltay*k+y0 - bl->y;
- distance = v1*v1+v2*v2;
-//printf("dist: %f",distance);
- // triangular shooting range
- if( distance <= range*k )
- {
-//printf(" hit");
- bl_list[bl_list_count++]=bl;
- }
- }
-//printf("\n");
- }
- }//end for mobs
- }
- }//end for(bx,by)
-
-
- if(bl_list_count>=BL_LIST_MAX) {
- if(battle_config.error_log)
- printf("map_foreachinarea: *WARNING* block count too many!\n");
- }
-
- va_start(ap,type);
- map_freeblock_lock(); // ƒƒ‚ƒŠ‚©‚ç‚̉ð•ú‚ð‹ÖŽ~‚·‚é
-
- for(i=blockcount;i<bl_list_count;i++)
- if(bl_list[i]->prev) // —L?‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
- func(bl_list[i],ap);
-
- map_freeblock_unlock(); // ‰ð•ú‚ð‹–‰Â‚·‚é
- va_end(ap);
-
- bl_list_count = blockcount;
-
-*/
-
-
-//////////////////////////////////////////////////////////////
-//
-// sharp shooting 2
-//
-//////////////////////////////////////////////////////////////
-// problem:
-// finding targets standing exactly on a line
-// (only t1 and t2 get hit)
-//
-// target 1
-// x t4
-// t2
-// t3 x
-// x
-// S
-//////////////////////////////////////////////////////////////
- va_list ap;
- int i, blockcount = bl_list_count;
- struct block_list *bl;
- int c1,c2;
-
- //////////////////////////////////////////////////////////////
- // linear parametric equation
- // x=(x1-x0)*t+x0; y=(y1-y0)*t+y0; t=[0,1]
- //////////////////////////////////////////////////////////////
- // linear equation for finding a single line between (x0,y0)->(x1,y1)
- // independent of the given xy-values
- double dx = 0.0;
- double dy = 0.0;
- int bx=-1; // initialize block coords to some impossible value
- int by=-1;
-
- int t;
- ///////////////////////////////
- // find maximum runindex
- int tmax = abs(y1-y0);
- if(tmax < abs(x1-x0))
- tmax = abs(x1-x0);
- // pre-calculate delta values for x and y destination
- // should speed up cause you don't need to divide in the loop
- if(tmax>0)
- {
- dx = ((double)(x1-x0)) / ((double)tmax);
- dy = ((double)(y1-y0)) / ((double)tmax);
- }
- // go along the index
- for(t=0; t<=tmax; t++)
- { // xy-values of the line including start and end point
- int x = (int)floor(dx * (double)t +0.5)+x0;
- int y = (int)floor(dy * (double)t +0.5)+y0;
-
- // check the block index of the calculated xy
- if( (bx!=x/BLOCK_SIZE) || (by!=y/BLOCK_SIZE) )
- { // we have reached a new block
- // so we store the current block coordinates
- bx = x/BLOCK_SIZE;
- by = y/BLOCK_SIZE;
-
- // and process the data
- c1 = map[m].block_count[bx+by*map[m].bxs]; // number of elements in the block
- c2 = map[m].block_mob_count[bx+by*map[m].bxs]; // number of mobs in the mob block
- if( (c1==0) && (c2==0) ) continue; // skip if nothing in the block
-
- if(type==0 || type!=BL_MOB) {
- bl = map[m].block[bx+by*map[m].bxs]; // a block with the elements
- for(i=0;i<c1 && bl;i++,bl=bl->next){ // go through all elements
- if( bl && ( !type || bl->type==type ) && bl_list_count<BL_LIST_MAX )
- {
- // check if block xy is on the line
- if( (bl->x-x0)*(y1-y0) == (bl->y-y0)*(x1-x0) )
- // and if it is within start and end point
- if( (((x0<=x1)&&(x0<=bl->x)&&(bl->x<=x1)) || ((x0>=x1)&&(x0>=bl->x)&&(bl->x>=x1))) &&
- (((y0<=y1)&&(y0<=bl->y)&&(bl->y<=y1)) || ((y0>=y1)&&(y0>=bl->y)&&(bl->y>=y1))) )
- bl_list[bl_list_count++]=bl;
- }
- }//end for elements
- }
-
- if(type==0 || type==BL_MOB) {
- bl = map[m].block_mob[bx+by*map[m].bxs]; // and the mob block
- for(i=0;i<c2 && bl;i++,bl=bl->next){
- if(bl && bl_list_count<BL_LIST_MAX) {
- // check if mob xy is on the line
- if( (bl->x-x0)*(y1-y0) == (bl->y-y0)*(x1-x0) )
- // and if it is within start and end point
- if( (((x0<=x1)&&(x0<=bl->x)&&(bl->x<=x1)) || ((x0>=x1)&&(x0>=bl->x)&&(bl->x>=x1))) &&
- (((y0<=y1)&&(y0<=bl->y)&&(bl->y<=y1)) || ((y0>=y1)&&(y0>=bl->y)&&(bl->y>=y1))) )
- bl_list[bl_list_count++]=bl;
- }
- }//end for mobs
- }
- }
- }//end for index
-
- if(bl_list_count>=BL_LIST_MAX) {
- if(battle_config.error_log)
- printf("map_foreachinarea: *WARNING* block count too many!\n");
- }
-
- va_start(ap,type);
- map_freeblock_lock(); // ƒƒ‚ƒŠ‚©‚ç‚̉ð•ú‚ð‹ÖŽ~‚·‚é
-
- for(i=blockcount;i<bl_list_count;i++)
- if(bl_list[i]->prev) // —L?‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
- func(bl_list[i],ap);
-
- map_freeblock_unlock(); // ‰ð•ú‚ð‹–‰Â‚·‚é
- va_end(ap);
-
- bl_list_count = blockcount;
-}
-
-/*==========================================
- * °ƒAƒCƒeƒ€‚âƒGƒtƒFƒNƒg—p‚̈ꎞobjŠ„‚è?‚Ä
- * object[]‚Ö‚Ì•Û‘¶‚Æid_db“o?‚Ü‚Å
- *
- * bl->id‚à‚±‚Ì’†‚Åݒ肵‚Ä–â‘è–³‚¢?
- *------------------------------------------
- */
-int map_addobject(struct block_list *bl) {
- int i;
- if( bl == NULL ){
- printf("map_addobject nullpo?\n");
- return 0;
- }
- if(first_free_object_id<2 || first_free_object_id>=MAX_FLOORITEM)
- first_free_object_id=2;
- for(i=first_free_object_id;i<MAX_FLOORITEM;i++)
- if(objects[i]==NULL)
- break;
- if(i>=MAX_FLOORITEM){
- if(battle_config.error_log)
- printf("no free object id\n");
- return 0;
- }
- first_free_object_id=i;
- if(last_object_id<i)
- last_object_id=i;
- objects[i]=bl;
- numdb_insert(id_db,i,bl);
- return i;
-}
-
-/*==========================================
- * ˆêŽžobject‚̉ð•ú
- * map_delobject‚Ìfree‚µ‚È‚¢ƒo?ƒWƒ‡ƒ“
- *------------------------------------------
- */
-int map_delobjectnofree(int id) {
- if(objects[id]==NULL)
- return 0;
-
- map_delblock(objects[id]);
- numdb_erase(id_db,id);
-// map_freeblock(objects[id]);
- objects[id]=NULL;
-
- if(first_free_object_id>id)
- first_free_object_id=id;
-
- while(last_object_id>2 && objects[last_object_id]==NULL)
- last_object_id--;
-
- return 0;
-}
-
-/*==========================================
- * ˆêŽžobject‚̉ð•ú
- * block_list‚©‚ç‚ÌíœAid_db‚©‚ç‚Ìíœ
- * object data‚ÌfreeAobject[]‚Ö‚ÌNULL‘ã“ü
- *
- * add‚Æ‚Ì??«‚ª–³‚¢‚Ì‚ª?‚É‚È‚é
- *------------------------------------------
- */
-int map_delobject(int id) {
- struct block_list *obj = objects[id];
-
- if(obj==NULL)
- return 0;
-
- map_delobjectnofree(id);
- map_freeblock(obj);
-
- return 0;
-}
-
-/*==========================================
- * ‘SˆêŽžobj‘ŠŽè‚Éfunc‚ðŒÄ‚Ô
- *
- *------------------------------------------
- */
-void map_foreachobject(int (*func)(struct block_list*,va_list),int type,...) {
- int i;
- int blockcount=bl_list_count;
- va_list ap;
-
- va_start(ap,type);
-
- for(i=2;i<=last_object_id;i++){
- if(objects[i]){
- if(type && objects[i]->type!=type)
- continue;
- if(bl_list_count>=BL_LIST_MAX) {
- if(battle_config.error_log)
- printf("map_foreachobject: too many block !\n");
- }
- else
- bl_list[bl_list_count++]=objects[i];
- }
- }
-
- map_freeblock_lock();
-
- for(i=blockcount;i<bl_list_count;i++)
- if( bl_list[i]->prev || bl_list[i]->next )
- func(bl_list[i],ap);
-
- map_freeblock_unlock();
-
- va_end(ap);
- bl_list_count = blockcount;
-}
-
-/*==========================================
- * °ƒAƒCƒeƒ€‚ðÁ‚·
- *
- * data==0‚ÌŽž‚Ítimer‚ÅÁ‚¦‚½Žž
- * data!=0‚ÌŽž‚ÍE‚¤“™‚ÅÁ‚¦‚½Žž‚Æ‚µ‚Ä“®ì
- *
- * ŒãŽÒ‚ÍAmap_clearflooritem(id)‚Ö
- * map.h?‚Å#define‚µ‚Ä‚ ‚é
- *------------------------------------------
- */
-int map_clearflooritem_timer(int tid,unsigned int tick,int id,int data) {
- struct flooritem_data *fitem=NULL;
-
- fitem = (struct flooritem_data *)objects[id];
- if(fitem==NULL || fitem->bl.type!=BL_ITEM || (!data && fitem->cleartimer != tid)){
- if(battle_config.error_log)
- printf("map_clearflooritem_timer : error\n");
- return 1;
- }
- if(data)
- delete_timer(fitem->cleartimer,map_clearflooritem_timer);
- else if(fitem->item_data.card[0] == (short)0xff00)
- intif_delete_petdata(*((long *)(&fitem->item_data.card[1])));
- clif_clearflooritem(fitem,0);
- map_delobject(fitem->bl.id);
-
- return 0;
-}
-
-/*==========================================
- * (m,x,y)‚ÌŽü?rangeƒ}ƒX?‚Ì‹ó‚«(=N“ü‰Â”\)cell‚Ì
- * ?‚©‚ç“K?‚ȃ}ƒX–Ú‚ÌÀ•W‚ðx+(y<<16)‚Å•Ô‚·
- *
- * Œ»?range=1‚ŃAƒCƒeƒ€ƒhƒƒbƒv—p“r‚Ì‚Ý
- *------------------------------------------
- */
-int map_searchrandfreecell(int m,int x,int y,int range) {
- int free_cell,i,j;
-
- for(free_cell=0,i=-range;i<=range;i++){
- if(i+y<0 || i+y>=map[m].ys)
- continue;
- for(j=-range;j<=range;j++){
- if(j+x<0 || j+x>=map[m].xs)
- continue;
- if(map_getcell(m,j+x,i+y,CELL_CHKNOPASS))
- continue;
- free_cell++;
- }
- }
- if(free_cell==0)
- return -1;
- free_cell=rand()%free_cell;
- for(i=-range;i<=range;i++){
- if(i+y<0 || i+y>=map[m].ys)
- continue;
- for(j=-range;j<=range;j++){
- if(j+x<0 || j+x>=map[m].xs)
- continue;
- if(map_getcell(m,j+x,i+y,CELL_CHKNOPASS))
- continue;
- if(free_cell==0){
- x+=j;
- y+=i;
- i=range+1;
- break;
- }
- free_cell--;
- }
- }
-
- return x+(y<<16);
-}
-
-/*==========================================
- * (m,x,y)‚ð’†S‚É3x3ˆÈ?‚É°ƒAƒCƒeƒ€Ý’u
- *
- * item_data‚ÍamountˆÈŠO‚ðcopy‚·‚é
- *------------------------------------------
- */
-int map_addflooritem(struct item *item_data,int amount,int m,int x,int y,struct map_session_data *first_sd,
- struct map_session_data *second_sd,struct map_session_data *third_sd,int type) {
- int xy,r;
- unsigned int tick;
- struct flooritem_data *fitem=NULL;
-
- nullpo_retr(0, item_data);
-
- if((xy=map_searchrandfreecell(m,x,y,1))<0)
- return 0;
- r=rand();
-
- fitem = (struct flooritem_data *)aCalloc(1,sizeof(*fitem));
- fitem->bl.type=BL_ITEM;
- fitem->bl.prev = fitem->bl.next = NULL;
- fitem->bl.m=m;
- fitem->bl.x=xy&0xffff;
- fitem->bl.y=(xy>>16)&0xffff;
- fitem->first_get_id = 0;
- fitem->first_get_tick = 0;
- fitem->second_get_id = 0;
- fitem->second_get_tick = 0;
- fitem->third_get_id = 0;
- fitem->third_get_tick = 0;
-
- fitem->bl.id = map_addobject(&fitem->bl);
- if(fitem->bl.id==0){
- aFree(fitem);
- return 0;
- }
-
- tick = gettick();
- if(first_sd) {
- fitem->first_get_id = first_sd->bl.id;
- if(type)
- fitem->first_get_tick = tick + battle_config.mvp_item_first_get_time;
- else
- fitem->first_get_tick = tick + battle_config.item_first_get_time;
- }
- if(second_sd) {
- fitem->second_get_id = second_sd->bl.id;
- if(type)
- fitem->second_get_tick = tick + battle_config.mvp_item_first_get_time + battle_config.mvp_item_second_get_time;
- else
- fitem->second_get_tick = tick + battle_config.item_first_get_time + battle_config.item_second_get_time;
- }
- if(third_sd) {
- fitem->third_get_id = third_sd->bl.id;
- if(type)
- fitem->third_get_tick = tick + battle_config.mvp_item_first_get_time + battle_config.mvp_item_second_get_time + battle_config.mvp_item_third_get_time;
- else
- fitem->third_get_tick = tick + battle_config.item_first_get_time + battle_config.item_second_get_time + battle_config.item_third_get_time;
- }
-
- memcpy(&fitem->item_data,item_data,sizeof(*item_data));
- fitem->item_data.amount=amount;
- fitem->subx=(r&3)*3+3;
- fitem->suby=((r>>2)&3)*3+3;
- fitem->cleartimer=add_timer(gettick()+battle_config.flooritem_lifetime,map_clearflooritem_timer,fitem->bl.id,0);
-
- map_addblock(&fitem->bl);
- clif_dropflooritem(fitem);
-
- return fitem->bl.id;
-}
-
-/*==========================================
- * charid_db‚֒ljÁ(•ÔM‘Ò‚¿‚ª‚ ‚ê‚ΕÔM)
- *------------------------------------------
- */
-void map_addchariddb(int charid, char *name) {
- struct charid2nick *p=NULL;
- int req=0;
-
- p = (struct charid2nick*)numdb_search(charid_db,charid);
- if(p==NULL){ // ƒf?ƒ^ƒx?ƒX‚É‚È‚¢
- p = (struct charid2nick *)aCallocA(1,sizeof(struct charid2nick));
- p->req_id=0;
- }else
- numdb_erase(charid_db,charid);
-
- req=p->req_id;
- memcpy(p->nick,name,24);
- p->req_id=0;
- numdb_insert(charid_db,charid,p);
- if(req){ // •ÔM‘Ò‚¿‚ª‚ ‚ê‚ΕÔM
- struct map_session_data *sd = map_id2sd(req);
- if(sd!=NULL)
- clif_solved_charname(sd,charid);
- }
-}
-
-/*==========================================
- * charid_db‚֒ljÁi•ÔM—v‹‚Ì‚Ýj
- *------------------------------------------
- */
-int map_reqchariddb(struct map_session_data * sd,int charid) {
- struct charid2nick *p=NULL;
-
- nullpo_retr(0, sd);
-
- p = (struct charid2nick*)numdb_search(charid_db,charid);
- if(p!=NULL) // ƒf?ƒ^ƒx?ƒX‚É‚·‚Å‚É‚ ‚é
- return 0;
- p = (struct charid2nick *)aCalloc(1,sizeof(struct charid2nick));
- p->req_id=sd->bl.id;
- numdb_insert(charid_db,charid,p);
- return 0;
-}
-
-/*==========================================
- * id_db‚Öbl‚ð’ljÁ
- *------------------------------------------
- */
-void map_addiddb(struct block_list *bl) {
- nullpo_retv(bl);
-
- numdb_insert(id_db,bl->id,bl);
-}
-
-/*==========================================
- * id_db‚©‚çbl‚ðíœ
- *------------------------------------------
- */
-void map_deliddb(struct block_list *bl) {
- nullpo_retv(bl);
-
- numdb_erase(id_db,bl->id);
-}
-
-/*==========================================
- * nick_db‚Ösd‚ð’ljÁ
- *------------------------------------------
- */
-void map_addnickdb(struct map_session_data *sd) {
- nullpo_retv(sd);
-
- strdb_insert(nick_db,sd->status.name,sd);
-}
-
-/*==========================================
- * PC‚Ìquit?— map.c?•ª
- *
- * quit?—‚ÌŽå?‚ªˆá‚¤‚悤‚È?‚à‚µ‚Ä‚«‚½
- *------------------------------------------
- */
-int map_quit(struct map_session_data *sd) {
- nullpo_retr(0, sd);
-
- if(!sd->state.waitingdisconnect) {
- if (sd->state.event_disconnect) {
- if (script_config.event_script_type == 0) {
- struct npc_data *npc;
- if ((npc = npc_name2id(script_config.logout_event_name))) {
- run_script(npc->u.scr.script,0,sd->bl.id,npc->bl.id); // PCLogoutNPC
- sprintf (tmp_output, "Event '"CL_WHITE"%s"CL_RESET"' executed.\n", script_config.logout_event_name);
- ShowStatus(tmp_output);
- }
- } else {
- sprintf (tmp_output, "%d '"CL_WHITE"%s"CL_RESET"' events executed.\n",
- npc_event_doall_id(script_config.logout_event_name, sd->bl.id), script_config.logout_event_name);
- ShowStatus(tmp_output);
- }
- }
-
- if(sd->chatID) // ƒ`ƒƒƒbƒg‚©‚ço‚é
- chat_leavechat(sd);
-
- if(sd->trade_partner) // Žæˆø‚ð’†?‚·‚é
- trade_tradecancel(sd);
-
- if(sd->party_invite>0) // ƒp?ƒeƒB?—U‚ð‹‘”Û‚·‚é
- party_reply_invite(sd,sd->party_invite_account,0);
-
- if(sd->guild_invite>0) // ƒMƒ‹ƒh?—U‚ð‹‘”Û‚·‚é
- guild_reply_invite(sd,sd->guild_invite,0);
- if(sd->guild_alliance>0) // ƒMƒ‹ƒh“¯–¿?—U‚ð‹‘”Û‚·‚é
- guild_reply_reqalliance(sd,sd->guild_alliance_account,0);
-
- party_send_logout(sd); // ƒp?ƒeƒB‚̃ƒOƒAƒEƒgƒƒbƒZ?ƒW‘—M
-
- guild_send_memberinfoshort(sd,0); // ƒMƒ‹ƒh‚̃ƒOƒAƒEƒgƒƒbƒZ?ƒW‘—M
-
- pc_cleareventtimer(sd); // ƒCƒxƒ“ƒgƒ^ƒCƒ}‚ð”jŠü‚·‚é
-
- if(sd->state.storage_flag)
- storage_guild_storage_quit(sd,0);
- else
- storage_storage_quit(sd); // ‘qŒÉ‚ðŠJ‚¢‚Ä‚é‚È‚ç•Û‘¶‚·‚é
-
- // check if we've been authenticated [celest]
- if (sd->state.auth)
- skill_castcancel(&sd->bl,0); // ‰r¥‚ð’†?‚·‚é
-
- skill_stop_dancing(&sd->bl,1);// ƒ_ƒ“ƒX/‰‰‘t’†?
-
- if(sd->sc_data && sd->sc_data[SC_BERSERK].timer!=-1) //ƒo?ƒT?ƒN’†‚ÌI—¹‚ÍHP‚ð100‚É
- sd->status.hp = 100;
-
- status_change_clear(&sd->bl,1); // ƒXƒe?ƒ^ƒXˆÙí‚ð‰ðœ‚·‚é
- skill_clear_unitgroup(&sd->bl); // ƒXƒLƒ‹ƒ†ƒjƒbƒgƒOƒ‹?ƒv‚Ìíœ
- skill_cleartimerskill(&sd->bl);
-
- // check if we've been authenticated [celest]
- if (sd->state.auth) {
- pc_stop_walking(sd,0);
- pc_stopattack(sd);
- pc_delinvincibletimer(sd);
- }
- pc_delspiritball(sd,sd->spiritball,1);
- skill_gangsterparadise(sd,0);
- skill_unit_move(&sd->bl,gettick(),0);
-
- if (sd->state.auth)
- status_calc_pc(sd,4);
- // skill_clear_unitgroup(&sd->bl); // [Sara-chan]
-
- clif_clearchar_area(&sd->bl,2);
-
- if(sd->status.pet_id && sd->pd) {
- pet_lootitem_drop(sd->pd,sd);
- pet_remove_map(sd);
- if(sd->pet.intimate <= 0) {
- intif_delete_petdata(sd->status.pet_id);
- sd->status.pet_id = 0;
- sd->pd = NULL;
- sd->petDB = NULL;
- }
- else
- intif_save_petdata(sd->status.account_id,&sd->pet);
- }
-
- if(pc_isdead(sd))
- pc_setrestartvalue(sd,2);
-
- pc_clean_skilltree(sd);
- pc_makesavestatus(sd);
- chrif_save(sd);
- storage_storage_dirty(sd);
- storage_storage_save(sd);
- map_delblock(&sd->bl);
- }
-
- if( sd->npc_stackbuf && sd->npc_stackbuf != NULL) {
- aFree( sd->npc_stackbuf );
- sd->npc_stackbuf = NULL;
- }
-
- chrif_char_offline(sd);
-
- {
- void *p = numdb_search(charid_db,sd->status.char_id);
- if(p) {
- numdb_erase(charid_db,sd->status.char_id);
- aFree(p);
- }
- }
- strdb_erase(nick_db,sd->status.name);
- numdb_erase(charid_db,sd->status.char_id);
- numdb_erase(id_db,sd->bl.id);
- aFree(sd->reg);
- aFree(sd->regstr);
-
- return 0;
-}
-
-/*==========================================
- * id”Ô?‚ÌPC‚ð’T‚·B‹‚È‚¯‚ê‚ÎNULL
- *------------------------------------------
- */
-struct map_session_data * map_id2sd(int id) {
-// remove search from db, because:
-// 1 - all players, npc, items and mob are in this db (to search, it's not speed, and search in session is more sure)
-// 2 - DB seems not always correct. Sometimes, when a player disconnects, its id (account value) is not removed and structure
-// point to a memory area that is not more a session_data and value are incorrect (or out of available memory) -> crash
-// replaced by searching in all session.
-// by searching in session, we are sure that fd, session, and account exist.
-/*
- struct block_list *bl;
-
- bl=numdb_search(id_db,id);
- if(bl && bl->type==BL_PC)
- return (struct map_session_data*)bl;
- return NULL;
-*/
- int i;
- struct map_session_data *sd;
-
- if (id <= 0) return 0;
-
- for(i = 0; i < fd_max; i++)
- if (session[i] && (sd = (struct map_session_data*)session[i]->session_data) && sd->bl.id == id)
- return sd;
-
- return NULL;
-}
-
-/*==========================================
- * char_id”Ô?‚Ì–¼‘O‚ð’T‚·
- *------------------------------------------
- */
-char * map_charid2nick(int id) {
- struct charid2nick *p = (struct charid2nick*)numdb_search(charid_db,id);
-
- if(p==NULL)
- return NULL;
- if(p->req_id!=0)
- return NULL;
- return p->nick;
-}
-
-struct map_session_data * map_charid2sd(int id) {
- int i;
- struct map_session_data *sd;
-
- if (id <= 0) return 0;
-
- for(i = 0; i < fd_max; i++)
- if (session[i] && (sd = (struct map_session_data*)session[i]->session_data) && sd->status.char_id == id)
- return sd;
-
- return NULL;
-}
-
-/*==========================================
- * Search session data from a nick name
- * (without sensitive case if necessary)
- * return map_session_data pointer or NULL
- *------------------------------------------
- */
-struct map_session_data * map_nick2sd(char *nick) {
- int i, quantity=0, nicklen;
- struct map_session_data *sd = NULL;
- struct map_session_data *pl_sd = NULL;
-
- if (nick == NULL)
- return NULL;
-
- nicklen = strlen(nick);
-
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data*)session[i]->session_data) && pl_sd->state.auth)
- // Without case sensitive check (increase the number of similar character names found)
- if (strnicmp(pl_sd->status.name, nick, nicklen) == 0) {
- // Strict comparison (if found, we finish the function immediatly with correct value)
- if (strcmp(pl_sd->status.name, nick) == 0)
- return pl_sd;
- quantity++;
- sd = pl_sd;
- }
- }
- // Here, the exact character name is not found
- // We return the found index of a similar account ONLY if there is 1 similar character
- if (quantity == 1)
- return sd;
-
- // Exact character name is not found and 0 or more than 1 similar characters have been found ==> we say not found
- return NULL;
-}
-
-/*==========================================
- * id”Ô?‚Ì•¨‚ð’T‚·
- * ˆêŽžobject‚Ìꇂ͔z—ñ‚ðˆø‚­‚Ì‚Ý
- *------------------------------------------
- */
-struct block_list * map_id2bl(int id)
-{
- struct block_list *bl=NULL;
- if(id >= 0 && id < sizeof(objects)/sizeof(objects[0]))
- bl = objects[id];
- else
- bl = (struct block_list*)numdb_search(id_db,id);
-
- return bl;
-}
-
-/*==========================================
- * id_db?‚Ì‘S‚Ä‚Éfunc‚ð?s
- *------------------------------------------
- */
-int map_foreachiddb(int (*func)(void*,void*,va_list),...) {
- va_list ap;
-
- va_start(ap,func);
- numdb_foreach(id_db,func,ap);
- va_end(ap);
- return 0;
-}
-
-/*==========================================
- * map.npc‚֒ljÁ (warp“™‚̗̈掂¿‚Ì‚Ý)
- *------------------------------------------
- */
-int map_addnpc(int m,struct npc_data *nd) {
- int i;
- if(m<0 || m>=map_num)
- return -1;
- for(i=0;i<map[m].npc_num && i<MAX_NPC_PER_MAP;i++)
- if(map[m].npc[i]==NULL)
- break;
- if(i==MAX_NPC_PER_MAP){
- if(battle_config.error_log)
- printf("too many NPCs in one map %s\n",map[m].name);
- return -1;
- }
- if(i==map[m].npc_num){
- map[m].npc_num++;
- }
-
- nullpo_retr(0, nd);
-
- map[m].npc[i]=nd;
- nd->n = i;
- numdb_insert(id_db,nd->bl.id,nd);
-
- return i;
-}
-
-void map_removenpc(void) {
- int i,m,n=0;
-
- for(m=0;m<map_num;m++) {
- for(i=0;i<map[m].npc_num && i<MAX_NPC_PER_MAP;i++) {
- if(map[m].npc[i]!=NULL) {
- clif_clearchar_area(&map[m].npc[i]->bl,2);
- map_delblock(&map[m].npc[i]->bl);
- numdb_erase(id_db,map[m].npc[i]->bl.id);
- if(map[m].npc[i]->bl.subtype==SCRIPT) {
- aFree(map[m].npc[i]->u.scr.script);
- aFree(map[m].npc[i]->u.scr.label_list);
- }
- aFree(map[m].npc[i]);
- map[m].npc[i] = NULL;
- n++;
- }
- }
- }
-
- sprintf(tmp_output,"Successfully removed and freed from memory '"CL_WHITE"%d"CL_RESET"' NPCs.\n",n);
- ShowStatus(tmp_output);
-}
-
-/*==========================================
- * map–¼‚©‚çmap”Ô?‚Ö?Š·
- *------------------------------------------
- */
-int map_mapname2mapid(char *name) {
- struct map_data *md=NULL;
-
- md = (struct map_data*)strdb_search(map_db,name);
-
-#ifdef USE_AFM
- // If we can't find the .gat map try .afm instead [celest]
- if(md==NULL && strstr(name,".gat")) {
- char *afm_name = strdup(name);
- strcpy(&afm_name[strlen(name) - 3], "afm");
- md = (struct map_data*)strdb_search(map_db,afm_name);
- }
-#endif
-
- if(md==NULL || md->gat==NULL)
- return -1;
- return md->m;
-}
-
-/*==========================================
- * ‘¼ŽImap–¼‚©‚çip,port?Š·
- *------------------------------------------
- */
-int map_mapname2ipport(char *name,int *ip,int *port) {
- struct map_data_other_server *mdos=NULL;
-
- mdos = (struct map_data_other_server*)strdb_search(map_db,name);
- if(mdos==NULL || mdos->gat)
- return -1;
- *ip=mdos->ip;
- *port=mdos->port;
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int map_check_dir(int s_dir,int t_dir) {
- if(s_dir == t_dir)
- return 0;
- switch(s_dir) {
- case 0:
- if(t_dir == 7 || t_dir == 1 || t_dir == 0)
- return 0;
- break;
- case 1:
- if(t_dir == 0 || t_dir == 2 || t_dir == 1)
- return 0;
- break;
- case 2:
- if(t_dir == 1 || t_dir == 3 || t_dir == 2)
- return 0;
- break;
- case 3:
- if(t_dir == 2 || t_dir == 4 || t_dir == 3)
- return 0;
- break;
- case 4:
- if(t_dir == 3 || t_dir == 5 || t_dir == 4)
- return 0;
- break;
- case 5:
- if(t_dir == 4 || t_dir == 6 || t_dir == 5)
- return 0;
- break;
- case 6:
- if(t_dir == 5 || t_dir == 7 || t_dir == 6)
- return 0;
- break;
- case 7:
- if(t_dir == 6 || t_dir == 0 || t_dir == 7)
- return 0;
- break;
- }
- return 1;
-}
-
-/*==========================================
- * ”Þ‰ä‚Ì•ûŒü‚ðŒvŽZ
- *------------------------------------------
- */
-int map_calc_dir( struct block_list *src,int x,int y) {
- int dir=0;
- int dx,dy;
-
- nullpo_retr(0, src);
-
- dx=x-src->x;
- dy=y-src->y;
- if( dx==0 && dy==0 ){ // ”Þ‰ä‚Ìꊈê’v
- dir=0; // ã
- }else if( dx>=0 && dy>=0 ){ // •ûŒü“I‚ɉEã
- dir=7; // ‰Eã
- if( dx*3-1<dy ) dir=0; // ã
- if( dx>dy*3 ) dir=6; // ‰E
- }else if( dx>=0 && dy<=0 ){ // •ûŒü“I‚ɉE‰º
- dir=5; // ‰E‰º
- if( dx*3-1<-dy ) dir=4; // ‰º
- if( dx>-dy*3 ) dir=6; // ‰E
- }else if( dx<=0 && dy<=0 ){ // •ûŒü“I‚ɶ‰º
- dir=3; // ¶‰º
- if( dx*3+1>dy ) dir=4; // ‰º
- if( dx<dy*3 ) dir=2; // ¶
- }else{ // •ûŒü“I‚ɶã
- dir=1; // ¶ã
- if( -dx*3-1<dy ) dir=0; // ã
- if( -dx>dy*3 ) dir=2; // ¶
- }
- return dir;
-}
-
-// gatŒn
-/*==========================================
- * (m,x,y)‚Ìó‘Ԃ𒲂ׂé
- *------------------------------------------
- */
-
-int map_getcell(int m,int x,int y,cell_t cellchk)
-{
- return (m < 0 || m > MAX_MAP_PER_SERVER) ? 0 : map_getcellp(&map[m],x,y,cellchk);
-}
-
-int map_getcellp(struct map_data* m,int x,int y,cell_t cellchk)
-{
- int type;
- nullpo_ret(m);
-
- if(x<0 || x>=m->xs-1 || y<0 || y>=m->ys-1)
- {
- if(cellchk==CELL_CHKNOPASS) return 1;
- return 0;
- }
- type = m->gat[x+y*m->xs];
- if (cellchk<0x10)
- type &= CELL_MASK;
-
- switch(cellchk)
- {
- case CELL_CHKPASS:
- return (type!=1 && type!=5);
- case CELL_CHKNOPASS:
- return (type==1 || type==5);
- case CELL_CHKWALL:
- return (type==1);
- case CELL_CHKWATER:
- return (type==3);
- case CELL_CHKGROUND:
- return (type==5);
- case CELL_GETTYPE:
- return type;
- case CELL_CHKNPC:
- return (type&CELL_NPC);
- case CELL_CHKBASILICA:
- return (type&CELL_BASILICA);
- default:
- return 0;
- }
-}
-
-/*==========================================
- * (m,x,y)‚Ìó‘Ô‚ðÝ’è‚·‚é
- *------------------------------------------
- */
-void map_setcell(int m,int x,int y,int cell)
-{
- int j;
- if(x<0 || x>=map[m].xs || y<0 || y>=map[m].ys)
- return;
- j=x+y*map[m].xs;
-
- switch (cell) {
- case CELL_SETNPC:
- map[m].gat[j] |= CELL_NPC;
- break;
- case CELL_SETBASILICA:
- map[m].gat[j] |= CELL_BASILICA;
- break;
- case CELL_CLRBASILICA:
- map[m].gat[j] &= ~CELL_BASILICA;
- break;
- default:
- map[m].gat[j] = (map[m].gat[j]&~CELL_MASK) + cell;
- break;
- }
-}
-
-/*==========================================
- * ‘¼ŽIŠÇ—‚̃}ƒbƒv‚ðdb‚ɒljÁ
- *------------------------------------------
- */
-int map_setipport(char *name,unsigned long ip,int port) {
- struct map_data *md=NULL;
- struct map_data_other_server *mdos=NULL;
-
- md = (struct map_data*)strdb_search(map_db,name);
- if(md==NULL){ // not exist -> add new data
- mdos=(struct map_data_other_server *)aCalloc(1,sizeof(struct map_data_other_server));
- memcpy(mdos->name,name,24);
- mdos->gat = NULL;
- mdos->ip = ip;
- mdos->port = port;
- mdos->map = NULL;
- strdb_insert(map_db,mdos->name,mdos);
- } else if(md->gat){
- if(ip!=clif_getip() || port!=clif_getport()){
- // “Ç‚Ýž‚ñ‚Å‚¢‚½‚¯‚ÇA’S“–ŠO‚É‚È‚Á‚½ƒ}ƒbƒv
- mdos=(struct map_data_other_server *)aCalloc(1,sizeof(struct map_data_other_server));
- memcpy(mdos->name,name,24);
- mdos->gat = NULL;
- mdos->ip = ip;
- mdos->port = port;
- mdos->map = md;
- strdb_insert(map_db,mdos->name,mdos);
- // printf("from char server : %s -> %08lx:%d\n",name,ip,port);
- } else {
- // “Ç‚Ýž‚ñ‚Å‚¢‚ÄA’S“–‚É‚È‚Á‚½ƒ}ƒbƒvi‰½‚à‚µ‚È‚¢j
- ;
- }
- } else {
- mdos=(struct map_data_other_server *)md;
- if(ip == clif_getip() && port == clif_getport()) {
- // Ž©•ª‚Ì’S“–‚É‚È‚Á‚½ƒ}ƒbƒv
- if(mdos->map == NULL) {
- // “Ç‚Ýž‚ñ‚Å‚¢‚È‚¢‚Ì‚ÅI—¹‚·‚é
- printf("map_setipport : %s is not loaded.\n",name);
- exit(1);
- } else {
- // “Ç‚Ýž‚ñ‚Å‚¢‚é‚Ì‚Å’u‚«Š·‚¦‚é
- md = mdos->map;
- aFree(mdos);
- strdb_insert(map_db,md->name,md);
- }
- } else {
- // ‘¼‚ÌŽI‚Ì’S“–ƒ}ƒbƒv‚È‚Ì‚Å’u‚«Š·‚¦‚邾‚¯
- mdos->ip = ip;
- mdos->port = port;
- }
- }
- return 0;
-}
-
-/*==========================================
- * ‘¼ŽIŠÇ—‚̃}ƒbƒv‚ð‘S‚Äíœ
- *------------------------------------------
- */
-int map_eraseallipport_sub(void *key,void *data,va_list va) {
- struct map_data_other_server *mdos = (struct map_data_other_server*)data;
- if(mdos->gat == NULL && mdos->map == NULL) {
- strdb_erase(map_db,key);
- aFree(mdos);
- }
- return 0;
-}
-
-int map_eraseallipport(void) {
- strdb_foreach(map_db,map_eraseallipport_sub);
- return 1;
-}
-
-/*==========================================
- * ‘¼ŽIŠÇ—‚̃}ƒbƒv‚ðdb‚©‚çíœ
- *------------------------------------------
- */
-int map_eraseipport(char *name,unsigned long ip,int port)
-{
- struct map_data *md;
- struct map_data_other_server *mdos;
-// unsigned char *p=(unsigned char *)&ip;
-
- md=(struct map_data *) strdb_search(map_db,name);
- if(md){
- if(md->gat) // local -> check data
- return 0;
- else {
- mdos=(struct map_data_other_server *)md;
- if(mdos->ip==ip && mdos->port == port) {
- if(mdos->map) {
- // ‚±‚̃}ƒbƒvŽI‚Å‚à“Ç‚Ýž‚ñ‚Å‚¢‚é‚̂ňړ®‚Å‚«‚é
- return 1; // ŒÄ‚Ño‚µŒ³‚Å chrif_sendmap() ‚ð‚·‚é
- } else {
- strdb_erase(map_db,name);
- aFree(mdos);
- }
-// if(battle_config.etc_log)
-// printf("erase map %s %d.%d.%d.%d:%d\n",name,p[0],p[1],p[2],p[3],port);
- }
- }
- }
- return 0;
-}
-
-// ‰Šú‰»Žü‚è
-/*==========================================
- * …ê‚‚³Ý’è
- *------------------------------------------
- */
-static struct waterlist_ {
- char mapname[24];
- int waterheight;
-} *waterlist=NULL;
-
-#define NO_WATER 1000000
-
-static int map_waterheight(char *mapname) {
- if(waterlist){
- int i;
- for(i=0;waterlist[i].mapname[0] && i < MAX_MAP_PER_SERVER;i++)
- if(strcmp(waterlist[i].mapname,mapname)==0)
- return waterlist[i].waterheight;
- }
- return NO_WATER;
-}
-
-static void map_readwater(char *watertxt) {
- char line[1024],w1[1024];
- FILE *fp=NULL;
- int n=0;
-
- fp=fopen(watertxt,"r");
- if(fp==NULL){
- printf("file not found: %s\n",watertxt);
- return;
- }
- if(waterlist==NULL)
- waterlist = (struct waterlist_*)aCallocA(MAX_MAP_PER_SERVER,sizeof(*waterlist));
- while(fgets(line,1020,fp) && n < MAX_MAP_PER_SERVER){
- int wh,count;
- if(line[0] == '/' && line[1] == '/')
- continue;
- if((count=sscanf(line,"%s%d",w1,&wh)) < 1){
- continue;
- }
- strcpy(waterlist[n].mapname,w1);
- if(count >= 2)
- waterlist[n].waterheight = wh;
- else
- waterlist[n].waterheight = 3;
- n++;
- }
- fclose(fp);
-}
-/*==========================================
-* ƒ}ƒbƒvƒLƒƒƒbƒVƒ…‚ɒljÁ‚·‚é
-*===========================================*/
-
-// ƒ}ƒbƒvƒLƒƒƒbƒVƒ…‚ÌÅ‘å’l
-#define MAX_MAP_CACHE 768
-
-//Šeƒ}ƒbƒv‚²‚Æ‚ÌŬŒÀî•ñ‚ð“ü‚ê‚é‚à‚ÌAREAD_FROM_BITMAP—p
-struct map_cache_info {
- char fn[32];//ƒtƒ@ƒCƒ‹–¼
- int xs,ys; //•‚Æ‚‚³
- int water_height;
- int pos; // ƒf[ƒ^‚ª“ü‚ê‚Ä‚ ‚éêŠ
- int compressed; // zilb’Ê‚¹‚é‚悤‚É‚·‚éˆ×‚Ì—\–ñ
- int compressed_len; // zilb’Ê‚¹‚é‚悤‚É‚·‚éˆ×‚Ì—\–ñ
-}; // 56 byte
-
-struct map_cache_head {
- int sizeof_header;
- int sizeof_map;
- // ã‚Ì‚Q‚‰ü•Ï•s‰Â
- int nmaps; // ƒ}ƒbƒv‚̌”
- int filesize;
-};
-
-struct {
- struct map_cache_head head;
- struct map_cache_info *map;
- FILE *fp;
- int dirty;
-} map_cache;
-
-static int map_cache_open(char *fn);
-static void map_cache_close(void);
-static int map_cache_read(struct map_data *m);
-static int map_cache_write(struct map_data *m);
-
-static int map_cache_open(char *fn)
-{
- atexit(map_cache_close);
- if(map_cache.fp) {
- map_cache_close();
- }
- map_cache.fp = fopen(fn,"r+b");
- if(map_cache.fp) {
- fread(&map_cache.head,1,sizeof(struct map_cache_head),map_cache.fp);
- fseek(map_cache.fp,0,SEEK_END);
- if(
- map_cache.head.sizeof_header == sizeof(struct map_cache_head) &&
- map_cache.head.sizeof_map == sizeof(struct map_cache_info) &&
- map_cache.head.nmaps == MAX_MAP_CACHE &&
- map_cache.head.filesize == ftell(map_cache.fp)
- ) {
- // ƒLƒƒƒbƒVƒ…“Ç‚Ýž‚ݬŒ÷
- map_cache.map = (struct map_cache_info *) aMalloc(sizeof(struct map_cache_info) * map_cache.head.nmaps);
- fseek(map_cache.fp,sizeof(struct map_cache_head),SEEK_SET);
- fread(map_cache.map,sizeof(struct map_cache_info),map_cache.head.nmaps,map_cache.fp);
- return 1;
- }
- fclose(map_cache.fp);
- }
- // “Ç‚Ýž‚Ý‚ÉŽ¸”s‚µ‚½‚Ì‚ÅV‹K‚É쬂·‚é
- map_cache.fp = fopen(fn,"wb");
- if(map_cache.fp) {
- memset(&map_cache.head,0,sizeof(struct map_cache_head));
- map_cache.map = (struct map_cache_info *) aCalloc(sizeof(struct map_cache_info),MAX_MAP_CACHE);
- map_cache.head.nmaps = MAX_MAP_CACHE;
- map_cache.head.sizeof_header = sizeof(struct map_cache_head);
- map_cache.head.sizeof_map = sizeof(struct map_cache_info);
-
- map_cache.head.filesize = sizeof(struct map_cache_head);
- map_cache.head.filesize += sizeof(struct map_cache_info) * map_cache.head.nmaps;
-
- map_cache.dirty = 1;
- return 1;
- }
- return 0;
-}
-
-static void map_cache_close(void)
-{
- if(!map_cache.fp) { return; }
- if(map_cache.dirty) {
- fseek(map_cache.fp,0,SEEK_SET);
- fwrite(&map_cache.head,1,sizeof(struct map_cache_head),map_cache.fp);
- fwrite(map_cache.map,map_cache.head.nmaps,sizeof(struct map_cache_info),map_cache.fp);
- }
- fclose(map_cache.fp);
- aFree(map_cache.map);
- map_cache.fp = NULL;
- return;
-}
-
-int map_cache_read(struct map_data *m)
-{
- int i;
- if(!map_cache.fp) { return 0; }
- for(i = 0;i < map_cache.head.nmaps ; i++) {
- if(!strcmp(m->name,map_cache.map[i].fn)) {
- if(map_cache.map[i].water_height != map_waterheight(m->name)) {
- // …ê‚Ì‚‚³‚ªˆá‚¤‚Ì‚Å“Ç‚Ý’¼‚µ
- return 0;
- } else if(map_cache.map[i].compressed == 0) {
- // ”ñˆ³kƒtƒ@ƒCƒ‹
- int size = map_cache.map[i].xs * map_cache.map[i].ys;
- m->xs = map_cache.map[i].xs;
- m->ys = map_cache.map[i].ys;
- m->gat = (unsigned char *)aCalloc(m->xs * m->ys,sizeof(unsigned char));
- fseek(map_cache.fp,map_cache.map[i].pos,SEEK_SET);
- if(fread(m->gat,1,size,map_cache.fp) == size) {
- // ¬Œ÷
- return 1;
- } else {
- // ‚È‚º‚©ƒtƒ@ƒCƒ‹Œã”¼‚ªŒ‡‚¯‚Ä‚é‚Ì‚Å“Ç‚Ý’¼‚µ
- m->xs = 0; m->ys = 0; m->gat = NULL; aFree(m->gat);
- return 0;
- }
- } else if(map_cache.map[i].compressed == 1) {
- // ˆ³kƒtƒ‰ƒO=1 : zlib
- unsigned char *buf;
- unsigned long dest_len;
- int size_compress = map_cache.map[i].compressed_len;
- m->xs = map_cache.map[i].xs;
- m->ys = map_cache.map[i].ys;
- m->gat = (unsigned char *)aMalloc(m->xs * m->ys * sizeof(unsigned char));
- buf = (unsigned char*)aMalloc(size_compress);
- fseek(map_cache.fp,map_cache.map[i].pos,SEEK_SET);
- if(fread(buf,1,size_compress,map_cache.fp) != size_compress) {
- // ‚È‚º‚©ƒtƒ@ƒCƒ‹Œã”¼‚ªŒ‡‚¯‚Ä‚é‚Ì‚Å“Ç‚Ý’¼‚µ
- printf("fread error\n");
- aFree(m->gat); m->xs = 0; m->ys = 0; m->gat = NULL;
- aFree(buf);
- return 0;
- }
- dest_len = m->xs * m->ys;
- decode_zip(m->gat,&dest_len,buf,size_compress);
- if(dest_len != map_cache.map[i].xs * map_cache.map[i].ys) {
- // ³í‚ɉ𓀂ªo—ˆ‚Ä‚È‚¢
- aFree(m->gat); m->xs = 0; m->ys = 0; m->gat = NULL;
- aFree(buf);
- return 0;
- }
- aFree(buf);
- return 1;
- }
- }
- }
- return 0;
-}
-
-static int map_cache_write(struct map_data *m)
-{
- int i;
- unsigned long len_new , len_old;
- char *write_buf;
- if(!map_cache.fp) { return 0; }
- for(i = 0;i < map_cache.head.nmaps ; i++) {
- if(!strcmp(m->name,map_cache.map[i].fn)) {
- // “¯‚¶ƒGƒ“ƒgƒŠ[‚ª‚ ‚ê‚Îã‘‚«
- if(map_cache.map[i].compressed == 0) {
- len_old = map_cache.map[i].xs * map_cache.map[i].ys;
- } else if(map_cache.map[i].compressed == 1) {
- len_old = map_cache.map[i].compressed_len;
- } else {
- // ƒTƒ|[ƒg‚³‚ê‚Ä‚È‚¢Œ`Ž®‚È‚Ì‚Å’·‚³‚O
- len_old = 0;
- }
- if(map_read_flag == 2) {
- // ˆ³k•Û‘¶
- // ‚³‚·‚ª‚É‚Q”{‚É–c‚ê‚鎖‚Í‚È‚¢‚Æ‚¢‚¤Ž–‚Å
- write_buf = (char *) aMalloc(m->xs * m->ys * 2);
- len_new = m->xs * m->ys * 2;
- encode_zip((unsigned char *) write_buf,&len_new,m->gat,m->xs * m->ys);
- map_cache.map[i].compressed = 1;
- map_cache.map[i].compressed_len = len_new;
- } else {
- len_new = m->xs * m->ys;
- write_buf = (char *) m->gat;
- map_cache.map[i].compressed = 0;
- map_cache.map[i].compressed_len = 0;
- }
- if(len_new <= len_old) {
- // ƒTƒCƒY‚ª“¯‚¶‚©¬‚³‚­‚È‚Á‚½‚Ì‚Åꊂ͕ςí‚ç‚È‚¢
- fseek(map_cache.fp,map_cache.map[i].pos,SEEK_SET);
- fwrite(write_buf,1,len_new,map_cache.fp);
- } else {
- // V‚µ‚¢êŠ‚É“o˜^
- fseek(map_cache.fp,map_cache.head.filesize,SEEK_SET);
- fwrite(write_buf,1,len_new,map_cache.fp);
- map_cache.map[i].pos = map_cache.head.filesize;
- map_cache.head.filesize += len_new;
- }
- map_cache.map[i].xs = m->xs;
- map_cache.map[i].ys = m->ys;
- map_cache.map[i].water_height = map_waterheight(m->name);
- map_cache.dirty = 1;
- if(map_read_flag == 2) {
- aFree(write_buf);
- }
- return 0;
- }
- }
- // “¯‚¶ƒGƒ“ƒgƒŠ‚ª–³‚¯‚ê‚Α‚«ž‚ß‚éꊂð’T‚·
- for(i = 0;i < map_cache.head.nmaps ; i++) {
- if(map_cache.map[i].fn[0] == 0) {
- // V‚µ‚¢êŠ‚É“o˜^
- if(map_read_flag == 2) {
- write_buf = (char *) aMalloc(m->xs * m->ys * 2);
- len_new = m->xs * m->ys * 2;
- encode_zip((unsigned char *) write_buf,&len_new,m->gat,m->xs * m->ys);
- map_cache.map[i].compressed = 1;
- map_cache.map[i].compressed_len = len_new;
- } else {
- len_new = m->xs * m->ys;
- write_buf = (char *) m->gat;
- map_cache.map[i].compressed = 0;
- map_cache.map[i].compressed_len = 0;
- }
- strncpy(map_cache.map[i].fn,m->name,sizeof(map_cache.map[0].fn));
- fseek(map_cache.fp,map_cache.head.filesize,SEEK_SET);
- fwrite(write_buf,1,len_new,map_cache.fp);
- map_cache.map[i].pos = map_cache.head.filesize;
- map_cache.map[i].xs = m->xs;
- map_cache.map[i].ys = m->ys;
- map_cache.map[i].water_height = map_waterheight(m->name);
- map_cache.head.filesize += len_new;
- map_cache.dirty = 1;
- if(map_read_flag == 2) {
- aFree(write_buf);
- }
- return 0;
- }
- }
- // ‘‚«ž‚ß‚È‚©‚Á‚½
- return 1;
-}
-
-#ifdef USE_AFM
-static int map_readafm(int m,char *fn) {
-
- /*
- Advanced Fusion Maps Support
- (c) 2003-2004, The Fusion Project
- - AlexKreuz
-
- The following code has been provided by me for eAthena
- under the GNU GPL. It provides Advanced Fusion
- Map, the map format desgined by me for Fusion, support
- for the eAthena emulator.
-
- I understand that because it is under the GPL
- that other emulators may very well use this code in their
- GNU project as well.
-
- The AFM map format was not originally a part of the GNU
- GPL. It originated from scratch by my own hand. I understand
- that distributing this code to read the AFM maps with eAthena
- causes the GPL to apply to this code. But the actual AFM
- maps are STILL copyrighted to the Fusion Project. By choosing
-
- In exchange for that 'act of faith' I ask for the following.
-
- A) Give credit where it is due. If you use this code, do not
- place your name on the changelog. Credit should be given
- to AlexKreuz.
- B) As an act of courtesy, ask me and let me know that you are putting
- AFM support in your project. You will have my blessings if you do.
- C) Use the code in its entirety INCLUDING the copyright message.
- Although the code provided may now be GPL, the AFM maps are not
- and so I ask you to display the copyright message on the STARTUP
- SCREEN as I have done here. (refer to core.c)
- "Advanced Fusion Maps (c) 2003-2004 The Fusion Project"
-
- Without this copyright, you are NOT entitled to bundle or distribute
- the AFM maps at all. On top of that, your "support" for AFM maps
- becomes just as shady as your "support" for Gravity GRF files.
-
- The bottom line is this. I know that there are those of you who
- would like to use this code but aren't going to want to provide the
- proper credit. I know this because I speak frome experience. If
- you are one of those people who is going to try to get around my
- requests, then save your breath because I don't want to hear it.
-
- I have zero faith in GPL and I know and accept that if you choose to
- not display the copyright for the AFMs then there is absolutely nothing
- I can do about it. I am not about to start a legal battle over something
- this silly.
-
- Provide the proper credit because you believe in the GPL. If you choose
- not to and would rather argue about it, consider the GPL failed.
-
- October 18th, 2004
- - AlexKreuz
- - The Fusion Project
- */
-
-
- int s;
- int x,y,xs,ys;
- size_t size;
-
- char afm_line[65535];
- int afm_size[2];
- FILE *afm_file;
- char *str;
-
- afm_file = fopen(fn, "r");
- if (afm_file != NULL) {
-
-// printf("\rLoading Maps [%d/%d]: %-50s ",m,map_num,fn);
-// fflush(stdout);
-
- str=fgets(afm_line, sizeof(afm_line)-1, afm_file);
- str=fgets(afm_line, sizeof(afm_line)-1, afm_file);
- str=fgets(afm_line, sizeof(afm_line)-1, afm_file);
- sscanf(str , "%d%d", &afm_size[0], &afm_size[1]);
-
- map[m].m = m;
- xs = map[m].xs = afm_size[0];
- ys = map[m].ys = afm_size[1];
- // check this, unsigned where it might not need to be
- map[m].gat = (unsigned char*)aCallocA(s = map[m].xs * map[m].ys, 1);
-
- if(map[m].gat==NULL){
- printf("out of memory : map_readmap gat\n");
- exit(1);
- }
-
- map[m].npc_num=0;
- map[m].users=0;
- memset(&map[m].flag,0,sizeof(map[m].flag));
-
- if(battle_config.pk_mode) map[m].flag.pvp = 1; // make all maps pvp for pk_mode [Valaris]
-
- for (y = 0; y < ys; y++) {
- str=fgets(afm_line, sizeof(afm_line)-1, afm_file);
- for (x = 0; x < xs; x++) {
- map[m].gat[x+y*xs] = str[x]-48;
- }
- }
-
- map[m].bxs=(xs+BLOCK_SIZE-1)/BLOCK_SIZE;
- map[m].bys=(ys+BLOCK_SIZE-1)/BLOCK_SIZE;
- size = map[m].bxs * map[m].bys * sizeof(struct block_list*);
- map[m].block = (struct block_list**)aCalloc(size, 1);
-
- if(map[m].block == NULL){
- printf("out of memory : map_readmap block\n");
- exit(1);
- }
-
- map[m].block_mob = (struct block_list**)aCalloc(size, 1);
- if (map[m].block_mob == NULL) {
- printf("out of memory : map_readmap block_mob\n");
- exit(1);
- }
-
- size = map[m].bxs*map[m].bys*sizeof(int);
-
- map[m].block_count = (int*)aCallocA(size, 1);
- if(map[m].block_count==NULL){
- printf("out of memory : map_readmap block\n");
- exit(1);
- }
- memset(map[m].block_count,0,size);
-
- map[m].block_mob_count = (int*)aCallocA(size, 1);
- if(map[m].block_mob_count==NULL){
- printf("out of memory : map_readmap block_mob\n");
- exit(1);
- }
- memset(map[m].block_mob_count,0,size);
-
- strdb_insert(map_db,map[m].name,&map[m]);
-
- fclose(afm_file);
-
- }
-
- return 0;
-}
-#endif
-
-/*==========================================
- * ƒ}ƒbƒv1–‡“Ç‚Ýž‚Ý
- * ===================================================*/
-static int map_readmap(int m,char *fn, char *alias, int *map_cache, int maxmap) {
- char *gat="";
- size_t size;
-
- int i = 0;
- int e = 0;
- char progress[21] = " ";
-
- //printf("\rLoading Maps [%d/%d]: %-50s ",m,map_num,fn);
- if (maxmap) { //avoid map-server crashing if there are 0 maps
- char c = '-';
- static int lasti = -1;
- static int last_time = -1;
- i=m*20/maxmap;
- if ((i != lasti) || (last_time != time(0))) {
- lasti = i;
- printf("\r");
- ShowStatus("Progress: ");
- printf("[");
- for (e=0;e<i;e++) progress[e] = '#';
- printf(progress);
- printf("] Working: [");
- last_time = time(0);
- switch(last_time % 4) {
- case 0: c='\\'; break;
- case 1: c='|'; break;
- case 2: c='/'; break;
- case 3: c='-'; break;
- }
- printf("%c]",c);
- fflush(stdout);
- }
- }
-
- if(map_cache_read(&map[m])) {
- // ƒLƒƒƒbƒVƒ…‚©‚ç“Ç‚Ýž‚ß‚½
- (*map_cache)++;
- } else {
- int s;
- int wh;
- int x,y,xs,ys;
- struct gat_1cell {float high[4]; int type;} *p=NULL;
- // read & convert fn
- // again, might not need to be unsigned char
- gat = (char*)grfio_read(fn);
- if(gat==NULL) {
- return -1;
- // ‚³‚·‚ª‚Ƀ}ƒbƒv‚ª“Ç‚ß‚È‚¢‚Ì‚Í‚Ü‚¸‚¢‚Ì‚ÅI—¹‚·‚é
- //printf("Can't load map %s\n",fn);
- //exit(1);
- }
-
- xs=map[m].xs=*(int*)(gat+6);
- ys=map[m].ys=*(int*)(gat+10);
- map[m].gat = (unsigned char *)aCallocA(s = map[m].xs * map[m].ys,sizeof(unsigned char));
- wh=map_waterheight(map[m].name);
- for(y=0;y<ys;y++){
- p=(struct gat_1cell*)(gat+y*xs*20+14);
- for(x=0;x<xs;x++){
- if(wh!=NO_WATER && p->type==0){
- // …ê”»’è
- map[m].gat[x+y*xs]=(p->high[0]>wh || p->high[1]>wh || p->high[2]>wh || p->high[3]>wh) ? 3 : 0;
- } else {
- map[m].gat[x+y*xs]=p->type;
- }
- p++;
- }
- }
- map_cache_write(&map[m]);
- aFree(gat);
- }
-
- map[m].m=m;
- map[m].npc_num=0;
- map[m].users=0;
- memset(&map[m].flag,0,sizeof(map[m].flag));
- if(battle_config.pk_mode)
- map[m].flag.pvp = 1; // make all maps pvp for pk_mode [Valaris]
- map[m].bxs=(map[m].xs+BLOCK_SIZE-1)/BLOCK_SIZE;
- map[m].bys=(map[m].ys+BLOCK_SIZE-1)/BLOCK_SIZE;
- size = map[m].bxs * map[m].bys * sizeof(struct block_list*);
- map[m].block = (struct block_list **)aCalloc(1,size);
- map[m].block_mob = (struct block_list **)aCalloc(1,size);
- size = map[m].bxs*map[m].bys*sizeof(int);
- map[m].block_count = (int *)aCallocA(1,size);
- map[m].block_mob_count=(int *)aCallocA(1,size);
- if (alias)
- strdb_insert(map_db,alias,&map[m]);
- else
- strdb_insert(map_db,map[m].name,&map[m]);
-
-// printf("%s read done\n",fn);
-
- return 0;
-}
-
-/*==========================================
- * ‘S‚Ä‚Ìmapƒf?ƒ^‚ð?‚Ý?‚Þ
- *------------------------------------------
- */
-int map_readallmap(void) {
- int i,maps_removed=0;
- char fn[256];
-#ifdef USE_AFM
- FILE *afm_file;
-#endif
- int map_cache = 0;
-
- // ƒ}ƒbƒvƒLƒƒƒbƒVƒ…‚ðŠJ‚­
- if(map_read_flag >= READ_FROM_BITMAP) {
- map_cache_open(map_cache_file);
- }
-
- sprintf(tmp_output, "Loading Maps%s...\n",
- (map_read_flag == CREATE_BITMAP_COMPRESSED ? " (Generating Map Cache w/ Compression)" :
- map_read_flag == CREATE_BITMAP ? " (Generating Map Cache)" :
- map_read_flag >= READ_FROM_BITMAP ? " (w/ Map Cache)" :
- map_read_flag == READ_FROM_AFM ? " (w/ AFM)" : ""));
- ShowStatus(tmp_output);
-
- // æ‚É‘S•”‚̃ƒbƒv‚Ì‘¶Ý‚ðŠm”F
- for(i=0;i<map_num;i++){
-
-#ifdef USE_AFM
- char afm_name[256] = "";
- char *p;
- if(!strstr(map[i].name,".afm")) {
- // check if it's necessary to replace the extension - speeds up loading abit
- strncpy(afm_name, map[i].name, strlen(map[i].name) - 4);
- strcat(afm_name, ".afm");
- }
- map[i].alias = NULL;
- sprintf(fn,"%s\\%s",afm_dir,afm_name);
- for(p=&fn[0];*p!=0;p++) if (*p=='\\') *p = '/'; // * At the time of Unix
-
- afm_file = fopen(fn, "r");
- if (afm_file != NULL) {
- map_readafm(i,fn);
- fclose(afm_file);
- }
- else if(strstr(map[i].name,".gat")!=NULL) {
-#else
- if(strstr(map[i].name,".gat")!=NULL) {
-#endif
- char *p = strstr(map[i].name, "<"); // [MouseJstr]
- if (p != NULL) {
- char buf[64];
- *p++ = '\0';
- sprintf(buf,"data\\%s", p);
- map[i].alias = aStrdup(buf);
- } else
- map[i].alias = NULL;
-
- sprintf(fn,"data\\%s",map[i].name);
- if(map_readmap(i,fn, p, &map_cache, map_num) == -1) {
- map_delmap(map[i].name);
- maps_removed++;
- i--;
- }
- }
- }
-
- aFree(waterlist);
- printf("\r");
- snprintf(tmp_output,sizeof(tmp_output),"Successfully loaded '"CL_WHITE"%d"CL_RESET"' maps.%30s\n",map_num,"");
- ShowInfo(tmp_output);
-
- map_cache_close();
- if(map_read_flag == CREATE_BITMAP || map_read_flag == CREATE_BITMAP_COMPRESSED) {
- --map_read_flag;
- }
-
- if (maps_removed) {
- snprintf(tmp_output,sizeof(tmp_output),"Maps Removed: '"CL_WHITE"%d"CL_RESET"'\n",maps_removed);
- ShowNotice(tmp_output);
- }
- return 0;
-}
-
-/*==========================================
- * ?‚Ý?‚Þmap‚ð’ljÁ‚·‚é
- *------------------------------------------
- */
-int map_addmap(char *mapname) {
- if (strcmpi(mapname,"clear")==0) {
- map_num=0;
- return 0;
- }
-
- if (map_num >= MAX_MAP_PER_SERVER - 1) {
- snprintf(tmp_output,sizeof(tmp_output),"Could not add map '"
- CL_WHITE"%s"CL_RESET"', the limit of maps has been reached.\n",mapname);
- ShowError(tmp_output);
- return 1;
- }
- memcpy(map[map_num].name, mapname, 24);
- map_num++;
- return 0;
-}
-
-/*==========================================
- * ?‚Ý?‚Þmap‚ð휂·‚é
- *------------------------------------------
- */
-int map_delmap(char *mapname) {
-
- int i;
-
- if (strcmpi(mapname, "all") == 0) {
- map_num = 0;
- return 0;
- }
-
- for(i = 0; i < map_num; i++) {
- if (strcmp(map[i].name, mapname) == 0) {
- printf("Removing map [ %s ] from maplist\n",map[i].name);
- memmove(map+i, map+i+1, sizeof(map[0])*(map_num-i-1));
- map_num--;
- }
- }
- return 0;
-}
-
-static int map_ip_set_ = 0;
-static int char_ip_set_ = 0;
-//static int bind_ip_set_ = 0;
-
-/*==========================================
- * Console Command Parser [Wizputer]
- *------------------------------------------
- */
-int parse_console(char *buf) {
- char *type,*command,*map, *buf2;
- int x = 0, y = 0;
- int m, n;
- struct map_session_data *sd;
-
- sd = (struct map_session_data*)aCalloc(sizeof(*sd), 1);
-
- sd->fd = 0;
- strcpy( sd->status.name , "console");
-
- type = (char *)aMallocA(64);
- command = (char *)aMallocA(64);
- map = (char *)aMallocA(64);
- buf2 = (char *)aMallocA(72);
-
- memset(type,0,64);
- memset(command,0,64);
- memset(map,0,64);
- memset(buf2,0,72);
-
- if ( ( n = sscanf(buf, "%[^:]:%[^:]:%99s %d %d[^\n]", type , command , map , &x , &y )) < 5 )
- if ( ( n = sscanf(buf, "%[^:]:%[^\n]", type , command )) < 2 )
- n = sscanf(buf,"%[^\n]",type);
-
- if ( n == 5 ) {
- if (x <= 0) {
- x = rand() % 399 + 1;
- sd->bl.x = x;
- } else {
- sd->bl.x = x;
- }
-
- if (y <= 0) {
- y = rand() % 399 + 1;
- sd->bl.y = y;
- } else {
- sd->bl.y = y;
- }
-
- m = map_mapname2mapid(map);
- if ( m >= 0 )
- sd->bl.m = m;
- else {
- printf("Console: Unknown map\n");
- goto end;
- }
- }
-
- printf("Type of command: %s || Command: %s || Map: %s Coords: %d %d\n",type,command,map,x,y);
-
- if ( strcmpi("admin",type) == 0 && n == 5 ) {
- sprintf(buf2,"console: %s",command);
- if( is_atcommand(sd->fd,sd,buf2,99) == AtCommand_None )
- printf("Console: not atcommand\n");
- } else if ( strcmpi("server",type) == 0 && n == 2 ) {
- if ( strcmpi("shutdown", command) == 0 || strcmpi("exit",command) == 0 || strcmpi("quit",command) == 0 ) {
- exit(0);
- }
- } else if ( strcmpi("help",type) == 0 ) {
- printf("To use GM commands:\n");
- printf("admin:<gm command>:<map of \"gm\"> <x> <y>\n");
- printf("You can use any GM command that doesn't require the GM.\n");
- printf("No using @item or @warp however you can use @charwarp\n");
- printf("The <map of \"gm\"> <x> <y> is for commands that need coords of the GM\n");
- printf("IE: @spawn\n");
- printf("To shutdown the server:\n");
- printf("server:shutdown\n");
- }
-
- end:
- aFree(buf);
- aFree(type);
- aFree(command);
- aFree(map);
- aFree(buf2);
- aFree(sd);
-
- return 0;
-}
-
-/*==========================================
- * Ý’èƒtƒ@ƒCƒ‹‚ð?‚Ý?‚Þ
- *------------------------------------------
- */
-int map_config_read(char *cfgName) {
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
- struct hostent *h = NULL;
-
- fp = fopen(cfgName,"r");
- if (fp == NULL) {
- printf("Map configuration file not found at: %s\n", cfgName);
- exit(1);
- }
- while(fgets(line, sizeof(line) -1, fp)) {
- if (line[0] == '/' && line[1] == '/')
- continue;
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2) {
- if (strcmpi(w1, "userid")==0){
- chrif_setuserid(w2);
- } else if (strcmpi(w1, "passwd") == 0) {
- chrif_setpasswd(w2);
- } else if (strcmpi(w1, "char_ip") == 0) {
- char_ip_set_ = 1;
- h = gethostbyname (w2);
- if(h != NULL) {
- snprintf(tmp_output,sizeof(tmp_output),"Char Server IP Address : '"CL_WHITE"%s"CL_RESET"' -> '"CL_WHITE"%d.%d.%d.%d"CL_RESET"'.\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- ShowInfo(tmp_output);
- sprintf(w2,"%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- }
- chrif_setip(w2);
- } else if (strcmpi(w1, "char_port") == 0) {
- chrif_setport(atoi(w2));
- } else if (strcmpi(w1, "map_ip") == 0) {
- map_ip_set_ = 1;
- h = gethostbyname (w2);
- if (h != NULL) {
- snprintf(tmp_output,sizeof(tmp_output),"Map Server IP Address : '"CL_WHITE"%s"CL_RESET"' -> '"CL_WHITE"%d.%d.%d.%d"CL_RESET"'.\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- ShowInfo(tmp_output);
- sprintf(w2, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- }
- clif_setip(w2);
- } else if (strcmpi(w1, "bind_ip") == 0) {
- //bind_ip_set_ = 1;
- h = gethostbyname (w2);
- if (h != NULL) {
- snprintf(tmp_output,sizeof(tmp_output),"Map Server IP Address : '"CL_WHITE"%s"CL_RESET"' -> '"CL_WHITE"%d.%d.%d.%d"CL_RESET"'.\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- ShowInfo(tmp_output);
- sprintf(w2, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
- }
- clif_setbindip(w2);
- } else if (strcmpi(w1, "map_port") == 0) {
- clif_setport(atoi(w2));
- map_port = (atoi(w2));
- } else if (strcmpi(w1, "water_height") == 0) {
- map_readwater(w2);
- } else if (strcmpi(w1, "map") == 0) {
- map_addmap(w2);
- } else if (strcmpi(w1, "delmap") == 0) {
- map_delmap(w2);
- } else if (strcmpi(w1, "npc") == 0) {
- npc_addsrcfile(w2);
- } else if (strcmpi(w1, "delnpc") == 0) {
- npc_delsrcfile(w2);
- } else if (strcmpi(w1, "data_grf") == 0) {
- grfio_setdatafile(w2);
- } else if (strcmpi(w1, "sdata_grf") == 0) {
- grfio_setsdatafile(w2);
- } else if (strcmpi(w1, "adata_grf") == 0) {
- grfio_setadatafile(w2);
- } else if (strcmpi(w1, "autosave_time") == 0) {
- autosave_interval = atoi(w2) * 1000;
- if (autosave_interval <= 0)
- autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
- } else if (strcmpi(w1, "motd_txt") == 0) {
- strcpy(motd_txt, w2);
- } else if (strcmpi(w1, "help_txt") == 0) {
- strcpy(help_txt, w2);
- } else if (strcmpi(w1, "mapreg_txt") == 0) {
- strcpy(mapreg_txt, w2);
- }else if(strcmpi(w1,"read_map_from_cache")==0){
- if (atoi(w2) == 2)
- map_read_flag = READ_FROM_BITMAP_COMPRESSED;
- else if (atoi(w2) == 1)
- map_read_flag = READ_FROM_BITMAP;
- else
- map_read_flag = READ_FROM_GAT;
- }else if(strcmpi(w1,"map_cache_file")==0){
- strncpy(map_cache_file,w2,255);
- } else if (strcmpi(w1, "import") == 0) {
- map_config_read(w2);
- } else if (strcmpi(w1, "console") == 0) {
- if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 ) {
- console = 1;
- ShowNotice("Console Commands is enabled.\n");
- }
- } else if(strcmpi(w1,"imalive_on")==0){ //Added by Mugendai for I'm Alive mod
- imalive_on = atoi(w2); //Added by Mugendai for I'm Alive mod
- } else if(strcmpi(w1,"imalive_time")==0){ //Added by Mugendai for I'm Alive mod
- imalive_time = atoi(w2); //Added by Mugendai for I'm Alive mod
- } else if(strcmpi(w1,"flush_on")==0){ //Added by Mugendai for GUI
- flush_on = atoi(w2); //Added by Mugendai for GUI
- } else if(strcmpi(w1,"flush_time")==0){ //Added by Mugendai for GUI
- flush_time = atoi(w2); //Added by Mugendai for GUI
- }
-
- }
- }
- fclose(fp);
-
- return 0;
-}
-
-int inter_config_read(char *cfgName)
-{
- int i;
- char line[1024],w1[1024],w2[1024];
- FILE *fp;
-
- fp=fopen(cfgName,"r");
- if(fp==NULL){
- snprintf(tmp_output,sizeof(tmp_output),"File not found: '%s'.\n",cfgName);
- ShowError(tmp_output);
- return 1;
- }
- while(fgets(line,1020,fp)){
- if(line[0] == '/' && line[1] == '/')
- continue;
- i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
- if(i!=2)
- continue;
- //support the import command, just like any other config
- if(strcmpi(w1,"import")==0){
- inter_config_read(w2);
- #ifndef TXT_ONLY
- } else if(strcmpi(w1,"item_db_db")==0){
- strcpy(item_db_db,w2);
- } else if(strcmpi(w1,"mob_db_db")==0){
- strcpy(mob_db_db,w2);
- } else if(strcmpi(w1,"login_db_level")==0){
- strcpy(login_db_level,w2);
- } else if(strcmpi(w1,"login_db_account_id")==0){
- strcpy(login_db_account_id,w2);
- } else if(strcmpi(w1,"login_db")==0){
- strcpy(login_db,w2);
- } else if (strcmpi(w1, "char_db") == 0) {
- strcpy(char_db, w2);
- } else if(strcmpi(w1,"gm_db_level")==0){
- strcpy(gm_db_level,w2);
- } else if(strcmpi(w1,"gm_db_account_id")==0){
- strcpy(gm_db_account_id,w2);
- } else if(strcmpi(w1,"gm_db")==0){
- strcpy(gm_db,w2);
- //Map Server SQL DB
- } else if(strcmpi(w1,"map_server_ip")==0){
- strcpy(map_server_ip, w2);
- } else if(strcmpi(w1,"map_server_port")==0){
- map_server_port=atoi(w2);
- } else if(strcmpi(w1,"map_server_id")==0){
- strcpy(map_server_id, w2);
- } else if(strcmpi(w1,"map_server_pw")==0){
- strcpy(map_server_pw, w2);
- } else if(strcmpi(w1,"map_server_db")==0){
- strcpy(map_server_db, w2);
- } else if(strcmpi(w1,"use_sql_db")==0){
- db_use_sqldbs = battle_config_switch(w2);
- printf ("Using SQL dbs: %s\n",w2);
- //Login Server SQL DB
- } else if(strcmpi(w1,"login_server_ip")==0){
- strcpy(login_server_ip, w2);
- } else if(strcmpi(w1,"login_server_port")==0){
- login_server_port = atoi(w2);
- } else if(strcmpi(w1,"login_server_id")==0){
- strcpy(login_server_id, w2);
- } else if(strcmpi(w1,"login_server_pw")==0){
- strcpy(login_server_pw, w2);
- } else if(strcmpi(w1,"login_server_db")==0){
- strcpy(login_server_db, w2);
- } else if(strcmpi(w1,"lowest_gm_level")==0){
- lowest_gm_level = atoi(w2);
- } else if(strcmpi(w1,"read_gm_interval")==0){
- read_gm_interval = ( atoi(w2) * 60 * 1000 ); // Minutes multiplied by 60 secs per min by 1000 milliseconds per second
- } else if(strcmpi(w1,"log_db")==0) {
- strcpy(log_db, w2);
- } else if(strcmpi(w1,"log_db_ip")==0) {
- strcpy(log_db_ip, w2);
- } else if(strcmpi(w1,"log_db")==0) {
- strcpy(log_db, w2);
- } else if(strcmpi(w1,"log_db_id")==0) {
- strcpy(log_db_id, w2);
- } else if(strcmpi(w1,"log_db_pw")==0) {
- strcpy(log_db_pw, w2);
- } else if(strcmpi(w1,"log_db_port")==0) {
- log_db_port = atoi(w2);
- #endif
- }
- }
- fclose(fp);
-
- return 0;
-}
-
-#ifndef TXT_ONLY
-/*=======================================
- * MySQL Init
- *---------------------------------------
- */
-
-int map_sql_init(void){
-
- mysql_init(&mmysql_handle);
-
- //DB connection start
- printf("Connect Map DB Server....\n");
- if(!mysql_real_connect(&mmysql_handle, map_server_ip, map_server_id, map_server_pw,
- map_server_db ,map_server_port, (char *)NULL, 0)) {
- //pointer check
- printf("%s\n",mysql_error(&mmysql_handle));
- exit(1);
- }
- else {
- printf ("connect success! (Map Server Connection)\n");
- }
-
- mysql_init(&lmysql_handle);
-
- //DB connection start
- printf("Connect Login DB Server....\n");
- if(!mysql_real_connect(&lmysql_handle, login_server_ip, login_server_id, login_server_pw,
- login_server_db ,login_server_port, (char *)NULL, 0)) {
- //pointer check
- printf("%s\n",mysql_error(&lmysql_handle));
- exit(1);
- }
- else {
- printf ("connect success! (Login Server Connection)\n");
- }
-
- if(battle_config.mail_system) { // mail system [Valaris]
- mysql_init(&mail_handle);
- if(!mysql_real_connect(&mail_handle, map_server_ip, map_server_id, map_server_pw,
- map_server_db ,map_server_port, (char *)NULL, 0)) {
- printf("%s\n",mysql_error(&mail_handle));
- exit(1);
- }
- }
-
- return 0;
-}
-
-int map_sql_close(void){
- mysql_close(&mmysql_handle);
- printf("Close Map DB Connection....\n");
-
- mysql_close(&lmysql_handle);
- printf("Close Login DB Connection....\n");
- return 0;
-}
-
-int log_sql_init(void){
-
- mysql_init(&mmysql_handle);
-
- //DB connection start
- printf(""CL_WHITE"[SQL]"CL_RESET": Connecting to Log Database "CL_WHITE"%s"CL_RESET" At "CL_WHITE"%s"CL_RESET"...\n",log_db,log_db_ip);
- if(!mysql_real_connect(&mmysql_handle, log_db_ip, log_db_id, log_db_pw,
- log_db ,log_db_port, (char *)NULL, 0)) {
- //pointer check
- printf(""CL_WHITE"[SQL Error]"CL_RESET": %s\n",mysql_error(&mmysql_handle));
- exit(1);
- } else {
- printf(""CL_WHITE"[SQL]"CL_RESET": Successfully '"CL_GREEN"connected"CL_RESET"' to Database '"CL_WHITE"%s"CL_RESET"'.\n", log_db);
- }
-
- return 0;
-}
-
-int online_timer (int tid,unsigned int tick,int id,int data)
-{
- char_online_check();
- return 0;
-}
-void char_online_check(void)
-{
- int i;
- struct map_session_data *sd;
-
- chrif_char_reset_offline();
-
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (sd = (struct map_session_data*)session[i]->session_data) && sd->state.auth &&
- !(battle_config.hide_GM_session && pc_isGM(sd)))
- if(sd->status.char_id)
- chrif_char_online(sd);
- }
-}
-#endif /* not TXT_ONLY */
-
-//-----------------------------------------------------
-//I'm Alive Alert
-//Used to output 'I'm Alive' every few seconds
-//Intended to let frontends know if the app froze
-//-----------------------------------------------------
-int imalive_timer(int tid, unsigned int tick, int id, int data){
- printf("I'm Alive\n");
- return 0;
-}
-
-//-----------------------------------------------------
-//Flush stdout
-//stdout buffer needs flushed to be seen in GUI
-//-----------------------------------------------------
-int flush_timer(int tid, unsigned int tick, int id, int data){
- fflush(stdout);
- return 0;
-}
-
-int id_db_final(void *k,void *d,va_list ap) { return 0; }
-int map_db_final(void *k,void *d,va_list ap) { return 0; }
-int nick_db_final(void *k,void *d,va_list ap)
-{
- char *p = (char *) d;
- if (p) aFree(p);
- return 0;
-}
-int charid_db_final(void *k,void *d,va_list ap)
-{
- struct charid2nick *p = (struct charid2nick *) d;
- if (p) aFree(p);
- return 0;
-}
-int cleanup_sub(struct block_list *bl, va_list ap) {
- nullpo_retr(0, bl);
-
- switch(bl->type) {
- case BL_PC:
- map_quit((struct map_session_data *) bl);
- break;
- case BL_NPC:
- npc_unload((struct npc_data *)bl);
- break;
- case BL_MOB:
- mob_unload((struct mob_data *)bl);
- break;
- case BL_PET:
- pet_remove_map((struct map_session_data *)bl);
- break;
- case BL_ITEM:
- map_clearflooritem(bl->id);
- break;
- case BL_SKILL:
- skill_delunit((struct skill_unit *) bl);
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- * mapŽII—¹Žž?—
- *------------------------------------------
- */
-void do_final(void) {
- int i;
- ShowStatus("Terminating...\n");
-
- for (i = 0; i < map_num; i++)
- if(map[i].m)
- map_foreachinarea(cleanup_sub, i, 0, 0, map[i].xs, map[i].ys, 0, 0);
-
-#ifndef TXT_ONLY
- chrif_char_reset_offline();
-#endif
-
- chrif_flush_fifo();
-
-//#if 0 // why is this here? >_>
- do_final_chrif(); // ‚±‚Ì“à•”‚ŃLƒƒƒ‰‚ð‘S‚ÄØ’f‚·‚é
- do_final_npc();
-// map_removenpc();
- do_final_script();
- do_final_itemdb();
- do_final_storage();
- do_final_guild();
- do_final_party();
- do_final_pc();
- do_final_pet();
- do_final_msg();
-
- for (i=0; i<map_num; i++) {
- if(map[i].gat) aFree(map[i].gat);
- if(map[i].block) aFree(map[i].block);
- if(map[i].block_mob) aFree(map[i].block_mob);
- if(map[i].block_count) aFree(map[i].block_count);
- if(map[i].block_mob_count) aFree(map[i].block_mob_count);
- }
-
-// do_final_timer(); (we used timer_final() instead)
- timer_final();
- numdb_final(id_db, id_db_final);
- strdb_final(map_db, map_db_final);
- strdb_final(nick_db, nick_db_final);
- numdb_final(charid_db, charid_db_final);
- exit_dbn();
-
-//#endif
-
-#ifndef TXT_ONLY
- map_sql_close();
-#endif /* not TXT_ONLY */
- ShowStatus("Successfully terminated.\n");
-}
-
-/*======================================================
- * Map-Server Version Screen [MC Cameri]
- *------------------------------------------------------
- */
-void map_helpscreen(int flag) { // by MC Cameri
- puts("Usage: map-server [options]");
- puts("Options:");
- puts(CL_WHITE" Commands\t\t\tDescription"CL_RESET);
- puts("-----------------------------------------------------------------------------");
- puts(" --help, --h, --?, /? Displays this help screen");
- puts(" --map-config <file> Load map-server configuration from <file>");
- puts(" --battle-config <file> Load battle configuration from <file>");
- puts(" --atcommand-config <file> Load atcommand configuration from <file>");
- puts(" --charcommand-config <file> Load charcommand configuration from <file>");
- puts(" --script-config <file> Load script configuration from <file>");
- puts(" --msg-config <file> Load message configuration from <file>");
- puts(" --grf-path-file <file> Load grf path file configuration from <file>");
- puts(" --sql-config <file> Load inter-server configuration from <file>");
- puts(" (SQL Only)");
- puts(" --log-config <file> Load logging configuration from <file>");
- puts(" (SQL Only)");
- puts(" --version, --v, -v, /v Displays the server's version");
- puts("\n");
- if (flag) exit(1);
-}
-
-/*======================================================
- * Map-Server Version Screen [MC Cameri]
- *------------------------------------------------------
- */
-void map_versionscreen(int flag) {
- printf("CL_WHITE" "eAthena version %d.%02d.%02d, Athena Mod version %d" CL_RESET"\n",
- ATHENA_MAJOR_VERSION, ATHENA_MINOR_VERSION, ATHENA_REVISION,
- ATHENA_MOD_VERSION);
- puts(CL_GREEN "Website/Forum:" CL_RESET "\thttp://eathena.deltaanime.net/");
- puts(CL_GREEN "Download URL:" CL_RESET "\thttp://eathena.systeminplace.net/");
- puts(CL_GREEN "IRC Channel:" CL_RESET "\tirc://irc.deltaanime.net/#athena");
- puts("\nOpen " CL_WHITE "readme.html" CL_RESET " for more information.");
- if (ATHENA_RELEASE_FLAG) ShowNotice("This version is not for release.\n");
- if (flag) exit(1);
-}
-
-/*======================================================
- * Map-Server Init and Command-line Arguments [Valaris]
- *------------------------------------------------------
- */
-int do_init(int argc, char *argv[]) {
- int i;
- FILE *data_conf;
- char line[1024], w1[1024], w2[1024];
-
- SERVER_TYPE = SERVER_MAP;
-#ifdef GCOLLECT
- GC_enable_incremental();
-#endif
-
- INTER_CONF_NAME="conf/inter_athena.conf";
- LOG_CONF_NAME="conf/log_athena.conf";
- MAP_CONF_NAME = "conf/map_athena.conf";
- BATTLE_CONF_FILENAME = "conf/battle_athena.conf";
- ATCOMMAND_CONF_FILENAME = "conf/atcommand_athena.conf";
- CHARCOMMAND_CONF_FILENAME = "conf/charcommand_athena.conf";
- SCRIPT_CONF_NAME = "conf/script_athena.conf";
- MSG_CONF_NAME = "conf/msg_athena.conf";
- GRF_PATH_FILENAME = "conf/grf-files.txt";
-
- chrif_connected = 0;
-
- srand(gettick());
-
- for (i = 1; i < argc ; i++) {
- if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "--h") == 0 || strcmp(argv[i], "--?") == 0 || strcmp(argv[i], "/?") == 0)
- map_helpscreen(1);
- if (strcmp(argv[i], "--version") == 0 || strcmp(argv[i], "--v") == 0 || strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "/v") == 0)
- map_versionscreen(1);
- else if (strcmp(argv[i], "--map_config") == 0 || strcmp(argv[i], "--map-config") == 0)
- MAP_CONF_NAME=argv[i+1];
- else if (strcmp(argv[i],"--battle_config") == 0 || strcmp(argv[i],"--battle-config") == 0)
- BATTLE_CONF_FILENAME = argv[i+1];
- else if (strcmp(argv[i],"--atcommand_config") == 0 || strcmp(argv[i],"--atcommand-config") == 0)
- ATCOMMAND_CONF_FILENAME = argv[i+1];
- else if (strcmp(argv[i],"--charcommand_config") == 0 || strcmp(argv[i],"--charcommand-config") == 0)
- CHARCOMMAND_CONF_FILENAME = argv[i+1];
- else if (strcmp(argv[i],"--script_config") == 0 || strcmp(argv[i],"--script-config") == 0)
- SCRIPT_CONF_NAME = argv[i+1];
- else if (strcmp(argv[i],"--msg_config") == 0 || strcmp(argv[i],"--msg-config") == 0)
- MSG_CONF_NAME = argv[i+1];
- else if (strcmp(argv[i],"--grf_path_file") == 0 || strcmp(argv[i],"--grf-path-file") == 0)
- GRF_PATH_FILENAME = argv[i+1];
-#ifndef TXT_ONLY
- else if (strcmp(argv[i],"--inter_config") == 0 || strcmp(argv[i],"--inter-config") == 0)
- INTER_CONF_NAME = argv[i+1];
-#endif /* not TXT_ONLY */
- else if (strcmp(argv[i],"--log_config") == 0 || strcmp(argv[i],"--log-config") == 0)
- LOG_CONF_NAME = argv[i+1];
- else if (strcmp(argv[i],"--run_once") == 0) // close the map-server as soon as its done.. for testing [Celest]
- runflag = 0;
- }
-
- map_config_read(MAP_CONF_NAME);
-
- if ((naddr_ == 0) && (map_ip_set_ == 0 || char_ip_set_ == 0)) {
- printf("\nUnable to determine your IP address... please edit\n");
- printf("the map_athena.conf file and set it.\n");
- printf("(127.0.0.1 is valid if you have no network interface)\n");
- }
-
- if (map_ip_set_ == 0 || char_ip_set_ == 0) {
- // The map server should know what IP address it is running on
- // - MouseJstr
- int localaddr = ntohl(addr_[0]);
- unsigned char *ptr = (unsigned char *) &localaddr;
- char buf[16];
- sprintf(buf, "%d.%d.%d.%d", ptr[0], ptr[1], ptr[2], ptr[3]);;
- if (naddr_ != 1)
- printf("Multiple interfaces detected.. using %s as our IP address\n", buf);
- else
- printf("Defaulting to %s as our IP address\n", buf);
- if (map_ip_set_ == 0)
- clif_setip(buf);
- if (char_ip_set_ == 0)
- chrif_setip(buf);
-
- if (ptr[0] == 192 && ptr[1] == 168)
- printf("\nFirewall detected.. \n edit lan_support.conf and map_athena.conf\n\n");
- }
- if (SHOW_DEBUG_MSG) ShowNotice("Server running in '"CL_WHITE"Debug Mode"CL_RESET"'.\n");
- battle_config_read(BATTLE_CONF_FILENAME);
- msg_config_read(MSG_CONF_NAME);
- atcommand_config_read(ATCOMMAND_CONF_FILENAME);
- charcommand_config_read(CHARCOMMAND_CONF_FILENAME);
- script_config_read(SCRIPT_CONF_NAME);
- inter_config_read(INTER_CONF_NAME);
- log_config_read(LOG_CONF_NAME);
-
- atexit(do_final);
-
- id_db = numdb_init();
- map_db = strdb_init(16);
- nick_db = strdb_init(24);
- charid_db = numdb_init();
-#ifndef TXT_ONLY
- map_sql_init();
-#endif /* not TXT_ONLY */
-
- grfio_init(GRF_PATH_FILENAME);
-
- data_conf = fopen(GRF_PATH_FILENAME, "r");
- // It will read, if there is grf-files.txt.
- if (data_conf) {
- while(fgets(line, 1020, data_conf)) {
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2) {
- if(strcmp(w1,"afm_dir") == 0)
- strcpy(afm_dir, w2);
- }
- }
- fclose(data_conf);
- } // end of reading grf-files.txt for AFMs
-
-
- map_readallmap();
-
- add_timer_func_list(map_freeblock_timer,"map_freeblock_timer");
- add_timer_func_list(map_clearflooritem_timer, "map_clearflooritem_timer");
- add_timer_interval(gettick()+1000,map_freeblock_timer,0,0,60*1000);
-
- //Added by Mugendai for GUI support
- if (flush_on)
- add_timer_interval(gettick()+10, flush_timer,0,0,flush_time);
- //Added for Mugendais I'm Alive mod
- if (imalive_on)
- add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000);
-
-#ifndef TXT_ONLY // online status timer, checks every hour [Valaris]
- add_timer_func_list(online_timer, "online_timer");
- add_timer_interval(gettick()+10, online_timer, 0, 0, CHECK_INTERVAL);
-#endif /* not TXT_ONLY */
-
- do_init_chrif();
- do_init_clif();
- do_init_itemdb();
- do_init_mob(); // npc‚̉Šú‰»Žž?‚Åmob_spawn‚µ‚ÄAmob_db‚ð?Æ‚·‚é‚Ì‚Åinit_npc‚æ‚èæ
- do_init_script();
- do_init_pc();
- do_init_status();
- do_init_party();
- do_init_guild();
- do_init_storage();
- do_init_skill();
- do_init_pet();
- do_init_npc();
-
-#ifndef TXT_ONLY /* mail system [Valaris] */
- if(battle_config.mail_system)
- do_init_mail();
-
- if (log_config.sql_logs && (log_config.branch || log_config.drop || log_config.mvpdrop ||
- log_config.present || log_config.produce || log_config.refine || log_config.trade))
- {
- log_sql_init();
- }
-#endif /* not TXT_ONLY */
-
- npc_event_do_oninit(); // npc‚ÌOnInitƒCƒxƒ“ƒg?s
-
- if ( console ) {
- set_defaultconsoleparse(parse_console);
- start_console();
- }
-
- if (battle_config.pk_mode == 1)
- ShowNotice("Server is running on '"CL_WHITE"PK Mode"CL_RESET"'.\n");
-
- sprintf(tmp_output,"Server is '"CL_GREEN"ready"CL_RESET"' and listening on port '"CL_WHITE"%d"CL_RESET"'.\n\n", map_port);
- ShowStatus(tmp_output);
-
- return 0;
-}
-
-int compare_item(struct item *a, struct item *b) {
- return (
- (a->nameid == b->nameid) &&
- (a->identify == b->identify) &&
- (a->refine == b->refine) &&
- (a->attribute == b->attribute) &&
- (a->card[0] == b->card[0]) &&
- (a->card[1] == b->card[1]) &&
- (a->card[2] == b->card[2]) &&
- (a->card[3] == b->card[3]));
-}
diff --git a/src/map/map.h b/src/map/map.h
deleted file mode 100644
index 01d9fef0e..000000000
--- a/src/map/map.h
+++ /dev/null
@@ -1,864 +0,0 @@
-// $Id: map.h,v 1.8 2004/09/25 11:39:17 MouseJstr Exp $
-#ifndef _MAP_H_
-#define _MAP_H_
-
-#include <stdarg.h>
-#include "mmo.h"
-
-#define MAX_PC_CLASS (1+6+6+1+6+1+1+1+1+4023)
-#define PC_CLASS_BASE 0
-#define PC_CLASS_BASE2 (PC_CLASS_BASE + 4001)
-#define PC_CLASS_BASE3 (PC_CLASS_BASE2 + 22)
-#define MAX_NPC_PER_MAP 512
-#define BLOCK_SIZE 8 // Never zero
-#define AREA_SIZE battle_config.area_size
-#define LOCAL_REG_NUM 16
-#define LIFETIME_FLOORITEM 60
-#define DAMAGELOG_SIZE 30
-#define LOOTITEM_SIZE 10
-#define MAX_SKILL_LEVEL 100
-#define MAX_STATUSCHANGE 210
-#define MAX_SKILLUNITGROUP 32
-#define MAX_MOBSKILLUNITGROUP 8
-#define MAX_SKILLUNITGROUPTICKSET 32
-#define MAX_SKILLTIMERSKILL 32
-#define MAX_MOBSKILLTIMERSKILL 10
-#define MAX_MOBSKILL 32
-#define MAX_EVENTQUEUE 2
-#define MAX_EVENTTIMER 32
-#define NATURAL_HEAL_INTERVAL 500
-#define MAX_FLOORITEM 500000
-#define MAX_LEVEL 255
-#define MAX_WALKPATH 32
-#define MAX_DROP_PER_MAP 48
-#define MAX_IGNORE_LIST 80
-#define MAX_VENDING 12
-
-#define DEFAULT_AUTOSAVE_INTERVAL 60*1000
-
-#define OPTION_HIDE 0x40
-
-enum { BL_NUL, BL_PC, BL_NPC, BL_MOB, BL_ITEM, BL_CHAT, BL_SKILL , BL_PET };
-enum { WARP, SHOP, SCRIPT, MONS };
-
-struct block_list {
- struct block_list *next,*prev;
- int id;
- short m,x,y;
- unsigned char type;
- unsigned char subtype;
-};
-
-struct walkpath_data {
- unsigned char path_len,path_pos,path_half;
- unsigned char path[MAX_WALKPATH];
-};
-struct shootpath_data {
- int rx,ry,len;
- int x[MAX_WALKPATH];
- int y[MAX_WALKPATH];
-};
-
-struct script_reg {
- int index;
- int data;
-};
-struct script_regstr {
- int index;
- char data[256];
-};
-struct status_change {
- int timer;
- int val1,val2,val3,val4;
-};
-struct vending {
- short index;
- unsigned short amount;
- unsigned int value;
-};
-
-struct skill_unit_group;
-struct skill_unit {
- struct block_list bl;
-
- struct skill_unit_group *group;
-
- int limit;
- int val1,val2;
- short alive,range;
-};
-struct skill_unit_group {
- int src_id;
- int party_id;
- int guild_id;
- int map;
- int target_flag;
- unsigned int tick;
- int limit,interval;
-
- int skill_id,skill_lv;
- int val1,val2,val3;
- char *valstr;
- int unit_id;
- int group_id;
- int unit_count,alive_count;
- struct skill_unit *unit;
-};
-struct skill_unit_group_tickset {
- unsigned int tick;
- int id;
-};
-struct skill_timerskill {
- int timer;
- int src_id;
- int target_id;
- int map;
- short x,y;
- short skill_id,skill_lv;
- int type;
- int flag;
-};
-
-struct npc_data;
-struct pet_db;
-struct item_data;
-struct square;
-
-struct map_session_data {
- struct block_list bl;
- struct {
- unsigned auth : 1;
- unsigned change_walk_target : 1;
- unsigned attack_continue : 1;
- unsigned menu_or_input : 1;
- unsigned dead_sit : 2;
- unsigned skillcastcancel : 1;
- unsigned waitingdisconnect : 1;
- unsigned lr_flag : 2;
- unsigned connect_new : 1;
- unsigned arrow_atk : 1;
- unsigned attack_type : 3;
- unsigned skill_flag : 1;
- unsigned gangsterparadise : 1;
- unsigned produce_flag : 1;
- unsigned make_arrow_flag : 1;
- unsigned potionpitcher_flag : 1;
- unsigned storage_flag : 1;
- unsigned snovice_flag : 4;
- int gmaster_flag;
- // originally by Qamera, adapted by celest
- unsigned event_death : 1;
- unsigned event_kill : 1;
- unsigned event_disconnect : 1;
- } state;
- struct {
- unsigned killer : 1;
- unsigned killable : 1;
- unsigned restart_full_recover : 1;
- unsigned no_castcancel : 1;
- unsigned no_castcancel2 : 1;
- unsigned no_sizefix : 1;
- unsigned no_magic_damage : 1;
- unsigned no_weapon_damage : 1;
- unsigned no_gemstone : 1;
- unsigned infinite_endure : 1;
- } special_state;
- int char_id, login_id1, login_id2, sex;
- int packet_ver; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- struct mmo_charstatus status;
- struct item_data *inventory_data[MAX_INVENTORY];
- short equip_index[11];
- unsigned short unbreakable_equip;
- unsigned short unbreakable; // chance to prevent equipment breaking [celest]
- int weight,max_weight;
- int cart_weight,cart_max_weight,cart_num,cart_max_num;
- char mapname[24];
- int fd,new_fd;
- short to_x,to_y;
- short speed,prev_speed;
- short opt1,opt2,opt3;
- char dir,head_dir;
- unsigned int client_tick,server_tick;
- struct walkpath_data walkpath;
- int walktimer;
- int next_walktime;
- int npc_id,areanpc_id,npc_shopid;
- int npc_pos;
- int npc_menu;
- int npc_amount;
- int npc_stack,npc_stackmax;
- char *npc_script,*npc_scriptroot;
- char *npc_stackbuf;
- char npc_str[256];
- unsigned int chatID;
- unsigned long idletime;
-
- struct{
- char name[24];
- } ignore[MAX_IGNORE_LIST];
- int ignoreAll;
-
- int attacktimer;
- int attacktarget;
- short attacktarget_lv;
- unsigned int attackabletime;
-
- int followtimer; // [MouseJstr]
- int followtarget;
-
- time_t emotionlasttime; // to limit flood with emotion packets
-
- short attackrange,attackrange_;
- int skilltimer;
- int skilltarget;
- short skillx,skilly;
- short skillid,skilllv;
- short skillitem,skillitemlv;
- short skillid_old,skilllv_old;
- short skillid_dance,skilllv_dance;
- struct skill_unit_group skillunit[MAX_SKILLUNITGROUP];
- struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET];
- struct skill_timerskill skilltimerskill[MAX_SKILLTIMERSKILL];
- char blockskill[MAX_SKILL]; // [celest]
- //unsigned int skillstatictimer[MAX_SKILL];
- unsigned short timerskill_count; // [celest]
- int cloneskill_id;
- int potion_hp,potion_sp,potion_per_hp,potion_per_sp;
-
- int invincible_timer;
- unsigned int canact_tick;
- unsigned int canmove_tick;
- unsigned int canlog_tick;
- unsigned int canregen_tick;
- int hp_sub,sp_sub;
- int inchealhptick,inchealsptick,inchealspirithptick,inchealspiritsptick;
-// -- moonsoul (new tick for berserk self-damage)
-// int berserkdamagetick;
- int fame;
-
- short view_class;
- short weapontype1,weapontype2;
- short disguiseflag,disguise; // [Valaris]
- int paramb[6],paramc[6],parame[6],paramcard[6];
- int hit,flee,flee2,aspd,amotion,dmotion;
- int watk,watk2,atkmods[3];
- int def,def2,mdef,mdef2,critical,matk1,matk2;
- int atk_ele,def_ele,star,overrefine;
- int castrate,delayrate,hprate,sprate,dsprate;
- int addele[10],addrace[12],addsize[3],subele[10],subrace[12];
- int addeff[10],addeff2[10],reseff[10];
- int watk_,watk_2,atkmods_[3],addele_[10],addrace_[12],addsize_[3]; //“ñ“—¬‚Ì‚½‚߂ɒljÁ
- int atk_ele_,star_,overrefine_; //“ñ“—¬‚Ì‚½‚߂ɒljÁ
- int base_atk,atk_rate;
- int weapon_atk[16],weapon_atk_rate[16];
- int arrow_atk,arrow_ele,arrow_cri,arrow_hit,arrow_range;
- int arrow_addele[10],arrow_addrace[12],arrow_addsize[3],arrow_addeff[10],arrow_addeff2[10];
- int nhealhp,nhealsp,nshealhp,nshealsp,nsshealhp,nsshealsp;
- int aspd_rate,speed_rate,hprecov_rate,sprecov_rate,critical_def,double_rate;
- int near_attack_def_rate,long_attack_def_rate,magic_def_rate,misc_def_rate;
- int matk_rate,ignore_def_ele,ignore_def_race,ignore_def_ele_,ignore_def_race_;
- int ignore_mdef_ele,ignore_mdef_race;
- int magic_addele[10],magic_addrace[12],magic_subrace[12];
- int perfect_hit,get_zeny_num;
- int critical_rate,hit_rate,flee_rate,flee2_rate,def_rate,def2_rate,mdef_rate,mdef2_rate;
- int def_ratio_atk_ele,def_ratio_atk_ele_,def_ratio_atk_race,def_ratio_atk_race_;
- int add_damage_class_count,add_damage_class_count_,add_magic_damage_class_count;
- short add_damage_classid[10],add_damage_classid_[10],add_magic_damage_classid[10];
- int add_damage_classrate[10],add_damage_classrate_[10],add_magic_damage_classrate[10];
- short add_def_class_count,add_mdef_class_count;
- short add_def_classid[10],add_mdef_classid[10];
- int add_def_classrate[10],add_mdef_classrate[10];
- short monster_drop_item_count;
- short monster_drop_itemid[10];
- int monster_drop_race[10],monster_drop_itemrate[10];
- int double_add_rate,speed_add_rate,aspd_add_rate,perfect_hit_add, get_zeny_add_num;
- short splash_range,splash_add_range;
- short autospell_id,autospell_lv,autospell_rate;
- short hp_drain_rate,hp_drain_per,sp_drain_rate,sp_drain_per;
- short hp_drain_rate_,hp_drain_per_,sp_drain_rate_,sp_drain_per_;
- short hp_drain_value,sp_drain_value,hp_drain_value_,sp_drain_value_;
- int short_weapon_damage_return,long_weapon_damage_return;
- int weapon_coma_ele[10],weapon_coma_race[12];
- int break_weapon_rate,break_armor_rate;
- short add_steal_rate;
- //--- 02/15's new card effects [celest]
- int crit_atk_rate;
- int critaddrace[12];
- short no_regen;
- int addeff3[10];
- short addeff3_type[10];
- short autospell2_id,autospell2_lv,autospell2_rate,autospell2_type;
- int skillatk[2];
- unsigned short unstripable_equip;
- short add_damage_classid2[10],add_damage_class_count2;
- int add_damage_classrate2[10];
- short sp_gain_value, hp_gain_value;
- short sp_drain_type;
- short ignore_def_mob, ignore_def_mob_;
- int hp_loss_tick, hp_loss_rate;
- short hp_loss_value, hp_loss_type;
- int addrace2[12],addrace2_[12];
- int subsize[3];
- short unequip_losehp[11];
- short unequip_losesp[11];
- int itemid;
- int itemhealrate[7];
- //--- 03/15's new card effects
- int expaddrace[12];
- int subrace2[12];
- short sp_gain_race[12];
-
- short spiritball, spiritball_old;
- int spirit_timer[MAX_SKILL_LEVEL];
- int magic_damage_return; // AppleGirl Was Here
- int random_attack_increase_add,random_attack_increase_per; // [Valaris]
- int perfect_hiding; // [Valaris]
- int classchange; // [Valaris]
-
- int die_counter;
- short doridori_counter;
-
- int reg_num;
- struct script_reg *reg;
- int regstr_num;
- struct script_regstr *regstr;
-
- struct status_change sc_data[MAX_STATUSCHANGE];
- short sc_count;
- struct square dev;
-
- int trade_partner;
- int deal_item_index[10];
- int deal_item_amount[10];
- int deal_zeny;
- short deal_locked;
-
- int party_sended,party_invite,party_invite_account;
- int party_hp,party_x,party_y;
-
- int guild_sended,guild_invite,guild_invite_account;
- int guild_emblem_id,guild_alliance,guild_alliance_account;
- int guildspy; // [Syrus22]
- int partyspy; // [Syrus22]
-
- int vender_id;
- int vend_num;
- char message[80];
- struct vending vending[MAX_VENDING];
-
- int catch_target_class;
- struct s_pet pet;
- struct pet_db *petDB;
- struct pet_data *pd;
- int pet_hungry_timer;
-
- int pvp_point,pvp_rank,pvp_timer,pvp_lastusers;
-
- char eventqueue[MAX_EVENTQUEUE][50];
- int eventtimer[MAX_EVENTTIMER];
- unsigned short eventcount; // [celest]
-
- int last_skillid,last_skilllv; // Added by RoVeRT
-
- unsigned char change_level; // [celest]
- int autoloot; //by Upa-Kun
- unsigned nodelay :1;
- unsigned noexp :1;
- unsigned detach :1;
-
-#ifndef TXT_ONLY
- int mail_counter; // mail counter for mail system [Valaris]
-#endif
-
-};
-
-struct npc_timerevent_list {
- int timer,pos;
-};
-struct npc_label_list {
- char name[24];
- int pos;
-};
-struct npc_item_list {
- int nameid,value;
-};
-struct npc_data {
- struct block_list bl;
- short n;
- short class_,dir;
- short speed;
- char name[24];
- char exname[24];
- int chat_id;
- short opt1,opt2,opt3,option;
- short flag;
- int walktimer; // [Valaris]
- short to_x,to_y; // [Valaris]
- struct walkpath_data walkpath;
- unsigned int next_walktime;
- unsigned int canmove_tick;
-
- struct { // [Valaris]
- unsigned state : 8;
- unsigned change_walk_target : 1;
- unsigned walk_easy : 1;
- } state;
-
- union {
- struct {
- char *script;
- short xs,ys;
- int guild_id;
- int timer,timerid,timeramount,nexttimer,rid;
- unsigned int timertick;
- struct npc_timerevent_list *timer_event;
- int label_list_num;
- struct npc_label_list *label_list;
- int src_id;
- } scr;
- struct npc_item_list shop_item[1];
- struct {
- short xs,ys;
- short x,y;
- char name[16];
- } warp;
- } u;
- // ‚±‚±‚Ƀƒ“ƒo‚ð’ljÁ‚µ‚Ä‚Í‚È‚ç‚È‚¢(shop_item‚ª‰Â•Ï’·‚̈×)
-
- char eventqueue[MAX_EVENTQUEUE][50];
- int eventtimer[MAX_EVENTTIMER];
- short arenaflag;
-
- void *chatdb;
-};
-struct mob_data {
- struct block_list bl;
- short n;
- short base_class,class_,dir,mode,level;
- short m,x0,y0,xs,ys;
- char name[24];
- int spawndelay1,spawndelay2;
- struct {
- unsigned state : 8;
- unsigned skillstate : 8;
- unsigned targettype : 1;
- unsigned steal_flag : 1;
- unsigned steal_coin_flag : 1;
- unsigned skillcastcancel : 1;
- unsigned master_check : 1;
- unsigned change_walk_target : 1;
- unsigned walk_easy : 1;
- unsigned special_mob_ai : 3;
- unsigned soul_change_flag : 1; // Celest
- int provoke_flag; // Celest
- } state;
- int timer;
- short to_x,to_y;
- short target_dir;
- short speed;
- int hp;
- int target_id,attacked_id;
- short target_lv;
- struct walkpath_data walkpath;
- unsigned int next_walktime;
- unsigned int attackabletime;
- unsigned int last_deadtime,last_spawntime,last_thinktime;
- unsigned int canmove_tick;
- short move_fail_count;
- struct {
- int id;
- int dmg;
- } dmglog[DAMAGELOG_SIZE];
- struct item *lootitem;
- short lootitem_count;
-
- struct status_change sc_data[MAX_STATUSCHANGE];
- short sc_count;
- short opt1,opt2,opt3,option;
- short min_chase;
- int guild_id;
- int deletetimer;
-
- int skilltimer;
- int skilltarget;
- short skillx,skilly;
- short skillid,skilllv,skillidx;
- unsigned int skilldelay[MAX_MOBSKILL];
- int def_ele;
- int master_id,master_dist;
- int exclusion_src,exclusion_party,exclusion_guild;
- struct skill_timerskill skilltimerskill[MAX_MOBSKILLTIMERSKILL];
- struct skill_unit_group skillunit[MAX_MOBSKILLUNITGROUP];
- struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET];
- char npc_event[50];
- unsigned char size;
- short recall_flag;
- int recallmob_count;
- short recallcount;
-};
-struct pet_data {
- struct block_list bl;
- short n;
- short class_,dir;
- short speed;
- char name[24];
- struct {
- unsigned state : 8 ;
- unsigned skillstate : 8 ;
- unsigned change_walk_target : 1 ;
- short skillbonus;
- } state;
- int timer;
- short to_x,to_y;
- short equip;
- struct walkpath_data walkpath;
- int target_id;
- short target_lv;
- int move_fail_count;
- unsigned int attackabletime,next_walktime,last_thinktime;
- int skilltype,skillval,skilltimer,skillduration; // [Valaris]
- //int skillbonustype,skillbonusval,skillbonustimer,skillbonusduration; // [Valaris]
- int skillbonustype,skillbonusval,skillbonustimer;
- struct item *lootitem;
- short loot; // [Valaris]
- short lootmax; // [Valaris]
- short lootitem_count;
- short lootitem_weight;
- int lootitem_timer;
- struct skill_timerskill skilltimerskill[MAX_MOBSKILLTIMERSKILL]; // [Valaris]
- struct skill_unit_group skillunit[MAX_MOBSKILLUNITGROUP]; // [Valaris]
- struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET]; // [Valaris]
- struct map_session_data *msd;
-};
-
-enum { MS_IDLE,MS_WALK,MS_ATTACK,MS_DEAD,MS_DELAY };
-
-enum { NONE_ATTACKABLE,ATTACKABLE };
-
-enum { ATK_LUCKY=1,ATK_FLEE,ATK_DEF}; // ˆÍ‚Ü‚êƒyƒiƒ‹ƒeƒBŒvŽZ—p
-
-// ‘•”õƒR[ƒh
-enum {
- EQP_WEAPON = 0x0002, // ‰EŽè
- EQP_ARMOR = 0x0010, // ‘Ì
- EQP_SHIELD = 0x0020, // ¶Žè
- EQP_HELM = 0x0100, // “ªã’i
-};
-
-struct map_data {
- char name[24];
- unsigned char *gat; // NULL‚Ȃ牺‚Ìmap_data_other_server‚Æ‚µ‚Ĉµ‚¤
- char *alias; // [MouseJstr]
- struct block_list **block;
- struct block_list **block_mob;
- int *block_count,*block_mob_count;
- int m;
- short xs,ys;
- short bxs,bys;
- int npc_num;
- int users;
- struct {
- unsigned alias : 1;
- unsigned nomemo : 1;
- unsigned noteleport : 1;
- unsigned noreturn : 1;
- unsigned monster_noteleport : 1;
- unsigned nosave : 1;
- unsigned nobranch : 1;
- unsigned nopenalty : 1;
- unsigned pvp : 1;
- unsigned pvp_noparty : 1;
- unsigned pvp_noguild : 1;
- unsigned pvp_nightmaredrop :1;
- unsigned pvp_nocalcrank : 1;
- unsigned gvg : 1;
- unsigned gvg_noparty : 1;
- unsigned nozenypenalty : 1;
- unsigned notrade : 1;
- unsigned noskill : 1;
- unsigned nowarp : 1;
- unsigned nowarpto : 1;
- unsigned nopvp : 1; // [Valaris]
- unsigned noicewall : 1; // [Valaris]
- unsigned snow : 1; // [Valaris]
- unsigned fog : 1; // [Valaris]
- unsigned sakura : 1; // [Valaris]
- unsigned leaves : 1; // [Valaris]
- unsigned rain : 1; // [Valaris]
- unsigned indoors : 1; // celest
- unsigned nogo : 1; // [Valaris]
- } flag;
- struct point save;
- struct npc_data *npc[MAX_NPC_PER_MAP];
- struct {
- int drop_id;
- int drop_type;
- int drop_per;
- } drop_list[MAX_DROP_PER_MAP];
-};
-struct map_data_other_server {
- char name[24];
- unsigned char *gat; // NULLŒÅ’è‚É‚µ‚Ä”»’f
- unsigned long ip;
- unsigned int port;
- struct map_data* map;
-};
-
-struct flooritem_data {
- struct block_list bl;
- short subx,suby;
- int cleartimer;
- int first_get_id,second_get_id,third_get_id;
- unsigned int first_get_tick,second_get_tick,third_get_tick;
- struct item item_data;
-};
-
-enum {
- SP_SPEED,SP_BASEEXP,SP_JOBEXP,SP_KARMA,SP_MANNER,SP_HP,SP_MAXHP,SP_SP, // 0-7
- SP_MAXSP,SP_STATUSPOINT,SP_0a,SP_BASELEVEL,SP_SKILLPOINT,SP_STR,SP_AGI,SP_VIT, // 8-15
- SP_INT,SP_DEX,SP_LUK,SP_CLASS,SP_ZENY,SP_SEX,SP_NEXTBASEEXP,SP_NEXTJOBEXP, // 16-23
- SP_WEIGHT,SP_MAXWEIGHT,SP_1a,SP_1b,SP_1c,SP_1d,SP_1e,SP_1f, // 24-31
- SP_USTR,SP_UAGI,SP_UVIT,SP_UINT,SP_UDEX,SP_ULUK,SP_26,SP_27, // 32-39
- SP_28,SP_ATK1,SP_ATK2,SP_MATK1,SP_MATK2,SP_DEF1,SP_DEF2,SP_MDEF1, // 40-47
- SP_MDEF2,SP_HIT,SP_FLEE1,SP_FLEE2,SP_CRITICAL,SP_ASPD,SP_36,SP_JOBLEVEL, // 48-55
- SP_UPPER,SP_PARTNER,SP_CART,SP_FAME,SP_UNBREAKABLE, //56-60
- SP_CARTINFO=99, // 99
-
- SP_BASEJOB=119, // 100+19 - celest
-
- // original 1000-
- SP_ATTACKRANGE=1000, SP_ATKELE,SP_DEFELE, // 1000-1002
- SP_CASTRATE, SP_MAXHPRATE, SP_MAXSPRATE, SP_SPRATE, // 1003-1006
- SP_ADDELE, SP_ADDRACE, SP_ADDSIZE, SP_SUBELE, SP_SUBRACE, // 1007-1011
- SP_ADDEFF, SP_RESEFF, // 1012-1013
- SP_BASE_ATK,SP_ASPD_RATE,SP_HP_RECOV_RATE,SP_SP_RECOV_RATE,SP_SPEED_RATE, // 1014-1018
- SP_CRITICAL_DEF,SP_NEAR_ATK_DEF,SP_LONG_ATK_DEF, // 1019-1021
- SP_DOUBLE_RATE, SP_DOUBLE_ADD_RATE, SP_MATK, SP_MATK_RATE, // 1022-1025
- SP_IGNORE_DEF_ELE,SP_IGNORE_DEF_RACE, // 1026-1027
- SP_ATK_RATE,SP_SPEED_ADDRATE,SP_ASPD_ADDRATE, // 1028-1030
- SP_MAGIC_ATK_DEF,SP_MISC_ATK_DEF, // 1031-1032
- SP_IGNORE_MDEF_ELE,SP_IGNORE_MDEF_RACE, // 1033-1034
- SP_MAGIC_ADDELE,SP_MAGIC_ADDRACE,SP_MAGIC_SUBRACE, // 1035-1037
- SP_PERFECT_HIT_RATE,SP_PERFECT_HIT_ADD_RATE,SP_CRITICAL_RATE,SP_GET_ZENY_NUM,SP_ADD_GET_ZENY_NUM, // 1038-1042
- SP_ADD_DAMAGE_CLASS,SP_ADD_MAGIC_DAMAGE_CLASS,SP_ADD_DEF_CLASS,SP_ADD_MDEF_CLASS, // 1043-1046
- SP_ADD_MONSTER_DROP_ITEM,SP_DEF_RATIO_ATK_ELE,SP_DEF_RATIO_ATK_RACE,SP_ADD_SPEED, // 1047-1050
- SP_HIT_RATE,SP_FLEE_RATE,SP_FLEE2_RATE,SP_DEF_RATE,SP_DEF2_RATE,SP_MDEF_RATE,SP_MDEF2_RATE, // 1051-1057
- SP_SPLASH_RANGE,SP_SPLASH_ADD_RANGE,SP_AUTOSPELL,SP_HP_DRAIN_RATE,SP_SP_DRAIN_RATE, // 1058-1062
- SP_SHORT_WEAPON_DAMAGE_RETURN,SP_LONG_WEAPON_DAMAGE_RETURN,SP_WEAPON_COMA_ELE,SP_WEAPON_COMA_RACE, // 1063-1066
- SP_ADDEFF2,SP_BREAK_WEAPON_RATE,SP_BREAK_ARMOR_RATE,SP_ADD_STEAL_RATE, // 1067-1070
- SP_MAGIC_DAMAGE_RETURN,SP_RANDOM_ATTACK_INCREASE,SP_ALL_STATS,SP_AGI_VIT,SP_AGI_DEX_STR,SP_PERFECT_HIDE, // 1071-1076
- SP_DISGUISE,SP_CLASSCHANGE, // 1077-1078
- SP_HP_DRAIN_VALUE,SP_SP_DRAIN_VALUE, // 1079-1080
- SP_WEAPON_ATK,SP_WEAPON_ATK_RATE, // 1081-1082
- SP_DELAYRATE, // 1083
-
- SP_RESTART_FULL_RECORVER=2000,SP_NO_CASTCANCEL,SP_NO_SIZEFIX,SP_NO_MAGIC_DAMAGE,SP_NO_WEAPON_DAMAGE,SP_NO_GEMSTONE, // 2000-2005
- SP_NO_CASTCANCEL2,SP_INFINITE_ENDURE,SP_UNBREAKABLE_WEAPON,SP_UNBREAKABLE_ARMOR, SP_UNBREAKABLE_HELM, // 2006-2010
- SP_UNBREAKABLE_SHIELD, SP_LONG_ATK_RATE, // 2011-2012
-
- SP_CRIT_ATK_RATE, SP_CRITICAL_ADDRACE, SP_NO_REGEN, SP_ADDEFF_WHENHIT, SP_AUTOSPELL_WHENHIT, // 2013-2017
- SP_SKILL_ATK, SP_UNSTRIPABLE, SP_ADD_DAMAGE_BY_CLASS, // 2018-2020
- SP_SP_GAIN_VALUE, SP_IGNORE_DEF_MOB, SP_HP_LOSS_RATE, SP_ADDRACE2, SP_HP_GAIN_VALUE, // 2021-2025
- SP_SUBSIZE, SP_DAMAGE_WHEN_UNEQUIP, SP_ADD_ITEM_HEAL_RATE, SP_LOSESP_WHEN_UNEQUIP, SP_EXP_ADDRACE, // 2026-2030
- SP_SP_GAIN_RACE, SP_SUBRACE2, SP_ADDEFF_WHENHIT_SHORT, // 2031-2033
- SP_UNSTRIPABLE_WEAPON,SP_UNSTRIPABLE_ARMOR,SP_UNSTRIPABLE_HELM,SP_UNSTRIPABLE_SHIELD // 2034-2037
-};
-
-enum {
- LOOK_BASE,LOOK_HAIR,LOOK_WEAPON,LOOK_HEAD_BOTTOM,LOOK_HEAD_TOP,LOOK_HEAD_MID,LOOK_HAIR_COLOR,LOOK_CLOTHES_COLOR,LOOK_SHIELD,LOOK_SHOES
-};
-
-// CELL
-#define CELL_MASK 0x0f
-#define CELL_NPC 0x80 // NPCƒZƒ‹
-#define CELL_BASILICA 0x40 // BASILICAƒZƒ‹
-#define CELL_MOONLIT 0x100
-#define CELL_REGEN 0x200
-/*
- * map_getcell()‚ÅŽg—p‚³‚ê‚éƒtƒ‰ƒO
- */
-typedef enum {
- CELL_CHKWALL=0, // •Ç(ƒZƒ‹ƒ^ƒCƒv1)
- CELL_CHKWATER, // …ê(ƒZƒ‹ƒ^ƒCƒv3)
- CELL_CHKGROUND, // ’n–ÊáŠQ•¨(ƒZƒ‹ƒ^ƒCƒv5)
- CELL_CHKPASS, // ’ʉ߉”\(ƒZƒ‹ƒ^ƒCƒv1,5ˆÈŠO)
- CELL_CHKNOPASS, // ’ʉߕs‰Â(ƒZƒ‹ƒ^ƒCƒv1,5)
- CELL_GETTYPE, // ƒZƒ‹ƒ^ƒCƒv‚ð•Ô‚·
- CELL_CHKNPC=0x10, // ƒ^ƒbƒ`ƒ^ƒCƒv‚ÌNPC(ƒZƒ‹ƒ^ƒCƒv0x80ƒtƒ‰ƒO)
- CELL_CHKBASILICA, // ƒoƒWƒŠƒJ(ƒZƒ‹ƒ^ƒCƒv0x40ƒtƒ‰ƒO)
-} cell_t;
-// map_setcell()‚ÅŽg—p‚³‚ê‚éƒtƒ‰ƒO
-enum {
- CELL_SETNPC=0x10, // ƒ^ƒbƒ`ƒ^ƒCƒv‚ÌNPC‚ðƒZƒbƒg
- CELL_SETBASILICA, // ƒoƒWƒŠƒJ‚ðƒZƒbƒg
- CELL_CLRBASILICA, // ƒoƒWƒŠƒJ‚ðƒNƒŠƒA
-};
-
-struct chat_data {
- struct block_list bl;
-
- unsigned char pass[8]; /* password */
- unsigned char title[61]; /* room title MAX 60 */
- unsigned char limit; /* join limit */
- unsigned char trigger;
- unsigned char users; /* current users */
- unsigned char pub; /* room attribute */
- struct map_session_data *usersd[20];
- struct block_list *owner_;
- struct block_list **owner;
- char npc_event[50];
-};
-
-extern struct map_data map[];
-extern int map_num;
-extern int autosave_interval;
-extern int agit_flag;
-extern int night_flag; // 0=day, 1=night [Yor]
-
-// gat?Ö§
-int map_getcell(int,int,int,cell_t);
-int map_getcellp(struct map_data*,int,int,cell_t);
-void map_setcell(int,int,int,int);
-extern int map_read_flag; // 0: grf«Õ«¡«¤«ë 1: «­«ã«Ã«·«å 2: «­«ã«Ã«·«å(?õê)
-enum {
- READ_FROM_GAT, READ_FROM_AFM,
- READ_FROM_BITMAP, CREATE_BITMAP,
- READ_FROM_BITMAP_COMPRESSED, CREATE_BITMAP_COMPRESSED
-};
-
-extern char motd_txt[];
-extern char help_txt[];
-
-extern char talkie_mes[];
-
-extern char wisp_server_name[];
-
-// ŽI‘S‘Ìî•ñ
-void map_setusers(int);
-int map_getusers(void);
-// block휊֘A
-int map_freeblock( void *bl );
-int map_freeblock_lock(void);
-int map_freeblock_unlock(void);
-// blockŠÖ˜A
-int map_addblock(struct block_list *);
-int map_delblock(struct block_list *);
-void map_foreachinarea(int (*)(struct block_list*,va_list),int,int,int,int,int,int,...);
-// -- moonsoul (added map_foreachincell)
-void map_foreachincell(int (*)(struct block_list*,va_list),int,int,int,int,...);
-void map_foreachinmovearea(int (*)(struct block_list*,va_list),int,int,int,int,int,int,int,int,...);
-void map_foreachinpath(int (*func)(struct block_list*,va_list),int m,int x0,int y0,int x1,int y1,int range,int type,...); // Celest
-int map_countnearpc(int,int,int);
-//blockŠÖ˜A‚ɒljÁ
-int map_count_oncell(int m,int x,int y);
-struct skill_unit *map_find_skill_unit_oncell(struct block_list *,int x,int y,int skill_id,struct skill_unit *);
-// ˆêŽž“IobjectŠÖ˜A
-int map_addobject(struct block_list *);
-int map_delobject(int);
-int map_delobjectnofree(int id);
-void map_foreachobject(int (*)(struct block_list*,va_list),int,...);
-//
-int map_quit(struct map_session_data *);
-// npc
-int map_addnpc(int,struct npc_data *);
-
-// °ƒAƒCƒeƒ€ŠÖ˜A
-int map_clearflooritem_timer(int,unsigned int,int,int);
-#define map_clearflooritem(id) map_clearflooritem_timer(0,0,id,1)
-int map_addflooritem(struct item *,int,int,int,int,struct map_session_data *,struct map_session_data *,struct map_session_data *,int);
-int map_searchrandfreecell(int,int,int,int);
-
-// ƒLƒƒƒ‰id„ƒLƒƒƒ‰–¼ •ÏŠ·ŠÖ˜A
-void map_addchariddb(int charid,char *name);
-void map_delchariddb(int charid);
-int map_reqchariddb(struct map_session_data * sd,int charid);
-char * map_charid2nick(int);
-struct map_session_data * map_charid2sd(int);
-
-struct map_session_data * map_id2sd(int);
-struct block_list * map_id2bl(int);
-int map_mapname2mapid(char*);
-int map_mapname2ipport(char*,int*,int*);
-int map_setipport(char *name,unsigned long ip,int port);
-int map_eraseipport(char *name,unsigned long ip,int port);
-int map_eraseallipport(void);
-void map_addiddb(struct block_list *);
-void map_deliddb(struct block_list *bl);
-int map_foreachiddb(int (*)(void*,void*,va_list),...);
-void map_addnickdb(struct map_session_data *);
-struct map_session_data * map_nick2sd(char*);
-int compare_item(struct item *a, struct item *b);
-
-// ‚»‚Ì‘¼
-int map_check_dir(int s_dir,int t_dir);
-int map_calc_dir( struct block_list *src,int x,int y);
-
-// path.c‚æ‚è
-int path_search(struct walkpath_data*,int,int,int,int,int,int);
-int path_search_long(struct shootpath_data *,int,int,int,int,int);
-int path_blownpos(int m,int x0,int y0,int dx,int dy,int count);
-
-int map_who(int fd);
-
-int cleanup_sub(struct block_list *bl, va_list ap);
-
-void map_helpscreen(); // [Valaris]
-int map_delmap(char *mapname);
-
-extern char *INTER_CONF_NAME;
-extern char *LOG_CONF_NAME;
-extern char *MAP_CONF_NAME;
-extern char *BATTLE_CONF_FILENAME;
-extern char *ATCOMMAND_CONF_FILENAME;
-extern char *CHARCOMMAND_CONF_FILENAME;
-extern char *SCRIPT_CONF_NAME;
-extern char *MSG_CONF_NAME;
-extern char *GRF_PATH_FILENAME;
-
-#ifndef TXT_ONLY
-
-// MySQL
-#ifdef __WIN32
-#include <my_global.h>
-#include <my_sys.h>
-#endif
-#include <mysql.h>
-
-void char_online_check(void); // [Valaris]
-void char_offline(struct map_session_data *sd);
-
-extern MYSQL mmysql_handle;
-extern char tmp_sql[65535];
-extern MYSQL_RES* sql_res ;
-extern MYSQL_ROW sql_row ;
-
-extern MYSQL lmysql_handle;
-extern char tmp_lsql[65535];
-extern MYSQL_RES* lsql_res ;
-extern MYSQL_ROW lsql_row ;
-
-extern MYSQL mail_handle;
-extern MYSQL_RES* mail_res ;
-extern MYSQL_ROW mail_row ;
-extern char tmp_msql[65535];
-
-extern int db_use_sqldbs;
-
-extern char item_db_db[32];
-extern char mob_db_db[32];
-extern char login_db[32];
-
-extern char login_db_level[32];
-extern char login_db_account_id[32];
-
-extern char gm_db[32];
-extern char gm_db_level[32];
-extern char gm_db_account_id[32];
-
-extern int lowest_gm_level;
-extern int read_gm_interval;
-
-extern char char_db[32];
-#endif /* not TXT_ONLY */
-
-#endif
diff --git a/src/map/mob.c b/src/map/mob.c
deleted file mode 100644
index f076b7530..000000000
--- a/src/map/mob.c
+++ /dev/null
@@ -1,4577 +0,0 @@
-// $Id: mob.c,v 1.7 2004/09/25 05:32:18 MouseJstr Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-
-#include "timer.h"
-#include "socket.h"
-#include "db.h"
-#include "nullpo.h"
-#include "malloc.h"
-#include "map.h"
-#include "clif.h"
-#include "intif.h"
-#include "pc.h"
-#include "status.h"
-#include "mob.h"
-#include "guild.h"
-#include "itemdb.h"
-#include "skill.h"
-#include "battle.h"
-#include "party.h"
-#include "npc.h"
-#include "log.h"
-#include "showmsg.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-#define MIN_MOBTHINKTIME 100
-
-#define MOB_LAZYMOVEPERC 50 // Move probability in the negligent mode MOB (rate of 1000 minute)
-#define MOB_LAZYWARPPERC 20 // Warp probability in the negligent mode MOB (rate of 1000 minute)
-
-struct mob_db mob_db[MAX_MOB_DB+1];
-
-#define CLASSCHANGE_BOSS_NUM 21
-
-/*==========================================
- * Local prototype declaration (only required thing)
- *------------------------------------------
- */
-static int distance(int,int,int,int);
-static int mob_makedummymobdb(int);
-static int mob_timer(int,unsigned int,int,int);
-int mobskill_use(struct mob_data *md,unsigned int tick,int event);
-int mobskill_deltimer(struct mob_data *md );
-int mob_skillid2skillidx(int class_,int skillid);
-int mobskill_use_id(struct mob_data *md,struct block_list *target,int skill_idx);
-static int mob_unlocktarget(struct mob_data *md,int tick);
-
-/*==========================================
- * Mob is searched with a name.
- *------------------------------------------
- */
-int mobdb_searchname(const char *str)
-{
- int i;
-
- for(i=0;i<sizeof(mob_db)/sizeof(mob_db[0]);i++){
- if( strcmpi(mob_db[i].name,str)==0 || strcmp(mob_db[i].jname,str)==0 ||
- memcmp(mob_db[i].name,str,24)==0 || memcmp(mob_db[i].jname,str,24)==0)
- return i;
- }
-
- return 0;
-}
-
-/*==========================================
- * Id Mob is checked.
- *------------------------------------------
- */
-int mobdb_checkid(const int id)
-{
- if (id <= 0 || id >= (sizeof(mob_db) / sizeof(mob_db[0])) || mob_db[id].name[0] == '\0')
- return 0;
-
- return id;
-}
-
-/*==========================================
- * The minimum data set for MOB spawning
- *------------------------------------------
- */
-int mob_spawn_dataset(struct mob_data *md,const char *mobname,int class_)
-{
- nullpo_retr(0, md);
-
- md->bl.prev=NULL;
- md->bl.next=NULL;
- if(strcmp(mobname,"--en--")==0)
- memcpy(md->name,mob_db[class_].name,24);
- else if(strcmp(mobname,"--ja--")==0)
- memcpy(md->name,mob_db[class_].jname,24);
- else
- memcpy(md->name,mobname,24);
-
- md->n = 0;
- md->base_class = md->class_ = class_;
- md->bl.id= npc_get_new_npc_id();
-
- memset(&md->state,0,sizeof(md->state));
- md->timer = -1;
- md->target_id=0;
- md->attacked_id=0;
- md->speed=mob_db[class_].speed;
-
- return 0;
-}
-
-
-/*==========================================
- * The MOB appearance for one time (for scripts)
- *------------------------------------------
- */
-int mob_once_spawn (struct map_session_data *sd, char *mapname,
- int x, int y, const char *mobname, int class_, int amount, const char *event)
-{
- struct mob_data *md = NULL;
- int m, count, lv = 255;
- int i, j;
-
- if(sd) lv = sd->status.base_level;
-
- if(sd && strcmp(mapname,"this")==0)
- m = sd->bl.m;
- else
- m = map_mapname2mapid(mapname);
-
- if (m < 0 || amount <= 0 || (class_ >= 0 && class_ <= 1000) || class_ > MAX_MOB_DB + 4000) // ’l‚ªˆÙí‚Ȃ碊«‚ðŽ~‚ß‚é
- return 0;
-
- if (class_ < 0) { // ƒ‰ƒ“ƒ_ƒ€‚É¢Š«
- int k;
- i = 0;
- j = -class_-1;
- if(j >= 0 && j < MAX_RANDOMMONSTER) {
- do {
- class_ = rand() % 1000 + 1001;
- k = rand() % 1000000;
- } while ((mob_db[class_].max_hp <= 0 || mob_db[class_].summonper[j] <= k ||
- (battle_config.random_monster_checklv && lv < mob_db[class_].lv)) && (i++) < 2000);
- if(i >= 2000)
- class_ = mob_db[0].summonper[j];
- } else
- return 0;
-// if(battle_config.etc_log)
-// printf("mobclass=%d try=%d\n",class_,i);
- }
- if (sd) { //even if the coords were wrong, spawn mob anyways (but look for most suitable coords first) Got from Freya [Lupus]
- if (x <= 0 || y <= 0) {
- if (x <= 0) x = sd->bl.x + rand() % 3 - 1;
- if (y <= 0) y = sd->bl.y + rand() % 3 - 1;
- if (map_getcell(m, x, y, CELL_CHKNOPASS)) {
- x = sd->bl.x;
- y = sd->bl.y;
- }
- }
- } else if (x <= 0 || y <= 0) {
- i = j = 0;
- printf("mob_once_spawn: %i at %s x:%i y:%i\n ??\n",class_,map[m].name,x,y); //got idea from Freya [Lupus]
- do {
- x = rand() % (map[m].xs - 2) + 1;
- y = rand() % (map[m].ys - 2) + 1;
- } while ((i = map_getcell(m, x, y, CELL_CHKNOPASS)) && j++ < 64);
- if (i) { // not solved?
- x = 0;
- y = 0;
- }
- }
-
- for (count = 0; count < amount; count++) {
- md = (struct mob_data *)aCalloc(1,sizeof(struct mob_data));
- memset (md, '\0', sizeof *md);
-
- if (class_ > MAX_MOB_DB + 2000) { // large/tiny mobs [Valaris]
- md->size = 2;
- class_ -= (MAX_MOB_DB + 2000);
- } else if (class_ > MAX_MOB_DB) {
- md->size = 1;
- class_ -= MAX_MOB_DB;
- }
-
- if(mob_db[class_].mode & 0x02)
- md->lootitem = (struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item));
- else
- md->lootitem = NULL;
-
- mob_spawn_dataset (md, mobname, class_);
- md->bl.m = m;
- md->bl.x = x;
- md->bl.y = y;
- if (class_ < 0 && battle_config.dead_branch_active)
- md->mode = 0x1 + 0x4 + 0x80; //ˆÚ“®‚µ‚ăAƒNƒeƒBƒu‚Å”½Œ‚‚·‚é
- md->m = m;
- md->x0 = x;
- md->y0 = y;
- //md->xs = 0;
- //md->ys = 0;
- md->spawndelay1 = -1; // ˆê“x‚̂݃tƒ‰ƒO
- md->spawndelay2 = -1; // ˆê“x‚̂݃tƒ‰ƒO
-
- memcpy(md->npc_event, event, strlen(event));
-
- md->bl.type = BL_MOB;
- map_addiddb (&md->bl);
- mob_spawn (md->bl.id);
-
- if(class_ == 1288) { // emperium hp based on defense level [Valaris]
- struct guild_castle *gc = guild_mapname2gc(map[md->bl.m].name);
- if(gc) {
- mob_db[class_].max_hp += 2000 * gc->defense;
- md->hp = mob_db[class_].max_hp;
- }
- } // end addition [Valaris]
- }
- return (amount > 0) ? md->bl.id : 0;
-}
-/*==========================================
- * The MOB appearance for one time (& area specification for scripts)
- *------------------------------------------
- */
-int mob_once_spawn_area(struct map_session_data *sd,char *mapname,
- int x0,int y0,int x1,int y1,
- const char *mobname,int class_,int amount,const char *event)
-{
- int x,y,i,max,lx=-1,ly=-1,id=0;
- int m;
-
- if(strcmp(mapname,"this")==0)
- m=sd->bl.m;
- else
- m=map_mapname2mapid(mapname);
-
- max=(y1-y0+1)*(x1-x0+1)*3;
- if(max>1000)max=1000;
-
- if(m<0 || amount<=0 || (class_>=0 && class_<=1000) || class_>MAX_MOB_DB) // A summon is stopped if a value is unusual
- return 0;
-
- for(i=0;i<amount;i++){
- int j=0;
- do{
- x=rand()%(x1-x0+1)+x0;
- y=rand()%(y1-y0+1)+y0;
- } while (map_getcell(m,x,y,CELL_CHKNOPASS) && (++j)<max);
- // freya }while( ( (c=map_getcell(m,x,y))==1 || c==5)&& (++j)<max );
- if(j>=max){
- if(lx>=0){ // Since reference went wrong, the place which boiled before is used.
- x=lx;
- y=ly;
- }else
- return 0; // Since reference of the place which boils first went wrong, it stops.
- }
- if(x==0||y==0) printf("xory=0, x=%d,y=%d,x0=%d,y0=%d\n",x,y,x0,y0);
- id=mob_once_spawn(sd,mapname,x,y,mobname,class_,1,event);
- lx=x;
- ly=y;
- }
- return id;
-}
-
-/*==========================================
- * Summoning Guardians [Valaris]
- *------------------------------------------
- */
-int mob_spawn_guardian(struct map_session_data *sd,char *mapname,
- int x,int y,const char *mobname,int class_,int amount,const char *event,int guardian)
-{
- struct mob_data *md=NULL;
- int m,count=1,lv=255;
-
- if( sd )
- lv=sd->status.base_level;
-
- if( sd && strcmp(mapname,"this")==0)
- m=sd->bl.m;
- else
- m=map_mapname2mapid(mapname);
-
- if(m<0 || amount<=0 || (class_>=0 && class_<=1000) || class_>MAX_MOB_DB) // Invalid monster classes
- return 0;
-
- if(class_<0)
- return 0;
-
- if(sd){
- if(x<=0) x=sd->bl.x;
- if(y<=0) y=sd->bl.y;
- }
-
- else if(x<=0 || y<=0)
- printf("mob_spawn_guardian: ??\n");
-
-
- for(count=0;count<amount;count++){
- struct guild_castle *gc;
- md=(struct mob_data *) aCalloc(sizeof(struct mob_data), 1);
- memset(md, '\0', sizeof *md);
-
- mob_spawn_dataset(md,mobname,class_);
- md->bl.m=m;
- md->bl.x=x;
- md->bl.y=y;
- md->m =m;
- md->x0=x;
- md->y0=y;
- md->xs=0;
- md->ys=0;
- md->spawndelay1=-1; // Only once is a flag.
- md->spawndelay2=-1; // Only once is a flag.
-
- memcpy(md->npc_event,event,sizeof(md->npc_event));
-
- md->bl.type=BL_MOB;
- map_addiddb(&md->bl);
- mob_spawn(md->bl.id);
-
- gc=guild_mapname2gc(map[md->bl.m].name);
- if(gc) {
- mob_db[class_].max_hp+=2000*gc->defense;
- if(guardian==0) { md->hp=gc->Ghp0; gc->GID0=md->bl.id; }
- if(guardian==1) { md->hp=gc->Ghp1; gc->GID1=md->bl.id; }
- if(guardian==2) { md->hp=gc->Ghp2; gc->GID2=md->bl.id; }
- if(guardian==3) { md->hp=gc->Ghp3; gc->GID3=md->bl.id; }
- if(guardian==4) { md->hp=gc->Ghp4; gc->GID4=md->bl.id; }
- if(guardian==5) { md->hp=gc->Ghp5; gc->GID5=md->bl.id; }
- if(guardian==6) { md->hp=gc->Ghp6; gc->GID6=md->bl.id; }
- if(guardian==7) { md->hp=gc->Ghp7; gc->GID7=md->bl.id; }
- }
- }
-
- return (amount>0)?md->bl.id:0;
-}
-
-/*==========================================
- * The disregard ID is added to mob.
- *------------------------------------------
- */
-int mob_exclusion_add(struct mob_data *md,int type,int id)
-{
- nullpo_retr(0, md);
-
- if(type==1)
- md->exclusion_src=id;
- if(type==2)
- md->exclusion_party=id;
- if(type==3)
- md->exclusion_guild=id;
-
- return 0;
-}
-
-/*==========================================
- * The disregard ID of mob is checked. (TAGE?)
- *------------------------------------------
- */
-int mob_exclusion_check(struct mob_data *md,struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
- nullpo_retr(0, md);
-
- if(sd->bl.type==BL_PC){
- if(md->exclusion_src && md->exclusion_src==sd->bl.id)
- return 1;
- if(md->exclusion_party && md->exclusion_party==sd->status.party_id)
- return 2;
- if(md->exclusion_guild && md->exclusion_guild==sd->status.guild_id)
- return 3;
- }
- return 0;
-}
-
-/*==========================================
- * Appearance income of mob
- *------------------------------------------
- */
-int mob_get_viewclass(int class_)
-{
- return mob_db[class_].view_class;
-}
-int mob_get_sex(int class_)
-{
- return mob_db[class_].sex;
-}
-short mob_get_hair(int class_)
-{
- return mob_db[class_].hair;
-}
-short mob_get_hair_color(int class_)
-{
- return mob_db[class_].hair_color;
-}
-short mob_get_weapon(int class_)
-{
- return mob_db[class_].weapon;
-}
-short mob_get_shield(int class_)
-{
- return mob_db[class_].shield;
-}
-short mob_get_head_top(int class_)
-{
- return mob_db[class_].head_top;
-}
-short mob_get_head_mid(int class_)
-{
- return mob_db[class_].head_mid;
-}
-short mob_get_head_buttom(int class_)
-{
- return mob_db[class_].head_buttom;
-}
-short mob_get_clothes_color(int class_) // Add for player monster dye - Valaris
-{
- return mob_db[class_].clothes_color; // End
-}
-int mob_get_equip(int class_) // mob equip [Valaris]
-{
- return mob_db[class_].equip;
-}
-/*==========================================
- * Is MOB in the state in which the present movement is possible or not?
- *------------------------------------------
- */
-int mob_can_move(struct mob_data *md)
-{
- nullpo_retr(0, md);
-
- if(md->canmove_tick > gettick() || (md->opt1 > 0 && md->opt1 != 6) || md->option&2)
- return 0;
- // ƒAƒ“ƒNƒ‹’†‚Å“®‚¯‚È‚¢‚Æ‚©
- if( md->sc_data[SC_ANKLE].timer != -1 || //ƒAƒ“ƒNƒ‹ƒXƒlƒA
- md->sc_data[SC_AUTOCOUNTER].timer != -1 || //ƒI[ƒgƒJƒEƒ“ƒ^[
- md->sc_data[SC_BLADESTOP].timer != -1 || //”’nŽæ‚è
- md->sc_data[SC_SPIDERWEB].timer != -1 //ƒXƒpƒCƒ_[ƒEƒFƒbƒu
- )
- return 0;
-
- return 1;
-}
-
-/*==========================================
- * Time calculation concerning one step next to mob
- *------------------------------------------
- */
-static int calc_next_walk_step(struct mob_data *md)
-{
- nullpo_retr(0, md);
-
- if(md->walkpath.path_pos>=md->walkpath.path_len)
- return -1;
- if(md->walkpath.path[md->walkpath.path_pos]&1)
- return status_get_speed(&md->bl)*14/10;
- return status_get_speed(&md->bl);
-}
-
-static int mob_walktoxy_sub(struct mob_data *md);
-
-/*==========================================
- * Mob Walk processing
- *------------------------------------------
- */
-static int mob_walk(struct mob_data *md,unsigned int tick,int data)
-{
- int moveblock;
- int i;
- static int dirx[8]={0,-1,-1,-1,0,1,1,1};
- static int diry[8]={1,1,0,-1,-1,-1,0,1};
- int x,y,dx,dy;
-
- nullpo_retr(0, md);
-
- md->state.state=MS_IDLE;
- if(md->walkpath.path_pos>=md->walkpath.path_len || md->walkpath.path_pos!=data)
- return 0;
-
- md->walkpath.path_half ^= 1;
- if(md->walkpath.path_half==0){
- md->walkpath.path_pos++;
- if(md->state.change_walk_target){
- mob_walktoxy_sub(md);
- return 0;
- }
- }
- else {
- if(md->walkpath.path[md->walkpath.path_pos]>=8)
- return 1;
-
- x = md->bl.x;
- y = md->bl.y;
- if(map_getcell(md->bl.m,x,y,CELL_CHKNOPASS)) {
- mob_stop_walking(md,1);
- return 0;
- }
- md->dir=md->walkpath.path[md->walkpath.path_pos];
- dx = dirx[md->dir];
- dy = diry[md->dir];
-
- if (map_getcell(md->bl.m,x+dx,y+dy,CELL_CHKBASILICA) && !(status_get_mode(&md->bl)&0x20)) {
- mob_stop_walking(md,1);
- return 0;
- }
-
- if (map_getcell(md->bl.m,x+dx,y+dy,CELL_CHKNOPASS)) {
- mob_walktoxy_sub(md);
- return 0;
- }
-
- if (skill_check_moonlit (&md->bl,x+dx,y+dy)) {
- mob_walktoxy_sub(md);
- return 0;
- }
- moveblock = ( x/BLOCK_SIZE != (x+dx)/BLOCK_SIZE || y/BLOCK_SIZE != (y+dy)/BLOCK_SIZE);
-
- md->state.state=MS_WALK;
- map_foreachinmovearea(clif_moboutsight,md->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,md);
-
- x += dx;
- y += dy;
- if(md->min_chase>13)
- md->min_chase--;
-
- skill_unit_move(&md->bl,tick,0);
- if(moveblock) map_delblock(&md->bl);
- md->bl.x = x;
- md->bl.y = y;
- if(moveblock) map_addblock(&md->bl);
- skill_unit_move(&md->bl,tick,1);
-
- map_foreachinmovearea(clif_mobinsight,md->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,BL_PC,md);
- md->state.state=MS_IDLE;
-
- if(md->option&4)
- skill_check_cloaking(&md->bl);
- }
- if((i=calc_next_walk_step(md))>0){
- i = i>>1;
- if(i < 1 && md->walkpath.path_half == 0)
- i = 1;
- md->timer=add_timer(tick+i,mob_timer,md->bl.id,md->walkpath.path_pos);
- md->state.state=MS_WALK;
-
- if(md->walkpath.path_pos>=md->walkpath.path_len)
- clif_fixmobpos(md); // ‚Æ‚Ü‚Á‚½‚Æ‚«‚Ɉʒu‚ÌÄ‘—M
- }
- return 0;
-}
-
-/*==========================================
- * Attack processing of mob
- *------------------------------------------
- */
-static int mob_attack(struct mob_data *md,unsigned int tick,int data)
-{
- struct block_list *tbl=NULL;
- struct map_session_data *tsd=NULL;
- struct mob_data *tmd=NULL;
-
- int mode,race,range;
-
- nullpo_retr(0, md);
-
- md->min_chase=13;
- md->state.state=MS_IDLE;
- md->state.skillstate=MSS_IDLE;
-
- if( md->skilltimer!=-1 ) // ƒXƒLƒ‹Žg—p’†
- return 0;
-
- if(md->opt1>0 || md->option&2)
- return 0;
-
- if(md->sc_data[SC_AUTOCOUNTER].timer != -1)
- return 0;
-
- if(md->sc_data[SC_BLADESTOP].timer != -1)
- return 0;
-
- if((tbl=map_id2bl(md->target_id))==NULL){
- md->target_id=0;
- md->state.targettype = NONE_ATTACKABLE;
- return 0;
- }
-
- if(tbl->type==BL_PC)
- tsd=(struct map_session_data *)tbl;
- else if(tbl->type==BL_MOB)
- tmd=(struct mob_data *)tbl;
- else
- return 0;
-
- if(tsd){
- if( pc_isdead(tsd) || tsd->invincible_timer != -1 || pc_isinvisible(tsd) || md->bl.m != tbl->m || tbl->prev == NULL || distance(md->bl.x,md->bl.y,tbl->x,tbl->y)>=13 ){
- md->target_id=0;
- md->state.targettype = NONE_ATTACKABLE;
- return 0;
- }
- }
- if(tmd){
- if(md->bl.m != tbl->m || tbl->prev == NULL || distance(md->bl.x,md->bl.y,tbl->x,tbl->y)>=13){
- md->target_id=0;
- md->state.targettype = NONE_ATTACKABLE;
- return 0;
- }
- }
-
-
- if(!md->mode)
- mode=mob_db[md->class_].mode;
- else
- mode=md->mode;
-
- race=mob_db[md->class_].race;
- if(!(mode&0x80)){
- md->target_id=0;
- md->state.targettype = NONE_ATTACKABLE;
- return 0;
- }
- if(tsd && !(mode&0x20) && (tsd->sc_data[SC_TRICKDEAD].timer != -1 || tsd->sc_data[SC_BASILICA].timer != -1 ||
- ((pc_ishiding(tsd) || tsd->state.gangsterparadise) && !((race == 4 || race == 6) && !tsd->perfect_hiding) ) ) ) {
- md->target_id=0;
- md->state.targettype = NONE_ATTACKABLE;
- return 0;
- }
-
- range = mob_db[md->class_].range;
- if(mode&1)
- range++;
- if(distance(md->bl.x,md->bl.y,tbl->x,tbl->y) > range)
- return 0;
- if(battle_config.monster_attack_direction_change)
- md->dir=map_calc_dir(&md->bl, tbl->x,tbl->y ); // Œü‚«Ý’è
-
- //clif_fixmobpos(md);
-
- md->state.skillstate=MSS_ATTACK;
- if( mobskill_use(md,tick,-2) ) // ƒXƒLƒ‹Žg—p
- return 0;
-
- md->target_lv = battle_weapon_attack(&md->bl,tbl,tick,0);
-
- if(!(battle_config.monster_cloak_check_type&2) && md->sc_data[SC_CLOAKING].timer != -1)
- status_change_end(&md->bl,SC_CLOAKING,-1);
-
- md->attackabletime = tick + status_get_adelay(&md->bl);
-
- md->timer=add_timer(md->attackabletime,mob_timer,md->bl.id,0);
- md->state.state=MS_ATTACK;
-
- return 0;
-}
-
-
-/*==========================================
- * The attack of PC which is attacking id is stopped.
- * The callback function of clif_foreachclient
- *------------------------------------------
- */
-int mob_stopattacked(struct map_session_data *sd,va_list ap)
-{
- int id;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, ap);
-
- id=va_arg(ap,int);
- if(sd->attacktarget==id)
- pc_stopattack(sd);
- return 0;
-}
-/*==========================================
- * The timer in which the mob's states changes
- *------------------------------------------
- */
-int mob_changestate(struct mob_data *md,int state,int type)
-{
- unsigned int tick;
- int i;
-
- nullpo_retr(0, md);
-
- if(md->timer != -1)
- delete_timer(md->timer,mob_timer);
- md->timer=-1;
- md->state.state=state;
-
- switch(state){
- case MS_WALK:
- if((i=calc_next_walk_step(md))>0){
- i = i>>2;
- md->timer=add_timer(gettick()+i,mob_timer,md->bl.id,0);
- }
- else
- md->state.state=MS_IDLE;
- break;
- case MS_ATTACK:
- tick = gettick();
- i=DIFF_TICK(md->attackabletime,tick);
- if(i>0 && i<2000)
- md->timer=add_timer(md->attackabletime,mob_timer,md->bl.id,0);
- else if(type) {
- md->attackabletime = tick + status_get_amotion(&md->bl);
- md->timer=add_timer(md->attackabletime,mob_timer,md->bl.id,0);
- }
- else {
- md->attackabletime = tick + 1;
- md->timer=add_timer(md->attackabletime,mob_timer,md->bl.id,0);
- }
- break;
- case MS_DELAY:
- md->timer=add_timer(gettick()+type,mob_timer,md->bl.id,0);
- break;
- case MS_DEAD:
- skill_castcancel(&md->bl,0);
-// mobskill_deltimer(md);
- md->state.skillstate=MSS_DEAD;
- md->last_deadtime=gettick();
- // Since it died, all aggressors' attack to this mob is stopped.
- clif_foreachclient(mob_stopattacked,md->bl.id);
- skill_unit_move(&md->bl,gettick(),0);
- status_change_clear(&md->bl,2); // ƒXƒe[ƒ^ƒXˆÙí‚ð‰ðœ‚·‚é
- skill_clear_unitgroup(&md->bl); // ‘S‚ẴXƒLƒ‹ƒ†ƒjƒbƒgƒOƒ‹[ƒv‚ð휂·‚é
- skill_cleartimerskill(&md->bl);
- if(md->deletetimer!=-1)
- delete_timer(md->deletetimer,mob_timer_delete);
- md->deletetimer=-1;
- md->hp=md->target_id=md->attacked_id=0;
- md->state.targettype = NONE_ATTACKABLE;
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- * timer processing of mob (timer function)
- * It branches to a walk and an attack.
- *------------------------------------------
- */
-static int mob_timer(int tid,unsigned int tick,int id,int data)
-{
- struct mob_data *md;
- struct block_list *bl;
-
- if( (bl=map_id2bl(id)) == NULL ){ //UŒ‚‚µ‚Ä‚«‚½“G‚ª‚à‚¤‚¢‚È‚¢‚̂ͳí‚̂悤‚¾
- return 1;
- }
-
- if(!bl || !bl->type || bl->type!=BL_MOB)
- return 1;
-
- nullpo_retr(1, md=(struct mob_data*)bl);
-
- if(md->timer != tid){
- if(battle_config.error_log)
- printf("mob_timer %d != %d\n",md->timer,tid);
- return 0;
- }
- md->timer=-1;
- if(md->bl.prev == NULL || md->state.state == MS_DEAD)
- return 1;
-
- map_freeblock_lock();
- switch(md->state.state){
- case MS_WALK:
- mob_walk(md,tick,data);
- break;
- case MS_ATTACK:
- mob_attack(md,tick,data);
- break;
- case MS_DELAY:
- mob_changestate(md,MS_IDLE,0);
- break;
- default:
- if(battle_config.error_log)
- printf("mob_timer : %d ?\n",md->state.state);
- break;
- }
-
- if (md->timer == -1)
- mob_changestate(md,MS_WALK,0);
-
- map_freeblock_unlock();
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int mob_walktoxy_sub(struct mob_data *md)
-{
- struct walkpath_data wpd;
- int x,y;
- static int dirx[8]={0,-1,-1,-1,0,1,1,1};
- static int diry[8]={1,1,0,-1,-1,-1,0,1};
-
- nullpo_retr(0, md);
-
- memset(&wpd, 0, sizeof(wpd));
-
- if(path_search(&wpd,md->bl.m,md->bl.x,md->bl.y,md->to_x,md->to_y,md->state.walk_easy))
- return 1;
- if (wpd.path[0] >= 8)
- return 1;
- x = md->bl.x+dirx[wpd.path[0]];
- y = md->bl.y+diry[wpd.path[0]];
- if (map_getcell(md->bl.m,x,y,CELL_CHKBASILICA) && !(status_get_mode(&md->bl)&0x20)) {
- md->state.change_walk_target=0;
- return 1;
- }
-
- memcpy(&md->walkpath,&wpd,sizeof(wpd));
-
- md->state.change_walk_target=0;
- mob_changestate(md,MS_WALK,0);
- clif_movemob(md);
-
- return 0;
-}
-
-/*==========================================
- * mob move start
- *------------------------------------------
- */
-int mob_walktoxy(struct mob_data *md,int x,int y,int easy)
-{
- struct walkpath_data wpd;
-
- nullpo_retr(0, md);
-
- if(md->state.state == MS_WALK && path_search(&wpd,md->bl.m,md->bl.x,md->bl.y,x,y,easy) )
- return 1;
-
- md->state.walk_easy = easy;
- md->to_x=x;
- md->to_y=y;
- if(md->state.state == MS_WALK)
- md->state.change_walk_target=1;
- else
- return mob_walktoxy_sub(md);
-
- return 0;
-}
-
-/*==========================================
- * mob spawn with delay (timer function)
- *------------------------------------------
- */
-static int mob_delayspawn(int tid,unsigned int tick,int m,int n)
-{
- mob_spawn(m);
- return 0;
-}
-
-/*==========================================
- * spawn timing calculation
- *------------------------------------------
- */
-int mob_setdelayspawn(int id)
-{
- unsigned int spawntime,spawntime1,spawntime2,spawntime3;
- struct mob_data *md;
- struct block_list *bl;
-
- if((bl=map_id2bl(id)) == NULL)
- return -1;
-
- if(!bl || !bl->type || bl->type!=BL_MOB)
- return -1;
-
- nullpo_retr(-1, md=(struct mob_data*)bl);
-
- if(!md || md->bl.type!=BL_MOB)
- return -1;
-
- // Processing of MOB which is not revitalized
- if(md->spawndelay1==-1 && md->spawndelay2==-1 && md->n==0){
- map_deliddb(&md->bl);
- if(md->lootitem) {
- map_freeblock(md->lootitem);
- md->lootitem=NULL;
- }
- map_freeblock(md); // Instead of [ of free ]
- return 0;
- }
-
- spawntime1=md->last_spawntime+md->spawndelay1;
- spawntime2=md->last_deadtime+md->spawndelay2;
- spawntime3=gettick()+5000+rand()%5000; //Lupus
- // spawntime = max(spawntime1,spawntime2,spawntime3);
- if(DIFF_TICK(spawntime1,spawntime2)>0)
- spawntime=spawntime1;
- else
- spawntime=spawntime2;
-
- if(DIFF_TICK(spawntime3,spawntime)>0)
- spawntime=spawntime3;
-
- add_timer(spawntime,mob_delayspawn,id,0);
- return 0;
-}
-
-/*==========================================
- * Mob spawning. Initialization is also variously here.
- *------------------------------------------
- */
-int mob_spawn(int id)
-{
- int x=0,y=0,i=0,c;
- unsigned int tick = gettick();
- struct mob_data *md;
- struct block_list *bl;
-
- //nullpo_retr(-1, bl=map_id2bl(id));
- bl=map_id2bl(id);
-
- if(!bl || !bl->type || bl->type!=BL_MOB)
- return -1;
-
- nullpo_retr(-1, md=(struct mob_data*)bl);
-
- if(!md || !md->bl.type || md->bl.type!=BL_MOB)
- return -1;
-
- md->last_spawntime=tick;
- if( md->bl.prev!=NULL ){
-// clif_clearchar_area(&md->bl,3);
-// skill_unit_move(&md->bl,tick,0);
- map_delblock(&md->bl);
- }
- else
- md->class_ = md->base_class;
-
- md->bl.m =md->m;
- do {
- if(md->x0==0 && md->y0==0){
- x=rand()%(map[md->bl.m].xs-2)+1;
- y=rand()%(map[md->bl.m].ys-2)+1;
- } else {
- x=md->x0+rand()%(md->xs+1)-md->xs/2;
- y=md->y0+rand()%(md->ys+1)-md->ys/2;
- }
- i++;
- } while(map_getcell(md->bl.m,x,y,CELL_CHKNOPASS) && i<50);
-
- if(i>=50){
-// if(battle_config.error_log==1)
-// printf("MOB spawn error %d @ %s\n",id,map[md->bl.m].name);
- add_timer(tick+5000,mob_delayspawn,id,0);
- return 1;
- }
-
- md->to_x=md->bl.x=x;
- md->to_y=md->bl.y=y;
- md->dir=0;
- md->target_dir=0;
-
- memset(&md->state,0,sizeof(md->state));
- md->attacked_id = 0;
- md->target_id = 0;
- md->move_fail_count = 0;
-
- if(!md->speed)
- md->speed = mob_db[md->class_].speed;
- md->def_ele = mob_db[md->class_].element;
-
- if(!md->level) // [Valaris]
- md->level=mob_db[md->class_].lv;
-
- md->master_id=0;
- md->master_dist=0;
-
- md->state.state = MS_IDLE;
- md->state.skillstate = MSS_IDLE;
- md->timer = -1;
- md->last_thinktime = tick;
- md->next_walktime = tick+rand()%50+5000;
- md->attackabletime = tick;
- md->canmove_tick = tick;
-
- md->guild_id = 0;
- if (md->class_ >= 1285 && md->class_ <= 1288) {
- struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name);
- if(gc)
- md->guild_id = gc->guild_id;
- }
-
- md->deletetimer=-1;
-
- md->skilltimer=-1;
- for(i=0,c=tick-1000*3600*10;i<MAX_MOBSKILL;i++)
- md->skilldelay[i] = c;
- md->skillid=0;
- md->skilllv=0;
-
- memset(md->dmglog,0,sizeof(md->dmglog));
- if(md->lootitem)
- memset(md->lootitem,0,sizeof(md->lootitem));
- md->lootitem_count = 0;
-
- for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++)
- md->skilltimerskill[i].timer = -1;
-
- for(i=0;i<MAX_STATUSCHANGE;i++) {
- md->sc_data[i].timer=-1;
- md->sc_data[i].val1 = md->sc_data[i].val2 = md->sc_data[i].val3 = md->sc_data[i].val4 =0;
- }
- md->sc_count=0;
- md->opt1=md->opt2=md->opt3=md->option=0;
-
- memset(md->skillunit,0,sizeof(md->skillunit));
- memset(md->skillunittick,0,sizeof(md->skillunittick));
-
- md->hp = status_get_max_hp(&md->bl);
- if(md->hp<=0){
- mob_makedummymobdb(md->class_);
- md->hp = status_get_max_hp(&md->bl);
- }
-
- map_addblock(&md->bl);
- skill_unit_move(&md->bl,tick,1);
-
- clif_spawnmob(md);
-
- return 0;
-}
-
-/*==========================================
- * Distance calculation between two points
- *------------------------------------------
- */
-static int distance(int x0,int y0,int x1,int y1)
-{
- int dx,dy;
-
- dx=abs(x0-x1);
- dy=abs(y0-y1);
- return dx>dy ? dx : dy;
-}
-
-/*==========================================
- * The stop of MOB's attack
- *------------------------------------------
- */
-int mob_stopattack(struct mob_data *md)
-{
- md->target_id=0;
- md->state.targettype = NONE_ATTACKABLE;
- md->attacked_id=0;
- return 0;
-}
-/*==========================================
- * The stop of MOB's walking
- *------------------------------------------
- */
-int mob_stop_walking(struct mob_data *md,int type)
-{
- nullpo_retr(0, md);
-
- if(md->state.state == MS_WALK || md->state.state == MS_IDLE) {
- int dx=0,dy=0;
-
- md->walkpath.path_len=0;
- if(type&4){
- dx=md->to_x-md->bl.x;
- if(dx<0)
- dx=-1;
- else if(dx>0)
- dx=1;
- dy=md->to_y-md->bl.y;
- if(dy<0)
- dy=-1;
- else if(dy>0)
- dy=1;
- }
- md->to_x=md->bl.x+dx;
- md->to_y=md->bl.y+dy;
- if(dx!=0 || dy!=0){
- mob_walktoxy_sub(md);
- return 0;
- }
- mob_changestate(md,MS_IDLE,0);
- }
- if(type&0x01)
- clif_fixmobpos(md);
- if(type&0x02) {
- int delay=status_get_dmotion(&md->bl);
- unsigned int tick = gettick();
- if(battle_config.monster_damage_delay && md->canmove_tick < tick)
- md->canmove_tick = tick + delay;
- }
-
- return 0;
-}
-
-/*==========================================
- * Reachability to a Specification ID existence place
- *------------------------------------------
- */
-int mob_can_reach(struct mob_data *md,struct block_list *bl,int range)
-{
- int dx,dy;
- struct walkpath_data wpd;
- int i;
-
- nullpo_retr(0, md);
- nullpo_retr(0, bl);
-
- dx=abs(bl->x - md->bl.x);
- dy=abs(bl->y - md->bl.y);
-
- if( md->bl.m != bl->m) // ˆá‚¤ƒƒbƒv
- return 0;
-
- if( range>0 && range < ((dx>dy)?dx:dy) ) // ‰“‚·‚¬‚é
- return 0;
-
- if( md->bl.x==bl->x && md->bl.y==bl->y ) // “¯‚¶ƒ}ƒX
- return 1;
-
- //=========== guildcastle guardian no search start===========
- //when players are the guild castle member not attack them !
- /*if(md->class_ >= 1285 && md->class_ <= 1287){
- struct map_session_data *sd;
- struct guild *g=NULL;
- struct guild_castle *gc=guild_mapname2gc(map[bl->m].name);
-
- if(gc && agit_flag==0) // Guardians will not attack during non-woe time [Valaris]
- return 0; // end addition [Valaris]
-
- if(gc && bl->type == BL_PC){
- nullpo_retr(0, sd=(struct map_session_data *)bl);
- if(gc && sd->status.guild_id > 0) {
- g=guild_search(sd->status.guild_id); // don't attack guild members [Valaris]
- if(g && g->guild_id == gc->guild_id)
- return 0;
- if(g && gc && guild_isallied(g,gc))
- return 0;
- }
- }
- }*/
- //========== guildcastle guardian no search eof==============
-
- /*if(bl->type == BL_PC && battle_config.monsters_ignore_gm) { // option to have monsters ignore GMs [Valaris]
- struct map_session_data *sd;
- if((sd=(struct map_session_data *)bl) != NULL && pc_isGM(sd) >= battle_config.monsters_ignore_gm)
- return 0;
- }*/
-
- // Obstacle judging
- wpd.path_len=0;
- wpd.path_pos=0;
- wpd.path_half=0;
- if(path_search(&wpd,md->bl.m,md->bl.x,md->bl.y,bl->x,bl->y,0)!=-1)
- return 1;
-
- if(bl->type!=BL_PC && bl->type!=BL_MOB)
- return 0;
-
- // It judges whether it can adjoin or not.
- dx=(dx>0)?1:((dx<0)?-1:0);
- dy=(dy>0)?1:((dy<0)?-1:0);
- if(path_search(&wpd,md->bl.m,md->bl.x,md->bl.y,bl->x-dx,bl->y-dy,0)!=-1)
- return 1;
- for(i=0;i<9;i++){
- if(path_search(&wpd,md->bl.m,md->bl.x,md->bl.y,bl->x-1+i/3,bl->y-1+i%3,0)!=-1)
- return 1;
- }
- return 0;
-}
-
-/*==========================================
- * Determination for an attack of a monster
- *------------------------------------------
- */
-int mob_target(struct mob_data *md,struct block_list *bl,int dist)
-{
- struct map_session_data *sd;
- struct status_change *sc_data;
- short *option;
- int mode,race;
-
- nullpo_retr(0, md);
- nullpo_retr(0, bl);
-
- sc_data = status_get_sc_data(bl);
- option = status_get_option(bl);
- race=mob_db[md->class_].race;
-
- if(!md->mode)
- mode=mob_db[md->class_].mode;
- else
- mode=md->mode;
-
- if(!(mode&0x80)) {
- md->target_id = 0;
- return 0;
- }
- // Nothing will be carried out if there is no mind of changing TAGE by TAGE ending.
- if( (md->target_id > 0 && md->state.targettype == ATTACKABLE) && (!(mode&0x04) || rand()%100>25) &&
- // if the monster was provoked ignore the above rule [celest]
- !(md->state.provoke_flag && md->state.provoke_flag == bl->id))
- return 0;
-
- if(mode&0x20 || // Coercion is exerted if it is MVPMOB.
- (sc_data && sc_data[SC_TRICKDEAD].timer == -1 && sc_data[SC_BASILICA].timer == -1 &&
- ( (option && !(*option&0x06) ) || race==4 || race==6) ) ) {
- if(bl->type == BL_PC) {
- nullpo_retr(0, sd = (struct map_session_data *)bl);
- if(sd->invincible_timer != -1 || pc_isinvisible(sd))
- return 0;
- if(!(mode&0x20) && race!=4 && race!=6 && sd->state.gangsterparadise)
- return 0;
- }
-
- md->target_id = bl->id; // Since there was no disturbance, it locks on to target.
- if(bl->type == BL_PC || bl->type == BL_MOB)
- md->state.targettype = ATTACKABLE;
- else
- md->state.targettype = NONE_ATTACKABLE;
- if (md->state.provoke_flag)
- md->state.provoke_flag = 0;
- md->min_chase=dist+13;
- if(md->min_chase>26)
- md->min_chase=26;
- }
- return 0;
-}
-
-/*==========================================
- * The ?? routine of an active monster
- *------------------------------------------
- */
-static int mob_ai_sub_hard_activesearch(struct block_list *bl,va_list ap)
-{
- struct map_session_data *tsd=NULL;
- struct mob_data *smd,*tmd=NULL;
- int mode,race,dist,*pcc;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, smd=va_arg(ap,struct mob_data *));
- nullpo_retr(0, pcc=va_arg(ap,int *));
-
- if(bl->type==BL_PC)
- tsd=(struct map_session_data *)bl;
- else if(bl->type==BL_MOB)
- tmd=(struct mob_data *)bl;
- else
- return 0;
-
- //“G–¡•û”»’è
- if(battle_check_target(&smd->bl,bl,BCT_ENEMY)==0)
- return 0;
-
- if(!smd->mode)
- mode=mob_db[smd->class_].mode;
- else
- mode=smd->mode;
-
- // ƒAƒNƒeƒBƒu‚Ń^[ƒQƒbƒgŽË’ö“à‚É‚¢‚é‚È‚çAƒƒbƒN‚·‚é
- if( mode&0x04 ){
- race=mob_db[smd->class_].race;
- //‘ÎÛ‚ªPC‚Ìê‡
- if(tsd &&
- !pc_isdead(tsd) &&
- tsd->bl.m == smd->bl.m &&
- tsd->invincible_timer == -1 &&
- !pc_isinvisible(tsd) &&
- (dist=distance(smd->bl.x,smd->bl.y,tsd->bl.x,tsd->bl.y))<9
- )
- {
- if(mode&0x20 ||
- (tsd->sc_data[SC_TRICKDEAD].timer == -1 && tsd->sc_data[SC_BASILICA].timer == -1 &&
- ((!pc_ishiding(tsd) && !tsd->state.gangsterparadise) || ((race == 4 || race == 6) && !tsd->perfect_hiding) ))){ // –WŠQ‚ª‚È‚¢‚©”»’è
- if( mob_can_reach(smd,bl,12) && // “ž’B‰Â”\«”»’è
- rand()%1000<1000/(++(*pcc)) ){ // ”͈͓àPC‚Å“™Šm—¦‚É‚·‚é
- smd->target_id=tsd->bl.id;
- smd->state.targettype = ATTACKABLE;
- smd->min_chase=13;
- }
- }
- }
- //‘ÎÛ‚ªMob‚Ìê‡
- else if(tmd &&
- tmd->bl.m == smd->bl.m &&
- (dist=distance(smd->bl.x,smd->bl.y,tmd->bl.x,tmd->bl.y))<9
- )
- {
- if( mob_can_reach(smd,bl,12) && // “ž’B‰Â”\«”»’è
- rand()%1000<1000/(++(*pcc)) ){ // ”͈͓à‚Å“™Šm—¦‚É‚·‚é
- smd->target_id=bl->id;
- smd->state.targettype = ATTACKABLE;
- smd->min_chase=13;
- }
- }
- }
- return 0;
-}
-
-/*==========================================
- * loot monster item search
- *------------------------------------------
- */
-static int mob_ai_sub_hard_lootsearch(struct block_list *bl,va_list ap)
-{
- struct mob_data* md;
- int mode,dist,*itc;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, md=va_arg(ap,struct mob_data *));
- nullpo_retr(0, itc=va_arg(ap,int *));
-
- if(!md->mode)
- mode=mob_db[md->class_].mode;
- else
- mode=md->mode;
-
-
- if( !md->target_id && mode&0x02){
- if(!md->lootitem || (battle_config.monster_loot_type == 1 && md->lootitem_count >= LOOTITEM_SIZE) )
- return 0;
- if(bl->m == md->bl.m && (dist=distance(md->bl.x,md->bl.y,bl->x,bl->y))<9){
- if( mob_can_reach(md,bl,12) && // Reachability judging
- rand()%1000<1000/(++(*itc)) ){ // It is made a probability, such as within the limits PC.
- md->target_id=bl->id;
- md->state.targettype = NONE_ATTACKABLE;
- md->min_chase=13;
- }
- }
- }
- return 0;
-}
-
-/*==========================================
- * The ?? routine of a link monster
- *------------------------------------------
- */
-static int mob_ai_sub_hard_linksearch(struct block_list *bl,va_list ap)
-{
- struct mob_data *tmd;
- struct mob_data* md;
- struct block_list *target;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, tmd=(struct mob_data *)bl);
- nullpo_retr(0, md=va_arg(ap,struct mob_data *));
- nullpo_retr(0, target=va_arg(ap,struct block_list *));
-
- // same family free in a range at a link monster -- it will be made to lock if MOB is
-/* if( (md->target_id > 0 && md->state.targettype == ATTACKABLE) && mob_db[md->class_].mode&0x08){
- if( tmd->class_==md->class_ && (!tmd->target_id || md->state.targettype == NONE_ATTACKABLE) && tmd->bl.m == md->bl.m){
- if( mob_can_reach(tmd,target,12) ){ // Reachability judging
- tmd->target_id=md->target_id;
- tmd->state.targettype = ATTACKABLE;
- tmd->min_chase=13;
- }
- }
- }*/
- if( md->attacked_id > 0 && mob_db[md->class_].mode&0x08){
- if( tmd->class_==md->class_ && tmd->bl.m == md->bl.m && (!tmd->target_id || md->state.targettype == NONE_ATTACKABLE)){
- if( mob_can_reach(tmd,target,12) ){ // Reachability judging
- tmd->target_id=md->attacked_id;
- tmd->state.targettype = ATTACKABLE;
- tmd->min_chase=13;
- }
- }
- }
-
- return 0;
-}
-/*==========================================
- * Processing of slave monsters
- *------------------------------------------
- */
-static int mob_ai_sub_hard_slavemob(struct mob_data *md,unsigned int tick)
-{
- struct mob_data *mmd=NULL;
- struct block_list *bl;
- int mode,race,old_dist;
-
- nullpo_retr(0, md);
-
- if((bl=map_id2bl(md->master_id)) != NULL )
- mmd=(struct mob_data *)bl;
-
- mode=mob_db[md->class_].mode;
-
- // It is not main monster/leader.
- if(!mmd || mmd->bl.type!=BL_MOB || mmd->bl.id!=md->master_id)
- return 0;
-
- // ŒÄ‚Ñ–ß‚µ
- if(mmd->recall_flag == 1){
- if (mmd->recallcount < (mmd->recallmob_count+2) ){
- mob_warp(md,-1,mmd->bl.x,mmd->bl.y,3);
- mmd->recallcount += 1;
- } else{
- mmd->recall_flag = 0;
- mmd->recallcount=0;
- }
- md->state.master_check = 1;
- return 0;
- }
- // Since it is in the map on which the master is not, teleport is carried out and it pursues.
- if( mmd->bl.m != md->bl.m ){
- mob_warp(md,mmd->bl.m,mmd->bl.x,mmd->bl.y,3);
- md->state.master_check = 1;
- return 0;
- }
-
- // Distance with between slave and master is measured.
- old_dist=md->master_dist;
- md->master_dist=distance(md->bl.x,md->bl.y,mmd->bl.x,mmd->bl.y);
-
- // Since the master was in near immediately before, teleport is carried out and it pursues.
- if( old_dist<10 && md->master_dist>18){
- mob_warp(md,-1,mmd->bl.x,mmd->bl.y,3);
- md->state.master_check = 1;
- return 0;
- }
-
- // Although there is the master, since it is somewhat far, it approaches.
- if((!md->target_id || md->state.targettype == NONE_ATTACKABLE) && mob_can_move(md) &&
- (md->walkpath.path_pos>=md->walkpath.path_len || md->walkpath.path_len==0) && md->master_dist<15){
- int i=0,dx,dy,ret;
- if(md->master_dist>4) {
- do {
- if(i<=5){
- dx=mmd->bl.x - md->bl.x;
- dy=mmd->bl.y - md->bl.y;
- if(dx<0) dx+=(rand()%( (dx<-3)?3:-dx )+1);
- else if(dx>0) dx-=(rand()%( (dx>3)?3:dx )+1);
- if(dy<0) dy+=(rand()%( (dy<-3)?3:-dy )+1);
- else if(dy>0) dy-=(rand()%( (dy>3)?3:dy )+1);
- }else{
- dx=mmd->bl.x - md->bl.x + rand()%7 - 3;
- dy=mmd->bl.y - md->bl.y + rand()%7 - 3;
- }
-
- ret=mob_walktoxy(md,md->bl.x+dx,md->bl.y+dy,0);
- i++;
- } while(ret && i<10);
- }
- else {
- do {
- dx = rand()%9 - 5;
- dy = rand()%9 - 5;
- if( dx == 0 && dy == 0) {
- dx = (rand()%1)? 1:-1;
- dy = (rand()%1)? 1:-1;
- }
- dx += mmd->bl.x;
- dy += mmd->bl.y;
-
- ret=mob_walktoxy(md,mmd->bl.x+dx,mmd->bl.y+dy,0);
- i++;
- } while(ret && i<10);
- }
-
- md->next_walktime=tick+500;
- md->state.master_check = 1;
- }
-
- // There is the master, the master locks a target and he does not lock.
- if( (mmd->target_id>0 && mmd->state.targettype == ATTACKABLE) && (!md->target_id || md->state.targettype == NONE_ATTACKABLE) ){
- struct map_session_data *sd=map_id2sd(mmd->target_id);
- if(sd!=NULL && !pc_isdead(sd) && sd->invincible_timer == -1 && !pc_isinvisible(sd)){
-
- race=mob_db[md->class_].race;
- if(mode&0x20 ||
- (sd->sc_data[SC_TRICKDEAD].timer == -1 && sd->sc_data[SC_BASILICA].timer == -1 &&
- ( (!pc_ishiding(sd) && !sd->state.gangsterparadise) || ((race == 4 || race == 6) && !sd->perfect_hiding) ) ) ){ // –WŠQ‚ª‚È‚¢‚©”»’è
-
- md->target_id=sd->bl.id;
- md->state.targettype = ATTACKABLE;
- md->min_chase=5+distance(md->bl.x,md->bl.y,sd->bl.x,sd->bl.y);
- md->state.master_check = 1;
- }
- }
- }
-
- // There is the master, the master locks a target and he does not lock.
-/* if( (md->target_id>0 && mmd->state.targettype == ATTACKABLE) && (!mmd->target_id || mmd->state.targettype == NONE_ATTACKABLE) ){
- struct map_session_data *sd=map_id2sd(md->target_id);
- if(sd!=NULL && !pc_isdead(sd) && sd->invincible_timer == -1 && !pc_isinvisible(sd)){
-
- race=mob_db[mmd->class_].race;
- if(mode&0x20 ||
- (sd->sc_data[SC_TRICKDEAD].timer == -1 &&
- (!(sd->status.option&0x06) || race==4 || race==6)
- ) ){ // It judges whether there is any disturbance.
-
- mmd->target_id=sd->bl.id;
- mmd->state.targettype = ATTACKABLE;
- mmd->min_chase=5+distance(mmd->bl.x,mmd->bl.y,sd->bl.x,sd->bl.y);
- }
- }
- }*/
-
- return 0;
-}
-
-/*==========================================
- * A lock of target is stopped and mob moves to a standby state.
- *------------------------------------------
- */
-static int mob_unlocktarget(struct mob_data *md,int tick)
-{
- nullpo_retr(0, md);
-
- md->target_id=0;
- md->state.targettype = NONE_ATTACKABLE;
- md->state.skillstate=MSS_IDLE;
- md->next_walktime=tick+rand()%3000+3000;
- return 0;
-}
-/*==========================================
- * Random walk
- *------------------------------------------
- */
-static int mob_randomwalk(struct mob_data *md,int tick)
-{
- const int retrycount=20;
- int speed;
-
- nullpo_retr(0, md);
-
- speed=status_get_speed(&md->bl);
- if(DIFF_TICK(md->next_walktime,tick)<0){
- int i,x,y,c,d=12-md->move_fail_count;
- int mask[8][2] = {{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1}};
- if(d<5) d=5;
- for(i=0;i<retrycount;i++){ // Search of a movable place
- int r=rand();
- x=r%(d*2+1)-d;
- y=r/(d*2+1)%(d*2+1)-d;
- if (md->target_dir){
- if (x<0) x=0-x;
- if (y<0) y=0-y;
- x *= mask[md->target_dir-1][0];
- y *= mask[md->target_dir-1][1];
- }
- x+=md->bl.x;
- y+=md->bl.y;
-
- if((map_getcell(md->bl.m,x,y,CELL_CHKPASS)) && mob_walktoxy(md,x,y,1)==0){
- md->move_fail_count=0;
- break;
- }
- if(i+1>=retrycount){
- md->move_fail_count++;
- md->target_dir = 0;
- if(md->move_fail_count>1000){
- if(battle_config.error_log)
- printf("MOB cant move. random spawn %d, class = %d\n",md->bl.id,md->class_);
- md->move_fail_count=0;
- mob_spawn(md->bl.id);
- }
- }
- }
- for(i=c=0;i<md->walkpath.path_len;i++){ // The next walk start time is calculated.
- if(md->walkpath.path[i]&1)
- c+=speed*14/10;
- else
- c+=speed;
- }
- md->next_walktime = tick+rand()%3000+3000+c;
- md->state.skillstate=MSS_WALK;
- return 1;
- }
- return 0;
-}
-
-/*==========================================
- * AI of MOB whose is near a Player
- *------------------------------------------
- */
-static int mob_ai_sub_hard(struct block_list *bl,va_list ap)
-{
- struct mob_data *md,*tmd=NULL;
- struct map_session_data *tsd=NULL;
- struct block_list *tbl=NULL;
- struct flooritem_data *fitem;
- unsigned int tick;
- int i,dx,dy,ret,dist;
- int attack_type=0;
- int mode,race;
- int search_size = AREA_SIZE*2;
- int blind_flag = 0;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, md=(struct mob_data*)bl);
-
- tick=va_arg(ap,unsigned int);
-
- if(DIFF_TICK(tick,md->last_thinktime)<MIN_MOBTHINKTIME)
- return 0;
- md->last_thinktime=tick;
-
- if( md->skilltimer!=-1 || md->bl.prev==NULL ){ // Under a skill aria and death
- if(DIFF_TICK(tick,md->next_walktime)>MIN_MOBTHINKTIME)
- md->next_walktime=tick;
- return 0;
- }
-
- if(!md->mode)
- mode=mob_db[md->class_].mode;
- else
- mode=md->mode;
-
- race=mob_db[md->class_].race;
-
- // Abnormalities
- if((md->opt1 > 0 && md->opt1 != 6) || md->state.state==MS_DELAY || md->sc_data[SC_BLADESTOP].timer != -1)
- return 0;
-
- if (md->sc_data && md->sc_data[SC_BLIND].timer != -1)
- blind_flag = 1;
-
- if(!(mode&0x80) && md->target_id > 0)
- md->target_id = 0;
-
- if(md->attacked_id > 0 && mode&0x08){ // Link monster
- struct map_session_data *asd=map_id2sd(md->attacked_id);
- if(asd){
- if(asd->invincible_timer == -1 && !pc_isinvisible(asd)){
- map_foreachinarea(mob_ai_sub_hard_linksearch,md->bl.m,
- md->bl.x-13,md->bl.y-13,
- md->bl.x+13,md->bl.y+13,
- BL_MOB,md,&asd->bl);
- }
- }
- }
-
- // It checks to see it was attacked first (if active, it is target change at 25% of probability).
- if( mode>0 && md->attacked_id>0 && (!md->target_id || md->state.targettype == NONE_ATTACKABLE
- || (mode&0x04 && rand()%100<25 ) ) ){
- struct block_list *abl=map_id2bl(md->attacked_id);
- struct map_session_data *asd=NULL;
- if(abl){
- if(abl->type==BL_PC)
- asd=(struct map_session_data *)abl;
- if(asd==NULL || md->bl.m != abl->m || abl->prev == NULL || asd->invincible_timer != -1 || pc_isinvisible(asd) ||
- (dist=distance(md->bl.x,md->bl.y,abl->x,abl->y))>=32 || battle_check_target(bl,abl,BCT_ENEMY)==0 ||
- (blind_flag && dist>3))
- md->attacked_id=0;
- else {
- //‹——£‚ª‰“‚¢ê‡‚̓^ƒQ‚ð•ÏX‚µ‚È‚¢
-
- if (!md->target_id || (distance(md->bl.x,md->bl.y,abl->x,abl->y)<3)) {
- md->target_id=md->attacked_id; // set target
- md->state.targettype = ATTACKABLE;
- attack_type = 1;
- md->attacked_id=0;
- md->min_chase=dist+13;
- if(md->min_chase>26)
- md->min_chase=26;
- }
- }
- }
- }
-
- md->state.master_check = 0;
- // Processing of slave monster
- if( md->master_id > 0 && md->state.special_mob_ai==0)
- mob_ai_sub_hard_slavemob(md,tick);
-
- // ƒAƒNƒeƒBƒ”ƒ‚ƒ“ƒXƒ^[‚Ìô“G (?? of a bitter taste TIVU monster)
- if( (!md->target_id || md->state.targettype == NONE_ATTACKABLE) && mode&0x04 && !md->state.master_check &&
- battle_config.monster_active_enable){
- i=0;
- search_size = (blind_flag) ? 3 : AREA_SIZE*2;
- if(md->state.special_mob_ai){
- map_foreachinarea(mob_ai_sub_hard_activesearch,md->bl.m,
- md->bl.x-search_size,md->bl.y-search_size,
- md->bl.x+search_size,md->bl.y+search_size,
- 0,md,&i);
- }else{
- map_foreachinarea(mob_ai_sub_hard_activesearch,md->bl.m,
- md->bl.x-search_size,md->bl.y-search_size,
- md->bl.x+search_size,md->bl.y+search_size,
- BL_PC,md,&i);
- }
- }
-
- // The item search of a route monster
- if( !md->target_id && mode&0x02 && !md->state.master_check){
- i=0;
- search_size = (blind_flag) ? 3 : AREA_SIZE*2;
- map_foreachinarea(mob_ai_sub_hard_lootsearch,md->bl.m,
- md->bl.x-search_size,md->bl.y-search_size,
- md->bl.x+search_size,md->bl.y+search_size,
- BL_ITEM,md,&i);
- }
-
- // It will attack, if the candidate for an attack is.
- if(md->target_id > 0){
- if((tbl=map_id2bl(md->target_id))){
- if(tbl->type==BL_PC)
- tsd=(struct map_session_data *)tbl;
- else if(tbl->type==BL_MOB)
- tmd=(struct mob_data *)tbl;
- if(tsd || tmd) {
- if(tbl->m != md->bl.m || tbl->prev == NULL || (dist=distance(md->bl.x,md->bl.y,tbl->x,tbl->y)) >= search_size || (blind_flag && dist>3))
- mob_unlocktarget(md,tick); // •Êƒ}ƒbƒv‚©AŽ‹ŠEŠO
- else if( tsd && !(mode&0x20) && (tsd->sc_data[SC_TRICKDEAD].timer != -1 || tsd->sc_data[SC_BASILICA].timer != -1 ||
- ((pc_ishiding(tsd) || tsd->state.gangsterparadise) &&
- !((race == 4 || race == 6) && !tsd->perfect_hiding) )) )
- mob_unlocktarget(md,tick); // ƒXƒLƒ‹‚È‚Ç‚É‚æ‚éô“G–WŠQ
- else if(!battle_check_range(&md->bl,tbl,mob_db[md->class_].range)){
- // UŒ‚”͈͊O‚Ȃ̂ňړ®
- if(!(mode&1)){ // ˆÚ“®‚µ‚È‚¢ƒ‚[ƒh
- mob_unlocktarget(md,tick);
- return 0;
- }
- if( !mob_can_move(md) ) // “®‚¯‚È‚¢ó‘Ô‚É‚ ‚é
- return 0;
- md->state.skillstate=MSS_CHASE; // “ËŒ‚ŽžƒXƒLƒ‹
- mobskill_use(md,tick,-1);
-// if(md->timer != -1 && (DIFF_TICK(md->next_walktime,tick)<0 || distance(md->to_x,md->to_y,tsd->bl.x,tsd->bl.y)<2) )
- if(md->timer != -1 && md->state.state!=MS_ATTACK && (DIFF_TICK(md->next_walktime,tick)<0 || distance(md->to_x,md->to_y,tbl->x,tbl->y)<2) )
- return 0; // Šù‚Ɉړ®’†
- search_size = (blind_flag) ? 3 :
- ((md->min_chase > 13) ? md->min_chase : 13);
- if(!mob_can_reach(md,tbl, search_size))
- mob_unlocktarget(md,tick); // ˆÚ“®‚Å‚«‚È‚¢‚̂Ń^ƒQ‰ðœiIW‚Æ‚©Hj
- else {
- // ’ÇÕ
- md->next_walktime=tick+500;
- i=0;
- do {
- if(i==0){ // ʼn‚ÍAEGIS‚Æ“¯‚¶•û–@‚ÅŒŸõ
- dx=tbl->x - md->bl.x;
- dy=tbl->y - md->bl.y;
- if(dx<0) dx++;
- else if(dx>0) dx--;
- if(dy<0) dy++;
- else if(dy>0) dy--;
- }else{ // ‚¾‚ß‚È‚çAthenaŽ®(ƒ‰ƒ“ƒ_ƒ€)
- dx=tbl->x - md->bl.x + rand()%3 - 1;
- dy=tbl->y - md->bl.y + rand()%3 - 1;
- }
- /* if(path_search(&md->walkpath,md->bl.m,md->bl.x,md->bl.y,md->bl.x+dx,md->bl.y+dy,0)){
- dx=tsd->bl.x - md->bl.x;
- dy=tsd->bl.y - md->bl.y;
- if(dx<0) dx--;
- else if(dx>0) dx++;
- if(dy<0) dy--;
- else if(dy>0) dy++;
- }*/
- ret=mob_walktoxy(md,md->bl.x+dx,md->bl.y+dy,0);
- i++;
- } while(ret && i<5);
-
- if(ret){ // ˆÚ“®•s‰Â”\‚ÈŠ‚©‚ç‚ÌUŒ‚‚È‚ç2•à‰º‚é
- if(dx<0) dx=2;
- else if(dx>0) dx=-2;
- if(dy<0) dy=2;
- else if(dy>0) dy=-2;
- mob_walktoxy(md,md->bl.x+dx,md->bl.y+dy,0);
- }
- }
- } else { // UŒ‚ŽË’ö”͈͓à
- md->state.skillstate=MSS_ATTACK;
- if(md->state.state==MS_WALK)
- mob_stop_walking(md,1); // •às’†‚È‚ç’âŽ~
- if(md->state.state==MS_ATTACK)
- return 0; // Šù‚ÉUŒ‚’†
- mob_changestate(md,MS_ATTACK,attack_type);
- }
- return 0;
- } else { // ƒ‹[ƒgƒ‚ƒ“ƒXƒ^[ˆ—
- if(tbl == NULL || tbl->type != BL_ITEM ||tbl->m != md->bl.m ||
- (dist=distance(md->bl.x,md->bl.y,tbl->x,tbl->y))>=md->min_chase || !md->lootitem |
- (blind_flag && dist>=4)){
- // ‰“‚·‚¬‚é‚©ƒAƒCƒeƒ€‚ª‚È‚­‚È‚Á‚½
- mob_unlocktarget(md,tick);
- if(md->state.state==MS_WALK)
- mob_stop_walking(md,1); // •às’†‚È‚ç’âŽ~
- } else if(dist) {
- if(!(mode&1)){ // ˆÚ“®‚µ‚È‚¢ƒ‚[ƒh
- mob_unlocktarget(md,tick);
- return 0;
- }
- if( !mob_can_move(md) ) // “®‚¯‚È‚¢ó‘Ô‚É‚ ‚é
- return 0;
- md->state.skillstate=MSS_LOOT; // ƒ‹[ƒgŽžƒXƒLƒ‹Žg—p
- mobskill_use(md,tick,-1);
-// if(md->timer != -1 && (DIFF_TICK(md->next_walktime,tick)<0 || distance(md->to_x,md->to_y,tbl->x,tbl->y)<2) )
- if(md->timer != -1 && md->state.state!=MS_ATTACK && (DIFF_TICK(md->next_walktime,tick)<0 || distance(md->to_x,md->to_y,tbl->x,tbl->y) <= 0))
- return 0; // Šù‚Ɉړ®’†
- md->next_walktime=tick+500;
- dx=tbl->x - md->bl.x;
- dy=tbl->y - md->bl.y;
-/* if(path_search(&md->walkpath,md->bl.m,md->bl.x,md->bl.y,md->bl.x+dx,md->bl.y+dy,0)){
- dx=tbl->x - md->bl.x;
- dy=tbl->y - md->bl.y;
- }*/
- ret=mob_walktoxy(md,md->bl.x+dx,md->bl.y+dy,0);
- if(ret)
- mob_unlocktarget(md,tick);// ˆÚ“®‚Å‚«‚È‚¢‚̂Ń^ƒQ‰ðœiIW‚Æ‚©Hj
- }else{ // ƒAƒCƒeƒ€‚Ü‚Å‚½‚Ç‚è’…‚¢‚½
- if(md->state.state==MS_ATTACK)
- return 0; // UŒ‚’†
- if(md->state.state==MS_WALK)
- mob_stop_walking(md,1); // •às’†‚È‚ç’âŽ~
- fitem = (struct flooritem_data *)tbl;
- if(md->lootitem_count < LOOTITEM_SIZE)
- memcpy(&md->lootitem[md->lootitem_count++],&fitem->item_data,sizeof(md->lootitem[0]));
- else if(battle_config.monster_loot_type == 1 && md->lootitem_count >= LOOTITEM_SIZE) {
- mob_unlocktarget(md,tick);
- return 0;
- }
- else {
- if(md->lootitem[0].card[0] == (short)0xff00)
- intif_delete_petdata(*((long *)(&md->lootitem[0].card[1])));
- for(i=0;i<LOOTITEM_SIZE-1;i++)
- memcpy(&md->lootitem[i],&md->lootitem[i+1],sizeof(md->lootitem[0]));
- memcpy(&md->lootitem[LOOTITEM_SIZE-1],&fitem->item_data,sizeof(md->lootitem[0]));
- }
- map_clearflooritem(tbl->id);
- mob_unlocktarget(md,tick);
- }
- return 0;
- }
- }else{
- mob_unlocktarget(md,tick);
- if(md->state.state==MS_WALK)
- mob_stop_walking(md,4); // •às’†‚È‚ç’âŽ~
- return 0;
- }
- }
-
- // It is skill use at the time of /standby at the time of a walk.
- if( mobskill_use(md,tick,-1) )
- return 0;
-
- // •àsˆ—
- if( mode&1 && mob_can_move(md) && // ˆÚ“®‰Â”\MOB&“®‚¯‚éó‘Ô‚É‚ ‚é
- (md->master_id==0 || md->state.special_mob_ai || md->master_dist>10) ){ //Žæ‚芪‚«MOB‚¶‚á‚È‚¢
-
- if( DIFF_TICK(md->next_walktime,tick) > + 7000 &&
- (md->walkpath.path_len==0 || md->walkpath.path_pos>=md->walkpath.path_len) ){
- md->next_walktime = tick + 3000*rand()%2000;
- }
-
- // Random movement
- if( mob_randomwalk(md,tick) )
- return 0;
- }
-
- // Since he has finished walking, it stands by.
- if( md->walkpath.path_len==0 || md->walkpath.path_pos>=md->walkpath.path_len )
- md->state.skillstate=MSS_IDLE;
- return 0;
-}
-
-/*==========================================
- * Serious processing for mob in PC field of view (foreachclient)
- *------------------------------------------
- */
-static int mob_ai_sub_foreachclient(struct map_session_data *sd,va_list ap)
-{
- unsigned int tick;
- nullpo_retr(0, sd);
- nullpo_retr(0, ap);
-
- tick=va_arg(ap,unsigned int);
- map_foreachinarea(mob_ai_sub_hard,sd->bl.m,
- sd->bl.x-AREA_SIZE*2,sd->bl.y-AREA_SIZE*2,
- sd->bl.x+AREA_SIZE*2,sd->bl.y+AREA_SIZE*2,
- BL_MOB,tick);
-
- return 0;
-}
-
-/*==========================================
- * Serious processing for mob in PC field of view (interval timer function)
- *------------------------------------------
- */
-static int mob_ai_hard(int tid,unsigned int tick,int id,int data)
-{
- clif_foreachclient(mob_ai_sub_foreachclient,tick);
-
- return 0;
-}
-
-/*==========================================
- * Negligent mode MOB AI (PC is not in near)
- *------------------------------------------
- */
-static int mob_ai_sub_lazy(void * key,void * data,va_list app)
-{
- struct mob_data *md=(struct mob_data *)data;
- struct mob_data *mmd=NULL;
- unsigned int tick;
- va_list ap;
-
- nullpo_retr(0, md);
- nullpo_retr(0, app);
- nullpo_retr(0, ap=va_arg(app,va_list));
-
- if(md->bl.type!=BL_MOB)
- return 0;
-
- if (md->master_id > 0) {
- mmd = (struct mob_data *)map_id2bl(md->master_id); //Ž©•ª‚ÌBOSS‚Ìî•ñ
- }
-
- tick=va_arg(ap,unsigned int);
-
- if(DIFF_TICK(tick,md->last_thinktime)<MIN_MOBTHINKTIME*10)
- return 0;
- md->last_thinktime=tick;
-
- if(md->bl.prev==NULL || md->skilltimer!=-1){
- if(DIFF_TICK(tick,md->next_walktime)>MIN_MOBTHINKTIME*10)
- md->next_walktime=tick;
- return 0;
- }
-
- // Žæ‚芪‚«ƒ‚ƒ“ƒXƒ^[‚̈—iŒÄ‚Ñ–ß‚µ‚³‚ꂽŽžj
- if(mmd && md->state.special_mob_ai == 0 && mmd->recall_flag == 1) {
- mob_ai_sub_hard_slavemob (md,tick);
- return 0;
- }
-
- if(DIFF_TICK(md->next_walktime,tick)<0 &&
- (mob_db[md->class_].mode&1) && mob_can_move(md) ){
-
- if( map[md->bl.m].users>0 ){
- // Since PC is in the same map, somewhat better negligent processing is carried out.
-
- // It sometimes moves.
- if(rand()%1000<MOB_LAZYMOVEPERC)
- mob_randomwalk(md,tick);
-
- // MOB which is not not the summons MOB but BOSS, either sometimes reboils.
- else if( rand()%1000<MOB_LAZYWARPPERC && md->x0<=0 && md->master_id!=0 &&
- mob_db[md->class_].mexp <= 0 && !(mob_db[md->class_].mode & 0x20))
- mob_spawn(md->bl.id);
-
- }else{
- // Since PC is not even in the same map, suitable processing is carried out even if it takes.
-
- // MOB which is not BOSS which is not Summons MOB, either -- a case -- sometimes -- leaping
- if( rand()%1000<MOB_LAZYWARPPERC && md->x0<=0 && md->master_id!=0 &&
- mob_db[md->class_].mexp <= 0 && !(mob_db[md->class_].mode & 0x20))
- mob_warp(md,-1,-1,-1,-1);
- }
-
- md->next_walktime = tick+rand()%10000+5000;
- }
- return 0;
-}
-
-/*==========================================
- * Negligent processing for mob outside PC field of view (interval timer function)
- *------------------------------------------
- */
-static int mob_ai_lazy(int tid,unsigned int tick,int id,int data)
-{
- map_foreachiddb(mob_ai_sub_lazy,tick);
-
- return 0;
-}
-
-
-/*==========================================
- * The structure object for item drop with delay
- * Since it is only two being able to pass [ int ] a timer function
- * Data is put in and passed to this structure object.
- *------------------------------------------
- */
-struct delay_item_drop {
- int m,x,y;
- int nameid,amount;
- struct map_session_data *first_sd,*second_sd,*third_sd;
-};
-
-struct delay_item_drop2 {
- int m,x,y;
- struct item item_data;
- struct map_session_data *first_sd,*second_sd,*third_sd;
-};
-
-/*==========================================
- * item drop with delay (timer function)
- *------------------------------------------
- */
-static int mob_delay_item_drop(int tid,unsigned int tick,int id,int data)
-{
- struct delay_item_drop *ditem;
- struct item temp_item;
- int flag, drop_flag = 1;
-
- nullpo_retr(0, ditem=(struct delay_item_drop *)id);
-
- memset(&temp_item,0,sizeof(temp_item));
- temp_item.nameid = ditem->nameid;
- temp_item.amount = ditem->amount;
- temp_item.identify = !itemdb_isequip3(temp_item.nameid);
-
- if (ditem->first_sd){
- #if 0
- if (ditem->first_sd->status.party_id > 0){
- struct party *p;
- if((p=party_search(ditem->first_sd->status.party_id)) && p->item){
- struct map_session_data *sd = NULL;
- int i;
- for (i = p->itemc + 1; i!=p->itemc; i++) { // initialise counter and loop through the party
- if (i >= MAX_PARTY)
- i = 0; // reset counter to 1st person in party so it'll stop when it reaches "itemc"
- if ((sd=p->member[i].sd)!=NULL && sd->bl.m == ditem->first_sd->bl.m)
- break;
- }
- if (sd){ // if an appropiate party member was found
- drop_flag = 0;
- if ((p->itemc++) >= MAX_PARTY)
- p->itemc = 0;
- if ((flag = pc_additem(ditem->first_sd,&temp_item,ditem->amount))) {
- clif_additem(ditem->first_sd,0,0,flag);
- drop_flag = 1;
- }
- }
- }
- } else
- #endif
- if(battle_config.item_auto_get || ditem->first_sd->autoloot){//Autoloot added by Upa-Kun
- drop_flag = 0;
- if((flag = pc_additem(ditem->first_sd,&temp_item,ditem->amount))){
- clif_additem(ditem->first_sd,0,0,flag);
- drop_flag = 1;
- }
- }
- }
-
- if (drop_flag) {
- map_addflooritem(&temp_item,1,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0);
- }
-
- aFree(ditem);
- return 0;
-}
-
-/*==========================================
- * item drop (timer function)-lootitem with delay
- *------------------------------------------
- */
-static int mob_delay_item_drop2(int tid,unsigned int tick,int id,int data)
-{
- struct delay_item_drop2 *ditem;
- int flag, drop_flag = 1;
-
- nullpo_retr(0, ditem=(struct delay_item_drop2 *)id);
-
- if (ditem->first_sd){
- #if 0
- if (ditem->first_sd->status.party_id > 0){
- struct party *p;
- if((p=party_search(ditem->first_sd->status.party_id)) && p->item){
- struct map_session_data *sd = NULL;
- int i;
- for (i = p->itemc + 1; i!=p->itemc; i++) { // initialise counter and loop through the party
- if (i >= MAX_PARTY)
- i = 0; // reset counter to 1st person in party so it'll stop when it reaches "itemc"
- if ((sd=p->member[i].sd)!=NULL && sd->bl.m == ditem->first_sd->bl.m)
- break;
- }
- if (sd){ // if an appropiate party member was found
- drop_flag = 0;
- if ((p->itemc++) >= MAX_PARTY)
- p->itemc = 0;
- if((flag = pc_additem(ditem->first_sd,&ditem->item_data,ditem->item_data.amount))){
- clif_additem(ditem->first_sd,0,0,flag);
- drop_flag = 1;
- }
- }
- }
- } else
- #endif
- if(battle_config.item_auto_get || ditem->first_sd->autoloot){//Autoloot added by Upa-Kun
- drop_flag = 0;
- if((flag = pc_additem(ditem->first_sd,&ditem->item_data,ditem->item_data.amount))){
- clif_additem(ditem->first_sd,0,0,flag);
- drop_flag = 1;
- }
- }
- }
-
- if (drop_flag) {
- map_addflooritem(&ditem->item_data,ditem->item_data.amount,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0);
- }
-
- aFree(ditem);
- return 0;
-}
-
-/*==========================================
- * mob data is erased.
- *------------------------------------------
- */
-void mob_unload(struct mob_data *md)
-{
- nullpo_retv(md);
- mob_remove_map(md, 0);
- map_deliddb(&md->bl);
- aFree(md);
- md = NULL;
-}
-int mob_remove_map(struct mob_data *md, int type)
-{
- nullpo_retr(1, md);
-
- if(md->bl.prev == NULL)
- return 1;
- mob_changestate(md,MS_DEAD,0);
- clif_clearchar_area(&md->bl,type);
- map_delblock(&md->bl);
- if (md->lootitem){
- aFree(md->lootitem);
- md->lootitem = NULL;
- }
-
- return 0;
-}
-int mob_delete(struct mob_data *md)
-{
- nullpo_retr(1, md);
-
- mob_remove_map(md, 1);
- if (mob_get_viewclass(md->class_) <= 1000)
- clif_clearchar_delay(gettick()+3000,&md->bl,0);
- mob_deleteslave(md);
- mob_setdelayspawn(md->bl.id);
- return 0;
-}
-int mob_timer_delete(int tid, unsigned int tick, int id, int data)
-{
- struct mob_data *md=(struct mob_data *)map_id2bl(id);
- nullpo_retr(0, md);
-
-//for Alchemist CANNIBALIZE [Lupus]
- mob_remove_map(md, 3);
- mob_setdelayspawn(md->bl.id);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int mob_deleteslave_sub(struct block_list *bl,va_list ap)
-{
- struct mob_data *md;
- int id;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, md = (struct mob_data *)bl);
-
- id=va_arg(ap,int);
- if(md->master_id > 0 && md->master_id == id )
- mob_damage(NULL,md,md->hp,1);
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int mob_deleteslave(struct mob_data *md)
-{
- nullpo_retr(0, md);
-
- map_foreachinarea(mob_deleteslave_sub, md->bl.m,
- 0,0,map[md->bl.m].xs,map[md->bl.m].ys,
- BL_MOB,md->bl.id);
- return 0;
-}
-
-/*==========================================
- * It is the damage of sd to damage to md.
- *------------------------------------------
- */
-int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type)
-{
- int i,count,minpos,mindmg;
- struct map_session_data *sd = NULL,*tmpsd[DAMAGELOG_SIZE];
- struct {
- struct party *p;
- int id,base_exp,job_exp,zeny;
- } pt[DAMAGELOG_SIZE];
- int pnum=0;
- int mvp_damage,max_hp;
- unsigned int tick = gettick();
- struct map_session_data *mvp_sd = NULL, *second_sd = NULL,*third_sd = NULL;
- struct block_list *master = NULL;
- double tdmg,temp;
- struct item item;
- int ret;
- int drop_rate;
- int race;
-
- nullpo_retr(0, md); //src‚ÍNULL‚ŌĂ΂ê‚éê‡‚à‚ ‚é‚Ì‚ÅA‘¼‚Ń`ƒFƒbƒN
-
- max_hp = status_get_max_hp(&md->bl);
- race = status_get_race(&md->bl);
-
- if(src && src->type == BL_PC) {
- sd = (struct map_session_data *)src;
- mvp_sd = sd;
- }
-
-// if(battle_config.battle_log)
-// printf("mob_damage %d %d %d\n",md->hp,max_hp,damage);
- if(md->bl.prev==NULL){
- if(battle_config.error_log==1)
- printf("mob_damage : BlockError!!\n");
- return 0;
- }
-
- if(md->state.state==MS_DEAD || md->hp<=0) {
- if(md->bl.prev != NULL) {
- mob_changestate(md,MS_DEAD,0);
- mobskill_use(md,tick,-1); // It is skill at the time of death.
- clif_clearchar_area(&md->bl,1);
- map_delblock(&md->bl);
- mob_setdelayspawn(md->bl.id);
- }
- return 0;
- }
-
- if(battle_config.monster_damage_delay && md->sc_data[SC_ENDURE].timer == -1)
- mob_stop_walking(md,3);
- if(damage > max_hp>>2)
- skill_stop_dancing(&md->bl,0);
-
- if(md->hp > max_hp)
- md->hp = max_hp;
-
- // The amount of overkill rounds to hp.
- if(damage>md->hp)
- damage=md->hp;
-
- if(!(type&2)) {
- if(sd!=NULL){
- for(i=0,minpos=0,mindmg=0x7fffffff;i<DAMAGELOG_SIZE;i++){
- //if(md->dmglog[i].id==sd->bl.id)
- if(md->dmglog[i].id==sd->status.char_id)
- break;
- if(md->dmglog[i].id==0){
- minpos=i;
- mindmg=0;
- }
- else if(md->dmglog[i].dmg<mindmg){
- minpos=i;
- mindmg=md->dmglog[i].dmg;
- }
- }
- if(i<DAMAGELOG_SIZE)
- md->dmglog[i].dmg+=damage;
- else {
- //md->dmglog[minpos].id=sd->bl.id;
- md->dmglog[minpos].id=sd->status.char_id;
- md->dmglog[minpos].dmg=damage;
- }
-
- if(md->attacked_id <= 0 && md->state.special_mob_ai==0)
- md->attacked_id = sd->bl.id;
- }
- if(src && src->type == BL_PET && battle_config.pet_attack_exp_to_master==1) {
- struct pet_data *pd = (struct pet_data *)src;
- nullpo_retr(0, pd);
- for(i=0,minpos=0,mindmg=0x7fffffff;i<DAMAGELOG_SIZE;i++){
- //if(md->dmglog[i].id==pd->msd->bl.id)
- if(md->dmglog[i].id==pd->msd->status.char_id)
- break;
- if(md->dmglog[i].id==0){
- minpos=i;
- mindmg=0;
- }
- else if(md->dmglog[i].dmg<mindmg){
- minpos=i;
- mindmg=md->dmglog[i].dmg;
- }
- }
- if(i<DAMAGELOG_SIZE)
- md->dmglog[i].dmg+=(damage*battle_config.pet_attack_exp_rate)/100;
- else {
- //md->dmglog[minpos].id=pd->msd->bl.id;
- md->dmglog[minpos].id=pd->msd->status.char_id;
- md->dmglog[minpos].dmg=(damage*battle_config.pet_attack_exp_rate)/100;
- }
- }
- if(src && src->type == BL_MOB && ((struct mob_data*)src)->state.special_mob_ai){
- struct mob_data *md2 = (struct mob_data *)src;
- nullpo_retr(0, md2);
- for(i=0,minpos=0,mindmg=0x7fffffff;i<DAMAGELOG_SIZE;i++){
- if(md->dmglog[i].id==md2->master_id)
- break;
- if(md->dmglog[i].id==0){
- minpos=i;
- mindmg=0;
- }
- else if(md->dmglog[i].dmg<mindmg){
- minpos=i;
- mindmg=md->dmglog[i].dmg;
- }
- }
- if(i<DAMAGELOG_SIZE)
- md->dmglog[i].dmg+=damage;
- else {
- md->dmglog[minpos].id=md2->master_id;
- md->dmglog[minpos].dmg=damage;
-
- if(md->attacked_id <= 0 && md->state.special_mob_ai==0)
- md->attacked_id = md2->master_id;
- }
- }
-
- }
-
- md->hp-=damage;
-
- if(md->class_ >= 1285 && md->class_ <=1287) { // guardian hp update [Valaris]
- struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name);
- if(gc) {
-
- if(md->bl.id==gc->GID0) {
- gc->Ghp0=md->hp;
- if(gc->Ghp0<=0) {
- guild_castledatasave(gc->castle_id,10,0);
- guild_castledatasave(gc->castle_id,18,0);
- }
- }
- if(md->bl.id==gc->GID1) {
- gc->Ghp1=md->hp;
- if(gc->Ghp1<=0) {
- guild_castledatasave(gc->castle_id,11,0);
- guild_castledatasave(gc->castle_id,19,0);
- }
- }
- if(md->bl.id==gc->GID2) {
- gc->Ghp2=md->hp;
- if(gc->Ghp2<=0) {
- guild_castledatasave(gc->castle_id,12,0);
- guild_castledatasave(gc->castle_id,20,0);
- }
- }
- if(md->bl.id==gc->GID3) {
- gc->Ghp3=md->hp;
- if(gc->Ghp3<=0) {
- guild_castledatasave(gc->castle_id,13,0);
- guild_castledatasave(gc->castle_id,21,0);
- }
- }
- if(md->bl.id==gc->GID4) {
- gc->Ghp4=md->hp;
- if(gc->Ghp4<=0) {
- guild_castledatasave(gc->castle_id,14,0);
- guild_castledatasave(gc->castle_id,22,0);
- }
- }
- if(md->bl.id==gc->GID5) {
- gc->Ghp5=md->hp;
- if(gc->Ghp5<=0) {
- guild_castledatasave(gc->castle_id,15,0);
- guild_castledatasave(gc->castle_id,23,0);
- }
- }
- if(md->bl.id==gc->GID6) {
- gc->Ghp6=md->hp;
- if(gc->Ghp6<=0) {
- guild_castledatasave(gc->castle_id,16,0);
- guild_castledatasave(gc->castle_id,24,0);
- }
- }
- if(md->bl.id==gc->GID7) {
- gc->Ghp7=md->hp;
- if(gc->Ghp7<=0) {
- guild_castledatasave(gc->castle_id,17,0);
- guild_castledatasave(gc->castle_id,25,0);
-
- }
- }
- }
- } // end addition [Valaris]
-
- if(md->option&2 )
- status_change_end(&md->bl, SC_HIDING, -1);
- if(md->option&4 )
- status_change_end(&md->bl, SC_CLOAKING, -1);
-
- if(md->state.special_mob_ai == 2){//ƒXƒtƒBƒA[ƒ}ƒCƒ“
- int skillidx=0;
-
- if((skillidx=mob_skillid2skillidx(md->class_,NPC_SELFDESTRUCTION2))>=0){
- md->mode |= 0x1;
- md->next_walktime=tick;
- mobskill_use_id(md,&md->bl,skillidx);//Ž©”š‰r¥ŠJŽn
- md->state.special_mob_ai++;
- }
- if (src && md->master_id==src->id)
- md->target_dir=map_calc_dir(src,md->bl.x,md->bl.y)+1;
- }
-
- if(md->hp>0){
- if (battle_config.show_mob_hp)
- clif_update_mobhp (md);
- return 0;
- }
-
- // ----- ‚±‚±‚©‚玀–Sˆ— -----
-
- map_freeblock_lock();
- mob_changestate(md,MS_DEAD,0);
- mobskill_use(md,tick,-1); // Ž€–SŽžƒXƒLƒ‹
-
- memset(tmpsd,0,sizeof(tmpsd));
- memset(pt,0,sizeof(pt));
-
- max_hp = status_get_max_hp(&md->bl);
-
- if(src && src->type == BL_MOB)
- mob_unlocktarget((struct mob_data *)src,tick);
-
-
- if(sd) {
- int sp = 0, hp = 0;
- if (sd->state.attack_type == BF_MAGIC && (i=pc_checkskill(sd,HW_SOULDRAIN))>0){ /* ƒ\ƒEƒ‹ƒhƒŒƒCƒ“ */
- clif_skill_nodamage(src,&md->bl,HW_SOULDRAIN,i,1);
- sp += (status_get_lv(&md->bl))*(65+15*i)/100;
- }
- sp += sd->sp_gain_value;
- sp += sd->sp_gain_race[race];
- hp += sd->hp_gain_value;
- if (sp > 0) {
- if(sd->status.sp + sp > sd->status.max_sp)
- sp = sd->status.max_sp - sd->status.sp;
- sd->status.sp += sp;
- clif_heal(sd->fd,SP_SP,sp);
- }
- if (hp > 0) {
- if(sd->status.hp + hp > sd->status.max_hp)
- hp = sd->status.max_hp - sd->status.hp;
- sd->status.hp += hp;
- clif_heal(sd->fd,SP_HP,hp);
- }
- }
-
- // mapŠO‚ÉÁ‚¦‚½l‚ÍŒvŽZ‚©‚眂­‚Ì‚Å
- // overkill•ª‚Í–³‚¢‚¯‚Çsum‚Ímax_hp‚Ƃ͈Ⴄ
-
- tdmg = 0;
- for(i=0,count=0,mvp_damage=0;i<DAMAGELOG_SIZE;i++){
- if(md->dmglog[i].id==0)
- continue;
- // Will this slow things down too much?
- tmpsd[i] = map_charid2sd(md->dmglog[i].id);
- // try finding again
- if(tmpsd[i] == NULL)
- tmpsd[i] = map_id2sd(md->dmglog[i].id);
- // if we still can't find the player
- if(tmpsd[i] == NULL)
- continue;
- count++;
- if(tmpsd[i]->bl.m != md->bl.m || pc_isdead(tmpsd[i]))
- continue;
-
- tdmg += (double)md->dmglog[i].dmg;
- if(mvp_damage<md->dmglog[i].dmg){
- third_sd = second_sd;
- second_sd = mvp_sd;
- mvp_sd=tmpsd[i];
- mvp_damage=md->dmglog[i].dmg;
- }
- }
-
- // [MouseJstr]
- if((map[md->bl.m].flag.pvp == 0) || (battle_config.pvp_exp == 1)) {
-
- // ŒoŒ±’l‚Ì•ª”z
- for(i=0;i<DAMAGELOG_SIZE;i++){
- int pid,base_exp,job_exp,flag=1,zeny=0;
- double per;
- struct party *p;
- if(tmpsd[i]==NULL || tmpsd[i]->bl.m != md->bl.m || pc_isdead(tmpsd[i]))
- continue;
-
- if (battle_config.exp_calc_type == 0) {
- // jAthena's exp formula
- per = ((double)md->dmglog[i].dmg)*(9.+(double)((count > 6)? 6:count))/10./tdmg;
- temp = (double)mob_db[md->class_].base_exp * per;
- base_exp = (temp > 2147483647.)? 0x7fffffff:(int)temp;
- if(mob_db[md->class_].base_exp > 0 && base_exp < 1) base_exp = 1;
- if(base_exp < 0) base_exp = 0;
- temp = (double)mob_db[md->class_].job_exp * per;
- job_exp = (temp > 2147483647.)? 0x7fffffff:(int)temp;
- if(mob_db[md->class_].job_exp > 0 && job_exp < 1) job_exp = 1;
- if(job_exp < 0) job_exp = 0;
- }
- else if (battle_config.exp_calc_type == 1) {
- //eAthena's exp formula rather than jAthena's
- per=(double)md->dmglog[i].dmg*256*(9+(double)((count > 6)? 6:count))/10/(double)max_hp;
- if(per>512) per=512;
- if(per<1) per=1;
- base_exp=(int) (mob_db[md->class_].base_exp*per/256);
- if(base_exp < 1) base_exp = 1;
- job_exp=(int) (mob_db[md->class_].job_exp*per/256);
- if(job_exp < 1) job_exp = 1;
- }
- else {
- //eAthena's exp formula rather than jAthena's, but based on total damage dealt
- per=(double)md->dmglog[i].dmg*256*(9+(double)((count > 6)? 6:count))/10/tdmg;
- if(per>512) per=512;
- if(per<1) per=1;
- base_exp=(int) (mob_db[md->class_].base_exp*per/256);
- if(base_exp < 1) base_exp = 1;
- job_exp=(int) (mob_db[md->class_].job_exp*per/256);
- if(job_exp < 1) job_exp = 1;
- }
-
- if(sd) {
- int rate;
- if ((rate = sd->expaddrace[race]) > 0) {
- base_exp = (100+rate)*base_exp/100;
- job_exp = (100+rate)*job_exp/100;
- }
- if (battle_config.pk_mode && (mob_db[md->class_].lv - sd->status.base_level >= 20)) {
- base_exp = (int) (base_exp *1.15); // pk_mode additional exp if monster >20 levels [Valaris]
- job_exp = (int) (job_exp * 1.15);
- }
- }
- if(md->master_id) {
- if(((master = map_id2bl(md->master_id)) && status_get_mode(master)&0x20) || // check if its master is a boss (MVP's and minibosses)
- (md->state.special_mob_ai >= 1 && battle_config.alchemist_summon_reward != 1)) { // for summoned creatures [Valaris]
- base_exp = 0;
- job_exp = 0;
- }
- } else {
- if(battle_config.zeny_from_mobs) {
- if(md->level > 0) zeny=(int) ((md->level+rand()%md->level)*per/256); // zeny calculation moblv + random moblv [Valaris]
- if(mob_db[md->class_].mexp > 0)
- zeny*=rand()%250;
- }
- if(battle_config.mobs_level_up && md->level > mob_db[md->class_].lv) { // [Valaris]
- job_exp+=(int) (((md->level-mob_db[md->class_].lv)*mob_db[md->class_].job_exp*.03)*per/256);
- base_exp+=(int) (((md->level-mob_db[md->class_].lv)*mob_db[md->class_].base_exp*.03)*per/256);
- }
- }
-
- if((pid=tmpsd[i]->status.party_id)>0){ // ƒp[ƒeƒB‚É“ü‚Á‚Ä‚¢‚é
- int j;
- for(j=0;j<pnum;j++) // Œö•½ƒp[ƒeƒBƒŠƒXƒg‚É‚¢‚é‚©‚Ç‚¤‚©
- if(pt[j].id==pid)
- break;
- if(j==pnum){ // ‚¢‚È‚¢‚Æ‚«‚ÍŒö•½‚©‚Ç‚¤‚©Šm”F
- if((p=party_search(pid))!=NULL && p->exp!=0){
- pt[pnum].id=pid;
- pt[pnum].p=p;
- pt[pnum].base_exp=base_exp;
- pt[pnum].job_exp=job_exp;
- if(battle_config.zeny_from_mobs)
- pt[pnum].zeny=zeny; // zeny share [Valaris]
- pnum++;
- flag=0;
- }
- }else{ // ‚¢‚é‚Æ‚«‚ÍŒö•½
- pt[j].base_exp+=base_exp;
- pt[j].job_exp+=job_exp;
- if(battle_config.zeny_from_mobs)
- pt[j].zeny+=zeny; // zeny share [Valaris]
- flag=0;
- }
- }
- if(flag) { // added zeny from mobs [Valaris]
- if(base_exp > 0 || job_exp > 0)
- pc_gainexp(tmpsd[i],base_exp,job_exp);
- if (battle_config.zeny_from_mobs && zeny > 0) {
- pc_getzeny(tmpsd[i],zeny); // zeny from mobs [Valaris]
- }
- }
-
- }
- // Œö•½•ª”z
- for(i=0;i<pnum;i++)
- party_exp_share(pt[i].p,md->bl.m,pt[i].base_exp,pt[i].job_exp,pt[i].zeny);
-
- // item drop
- if(!(type&1)) {
- int log_item[10] = {0}; //8 -> 10 Lupus
- int drop_ore = -1,drop_items=0; //slot N for DROP LOG, number of dropped items
- for(i=0;i<10;i++){ // 8 -> 10 Lupus
- struct delay_item_drop *ditem;
- int drop_rate;
-
- if((master && status_get_mode(master)&0x20) || // check if its master is a boss (MVP's and minibosses)
- (md->state.special_mob_ai >= 1 && battle_config.alchemist_summon_reward != 1)) // Added [Valaris]
- break; // End
-
- if(mob_db[md->class_].dropitem[i].nameid <= 0)
- continue;
- drop_rate = mob_db[md->class_].dropitem[i].p;
- if(drop_rate <= 0 && !battle_config.drop_rate0item)
- drop_rate = 1;
- if(battle_config.drops_by_luk>0 && sd && md) drop_rate+=(sd->status.luk*battle_config.drops_by_luk)/100; // drops affected by luk [Valaris]
- if(sd && md && battle_config.pk_mode==1 && (mob_db[md->class_].lv - sd->status.base_level >= 20)) drop_rate = (int) (drop_rate*1.25); // pk_mode increase drops if 20 level difference [Valaris]
- if(drop_rate < rand() % 10000 + 1) { //fixed 0.01% impossible drops bug [Lupus]
- drop_ore = i; //we remember an empty slot to put there ORE DISCOVERY drop later.
- continue;
- }
- drop_items++; //we count if there were any drops
-
- ditem=(struct delay_item_drop *)aCalloc(1,sizeof(struct delay_item_drop));
- ditem->nameid = mob_db[md->class_].dropitem[i].nameid;
- log_item[i] = ditem->nameid;
- ditem->amount = 1;
- ditem->m = md->bl.m;
- ditem->x = md->bl.x;
- ditem->y = md->bl.y;
- ditem->first_sd = mvp_sd;
- ditem->second_sd = second_sd;
- ditem->third_sd = third_sd;
- add_timer(tick+500+i,mob_delay_item_drop,(int)ditem,0);
- }
-
- // Ore Discovery [Celest]
- if (sd == mvp_sd && pc_checkskill(sd,BS_FINDINGORE)>0 && battle_config.finding_ore_rate/100 >= rand()%1000) {
- struct delay_item_drop *ditem;
- ditem=(struct delay_item_drop *)aCalloc(1,sizeof(struct delay_item_drop));
- ditem->nameid = itemdb_searchrandomid(6);
- if (drop_ore<0) i=8; //we have only 10 slots in LOG, there's a check to not overflow (9th item usually a card, so we use 8th slot)
- log_item[i] = ditem->nameid; //it's for logging only
- drop_items++; //we count if there were any drops
- ditem->amount = 1;
- ditem->m = md->bl.m;
- ditem->x = md->bl.x;
- ditem->y = md->bl.y;
- ditem->first_sd = mvp_sd;
- ditem->second_sd = second_sd;
- ditem->third_sd = third_sd;
- add_timer(tick+500+i,mob_delay_item_drop,(int)ditem,0);
- }
-
- //this drop log contains ALL dropped items + ORE (if there was ORE Recovery) [Lupus]
- if(sd && log_config.drop > 0 && drop_items) //we check were there any drops.. and if not - don't write the log
- log_drop(sd, md->class_, log_item); //mvp_sd
-
- if(sd && sd->state.attack_type == BF_WEAPON) {
- for(i=0;i<sd->monster_drop_item_count;i++) {
- struct delay_item_drop *ditem;
- if(sd->monster_drop_itemid[i] <= 0)
- continue;
- if(sd->monster_drop_race[i] & (1<<race) ||
- (mob_db[md->class_].mode & 0x20 && sd->monster_drop_race[i] & 1<<10) ||
- (!(mob_db[md->class_].mode & 0x20) && sd->monster_drop_race[i] & 1<<11) ) {
- if(sd->monster_drop_itemrate[i] <= rand()%10000)
- continue;
-
- ditem=(struct delay_item_drop *)aCalloc(1,sizeof(struct delay_item_drop));
- ditem->nameid = sd->monster_drop_itemid[i];
- ditem->amount = 1;
- ditem->m = md->bl.m;
- ditem->x = md->bl.x;
- ditem->y = md->bl.y;
- ditem->first_sd = mvp_sd;
- ditem->second_sd = second_sd;
- ditem->third_sd = third_sd;
- add_timer(tick+520+i,mob_delay_item_drop,(int)ditem,0);
- }
- }
- if(sd->get_zeny_num > 0)
- pc_getzeny(sd,mob_db[md->class_].lv*10 + rand()%(sd->get_zeny_num+1));
- }
- if(md->lootitem) {
- for(i=0;i<md->lootitem_count;i++) {
- struct delay_item_drop2 *ditem;
-
- ditem=(struct delay_item_drop2 *)aCalloc(1,sizeof(struct delay_item_drop2));
- memcpy(&ditem->item_data,&md->lootitem[i],sizeof(md->lootitem[0]));
- ditem->m = md->bl.m;
- ditem->x = md->bl.x;
- ditem->y = md->bl.y;
- ditem->first_sd = mvp_sd;
- ditem->second_sd = second_sd;
- ditem->third_sd = third_sd;
- add_timer(tick+540+i,mob_delay_item_drop2,(int)ditem,0);
- }
- }
- }
-
- // mvpˆ—
- if(mvp_sd && mob_db[md->class_].mexp > 0 ){
- int log_mvp[2] = {0};
- int j;
- int mexp;
- temp = ((double)mob_db[md->class_].mexp * (9.+(double)count)/10.); //[Gengar]
- mexp = (temp > 2147483647.)? 0x7fffffff:(int)temp;
- if(mexp < 1) mexp = 1;
- clif_mvp_effect(mvp_sd); // ƒGƒtƒFƒNƒg
- clif_mvp_exp(mvp_sd,mexp);
- pc_gainexp(mvp_sd,mexp,0);
- log_mvp[1] = mexp;
- for(j=0;j<3;j++){
- i = rand() % 3;
- if(mob_db[md->class_].mvpitem[i].nameid <= 0)
- continue;
- drop_rate = mob_db[md->class_].mvpitem[i].p;
- if(drop_rate <= 0 && !battle_config.drop_rate0item)
- drop_rate = 1;
-/* if(drop_rate < battle_config.item_drop_mvp_min)
- drop_rate = battle_config.item_drop_mvp_min;
- else if(drop_rate > battle_config.item_drop_mvp_max) //fixed
- drop_rate = battle_config.item_drop_mvp_max;
-*/
- if(drop_rate <= rand()%10000+1) //if ==0, then it doesn't drop
- continue;
- memset(&item,0,sizeof(item));
- item.nameid=mob_db[md->class_].mvpitem[i].nameid;
- item.identify=!itemdb_isequip3(item.nameid);
- clif_mvp_item(mvp_sd,item.nameid);
- log_mvp[0] = item.nameid;
- if(mvp_sd->weight*2 > mvp_sd->max_weight)
- map_addflooritem(&item,1,mvp_sd->bl.m,mvp_sd->bl.x,mvp_sd->bl.y,mvp_sd,second_sd,third_sd,1);
- else if((ret = pc_additem(mvp_sd,&item,1))) {
- clif_additem(sd,0,0,ret);
- map_addflooritem(&item,1,mvp_sd->bl.m,mvp_sd->bl.x,mvp_sd->bl.y,mvp_sd,second_sd,third_sd,1);
- }
- break;
- }
-
- if(log_config.mvpdrop > 0)
- log_mvpdrop(mvp_sd, md->class_, log_mvp);
- }
-
- } // [MouseJstr]
-
- // <Agit> NPC Event [OnAgitBreak]
- if(md->npc_event[0] && strcmp(((md->npc_event)+strlen(md->npc_event)-13),"::OnAgitBreak") == 0) {
- printf("MOB.C: Run NPC_Event[OnAgitBreak].\n");
- if (agit_flag == 1) //Call to Run NPC_Event[OnAgitBreak]
- guild_agit_break(md);
- }
-
- // SCRIPTŽÀs
- if(md->npc_event[0]){
-// if(battle_config.battle_log)
-// printf("mob_damage : run event : %s\n",md->npc_event);
- if(src && src->type == BL_PET)
- sd = ((struct pet_data *)src)->msd;
- if(sd == NULL) {
- if(mvp_sd != NULL)
- sd = mvp_sd;
- else {
- struct map_session_data *tmpsd;
- int i;
- for(i=0;i<fd_max;i++){
- if(session[i] && (tmpsd= (struct map_session_data *) session[i]->session_data) && tmpsd->state.auth) {
- if(md->bl.m == tmpsd->bl.m) {
- sd = tmpsd;
- break;
- }
- }
- }
- }
- }
- if(sd)
- npc_event(sd,md->npc_event,0);
- }
-
- clif_clearchar_area(&md->bl,1);
- if(md->level) md->level=0;
- map_delblock(&md->bl);
- if(mob_get_viewclass(md->class_) <= 1000)
- clif_clearchar_delay(tick+3000,&md->bl,0);
- mob_deleteslave(md);
- mob_setdelayspawn(md->bl.id);
- map_freeblock_unlock();
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int mob_class_change(struct mob_data *md,int *value)
-{
- unsigned int tick = gettick();
- int i,c,hp_rate,max_hp,class_,count = 0;
-
- nullpo_retr(0, md);
- nullpo_retr(0, value);
-
- if(value[0]<=1000 || value[0]>MAX_MOB_DB)
- return 0;
- if(md->bl.prev == NULL) return 0;
-
- while(count < 5 && value[count] > 1000 && value[count] <= MAX_MOB_DB) count++;
- if(count < 1) return 0;
-
- class_ = value[rand()%count];
- if(class_<=1000 || class_>MAX_MOB_DB) return 0;
-
- max_hp = status_get_max_hp(&md->bl);
- hp_rate = md->hp*100/max_hp;
- clif_mob_class_change(md,class_);
- md->class_ = class_;
- max_hp = status_get_max_hp(&md->bl);
- if(battle_config.monster_class_change_full_recover==1) {
- md->hp = max_hp;
- memset(md->dmglog,0,sizeof(md->dmglog));
- }
- else
- md->hp = max_hp*hp_rate/100;
- if(md->hp > max_hp) md->hp = max_hp;
- else if(md->hp < 1) md->hp = 1;
-
- memcpy(md->name,mob_db[class_].jname,24);
- memset(&md->state,0,sizeof(md->state));
- md->attacked_id = 0;
- md->target_id = 0;
- md->move_fail_count = 0;
-
- md->speed = mob_db[md->class_].speed;
- md->def_ele = mob_db[md->class_].element;
-
- mob_changestate(md,MS_IDLE,0);
- skill_castcancel(&md->bl,0);
- md->state.skillstate = MSS_IDLE;
- md->last_thinktime = tick;
- md->next_walktime = tick+rand()%50+5000;
- md->attackabletime = tick;
- md->canmove_tick = tick;
-
- for(i=0,c=tick-1000*3600*10;i<MAX_MOBSKILL;i++)
- md->skilldelay[i] = c;
- md->skillid=0;
- md->skilllv=0;
-
- if(md->lootitem == NULL && mob_db[class_].mode&0x02)
- md->lootitem=(struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item));
-
- skill_clear_unitgroup(&md->bl);
- skill_cleartimerskill(&md->bl);
-
- clif_clearchar_area(&md->bl,0);
- clif_spawnmob(md);
-
- return 0;
-}
-
-/*==========================================
- * mob‰ñ•œ
- *------------------------------------------
- */
-int mob_heal(struct mob_data *md,int heal)
-{
- int max_hp;
-
- nullpo_retr(0, md);
- max_hp = status_get_max_hp(&md->bl);
-
- md->hp += heal;
- if( max_hp < md->hp )
- md->hp = max_hp;
-
- if(md->class_ >= 1285 && md->class_ <=1287) { // guardian hp update [Valaris]
- struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name);
- if(gc) {
- if(md->bl.id==gc->GID0) gc->Ghp0=md->hp;
- if(md->bl.id==gc->GID1) gc->Ghp1=md->hp;
- if(md->bl.id==gc->GID2) gc->Ghp2=md->hp;
- if(md->bl.id==gc->GID3) gc->Ghp3=md->hp;
- if(md->bl.id==gc->GID4) gc->Ghp4=md->hp;
- if(md->bl.id==gc->GID5) gc->Ghp5=md->hp;
- if(md->bl.id==gc->GID6) gc->Ghp6=md->hp;
- if(md->bl.id==gc->GID7) gc->Ghp7=md->hp;
- }
- } // end addition [Valaris]
-
- if (battle_config.show_mob_hp)
- clif_update_mobhp(md);
-
- return 0;
-}
-
-
-/*==========================================
- * Added by RoVeRT
- *------------------------------------------
- */
-int mob_warpslave_sub(struct block_list *bl,va_list ap)
-{
- struct mob_data *md=(struct mob_data *)bl;
- int id,x,y;
- id=va_arg(ap,int);
- x=va_arg(ap,int);
- y=va_arg(ap,int);
- if( md->master_id==id ) {
- mob_warp(md,-1,x,y,2);
- }
- return 0;
-}
-
-/*==========================================
- * Added by RoVeRT
- *------------------------------------------
- */
-int mob_warpslave(struct mob_data *md,int x, int y)
-{
-//printf("warp slave\n");
- map_foreachinarea(mob_warpslave_sub, md->bl.m,
- x-AREA_SIZE,y-AREA_SIZE,
- x+AREA_SIZE,y+AREA_SIZE,BL_MOB,
- md->bl.id, md->bl.x, md->bl.y );
- return 0;
-}
-
-/*==========================================
- * mobƒ[ƒv
- *------------------------------------------
- */
-int mob_warp(struct mob_data *md,int m,int x,int y,int type)
-{
- int i=0,xs=0,ys=0,bx=x,by=y;
- int tick = gettick();
-
- nullpo_retr(0, md);
-
- if( md->bl.prev==NULL )
- return 0;
-
- if( m<0 ) m=md->bl.m;
-
- if(type >= 0) {
- if(map[md->bl.m].flag.monster_noteleport)
- return 0;
- clif_clearchar_area(&md->bl,type);
- }
- skill_unit_move(&md->bl,tick,0);
- map_delblock(&md->bl);
-
- if(bx>0 && by>0){ // ˆÊ’uŽw’è‚ÌꇎüˆÍ‚XƒZƒ‹‚ð’Tõ
- xs=ys=9;
- }
-
- while( ( x<0 || y<0 || map_getcell(m,x,y,CELL_CHKNOPASS)) && (i++)<1000 ){
- if( xs>0 && ys>0 && i<250 ){ // Žw’èˆÊ’u•t‹ß‚Ì’Tõ
- x=bx+rand()%xs-xs/2;
- y=by+rand()%ys-ys/2;
- }else{ // Š®‘Sƒ‰ƒ“ƒ_ƒ€’Tõ
- x=rand()%(map[m].xs-2)+1;
- y=rand()%(map[m].ys-2)+1;
- }
- }
- md->dir=0;
- if(i<1000){
- md->bl.x=md->to_x=x;
- md->bl.y=md->to_y=y;
- md->bl.m=m;
- }else {
- m=md->bl.m;
- if(battle_config.error_log==1)
- printf("MOB %d warp failed, class = %d\n",md->bl.id,md->class_);
- }
-
- md->target_id=0; // ƒ^ƒQ‚ð‰ðœ‚·‚é
- md->state.targettype=NONE_ATTACKABLE;
- md->attacked_id=0;
- md->state.skillstate=MSS_IDLE;
- mob_changestate(md,MS_IDLE,0);
-
- if(type>0 && i==1000) {
- if(battle_config.battle_log)
- printf("MOB %d warp to (%d,%d), class = %d\n",md->bl.id,x,y,md->class_);
- }
-
- map_addblock(&md->bl);
- skill_unit_move(&md->bl,tick,1);
- if(type>0)
- {
- clif_spawnmob(md);
- mob_warpslave(md,md->bl.x,md->bl.y);
- }
-
- return 0;
-}
-
-/*==========================================
- * ‰æ–Ê“à‚ÌŽæ‚芪‚«‚Ì”ŒvŽZ—p(foreachinarea)
- *------------------------------------------
- */
-int mob_countslave_sub(struct block_list *bl,va_list ap)
-{
- int id,*c;
- struct mob_data *md;
-
- id=va_arg(ap,int);
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, c=va_arg(ap,int *));
- nullpo_retr(0, md = (struct mob_data *)bl);
-
- if( md->master_id==id )
- (*c)++;
- return 0;
-}
-/*==========================================
- * ‰æ–Ê“à‚ÌŽæ‚芪‚«‚Ì”ŒvŽZ
- *------------------------------------------
- */
-int mob_countslave(struct mob_data *md)
-{
- int c=0;
-
- nullpo_retr(0, md);
-
- map_foreachinarea(mob_countslave_sub, md->bl.m,
- 0,0,map[md->bl.m].xs-1,map[md->bl.m].ys-1,
- BL_MOB,md->bl.id,&c);
- return c;
-}
-/*==========================================
- * Žè‰ºMOB¢Š«
- *------------------------------------------
- */
-int mob_summonslave(struct mob_data *md2,int *value,int amount,int flag)
-{
- struct mob_data *md;
- int bx,by,m,count = 0,class_,k,a = amount;
-
- nullpo_retr(0, md2);
- nullpo_retr(0, value);
-
- bx=md2->bl.x;
- by=md2->bl.y;
- m=md2->bl.m;
-
- if(value[0]<=1000 || value[0]>MAX_MOB_DB) // ’l‚ªˆÙí‚Ȃ碊«‚ðŽ~‚ß‚é
- return 0;
- while(count < 21 && value[count] > 1000 && value[count] <= 2000) count++;
- if(count < 1) return 0;
-
- for(k=0;k<count;k++) {
- amount = a;
- class_ = value[k];
- if(class_<=1000 || class_>MAX_MOB_DB) continue;
- for(;amount>0;amount--){
- int x=0,y=0,i=0;
- md=(struct mob_data *)aCalloc(1,sizeof(struct mob_data));
- if(mob_db[class_].mode&0x02)
- md->lootitem=(struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item));
- else
- md->lootitem=NULL;
-
- while((x<=0 || y<=0 || map_getcell(m,x,y,CELL_CHKNOPASS)) && (i++)<100){
- x=rand()%9-4+bx;
- y=rand()%9-4+by;
- }
- if(i>=100){
- x=bx;
- y=by;
- }
-
- mob_spawn_dataset(md,"--ja--",class_);
- md->bl.m=m;
- md->bl.x=x;
- md->bl.y=y;
-
- md->m =m;
- md->x0=x;
- md->y0=y;
- md->xs=0;
- md->ys=0;
- md->speed=md2->speed;
- md->spawndelay1=-1; // ˆê“x‚̂݃tƒ‰ƒO
- md->spawndelay2=-1; // ˆê“x‚̂݃tƒ‰ƒO
-
- memset(md->npc_event,0,sizeof(md->npc_event));
- md->bl.type=BL_MOB;
- map_addiddb(&md->bl);
- mob_spawn(md->bl.id);
- clif_skill_nodamage(&md->bl,&md->bl,(flag)? NPC_SUMMONSLAVE:NPC_SUMMONMONSTER,a,1);
-
- if(flag)
- md->master_id=md2->bl.id;
- }
- }
- return 0;
-}
-
-/*==========================================
- * Ž©•ª‚ðƒƒbƒN‚µ‚Ä‚¢‚éPC‚Ì”‚𔂦‚é(foreachclient)
- *------------------------------------------
- */
-static int mob_counttargeted_sub(struct block_list *bl,va_list ap)
-{
- int id,*c,target_lv;
- struct block_list *src;
-
- id=va_arg(ap,int);
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, c=va_arg(ap,int *));
-
- src=va_arg(ap,struct block_list *);
- target_lv=va_arg(ap,int);
- if(id == bl->id || (src && id == src->id)) return 0;
- if(bl->type == BL_PC) {
- struct map_session_data *sd = (struct map_session_data *)bl;
- if(sd && sd->attacktarget == id && sd->attacktimer != -1 && sd->attacktarget_lv >= target_lv)
- (*c)++;
- }
- else if(bl->type == BL_MOB) {
- struct mob_data *md = (struct mob_data *)bl;
- if(md && md->target_id == id && md->timer != -1 && md->state.state == MS_ATTACK && md->target_lv >= target_lv)
- (*c)++;
- }
- else if(bl->type == BL_PET) {
- struct pet_data *pd = (struct pet_data *)bl;
- if(pd->target_id == id && pd->timer != -1 && pd->state.state == MS_ATTACK && pd->target_lv >= target_lv)
- (*c)++;
- }
- return 0;
-}
-/*==========================================
- * Ž©•ª‚ðƒƒbƒN‚µ‚Ä‚¢‚éPC‚Ì”‚𔂦‚é
- *------------------------------------------
- */
-int mob_counttargeted(struct mob_data *md,struct block_list *src,int target_lv)
-{
- int c=0;
-
- nullpo_retr(0, md);
-
- map_foreachinarea(mob_counttargeted_sub, md->bl.m,
- md->bl.x-AREA_SIZE,md->bl.y-AREA_SIZE,
- md->bl.x+AREA_SIZE,md->bl.y+AREA_SIZE,0,md->bl.id,&c,src,target_lv);
- return c;
-}
-
-/*==========================================
- *MOBskill‚©‚çŠY“–skillid‚Ìskillidx‚ð•Ô‚·
- *------------------------------------------
- */
-int mob_skillid2skillidx(int class_,int skillid)
-{
- int i;
- struct mob_skill *ms=mob_db[class_].skill;
-
- if(ms==NULL)
- return -1;
-
- for(i=0;i<mob_db[class_].maxskill;i++){
- if(ms[i].skill_id == skillid)
- return i;
- }
- return -1;
-
-}
-
-//
-// MOBƒXƒLƒ‹
-//
-
-/*==========================================
- * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹AIDŽw’èj
- *------------------------------------------
- */
-int mobskill_castend_id( int tid, unsigned int tick, int id,int data )
-{
- struct mob_data* md=NULL;
- struct block_list *bl;
- struct block_list *mbl;
- int range;
-
- if((mbl = map_id2bl(id)) == NULL ) //‰r¥‚µ‚½Mob‚ª‚à‚¤‚¢‚È‚¢‚Æ‚¢‚¤‚Ì‚Í—Ç‚­‚ ‚é³íˆ—
- return 0;
- if((md=(struct mob_data *)mbl) == NULL ){
- printf("mobskill_castend_id nullpo mbl->id:%d\n",mbl->id);
- return 0;
- }
-
- if( md->bl.type!=BL_MOB || md->bl.prev==NULL )
- return 0;
-
- if( md->skilltimer != tid ) // ƒ^ƒCƒ}ID‚ÌŠm”F
- return 0;
-
- md->skilltimer=-1;
- //’¾–Ù‚âó‘ÔˆÙí‚È‚Ç
- if(md->sc_data){
- if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 ||
- (!(mob_db[md->class_].mode & 0x20) && md->sc_data[SC_ROKISWEIL].timer != -1) ||
- md->sc_data[SC_STEELBODY].timer != -1)
- return 0;
- if(md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //ƒI[ƒgƒJƒEƒ“ƒ^[
- return 0;
- if(md->sc_data[SC_BLADESTOP].timer != -1) //”’nŽæ‚è
- return 0;
- if(md->sc_data[SC_BERSERK].timer != -1) //ƒo[ƒT[ƒN
- return 0;
- }
- if(md->skillid != NPC_EMOTION)
- md->last_thinktime=tick + status_get_adelay(&md->bl);
-
- if((bl = map_id2bl(md->skilltarget)) == NULL || bl->prev==NULL){ //ƒXƒLƒ‹ƒ^[ƒQƒbƒg‚ª‘¶Ý‚µ‚È‚¢
- //printf("mobskill_castend_id nullpo\n");//ƒ^[ƒQƒbƒg‚ª‚¢‚È‚¢‚Æ‚«‚Ínullpo‚¶‚á‚È‚­‚Ä•’Ê‚ÉI—¹
- return 0;
- }
- if(md->bl.m != bl->m)
- return 0;
-
- if(md->skillid == PR_LEXAETERNA) {
- struct status_change *sc_data = status_get_sc_data(bl);
- if(sc_data && (sc_data[SC_FREEZE].timer != -1 || (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0)))
- return 0;
- }
- else if(md->skillid == RG_BACKSTAP) {
- int dir = map_calc_dir(&md->bl,bl->x,bl->y),t_dir = status_get_dir(bl);
- int dist = distance(md->bl.x,md->bl.y,bl->x,bl->y);
- if(bl->type != BL_SKILL && (dist == 0 || map_check_dir(dir,t_dir)))
- return 0;
- }
- if( ( (skill_get_inf(md->skillid)&1) || (skill_get_inf2(md->skillid)&4) ) && // ”Þ‰ä“G‘Ί֌Wƒ`ƒFƒbƒN
- battle_check_target(&md->bl,bl, BCT_ENEMY)<=0 )
- return 0;
- range = skill_get_range(md->skillid,md->skilllv);
- if(range < 0)
- range = status_get_range(&md->bl) - (range + 1);
- if(range + battle_config.mob_skill_add_range < distance(md->bl.x,md->bl.y,bl->x,bl->y))
- return 0;
-
- md->skilldelay[md->skillidx]=tick;
-
- if(battle_config.mob_skill_log)
- printf("MOB skill castend skill=%d, class = %d\n",md->skillid,md->class_);
-// mob_stop_walking(md,0);
-
- switch( skill_get_nk(md->skillid) )
- {
- // UŒ‚Œn/‚«”ò‚΂µŒn
- case 0: case 2:
- skill_castend_damage_id(&md->bl,bl,md->skillid,md->skilllv,tick,0);
- break;
- case 1:// Žx‰‡Œn
- if(!mob_db[md->class_].skill[md->skillidx].val[0] &&
- (md->skillid==AL_HEAL || (md->skillid==ALL_RESURRECTION && bl->type != BL_PC)) && battle_check_undead(status_get_race(bl),status_get_elem_type(bl)) )
- skill_castend_damage_id(&md->bl,bl,md->skillid,md->skilllv,tick,0);
- else
- skill_castend_nodamage_id(&md->bl,bl,md->skillid,md->skilllv,tick,0);
- break;
- }
-
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹Aꊎw’èj
- *------------------------------------------
- */
-int mobskill_castend_pos( int tid, unsigned int tick, int id,int data )
-{
- struct mob_data* md=NULL;
- int range,maxcount;
-
- nullpo_retr(0, md=(struct mob_data *)map_id2bl(id));
-
- if( md->bl.type!=BL_MOB || md->bl.prev==NULL )
- return 0;
-
- if( md->skilltimer != tid ) // ƒ^ƒCƒ}ID‚ÌŠm”F
- return 0;
-
- md->skilltimer=-1;
- if(md->sc_data){
- if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 ||
- (!(mob_db[md->class_].mode & 0x20) && md->sc_data[SC_ROKISWEIL].timer != -1) ||
- md->sc_data[SC_STEELBODY].timer != -1)
- return 0;
- if(md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //ƒI[ƒgƒJƒEƒ“ƒ^[
- return 0;
- if(md->sc_data[SC_BLADESTOP].timer != -1) //”’nŽæ‚è
- return 0;
- if(md->sc_data[SC_BERSERK].timer != -1) //ƒo[ƒT[ƒN
- return 0;
- }
-
- if (!battle_config.monster_skill_reiteration &&
- skill_get_unit_flag (md->skillid) & UF_NOREITERATION &&
- skill_check_unit_range (md->bl.m, md->skillx, md->skilly, md->skillid, md->skilllv))
- return 0;
-
- if(battle_config.monster_skill_nofootset &&
- skill_get_unit_flag (md->skillid) & UF_NOFOOTSET &&
- skill_check_unit_range2(&md->bl, md->bl.m, md->skillx, md->skilly, md->skillid, md->skilllv))
- return 0;
-
-
- if(battle_config.monster_land_skill_limit) {
- maxcount = skill_get_maxcount(md->skillid);
- if(maxcount > 0) {
- int i,c;
- for(i=c=0;i<MAX_MOBSKILLUNITGROUP;i++) {
- if(md->skillunit[i].alive_count > 0 && md->skillunit[i].skill_id == md->skillid)
- c++;
- }
- if(c >= maxcount)
- return 0;
- }
- }
-
- range = skill_get_range(md->skillid,md->skilllv);
- if(range < 0)
- range = status_get_range(&md->bl) - (range + 1);
- if(range + battle_config.mob_skill_add_range < distance(md->bl.x,md->bl.y,md->skillx,md->skilly))
- return 0;
- md->skilldelay[md->skillidx]=tick;
-
- if(battle_config.mob_skill_log)
- printf("MOB skill castend skill=%d, class = %d\n",md->skillid,md->class_);
-// mob_stop_walking(md,0);
-
- skill_castend_pos2(&md->bl,md->skillx,md->skilly,md->skillid,md->skilllv,tick,0);
-
- return 0;
-}
-
-
-/*==========================================
- * Skill use (an aria start, ID specification)
- *------------------------------------------
- */
-int mobskill_use_id(struct mob_data *md,struct block_list *target,int skill_idx)
-{
- int casttime,range;
- struct mob_skill *ms;
- int skill_id, skill_lv, forcecast = 0;
-
- nullpo_retr(0, md);
- nullpo_retr(0, ms=&mob_db[md->class_].skill[skill_idx]);
-
- if( target==NULL && (target=map_id2bl(md->target_id))==NULL )
- return 0;
-
- if( target->prev==NULL || md->bl.prev==NULL )
- return 0;
-
- skill_id=ms->skill_id;
- skill_lv=ms->skill_lv;
-
- // ’¾–Ù‚âˆÙí
- if(md->sc_data){
- if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 ||
- (!(mob_db[md->class_].mode & 0x20) && md->sc_data[SC_ROKISWEIL].timer != -1) ||
- md->sc_data[SC_STEELBODY].timer != -1)
- return 0;
- if(md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //ƒI[ƒgƒJƒEƒ“ƒ^[
- return 0;
- if(md->sc_data[SC_BLADESTOP].timer != -1) //”’nŽæ‚è
- return 0;
- if(md->sc_data[SC_BERSERK].timer != -1) //ƒo[ƒT[ƒN
- return 0;
- }
-
- if(md->option&4 && skill_id==TF_HIDING)
- return 0;
- if(md->option&2 && skill_id!=TF_HIDING && skill_id!=AS_GRIMTOOTH && skill_id!=RG_BACKSTAP && skill_id!=RG_RAID)
- return 0;
-
- if(map[md->bl.m].flag.gvg && skill_db[skill_id].nocast & 4)
- return 0;
- if(skill_get_inf2(skill_id)&0x200 && md->bl.id == target->id)
- return 0;
-
- // ŽË’ö‚ÆáŠQ•¨ƒ`ƒFƒbƒN
- range = skill_get_range(skill_id,skill_lv);
- if(range < 0)
- range = status_get_range(&md->bl) - (range + 1);
- if(!battle_check_range(&md->bl,target,range))
- return 0;
-
-// delay=skill_delayfix(&md->bl, skill_get_delay( skill_id,skill_lv) );
-
- casttime=skill_castfix(&md->bl,ms->casttime);
- md->state.skillcastcancel=ms->cancel;
- md->skilldelay[skill_idx]=gettick();
-
- switch(skill_id){ /* ‰½‚©“ÁŽê‚Ȉ—‚ª•K—v */
- case ALL_RESURRECTION: /* ƒŠƒUƒŒƒNƒVƒ‡ƒ“ */
- if(target->type != BL_PC && battle_check_undead(status_get_race(target),status_get_elem_type(target))){ /* “G‚ªƒAƒ“ƒfƒbƒh‚È‚ç */
- forcecast=1; /* ƒ^[ƒ“ƒAƒ“ƒfƒbƒg‚Æ“¯‚¶‰r¥ŽžŠÔ */
- casttime=skill_castfix(&md->bl, skill_get_cast(PR_TURNUNDEAD,skill_lv) );
- }
- break;
- case MO_EXTREMITYFIST: /*ˆ¢C—…”e–PŒ*/
- case SA_MAGICROD:
- case SA_SPELLBREAKER:
- forcecast=1;
- break;
- case NPC_SUMMONSLAVE:
- case NPC_SUMMONMONSTER:
- if(md->master_id!=0)
- return 0;
- break;
- }
-
- if(battle_config.mob_skill_log)
- printf("MOB skill use target_id=%d skill=%d lv=%d cast=%d, class = %d\n",target->id,skill_id,skill_lv,casttime,md->class_);
-
- if(casttime>0 || forcecast){ // ‰r¥‚ª•K—v
-// struct mob_data *md2;
- mob_stop_walking(md,0); // •às’âŽ~
- clif_skillcasting( &md->bl,
- md->bl.id, target->id, 0,0, skill_id,casttime);
-
- // ‰r¥”½‰žƒ‚ƒ“ƒXƒ^[
- // future homunculus support?
-/* if(md->master_id && target->type==BL_MOB && (md2=(struct mob_data *)target) &&
- mob_db[md2->class_].mode&0x10 && md2->state.state!=MS_ATTACK){
- md2->target_id=md->bl.id;
- md->state.targettype = ATTACKABLE;
- md2->min_chase=13;
- }*/
- }
-
- if( casttime<=0 ) // ‰r¥‚Ì–³‚¢‚à‚̂̓Lƒƒƒ“ƒZƒ‹‚³‚ê‚È‚¢
- md->state.skillcastcancel=0;
-
- md->skilltarget = target->id;
- md->skillx = 0;
- md->skilly = 0;
- md->skillid = skill_id;
- md->skilllv = skill_lv;
- md->skillidx = skill_idx;
-
- if(!(battle_config.monster_cloak_check_type&2) && md->sc_data[SC_CLOAKING].timer != -1 && md->skillid != AS_CLOAKING)
- status_change_end(&md->bl,SC_CLOAKING,-1);
-
- if( casttime>0 ){
- md->skilltimer =
- add_timer( gettick()+casttime, mobskill_castend_id, md->bl.id, 0 );
- }else{
- md->skilltimer = -1;
- mobskill_castend_id(md->skilltimer,gettick(),md->bl.id, 0);
- }
-
- return 1;
-}
-/*==========================================
- * ƒXƒLƒ‹Žg—piꊎw’èj
- *------------------------------------------
- */
-int mobskill_use_pos( struct mob_data *md,
- int skill_x, int skill_y, int skill_idx)
-{
- int casttime=0,range;
- struct mob_skill *ms;
- struct block_list bl;
- int skill_id, skill_lv;
-
- nullpo_retr(0, md);
- nullpo_retr(0, ms=&mob_db[md->class_].skill[skill_idx]);
-
- if( md->bl.prev==NULL )
- return 0;
-
- skill_id=ms->skill_id;
- skill_lv=ms->skill_lv;
-
- //’¾–Ù‚âó‘ÔˆÙí‚È‚Ç
- if(md->sc_data){
- if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 ||
- (!(mob_db[md->class_].mode & 0x20) && md->sc_data[SC_ROKISWEIL].timer != -1) ||
- md->sc_data[SC_STEELBODY].timer != -1)
- return 0;
- if(md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //ƒI[ƒgƒJƒEƒ“ƒ^[
- return 0;
- if(md->sc_data[SC_BLADESTOP].timer != -1) //”’nŽæ‚è
- return 0;
- if(md->sc_data[SC_BERSERK].timer != -1) //ƒo[ƒT[ƒN
- return 0;
- }
-
- if(md->option&2)
- return 0;
-
- if(map[md->bl.m].flag.gvg && (skill_id == SM_ENDURE || skill_id == AL_TELEPORT || skill_id == AL_WARP ||
- skill_id == WZ_ICEWALL || skill_id == TF_BACKSLIDING))
- return 0;
-
- // ŽË’ö‚ÆáŠQ•¨ƒ`ƒFƒbƒN
- bl.type = BL_NUL;
- bl.m = md->bl.m;
- bl.x = skill_x;
- bl.y = skill_y;
- range = skill_get_range(skill_id,skill_lv);
- if(range < 0)
- range = status_get_range(&md->bl) - (range + 1);
- if(!battle_check_range(&md->bl,&bl,range))
- return 0;
-
-// delay=skill_delayfix(&sd->bl, skill_get_delay( skill_id,skill_lv) );
- casttime=skill_castfix(&md->bl,ms->casttime);
- md->skilldelay[skill_idx]=gettick();
- md->state.skillcastcancel=ms->cancel;
-
- if(battle_config.mob_skill_log)
- printf("MOB skill use target_pos=(%d,%d) skill=%d lv=%d cast=%d, class = %d\n",
- skill_x,skill_y,skill_id,skill_lv,casttime,md->class_);
-
- if( casttime>0 ) { // A cast time is required.
- mob_stop_walking(md,0); // •às’âŽ~
- clif_skillcasting( &md->bl,
- md->bl.id, 0, skill_x,skill_y, skill_id,casttime);
- }
-
- if( casttime<=0 ) // A skill without a cast time wont be cancelled.
- md->state.skillcastcancel=0;
-
-
- md->skillx = skill_x;
- md->skilly = skill_y;
- md->skilltarget = 0;
- md->skillid = skill_id;
- md->skilllv = skill_lv;
- md->skillidx = skill_idx;
- if(!(battle_config.monster_cloak_check_type&2) && md->sc_data[SC_CLOAKING].timer != -1)
- status_change_end(&md->bl,SC_CLOAKING,-1);
- if( casttime>0 ){
- md->skilltimer =
- add_timer( gettick()+casttime, mobskill_castend_pos, md->bl.id, 0 );
- }else{
- md->skilltimer = -1;
- mobskill_castend_pos(md->skilltimer,gettick(),md->bl.id, 0);
- }
-
- return 1;
-}
-
-
-/*==========================================
- * Friendly Mob whose HP is decreasing by a nearby MOB is looked for.
- *------------------------------------------
- */
-int mob_getfriendhpltmaxrate_sub(struct block_list *bl,va_list ap)
-{
- int rate;
- struct mob_data **fr, *md, *mmd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, mmd=va_arg(ap,struct mob_data *));
-
- md=(struct mob_data *)bl;
-
- if( mmd->bl.id == bl->id )
- return 0;
- rate=va_arg(ap,int);
- fr=va_arg(ap,struct mob_data **);
- if( md->hp < mob_db[md->class_].max_hp*rate/100 )
- (*fr)=md;
- return 0;
-}
-struct mob_data *mob_getfriendhpltmaxrate(struct mob_data *md,int rate)
-{
- struct mob_data *fr=NULL;
- const int r=8;
-
- nullpo_retr(NULL, md);
-
- map_foreachinarea(mob_getfriendhpltmaxrate_sub, md->bl.m,
- md->bl.x-r ,md->bl.y-r, md->bl.x+r, md->bl.y+r,
- BL_MOB,md,rate,&fr);
- return fr;
-}
-/*==========================================
- * What a status state suits by nearby MOB is looked for.
- *------------------------------------------
- */
-int mob_getfriendstatus_sub(struct block_list *bl,va_list ap)
-{
- int cond1,cond2;
- struct mob_data **fr, *md, *mmd;
- int flag=0;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, md=(struct mob_data *)bl);
- nullpo_retr(0, mmd=va_arg(ap,struct mob_data *));
-
- if( mmd->bl.id == bl->id )
- return 0;
- cond1=va_arg(ap,int);
- cond2=va_arg(ap,int);
- fr=va_arg(ap,struct mob_data **);
- if( cond2==-1 ){
- int j;
- for(j=SC_STONE;j<=SC_BLIND && !flag;j++){
- flag=(md->sc_data[j].timer!=-1 );
- }
- }else
- flag=( md->sc_data[cond2].timer!=-1 );
- if( flag^( cond1==MSC_FRIENDSTATUSOFF ) )
- (*fr)=md;
-
- return 0;
-}
-struct mob_data *mob_getfriendstatus(struct mob_data *md,int cond1,int cond2)
-{
- struct mob_data *fr=NULL;
- const int r=8;
-
- nullpo_retr(0, md);
-
- map_foreachinarea(mob_getfriendstatus_sub, md->bl.m,
- md->bl.x-r ,md->bl.y-r, md->bl.x+r, md->bl.y+r,
- BL_MOB,md,cond1,cond2,&fr);
- return fr;
-}
-
-/*==========================================
- * Skill use judging
- *------------------------------------------
- */
-int mobskill_use(struct mob_data *md,unsigned int tick,int event)
-{
- struct mob_skill *ms;
-// struct block_list *target=NULL;
- int i,max_hp;
-
- nullpo_retr(0, md);
- nullpo_retr(0, ms = mob_db[md->class_].skill);
-
- max_hp = status_get_max_hp(&md->bl);
-
- if(battle_config.mob_skill_use == 0 || md->skilltimer != -1)
- return 0;
-
- if(md->state.special_mob_ai)
- return 0;
-
- if(md->sc_data[SC_SELFDESTRUCTION].timer!=-1) //Ž©”š’†‚̓XƒLƒ‹‚ðŽg‚í‚È‚¢
- return 0;
-
- for(i=0;i<mob_db[md->class_].maxskill;i++){
- int c2=ms[i].cond2,flag=0;
- struct mob_data *fmd=NULL;
-
- // ƒfƒBƒŒƒC’†
- if( DIFF_TICK(tick,md->skilldelay[i])<ms[i].delay )
- continue;
-
- // ó‘Ô”»’è
- if( ms[i].state>=0 && ms[i].state!=md->state.skillstate )
- continue;
-
- // ðŒ”»’è
- flag=(event==ms[i].cond1);
- if(!flag){
- switch( ms[i].cond1 ){
- case MSC_ALWAYS:
- flag=1; break;
- case MSC_MYHPLTMAXRATE: // HP< maxhp%
- flag=( md->hp < max_hp*c2/100 ); break;
- case MSC_MYSTATUSON: // status[num] on
- case MSC_MYSTATUSOFF: // status[num] off
- if( ms[i].cond2==-1 ){
- int j;
- for(j=SC_STONE;j<=SC_BLIND && !flag;j++){
- flag=(md->sc_data[j].timer!=-1 );
- }
- }else
- flag=( md->sc_data[ms[i].cond2].timer!=-1 );
- flag^=( ms[i].cond1==MSC_MYSTATUSOFF ); break;
- case MSC_FRIENDHPLTMAXRATE: // friend HP < maxhp%
- flag=(( fmd=mob_getfriendhpltmaxrate(md,ms[i].cond2) )!=NULL ); break;
- case MSC_FRIENDSTATUSON: // friend status[num] on
- case MSC_FRIENDSTATUSOFF: // friend status[num] off
- flag=(( fmd=mob_getfriendstatus(md,ms[i].cond1,ms[i].cond2) )!=NULL ); break;
- case MSC_SLAVELT: // slave < num
- flag=( mob_countslave(md) < c2 ); break;
- case MSC_ATTACKPCGT: // attack pc > num
- flag=( mob_counttargeted(md,NULL,0) > c2 ); break;
- case MSC_SLAVELE: // slave <= num
- flag=( mob_countslave(md) <= c2 ); break;
- case MSC_ATTACKPCGE: // attack pc >= num
- flag=( mob_counttargeted(md,NULL,0) >= c2 ); break;
- case MSC_SKILLUSED: // specificated skill used
- flag=( (event&0xffff)==MSC_SKILLUSED && ((event>>16)==c2 || c2==0)); break;
- }
- }
-
- // Šm—¦”»’è
- if( flag && rand()%10000 < ms[i].permillage ){
-
- if( skill_get_inf(ms[i].skill_id)&2 ){
- // ꊎw’è
- struct block_list *bl = NULL;
- int x=0,y=0;
- if( ms[i].target<=MST_AROUND ){
- bl= ((ms[i].target==MST_TARGET || ms[i].target==MST_AROUND5)? map_id2bl(md->target_id):
- (ms[i].target==MST_FRIEND)? &fmd->bl : &md->bl);
- if(bl!=NULL){
- x=bl->x; y=bl->y;
- }
- }
- if( x<=0 || y<=0 )
- continue;
- // Ž©•ª‚ÌŽüˆÍ
- if( ms[i].target>=MST_AROUND1 ){
- int bx=x, by=y, i=0, m=bl->m, r=ms[i].target-MST_AROUND1;
- do{
- bx=x + rand()%(r*2+3) - r;
- by=y + rand()%(r*2+3) - r;
- }while( ( bx<=0 || by<=0 || bx>=map[m].xs || by>=map[m].ys ||
- map_getcell(m,bx,by,CELL_CHKNOPASS)) && (i++)<1000);
- if(i<1000){
- x=bx; y=by;
- }
- }
- // ‘ŠŽè‚ÌŽüˆÍ
- if( ms[i].target>=MST_AROUND5 ){
- int bx=x, by=y, i=0,m=bl->m, r=(ms[i].target-MST_AROUND5)+1;
- do{
- bx=x + rand()%(r*2+1) - r;
- by=y + rand()%(r*2+1) - r;
- }while( ( bx<=0 || by<=0 || bx>=map[m].xs || by>=map[m].ys ||
- map_getcell(m,bx,by,CELL_CHKNOPASS)) && (i++)<1000);
- if(i<1000){
- x=bx; y=by;
- }
- }
- if(!mobskill_use_pos(md,x,y,i))
- return 0;
-
- }else{
- // IDŽw’è
- if( ms[i].target<=MST_FRIEND ){
- struct block_list *bl = NULL;
- bl= ((ms[i].target==MST_TARGET)? map_id2bl(md->target_id):
- (ms[i].target==MST_FRIEND)? &fmd->bl : &md->bl);
- if(bl && !mobskill_use_id(md,bl,i))
- return 0;
- }
- }
- if(ms[i].emotion >= 0)
- clif_emotion(&md->bl,ms[i].emotion);
- return 1;
- }
- }
-
- return 0;
-}
-/*==========================================
- * Skill use event processing
- *------------------------------------------
- */
-int mobskill_event(struct mob_data *md,int flag)
-{
- nullpo_retr(0, md);
-
- if(flag==-1 && mobskill_use(md,gettick(),MSC_CASTTARGETED))
- return 1;
- if( (flag&BF_SHORT) && mobskill_use(md,gettick(),MSC_CLOSEDATTACKED))
- return 1;
- if( (flag&BF_LONG) && mobskill_use(md,gettick(),MSC_LONGRANGEATTACKED))
- return 1;
- return 0;
-}
-/*==========================================
- * Mob‚ªƒGƒ“ƒyƒŠƒEƒ€‚È‚Ç‚Ìꇂ̔»’è
- *------------------------------------------
- */
-int mob_gvmobcheck(struct map_session_data *sd, struct block_list *bl)
-{
- struct mob_data *md=NULL;
-
- nullpo_retr(0,sd);
- nullpo_retr(0,bl);
-
- if(bl->type==BL_MOB && (md=(struct mob_data *)bl) &&
- (md->class_ == 1288 || md->class_ == 1287 || md->class_ == 1286 || md->class_ == 1285))
- {
- struct guild_castle *gc=guild_mapname2gc(map[sd->bl.m].name);
- struct guild *g=guild_search(sd->status.guild_id);
-
- if(g == NULL && md->class_ == 1288)
- return 0;//ƒMƒ‹ƒh–¢‰Á“ü‚È‚çƒ_ƒ[ƒW–³‚µ
- else if(gc != NULL && !map[sd->bl.m].flag.gvg)
- return 0;//Ô“à‚ÅGv‚¶‚á‚È‚¢‚Æ‚«‚̓_ƒ[ƒW‚È‚µ
- else if(g) {
- if (gc != NULL && g->guild_id == gc->guild_id)
- return 0;//Ž©è—̃Mƒ‹ƒh‚̃Gƒ“ƒy‚È‚çƒ_ƒ[ƒW–³‚µ
- else if(guild_checkskill(g,GD_APPROVAL) <= 0 && md->class_ == 1288)
- return 0;//³‹KƒMƒ‹ƒh³”F‚ª‚È‚¢‚ƃ_ƒ[ƒW–³‚µ
- else if (gc && guild_check_alliance(gc->guild_id, g->guild_id, 0) == 1)
- return 0; // “¯–¿‚È‚çƒ_ƒ[ƒW–³‚µ
- }
- }
-
- return 1;
-}
-/*==========================================
- * ƒXƒLƒ‹—pƒ^ƒCƒ}[íœ
- *------------------------------------------
- */
-int mobskill_deltimer(struct mob_data *md )
-{
- nullpo_retr(0, md);
-
- if( md->skilltimer!=-1 ){
- if( skill_get_inf( md->skillid )&2 )
- delete_timer( md->skilltimer, mobskill_castend_pos );
- else
- delete_timer( md->skilltimer, mobskill_castend_id );
- md->skilltimer=-1;
- }
- return 0;
-}
-//
-// ‰Šú‰»
-//
-/*==========================================
- * Since un-setting [ mob ] up was used, it is an initial provisional value setup.
- *------------------------------------------
- */
-static int mob_makedummymobdb(int class_)
-{
- int i;
-
- sprintf(mob_db[class_].name,"mob%d",class_);
- sprintf(mob_db[class_].jname,"mob%d",class_);
- mob_db[class_].lv=1;
- mob_db[class_].max_hp=1000;
- mob_db[class_].max_sp=1;
- mob_db[class_].base_exp=2;
- mob_db[class_].job_exp=1;
- mob_db[class_].range=1;
- mob_db[class_].atk1=7;
- mob_db[class_].atk2=10;
- mob_db[class_].def=0;
- mob_db[class_].mdef=0;
- mob_db[class_].str=1;
- mob_db[class_].agi=1;
- mob_db[class_].vit=1;
- mob_db[class_].int_=1;
- mob_db[class_].dex=6;
- mob_db[class_].luk=2;
- mob_db[class_].range2=10;
- mob_db[class_].range3=10;
- mob_db[class_].size=0;
- mob_db[class_].race=0;
- mob_db[class_].element=0;
- mob_db[class_].mode=0;
- mob_db[class_].speed=300;
- mob_db[class_].adelay=1000;
- mob_db[class_].amotion=500;
- mob_db[class_].dmotion=500;
- //mob_db[class_].dropitem[0].nameid=909; // Jellopy
- //mob_db[class_].dropitem[0].p=1000;
- for(i=1;i<10;i++){ // 8-> 10 Lupus
- mob_db[class_].dropitem[i].nameid=0;
- mob_db[class_].dropitem[i].p=0;
- }
- // Item1,Item2
- mob_db[class_].mexp=0;
- mob_db[class_].mexpper=0;
- for(i=0;i<3;i++){
- mob_db[class_].mvpitem[i].nameid=0;
- mob_db[class_].mvpitem[i].p=0;
- }
- for(i=0;i<MAX_RANDOMMONSTER;i++)
- mob_db[class_].summonper[i]=0;
- return 0;
-}
-
-/*==========================================
- * db/mob_db.txt reading
- *------------------------------------------
- */
-static int mob_readdb(void)
-{
- FILE *fp;
- char line[1024];
- char *filename[]={ "db/mob_db.txt","db/mob_db2.txt" };
- int i;
-
- memset(mob_db,0,sizeof(mob_db));
-
- for(i=0;i<2;i++){
-
- fp=fopen(filename[i],"r");
- if(fp==NULL){
- if(i>0)
- continue;
- return -1;
- }
- while(fgets(line,1020,fp)){
- int class_,i;
- char *str[60],*p,*np; // 55->60 Lupus
-
- if(line[0] == '/' && line[1] == '/')
- continue;
-
- for(i=0,p=line;i<60;i++){
- if((np=strchr(p,','))!=NULL){
- str[i]=p;
- *np=0;
- p=np+1;
- } else
- str[i]=p;
- }
-
- class_=atoi(str[0]);
- if(class_<=1000 || class_>MAX_MOB_DB)
- continue;
-
- mob_db[class_].view_class=class_;
- memcpy(mob_db[class_].name,str[1],24);
- memcpy(mob_db[class_].jname,str[2],24);
- mob_db[class_].lv=atoi(str[3]);
- mob_db[class_].max_hp=atoi(str[4]);
- mob_db[class_].max_sp=atoi(str[5]);
-
- mob_db[class_].base_exp = atoi(str[6]);
- if (mob_db[class_].base_exp <= 0)
- mob_db[class_].base_exp = 0;
- else if (mob_db[class_].base_exp * battle_config.base_exp_rate / 100 > 1000000000 ||
- mob_db[class_].base_exp * battle_config.base_exp_rate / 100 < 0)
- mob_db[class_].base_exp = 1000000000;
- else {
- mob_db[class_].base_exp = mob_db[class_].base_exp * battle_config.base_exp_rate / 100;
- if (mob_db[class_].base_exp < 1)
- mob_db[class_].base_exp = 1;
- }
-
- mob_db[class_].job_exp = atoi(str[7]);
- if (mob_db[class_].job_exp <= 0)
- mob_db[class_].job_exp = 0;
- else if (mob_db[class_].job_exp * battle_config.job_exp_rate / 100 > 1000000000 ||
- mob_db[class_].job_exp * battle_config.job_exp_rate / 100 < 0)
- mob_db[class_].job_exp = 1000000000;
- else {
- mob_db[class_].job_exp = mob_db[class_].job_exp * battle_config.job_exp_rate / 100;
- if (mob_db[class_].job_exp < 1)
- mob_db[class_].job_exp = 1;
- }
-
- mob_db[class_].range=atoi(str[8]);
- mob_db[class_].atk1=atoi(str[9]);
- mob_db[class_].atk2=atoi(str[10]);
- mob_db[class_].def=atoi(str[11]);
- mob_db[class_].mdef=atoi(str[12]);
- mob_db[class_].str=atoi(str[13]);
- mob_db[class_].agi=atoi(str[14]);
- mob_db[class_].vit=atoi(str[15]);
- mob_db[class_].int_=atoi(str[16]);
- mob_db[class_].dex=atoi(str[17]);
- mob_db[class_].luk=atoi(str[18]);
- mob_db[class_].range2=atoi(str[19]);
- mob_db[class_].range3=atoi(str[20]);
- mob_db[class_].size=atoi(str[21]);
- mob_db[class_].race=atoi(str[22]);
- mob_db[class_].element=atoi(str[23]);
- mob_db[class_].mode=atoi(str[24]);
- mob_db[class_].speed=atoi(str[25]);
- mob_db[class_].adelay=atoi(str[26]);
- mob_db[class_].amotion=atoi(str[27]);
- mob_db[class_].dmotion=atoi(str[28]);
-
- for(i=0;i<10;i++){ // 8 -> 10 Lupus
- int rate = 0,type,ratemin,ratemax;
- mob_db[class_].dropitem[i].nameid=atoi(str[29+i*2]);
- type = itemdb_type(mob_db[class_].dropitem[i].nameid);
- if (type == 0) {
- rate = battle_config.item_rate_heal * atoi(str[30+i*2]) / 100; //fix by Yor
- ratemin = battle_config.item_drop_heal_min;
- ratemax = battle_config.item_drop_heal_max;
- }
- else if (type == 2) {
- rate = battle_config.item_rate_use * atoi(str[30+i*2]) / 100; //fix by Yor
- ratemin = battle_config.item_drop_use_min;
- ratemax = battle_config.item_drop_use_max; // End
- }
- else if (type == 4 || type == 5 || type == 8) { // Changed to include Pet Equip
- rate = battle_config.item_rate_equip * atoi(str[30+i*2]) / 100;
- ratemin = battle_config.item_drop_equip_min;
- ratemax = battle_config.item_drop_equip_max;
- }
- else if (type == 6) {
- rate = battle_config.item_rate_card * atoi(str[30+i*2]) / 100;
- ratemin = battle_config.item_drop_card_min;
- ratemax = battle_config.item_drop_card_max;
- }
- else {
- rate = battle_config.item_rate_common * atoi(str[30+i*2]) / 100;
- ratemin = battle_config.item_drop_common_min;
- ratemax = battle_config.item_drop_common_max;
- }
- mob_db[class_].dropitem[i].p = (rate < ratemin) ? ratemin : (rate > ratemax) ? ratemax: rate;
- }
- // MVP EXP Bonus, Chance: MEXP,ExpPer
- mob_db[class_].mexp=atoi(str[49])*battle_config.mvp_exp_rate/100;
- mob_db[class_].mexpper=atoi(str[50]);
- // MVP Drops: MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per
- for(i=0;i<3;i++){
- int rate=atoi(str[52+i*2])*battle_config.mvp_item_rate/100; //idea of the fix from Freya
- mob_db[class_].mvpitem[i].nameid=atoi(str[51+i*2]);
- mob_db[class_].mvpitem[i].p= (rate < battle_config.item_drop_mvp_min)
- ? battle_config.item_drop_mvp_min : (rate > battle_config.item_drop_mvp_max)
- ? battle_config.item_drop_mvp_max : rate;
- }
- for(i=0;i<MAX_RANDOMMONSTER;i++)
- mob_db[class_].summonper[i]=0;
- mob_db[class_].maxskill=0;
-
- mob_db[class_].sex=0;
- mob_db[class_].hair=0;
- mob_db[class_].hair_color=0;
- mob_db[class_].weapon=0;
- mob_db[class_].shield=0;
- mob_db[class_].head_top=0;
- mob_db[class_].head_mid=0;
- mob_db[class_].head_buttom=0;
- mob_db[class_].clothes_color=0; //Add for player monster dye - Valaris
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n",filename[i]);
- ShowStatus(tmp_output);
- }
- return 0;
-}
-
-/*==========================================
- * MOB display graphic change data reading
- *------------------------------------------
- */
-static int mob_readdb_mobavail(void)
-{
- FILE *fp;
- char line[1024];
- int ln=0;
- int class_,j,k;
- char *str[20],*p,*np;
-
- if( (fp=fopen("db/mob_avail.txt","r"))==NULL ){
- printf("can't read db/mob_avail.txt\n");
- return -1;
- }
-
- while(fgets(line,1020,fp)){
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(str,0,sizeof(str));
-
- for(j=0,p=line;j<12;j++){
- if((np=strchr(p,','))!=NULL){
- str[j]=p;
- *np=0;
- p=np+1;
- } else
- str[j]=p;
- }
-
- if(str[0]==NULL)
- continue;
-
- class_=atoi(str[0]);
- if(class_<=1000 || class_>MAX_MOB_DB) // ’l‚ªˆÙí‚Ȃ爗‚µ‚È‚¢B
- continue;
-
- k=atoi(str[1]);
- if(k < 0)
- continue;
- if (j > 3 && k > 23 && k < 69)
- k += 3977; // advanced job/baby class
- mob_db[class_].view_class=k;
-
- if((k < 24) || (k > 4000)) {
- mob_db[class_].sex=atoi(str[2]);
- mob_db[class_].hair=atoi(str[3]);
- mob_db[class_].hair_color=atoi(str[4]);
- mob_db[class_].weapon=atoi(str[5]);
- mob_db[class_].shield=atoi(str[6]);
- mob_db[class_].head_top=atoi(str[7]);
- mob_db[class_].head_mid=atoi(str[8]);
- mob_db[class_].head_buttom=atoi(str[9]);
- mob_db[class_].option=atoi(str[10])&~0x46;
- mob_db[class_].clothes_color=atoi(str[11]); // Monster player dye option - Valaris
- }
- else if(atoi(str[2]) > 0) mob_db[class_].equip=atoi(str[2]); // mob equipment [Valaris]
-
- ln++;
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,"db/mob_avail.txt");
- ShowStatus(tmp_output);
- return 0;
-}
-
-/*==========================================
- * Reading of random monster data
- *------------------------------------------
- */
-static int mob_read_randommonster(void)
-{
- FILE *fp;
- char line[1024];
- char *str[10],*p;
- int i,j;
-
- const char* mobfile[] = {
- "db/mob_branch.txt",
- "db/mob_poring.txt",
- "db/mob_boss.txt" };
-
- for(i=0;i<MAX_RANDOMMONSTER;i++){
- mob_db[0].summonper[i] = 1002; // ݒ肵–Y‚ꂽꇂ̓|ƒŠƒ“‚ªo‚é‚悤‚É‚µ‚Ä‚¨‚­
- fp=fopen(mobfile[i],"r");
- if(fp==NULL){
- printf("can't read %s\n",mobfile[i]);
- return -1;
- }
- while(fgets(line,1020,fp)){
- int class_,per;
- if(line[0] == '/' && line[1] == '/')
- continue;
- memset(str,0,sizeof(str));
- for(j=0,p=line;j<3 && p;j++){
- str[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
-
- if(str[0]==NULL || str[2]==NULL)
- continue;
-
- class_ = atoi(str[0]);
- per=atoi(str[2]);
- if((class_>1000 && class_<=MAX_MOB_DB) || class_==0)
- mob_db[class_].summonper[i]=per;
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n",mobfile[i]);
- ShowStatus(tmp_output);
- }
- return 0;
-}
-/*==========================================
- * db/mob_skill_db.txt reading
- *------------------------------------------
- */
-static int mob_readskilldb(void)
-{
- FILE *fp;
- char line[1024];
- int i;
-
- const struct {
- char str[32];
- int id;
- } cond1[] = {
- { "always", MSC_ALWAYS },
- { "myhpltmaxrate", MSC_MYHPLTMAXRATE },
- { "friendhpltmaxrate",MSC_FRIENDHPLTMAXRATE },
- { "mystatuson", MSC_MYSTATUSON },
- { "mystatusoff", MSC_MYSTATUSOFF },
- { "friendstatuson", MSC_FRIENDSTATUSON },
- { "friendstatusoff", MSC_FRIENDSTATUSOFF },
- { "attackpcgt", MSC_ATTACKPCGT },
- { "attackpcge", MSC_ATTACKPCGE },
- { "slavelt", MSC_SLAVELT },
- { "slavele", MSC_SLAVELE },
- { "closedattacked", MSC_CLOSEDATTACKED },
- { "longrangeattacked",MSC_LONGRANGEATTACKED },
- { "skillused", MSC_SKILLUSED },
- { "casttargeted", MSC_CASTTARGETED },
- }, cond2[] ={
- { "anybad", -1 },
- { "stone", SC_STONE },
- { "freeze", SC_FREEZE },
- { "stan", SC_STAN },
- { "sleep", SC_SLEEP },
- { "poison", SC_POISON },
- { "curse", SC_CURSE },
- { "silence", SC_SILENCE },
- { "confusion", SC_CONFUSION },
- { "blind", SC_BLIND },
- { "hiding", SC_HIDING },
- { "sight", SC_SIGHT },
- }, state[] = {
- { "any", -1 },
- { "idle", MSS_IDLE },
- { "walk", MSS_WALK },
- { "attack", MSS_ATTACK },
- { "dead", MSS_DEAD },
- { "loot", MSS_LOOT },
- { "chase", MSS_CHASE },
- }, target[] = {
- { "target", MST_TARGET },
- { "self", MST_SELF },
- { "friend", MST_FRIEND },
- { "around5", MST_AROUND5 },
- { "around6", MST_AROUND6 },
- { "around7", MST_AROUND7 },
- { "around8", MST_AROUND8 },
- { "around1", MST_AROUND1 },
- { "around2", MST_AROUND2 },
- { "around3", MST_AROUND3 },
- { "around4", MST_AROUND4 },
- { "around", MST_AROUND },
- };
-
- int x;
- char *filename[]={ "db/mob_skill_db.txt","db/mob_skill_db2.txt" };
-
- for(x=0;x<2;x++){
-
- fp=fopen(filename[x],"r");
- if(fp==NULL){
- if(x==0)
- printf("can't read %s\n",filename[x]);
- continue;
- }
- while(fgets(line,1020,fp)){
- char *sp[20],*p;
- int mob_id;
- struct mob_skill *ms;
- int j=0;
-
- if(line[0] == '/' && line[1] == '/')
- continue;
-
- memset(sp,0,sizeof(sp));
- for(i=0,p=line;i<18 && p;i++){
- sp[i]=p;
- if((p=strchr(p,','))!=NULL)
- *p++=0;
- }
- if( (mob_id=atoi(sp[0]))<=0 )
- continue;
-
- if( strcmp(sp[1],"clear")==0 ){
- memset(mob_db[mob_id].skill,0,sizeof(mob_db[mob_id].skill));
- mob_db[mob_id].maxskill=0;
- continue;
- }
-
- for(i=0;i<MAX_MOBSKILL;i++)
- if( (ms=&mob_db[mob_id].skill[i])->skill_id == 0)
- break;
- if(i==MAX_MOBSKILL){
- printf("mob_skill: readdb: too many skill ! [%s] in %d[%s]\n",
- sp[1],mob_id,mob_db[mob_id].jname);
- continue;
- }
-
- ms->state=atoi(sp[2]);
- for(j=0;j<sizeof(state)/sizeof(state[0]);j++){
- if( strcmp(sp[2],state[j].str)==0)
- ms->state=state[j].id;
- }
- ms->skill_id=atoi(sp[3]);
- j=atoi(sp[4]);
- if (j<=0 || j>MAX_SKILL_DB)
- continue;
- ms->skill_lv=j;
- ms->permillage=atoi(sp[5]);
- ms->casttime=atoi(sp[6]);
- ms->delay=atoi(sp[7]);
- ms->cancel=atoi(sp[8]);
- if( strcmp(sp[8],"yes")==0 ) ms->cancel=1;
- ms->target=atoi(sp[9]);
- for(j=0;j<sizeof(target)/sizeof(target[0]);j++){
- if( strcmp(sp[9],target[j].str)==0)
- ms->target=target[j].id;
- }
- ms->cond1=-1;
- for(j=0;j<sizeof(cond1)/sizeof(cond1[0]);j++){
- if( strcmp(sp[10],cond1[j].str)==0)
- ms->cond1=cond1[j].id;
- }
- ms->cond2=atoi(sp[11]);
- for(j=0;j<sizeof(cond2)/sizeof(cond2[0]);j++){
- if( strcmp(sp[11],cond2[j].str)==0)
- ms->cond2=cond2[j].id;
- }
- ms->val[0]=atoi(sp[12]);
- ms->val[1]=atoi(sp[13]);
- ms->val[2]=atoi(sp[14]);
- ms->val[3]=atoi(sp[15]);
- ms->val[4]=atoi(sp[16]);
- if(sp[17] != NULL && strlen(sp[17])>2)
- ms->emotion=atoi(sp[17]);
- else
- ms->emotion=-1;
- mob_db[mob_id].maxskill=i+1;
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n",filename[x]);
- ShowStatus(tmp_output);
- }
- return 0;
-}
-/*==========================================
- * db/mob_race_db.txt reading
- *------------------------------------------
- */
-static int mob_readdb_race(void)
-{
- FILE *fp;
- char line[1024];
- int race,j,k;
- char *str[20],*p,*np;
-
- if( (fp=fopen("db/mob_race2_db.txt","r"))==NULL ){
- printf("can't read db/mob_race2_db.txt\n");
- return -1;
- }
-
- while(fgets(line,1020,fp)){
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(str,0,sizeof(str));
-
- for(j=0,p=line;j<12;j++){
- if((np=strchr(p,','))!=NULL){
- str[j]=p;
- *np=0;
- p=np+1;
- } else
- str[j]=p;
- }
- if(str[0]==NULL)
- continue;
-
- race=atoi(str[0]);
- if (race < 0 || race >= MAX_MOB_RACE_DB)
- continue;
-
- for (j=1; j<20; j++) {
- if (!str[j])
- break;
- k=atoi(str[j]);
- if (k < 1000 || k > MAX_MOB_DB)
- continue;
- mob_db[k].race2 = race;
- //mob_race_db[race][j] = k;
- }
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/mob_race2_db.txt");
- ShowStatus(tmp_output);
- return 0;
-}
-
-#ifndef TXT_ONLY
-/*==========================================
- * SQL reading
- *------------------------------------------
- */
-static int mob_read_sqldb(void)
-{
- char line[1024];
- int i,class_;
- long unsigned int ln=0;
- char *str[60],*p,*np; // 55->60 Lupus
-
- memset(mob_db,0,sizeof(mob_db));
-
- sprintf (tmp_sql, "SELECT * FROM `%s`",mob_db_db);
- if(mysql_query(&mmysql_handle, tmp_sql) ) {
- printf("DB server Error (select %s to Memory)- %s\n",mob_db_db,mysql_error(&mmysql_handle) );
- }
- sql_res = mysql_store_result(&mmysql_handle);
- if (sql_res) {
- while((sql_row = mysql_fetch_row(sql_res))){
- sprintf(line,"%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s",
- sql_row[0],sql_row[1],sql_row[2],sql_row[3],sql_row[4],
- sql_row[5],sql_row[6],sql_row[7],sql_row[8],sql_row[9],
- sql_row[10],sql_row[11],sql_row[12],sql_row[13],sql_row[14],
- sql_row[15],sql_row[16],sql_row[17],sql_row[18],sql_row[19],
- sql_row[20],sql_row[21],sql_row[22],sql_row[23],sql_row[24],
- sql_row[25],sql_row[26],sql_row[27],sql_row[28],sql_row[29],
- sql_row[30],sql_row[31],sql_row[32],sql_row[33],sql_row[34],
- sql_row[35],sql_row[36],sql_row[37],sql_row[38],sql_row[39],
- sql_row[40],sql_row[41],sql_row[42],sql_row[43],sql_row[44],
- sql_row[45],sql_row[46],sql_row[47],sql_row[48],sql_row[49],
- sql_row[50],sql_row[51],sql_row[52],sql_row[53],sql_row[54],
- sql_row[55],sql_row[56]);
-
- for(i=0,p=line;i<57;i++){
- if((np=strchr(p,','))!=NULL){
- str[i]=p;
- *np=0;
- p=np+1;
- } else
- str[i]=p;
- }
-
- class_=atoi(str[0]);
- if(class_<=1000 || class_>MAX_MOB_DB)
- continue;
-
- ln++;
-
- mob_db[class_].view_class=class_;
- memcpy(mob_db[class_].name,str[1],24);
- memcpy(mob_db[class_].jname,str[2],24);
- mob_db[class_].lv=atoi(str[3]);
- mob_db[class_].max_hp=atoi(str[4]);
- mob_db[class_].max_sp=atoi(str[5]);
-
- mob_db[class_].base_exp = atoi(str[6]);
- if (mob_db[class_].base_exp <= 0)
- mob_db[class_].base_exp = 0;
- else if (mob_db[class_].base_exp * battle_config.base_exp_rate / 100 > 1000000000 ||
- mob_db[class_].base_exp * battle_config.base_exp_rate / 100 < 0)
- mob_db[class_].base_exp = 1000000000;
- else {
- mob_db[class_].base_exp = mob_db[class_].base_exp * battle_config.base_exp_rate / 100;
- if (mob_db[class_].base_exp < 1)
- mob_db[class_].base_exp = 1;
- }
- mob_db[class_].job_exp = atoi(str[7]);
- if (mob_db[class_].job_exp <= 0)
- mob_db[class_].job_exp = 0;
- else if (mob_db[class_].job_exp * battle_config.job_exp_rate / 100 > 1000000000 ||
- mob_db[class_].job_exp * battle_config.job_exp_rate / 100 < 0)
- mob_db[class_].job_exp = 1000000000;
- else {
- mob_db[class_].job_exp = mob_db[class_].job_exp * battle_config.job_exp_rate / 100;
- if (mob_db[class_].job_exp < 1)
- mob_db[class_].job_exp = 1;
- }
-
- mob_db[class_].range=atoi(str[8]);
- mob_db[class_].atk1=atoi(str[9]);
- mob_db[class_].atk2=atoi(str[10]);
- mob_db[class_].def=atoi(str[11]);
- mob_db[class_].mdef=atoi(str[12]);
- mob_db[class_].str=atoi(str[13]);
- mob_db[class_].agi=atoi(str[14]);
- mob_db[class_].vit=atoi(str[15]);
- mob_db[class_].int_=atoi(str[16]);
- mob_db[class_].dex=atoi(str[17]);
- mob_db[class_].luk=atoi(str[18]);
- mob_db[class_].range2=atoi(str[19]);
- mob_db[class_].range3=atoi(str[20]);
- mob_db[class_].size=atoi(str[21]);
- mob_db[class_].race=atoi(str[22]);
- mob_db[class_].element=atoi(str[23]);
- mob_db[class_].mode=atoi(str[24]);
- mob_db[class_].speed=atoi(str[25]);
- mob_db[class_].adelay=atoi(str[26]);
- mob_db[class_].amotion=atoi(str[27]);
- mob_db[class_].dmotion=atoi(str[28]);
-
- for(i=0;i<10;i++){ // 8 -> 10 Lupus
- int rate = 0,type,ratemin,ratemax;
- mob_db[class_].dropitem[i].nameid=atoi(str[29+i*2]);
- type = itemdb_type(mob_db[class_].dropitem[i].nameid);
- if (type == 0) { // Added by Valaris
- rate = battle_config.item_rate_heal * atoi(str[30+i*2]) / 100;
- ratemin = battle_config.item_drop_heal_min;
- ratemax = battle_config.item_drop_heal_max;
- }
- else if (type == 2) {
- rate = battle_config.item_rate_use * atoi(str[30+i*2]) / 100;
- ratemin = battle_config.item_drop_use_min;
- ratemax = battle_config.item_drop_use_max; // End
- }
- else if (type == 4 || type == 5 || type == 8) { // Changed to include Pet Equip
- rate = battle_config.item_rate_equip * atoi(str[30+i*2]) / 100;
- ratemin = battle_config.item_drop_equip_min;
- ratemax = battle_config.item_drop_equip_max;
- }
- else if (type == 6) {
- rate = battle_config.item_rate_card * atoi(str[30+i*2]) / 100;
- ratemin = battle_config.item_drop_card_min;
- ratemax = battle_config.item_drop_card_max;
- }
- else {
- rate = battle_config.item_rate_common * atoi(str[30+i*2]) / 100;
- ratemin = battle_config.item_drop_common_min;
- ratemax = battle_config.item_drop_common_max;
- }
-
- mob_db[class_].dropitem[i].p = (rate < ratemin) ? ratemin : (rate > ratemax) ? ratemax: rate;
- }
- // MVP EXP Bonus, Chance: MEXP,ExpPer
- mob_db[class_].mexp=atoi(str[49])*battle_config.mvp_exp_rate/100;
- mob_db[class_].mexpper=atoi(str[50]);
- // MVP Drops: MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per
- for(i=0;i<3;i++){
- mob_db[class_].mvpitem[i].nameid=atoi(str[51+i*2]);
- mob_db[class_].mvpitem[i].p=atoi(str[52+i*2])*battle_config.mvp_item_rate/100;
- }
- for(i=0;i<MAX_RANDOMMONSTER;i++)
- mob_db[class_].summonper[i]=0;
- mob_db[class_].maxskill=0;
-
- mob_db[class_].sex=0;
- mob_db[class_].hair=0;
- mob_db[class_].hair_color=0;
- mob_db[class_].weapon=0;
- mob_db[class_].shield=0;
- mob_db[class_].head_top=0;
- mob_db[class_].head_mid=0;
- mob_db[class_].head_buttom=0;
- }
- mysql_free_result(sql_res);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,mob_db_db);
- ShowStatus(tmp_output);
- }
- return 0;
-}
-#endif /* not TXT_ONLY */
-
-void mob_reload(void)
-{
-#ifndef TXT_ONLY
- if(db_use_sqldbs)
- mob_read_sqldb();
- else
-#endif /* TXT_ONLY */
- mob_readdb();
-
- mob_readdb_mobavail();
- mob_read_randommonster();
- mob_readskilldb();
- mob_readdb_race();
-}
-
-/*==========================================
- * Circumference initialization of mob
- *------------------------------------------
- */
-int do_init_mob(void)
-{
-#ifndef TXT_ONLY
- if(db_use_sqldbs)
- mob_read_sqldb();
- else
-#endif /* TXT_ONLY */
- mob_readdb();
-
- mob_readdb_mobavail();
- mob_read_randommonster();
- mob_readskilldb();
- mob_readdb_race();
-
- add_timer_func_list(mob_timer,"mob_timer");
- add_timer_func_list(mob_delayspawn,"mob_delayspawn");
- add_timer_func_list(mob_delay_item_drop,"mob_delay_item_drop");
- add_timer_func_list(mob_delay_item_drop2,"mob_delay_item_drop2");
- add_timer_func_list(mob_ai_hard,"mob_ai_hard");
- add_timer_func_list(mob_ai_lazy,"mob_ai_lazy");
- add_timer_func_list(mobskill_castend_id,"mobskill_castend_id");
- add_timer_func_list(mobskill_castend_pos,"mobskill_castend_pos");
- add_timer_func_list(mob_timer_delete,"mob_timer_delete");
- add_timer_interval(gettick()+MIN_MOBTHINKTIME,mob_ai_hard,0,0,MIN_MOBTHINKTIME);
- add_timer_interval(gettick()+MIN_MOBTHINKTIME*10,mob_ai_lazy,0,0,MIN_MOBTHINKTIME*10);
-
- return 0;
-}
diff --git a/src/map/mob.h b/src/map/mob.h
deleted file mode 100644
index 6613c5b6b..000000000
--- a/src/map/mob.h
+++ /dev/null
@@ -1,149 +0,0 @@
-// $Id: mob.h,v 1.4 2004/09/25 05:32:18 MouseJstr Exp $
-#ifndef _MOB_H_
-#define _MOB_H_
-
-#define MAX_RANDOMMONSTER 3
-#define MAX_MOB_RACE_DB 6
-#define MAX_MOB_DB 2000 /* Change this to increase the table size in your mob_db to accomodate
- numbers more than 2000 for mobs if you want to (and know what you're doing).
- Be sure to note that 4001 to 4047 are for advanced classes. */
-
-struct mob_skill {
- short state;
- short skill_id,skill_lv;
- short permillage;
- int casttime,delay;
- short cancel;
- short cond1,cond2;
- short target;
- int val[5];
- short emotion;
-};
-
-struct mob_db {
- char name[24],jname[24];
- int lv;
- int max_hp,max_sp;
- int base_exp,job_exp;
- int atk1,atk2;
- int def,mdef;
- int str,agi,vit,int_,dex,luk;
- int range,range2,range3;
- int size,race,element,mode;
- short race2; // celest
- int speed,adelay,amotion,dmotion;
- int mexp,mexpper;
- struct { int nameid,p; } dropitem[10]; //8 -> 10 Lupus
- struct { int nameid,p; } mvpitem[3];
- int view_class,sex;
- short hair,hair_color,weapon,shield,head_top,head_mid,head_buttom,option,clothes_color; // [Valaris]
- int equip; // [Valaris]
- int summonper[MAX_RANDOMMONSTER];
- int maxskill;
- struct mob_skill skill[MAX_MOBSKILL];
-};
-extern struct mob_db mob_db[];
-
-enum {
- MST_TARGET = 0,
- MST_SELF = 1,
- MST_FRIEND = 2,
- MST_AROUND5 = 3,
- MST_AROUND6 = 4,
- MST_AROUND7 = 5,
- MST_AROUND8 = 6,
- MST_AROUND1 = 7,
- MST_AROUND2 = 8,
- MST_AROUND3 = 9,
- MST_AROUND4 = 10,
- MST_AROUND = MST_AROUND4,
-
- MSC_ALWAYS = 0x0000,
- MSC_MYHPLTMAXRATE = 0x0001,
- MSC_FRIENDHPLTMAXRATE= 0x0010,
- MSC_MYSTATUSON = 0x0020,
- MSC_MYSTATUSOFF = 0x0021,
- MSC_FRIENDSTATUSON = 0x0030,
- MSC_FRIENDSTATUSOFF = 0x0031,
-
- MSC_ATTACKPCGT = 0x0100,
- MSC_ATTACKPCGE = 0x0101,
- MSC_SLAVELT = 0x0110,
- MSC_SLAVELE = 0x0111,
- MSC_CLOSEDATTACKED = 0x1000,
- MSC_LONGRANGEATTACKED= 0x1001,
- MSC_SKILLUSED = 0x1010,
- MSC_CASTTARGETED = 0x1011,
-};
-
-enum {
- MSS_IDLE, // ?@
- MSS_WALK, // ?
- MSS_ATTACK, // U
- MSS_DEAD, // S
- MSS_LOOT, // [g
- MSS_CHASE, // ?
-};
-
-int mobdb_searchname(const char *str);
-int mobdb_checkid(const int id);
-int mob_once_spawn(struct map_session_data *sd,char *mapname,
- int x,int y,const char *mobname,int class_,int amount,const char *event);
-int mob_once_spawn_area(struct map_session_data *sd,char *mapname,
- int x0,int y0,int x1,int y1,
- const char *mobname,int class_,int amount,const char *event);
-
-int mob_spawn_guardian(struct map_session_data *sd,char *mapname, // Spawning Guardians [Valaris]
- int x,int y,const char *mobname,int class_,int amount,const char *event,int guardian); // Spawning Guardians [Valaris]
-
-
-int mob_walktoxy(struct mob_data *md,int x,int y,int easy);
-//int mob_randomwalk(struct mob_data *md,int tick);
-//int mob_can_move(struct mob_data *md);
-
-int mob_target(struct mob_data *md,struct block_list *bl,int dist);
-int mob_stop_walking(struct mob_data *md,int type);
-int mob_stopattack(struct mob_data *);
-int mob_spawn(int);
-int mob_setdelayspawn(int);
-int mob_damage(struct block_list *,struct mob_data*,int,int);
-int mob_changestate(struct mob_data *md,int state,int type);
-int mob_heal(struct mob_data*,int);
-int mob_exclusion_add(struct mob_data *md,int type,int id);
-int mob_exclusion_check(struct mob_data *md,struct map_session_data *sd);
-int mob_get_viewclass(int);
-int mob_get_sex(int);
-short mob_get_hair(int);
-short mob_get_hair_color(int);
-short mob_get_weapon(int);
-short mob_get_shield(int);
-short mob_get_head_top(int);
-short mob_get_head_mid(int);
-short mob_get_head_buttom(int);
-short mob_get_clothes_color(int); //player mob dye [Valaris]
-int mob_get_equip(int); // mob equip [Valaris]
-int do_init_mob(void);
-
-void mob_unload(struct mob_data *md);
-int mob_remove_map(struct mob_data *md, int type);
-int mob_delete(struct mob_data *md);
-int mob_timer_delete(int tid, unsigned int tick, int id, int data);
-
-int mob_deleteslave(struct mob_data *md);
-
-int mob_counttargeted(struct mob_data *md,struct block_list *src,int target_lv);
-
-int mob_class_change(struct mob_data *md,int *value);
-int mob_warp(struct mob_data *md,int m,int x,int y,int type);
-
-int mobskill_use(struct mob_data *md,unsigned int tick,int event);
-int mobskill_event(struct mob_data *md,int flag);
-int mobskill_castend_id( int tid, unsigned int tick, int id,int data );
-int mobskill_castend_pos( int tid, unsigned int tick, int id,int data );
-int mob_summonslave(struct mob_data *md2,int *value,int amount,int flag);
-int mob_countslave(struct mob_data *md);
-
-int mob_gvmobcheck(struct map_session_data *sd, struct block_list *bl);
-void mob_reload(void);
-
-#endif
diff --git a/src/map/npc.c b/src/map/npc.c
deleted file mode 100644
index 069597f83..000000000
--- a/src/map/npc.c
+++ /dev/null
@@ -1,2574 +0,0 @@
-// $Id: npc.c,v 1.5 2004/09/25 05:32:18 MouseJstr Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <string.h>
-#include <math.h>
-#include <time.h>
-
-#include "db.h"
-#include "timer.h"
-#include "nullpo.h"
-#include "malloc.h"
-#include "map.h"
-#include "npc.h"
-#include "clif.h"
-#include "intif.h"
-#include "pc.h"
-#include "status.h"
-#include "itemdb.h"
-#include "script.h"
-#include "mob.h"
-#include "pet.h"
-#include "battle.h"
-#include "skill.h"
-#include "grfio.h"
-#include "showmsg.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-#ifdef _WIN32
-#undef isspace
-#define isspace(x) (x == ' ' || x == '\t')
-#endif
-
-struct npc_src_list {
- struct npc_src_list * next;
-// struct npc_src_list * prev; //[Shinomori]
- char name[4];
-};
-
-static struct npc_src_list *npc_src_first=NULL;
-static struct npc_src_list *npc_src_last=NULL;
-static int npc_id=START_NPC_NUM;
-static int npc_warp=0;
-static int npc_shop=0;
-static int npc_script=0;
-static int npc_mob=0;
-char *current_file = NULL;
-int npc_get_new_npc_id(void){ return npc_id++; }
-
-static struct dbt *ev_db;
-static struct dbt *npcname_db;
-
-struct event_data {
- struct npc_data *nd;
- int pos;
-};
-static struct tm ev_tm_b; // ŽžŒvƒCƒxƒ“ƒg—p
-
-static int npc_walktimer(int,unsigned int,int,int); // [Valaris]
-static int npc_walktoxy_sub(struct npc_data *nd); // [Valaris]
-
-/*==========================================
- * NPC‚Ì–³Œø‰»/—LŒø‰»
- * npc_enable
- * npc_enable_sub —LŒøŽž‚ÉOnTouchƒCƒxƒ“ƒg‚ðŽÀs
- *------------------------------------------
- */
-int npc_enable_sub( struct block_list *bl, va_list ap )
-{
- struct map_session_data *sd;
- struct npc_data *nd;
- //char *name=(char *)aCallocA(50,sizeof(char)); // fixed [Shinomori]
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, nd=va_arg(ap,struct npc_data *));
- if(bl->type == BL_PC && (sd=(struct map_session_data *)bl)){
- char name[50]; // need 24 + 9 for the "::OnTouch"
-
- if (nd->flag&1) // –³Œø‰»‚³‚ê‚Ä‚¢‚é
- return 1;
-
- if(sd->areanpc_id==nd->bl.id)
- return 1;
- sd->areanpc_id=nd->bl.id;
-
- sprintf(name,"%s::OnTouch", nd->name);
- npc_event(sd,name,0);
- }
- //aFree(name);
- return 0;
-}
-int npc_enable(const char *name,int flag)
-{
- struct npc_data *nd= (struct npc_data *) strdb_search(npcname_db,name);
- if (nd==NULL)
- return 0;
-
- if (flag&1) { // —LŒø‰»
- nd->flag&=~1;
- clif_spawnnpc(nd);
- }else if (flag&2){
- nd->flag&=~1;
- nd->option = 0x0000;
- clif_changeoption(&nd->bl);
- }else if (flag&4){
- nd->flag|=1;
- nd->option = 0x0002;
- clif_changeoption(&nd->bl);
- }else{ // –³Œø‰»
- nd->flag|=1;
- clif_clearchar(&nd->bl,0);
- }
- if(flag&3 && (nd->u.scr.xs > 0 || nd->u.scr.ys >0))
- map_foreachinarea( npc_enable_sub,nd->bl.m,nd->bl.x-nd->u.scr.xs,nd->bl.y-nd->u.scr.ys,nd->bl.x+nd->u.scr.xs,nd->bl.y+nd->u.scr.ys,BL_PC,nd);
-
- return 0;
-}
-
-/*==========================================
- * NPC‚𖼑O‚Å’T‚·
- *------------------------------------------
- */
-struct npc_data* npc_name2id(const char *name)
-{
- return (struct npc_data *) strdb_search(npcname_db,name);
-}
-
-void ev_release(struct dbn *db, int which)
-{
- if (which & 0x1)
- aFree(db->key);
- if (which & 0x2)
- aFree(db->data);
-}
-
-/*==========================================
- * ƒCƒxƒ“ƒgƒLƒ…[‚̃Cƒxƒ“ƒgˆ—
- *------------------------------------------
- */
-int npc_event_dequeue(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- sd->npc_id=0;
- if (sd->eventqueue[0][0]) { // ƒLƒ…[‚̃Cƒxƒ“ƒgˆ—
- size_t ev;
-
- // find an empty place in eventtimer list
- for(ev=0;ev<MAX_EVENTTIMER;ev++)
- if( sd->eventtimer[ev]==-1 )
- break;
- if(ev<MAX_EVENTTIMER)
- { // generate and insert the timer
- int i;
- // copy the first event name
- char *name=(char *)aMalloc(50*sizeof(char));
- memcpy(name,sd->eventqueue[0],50);
- // shift queued events down by one
- for(i=1;i<MAX_EVENTQUEUE;i++)
- memcpy(sd->eventqueue[i-1],sd->eventqueue[i],50);
- // clear the last event
- sd->eventqueue[MAX_EVENTQUEUE-1][0]=0;
- // add the timer
- sd->eventtimer[ev]=add_timer(gettick()+100,pc_eventtimer,sd->bl.id,(int)name);//!!todo!!
-
- }else
- printf("npc_event_dequeue: event timer is full !\n");
- }
- return 0;
-}
-
-/*==========================================
- * ƒCƒxƒ“ƒg‚Ì’x‰„ŽÀs
- *------------------------------------------
- */
-int npc_event_timer(int tid,unsigned int tick,int id,int data)
-{
- char *eventname = (char *)data;
- struct event_data *ev = (struct event_data *)strdb_search(ev_db,eventname);
- struct npc_data *nd;
- struct map_session_data *sd=map_id2sd(id);
- size_t i;
-
- if((ev==NULL || (nd=ev->nd)==NULL))
- {
- if(battle_config.error_log)
- printf("npc_event: event not found [%s]\n",eventname);
- }
- else
- {
- for(i=0;i<MAX_EVENTTIMER;i++) {
- if( nd->eventtimer[i]==tid ) {
- nd->eventtimer[i]=-1;
- npc_event(sd,eventname,0); // sd NULL check is within
- break;
- }
- }
- if(i==MAX_EVENTTIMER && battle_config.error_log)
- printf("npc_event_timer: event timer not found [%s]!\n",eventname);
- }
-
- aFree(eventname);
- return 0;
-}
-
-int npc_timer_event(const char *eventname) // Added by RoVeRT
-{
- struct event_data *ev=(struct event_data *) strdb_search(ev_db,eventname);
- struct npc_data *nd;
-// int xs,ys;
-
- if((ev==NULL || (nd=ev->nd)==NULL)){
- printf("npc_event: event not found [%s]\n",eventname);
- return 0;
- }
-
- run_script(nd->u.scr.script,ev->pos,nd->bl.id,nd->bl.id);
-
- return 0;
-}
-/*
-int npc_timer_sub_sub(void *key,void *data,va_list ap) // Added by RoVeRT
-{
- char *p=(char *)key;
- struct event_data *ev=(struct event_data *)data;
- int *c=va_arg(ap,int *);
- int tick=0,ctick=gettick();
- char temp[10];
- char event[100];
-
- if(ev->nd->bl.id==(int)*c && (p=strchr(p,':')) && p && strncasecmp("::OnTimer",p,8)==0 ){
- sscanf(&p[9],"%s",temp);
- tick=atoi(temp);
-
- strcpy( event, ev->nd->name);
- strcat( event, p);
-
- if (ctick >= ev->nd->lastaction && ctick - ev->nd->timer >= tick) {
- npc_timer_event(event);
- ev->nd->lastaction = ctick;
- }
- }
- return 0;
-}
-
-int npc_timer_sub(void *key,void *data,va_list ap) // Added by RoVeRT
-{
- struct npc_data *nd=(struct npc_data*)data;
-
- if(nd->timer == -1)
- return 0;
-
- strdb_foreach(ev_db,npc_timer_sub_sub,&nd->bl.id);
-
- return 0;
-}
-
-int npc_timer(int tid,unsigned int tick,int id,int data) // Added by RoVeRT
-{
- strdb_foreach(npcname_db,npc_timer_sub);
-
- aFree((void*)data);
- return 0;
-}*/
-/*==========================================
- * ƒCƒxƒ“ƒg—pƒ‰ƒxƒ‹‚̃GƒNƒXƒ|[ƒg
- * npc_parse_script->strdb_foreach‚©‚çŒÄ‚΂ê‚é
- *------------------------------------------
- */
-int npc_event_export(void *key,void *data,va_list ap)
-{
- char *lname=(char *)key;
- int pos=(int)data;
- struct npc_data *nd=va_arg(ap,struct npc_data *);
-
- if ((lname[0]=='O' || lname[0]=='o')&&(lname[1]=='N' || lname[1]=='n')) {
- struct event_data *ev;
- char *buf;
- char *p=strchr(lname,':');
- // ƒGƒNƒXƒ|[ƒg‚³‚ê‚é
- ev=(struct event_data *) aCalloc(sizeof(struct event_data), 1);
- buf=(char *) aCallocA(50, 1);
- if (ev==NULL || buf==NULL) {
- printf("npc_event_export: out of memory !\n");
- exit(1);
- }else if (p==NULL || (p-lname)>24) {
- printf("npc_event_export: label name error !\n");
- exit(1);
- }else{
- ev->nd=nd;
- ev->pos=pos;
- *p='\0';
- sprintf(buf,"%s::%s",nd->exname,lname);
- *p=':';
- strdb_insert(ev_db,buf,ev);
-// if (battle_config.etc_log)
-// printf("npc_event_export: export [%s]\n",buf);
- }
- }
- return 0;
-}
-
-/*==========================================
- * ‘S‚Ä‚ÌNPC‚ÌOn*ƒCƒxƒ“ƒgŽÀs
- *------------------------------------------
- */
-int npc_event_doall_sub(void *key,void *data,va_list ap)
-{
- char *p=(char *)key;
- struct event_data *ev;
- int *c;
- int rid;
- const char *name;
-
- nullpo_retr(0, ev=(struct event_data *)data);
- nullpo_retr(0, ap);
- nullpo_retr(0, c=va_arg(ap,int *));
- name=va_arg(ap,const char *);
- rid=va_arg(ap, int);
-
- if( (p=strchr(p,':')) && p && strcmpi(name,p)==0 ){
- run_script(ev->nd->u.scr.script,ev->pos,rid,ev->nd->bl.id);
- (*c)++;
- }
-
- return 0;
-}
-int npc_event_doall(const char *name)
-{
- int c=0;
- char buf[64]="::";
-
- strncpy(buf+2,name,62);
- strdb_foreach(ev_db,npc_event_doall_sub,&c,buf,0);
- return c;
-}
-int npc_event_doall_id(const char *name, int rid)
-{
- int c=0;
- char buf[64]="::";
-
- strncpy(buf+2,name,62);
- strdb_foreach(ev_db,npc_event_doall_sub,&c,buf,rid);
- return c;
-}
-
-int npc_event_do_sub(void *key,void *data,va_list ap)
-{
- char *p=(char *)key;
- struct event_data *ev;
- int *c;
- const char *name;
-
- nullpo_retr(0, ev=(struct event_data *)data);
- nullpo_retr(0, ap);
- nullpo_retr(0, c=va_arg(ap,int *));
-
- name=va_arg(ap,const char *);
-
- if (p && strcmpi(name,p)==0 ) {
- run_script(ev->nd->u.scr.script,ev->pos,0,ev->nd->bl.id);
- (*c)++;
- }
-
- return 0;
-}
-int npc_event_do(const char *name)
-{
- int c=0;
-
- if (*name==':' && name[1]==':') {
- return npc_event_doall(name+2);
- }
-
- strdb_foreach(ev_db,npc_event_do_sub,&c,name);
- return c;
-}
-
-/*==========================================
- * ŽžŒvƒCƒxƒ“ƒgŽÀs
- *------------------------------------------
- */
-int npc_event_do_clock(int tid,unsigned int tick,int id,int data)
-{
- time_t timer;
- struct tm *t;
- char buf[64];
- char *day="";
- int c=0;
-
- time(&timer);
- t=localtime(&timer);
-
- switch (t->tm_wday) {
- case 0: day = "Sun"; break;
- case 1: day = "Mon"; break;
- case 2: day = "Tue"; break;
- case 3: day = "Wed"; break;
- case 4: day = "Thu"; break;
- case 5: day = "Fri"; break;
- case 6: day = "Sat"; break;
- }
-
- if (t->tm_min != ev_tm_b.tm_min ) {
- sprintf(buf,"OnMinute%02d",t->tm_min);
- c+=npc_event_doall(buf);
- sprintf(buf,"OnClock%02d%02d",t->tm_hour,t->tm_min);
- c+=npc_event_doall(buf);
- sprintf(buf,"On%s%02d%02d",day,t->tm_hour,t->tm_min);
- c+=npc_event_doall(buf);
- }
- if (t->tm_hour!= ev_tm_b.tm_hour) {
- sprintf(buf,"OnHour%02d",t->tm_hour);
- c+=npc_event_doall(buf);
- }
- if (t->tm_mday!= ev_tm_b.tm_mday) {
- sprintf(buf,"OnDay%02d%02d",t->tm_mon+1,t->tm_mday);
- c+=npc_event_doall(buf);
- }
- memcpy(&ev_tm_b,t,sizeof(ev_tm_b));
- return c;
-}
-/*==========================================
- * OnInitƒCƒxƒ“ƒgŽÀs(&ŽžŒvƒCƒxƒ“ƒgŠJŽn)
- *------------------------------------------
- */
-int npc_event_do_oninit(void)
-{
-// int c = npc_event_doall("OnInit");
- sprintf(tmp_output,"Event '"CL_WHITE"OnInit"CL_RESET"' executed with '"
- CL_WHITE"%d"CL_RESET"' NPCs.\n",npc_event_doall("OnInit"));
- ShowStatus(tmp_output);
-
- add_timer_interval(gettick()+100,
- npc_event_do_clock,0,0,1000);
-
- return 0;
-}
-/*==========================================
- * OnTimer NPC event - by RoVeRT
- *------------------------------------------
- */
-int npc_addeventtimer(struct npc_data *nd,int tick,const char *name)
-{
- int i;
- for(i=0;i<MAX_EVENTTIMER;i++)
- if( nd->eventtimer[i]==-1 )
- break;
- if(i<MAX_EVENTTIMER){
- char *evname=(char *) aMallocA(24);
- if(evname==NULL){
- printf("npc_addeventtimer: out of memory !\n");exit(1);
- }
- memcpy(evname,name,24);
- nd->eventtimer[i]=add_timer(gettick()+tick,
- npc_event_timer,nd->bl.id,(int)evname);
- }else
- printf("npc_addtimer: event timer is full !\n");
-
- return 0;
-}
-
-int npc_deleventtimer(struct npc_data *nd,const char *name)
-{
- int i;
- for(i=0;i<MAX_EVENTTIMER;i++)
- if( nd->eventtimer[i]!=-1 && strcmp(
- (char *)(get_timer(nd->eventtimer[i])->data), name)==0 ){
- delete_timer(nd->eventtimer[i],npc_event_timer);
- nd->eventtimer[i]=-1;
- break;
- }
-
- return 0;
-}
-
-int npc_cleareventtimer(struct npc_data *nd)
-{
- int i;
- for(i=0;i<MAX_EVENTTIMER;i++)
- if( nd->eventtimer[i]!=-1 ){
- delete_timer(nd->eventtimer[i],npc_event_timer);
- nd->eventtimer[i]=-1;
- }
-
- return 0;
-}
-
-int npc_do_ontimer_sub(void *key,void *data,va_list ap)
-{
- char *p = (char *)key;
- struct event_data *ev = (struct event_data *)data;
- int *c = va_arg(ap,int *);
-// struct map_session_data *sd=va_arg(ap,struct map_session_data *);
- int option = va_arg(ap,int);
- int tick = 0;
- char temp[10];
- char event[50];
-
- if(ev->nd->bl.id == (int)*c && (p = strchr(p,':')) && strnicmp("::OnTimer",p,8) == 0){
- sscanf(&p[9], "%s", temp);
- tick = atoi(temp);
-
- strcpy(event, ev->nd->name);
- strcat(event, p);
-
- if (option!=0) {
- npc_addeventtimer(ev->nd, tick, event);
- } else {
- npc_deleventtimer(ev->nd, event);
- }
- }
- return 0;
-}
-int npc_do_ontimer(int npc_id, int option)
-{
- strdb_foreach(ev_db, npc_do_ontimer_sub, &npc_id, option);
- return 0;
-}
-/*==========================================
- * ƒ^ƒCƒ}[ƒCƒxƒ“ƒg—pƒ‰ƒxƒ‹‚ÌŽæ‚èž‚Ý
- * npc_parse_script->strdb_foreach‚©‚çŒÄ‚΂ê‚é
- *------------------------------------------
- */
-int npc_timerevent_import(void *key,void *data,va_list ap)
-{
- char *lname=(char *)key;
- int pos=(int)data;
- struct npc_data *nd=va_arg(ap,struct npc_data *);
- int t=0,i=0;
-
- if(sscanf(lname,"OnTimer%d%n",&t,&i)==1 && lname[i]==':') {
- // ƒ^ƒCƒ}[ƒCƒxƒ“ƒg
- struct npc_timerevent_list *te=nd->u.scr.timer_event;
- int j,i=nd->u.scr.timeramount;
- if(te==NULL) te=(struct npc_timerevent_list*)aMallocA(sizeof(struct npc_timerevent_list));
- else te= (struct npc_timerevent_list*)aRealloc( te, sizeof(struct npc_timerevent_list) * (i+1) );
- if(te==NULL){
- printf("npc_timerevent_import: out of memory !\n");
- exit(1);
- }
- for(j=0;j<i;j++){
- if(te[j].timer>t){
- memmove(te+j+1,te+j,sizeof(struct npc_timerevent_list)*(i-j));
- break;
- }
- }
- te[j].timer=t;
- te[j].pos=pos;
- nd->u.scr.timer_event=te;
- nd->u.scr.timeramount=i+1;
- }
- return 0;
-}
-/*==========================================
- * ƒ^ƒCƒ}[ƒCƒxƒ“ƒgŽÀs
- *------------------------------------------
- */
-int npc_timerevent(int tid,unsigned int tick,int id,int data)
-{
- int next,t;
- struct npc_data* nd=(struct npc_data *)map_id2bl(id);
- struct npc_timerevent_list *te;
- if( nd==NULL || nd->u.scr.nexttimer<0 ){
- printf("npc_timerevent: ??\n");
- return 0;
- }
- nd->u.scr.timertick=tick;
- te=nd->u.scr.timer_event+ nd->u.scr.nexttimer;
- nd->u.scr.timerid = -1;
-
- t = nd->u.scr.timer+=data;
- nd->u.scr.nexttimer++;
- if( nd->u.scr.timeramount>nd->u.scr.nexttimer ){
- next= nd->u.scr.timer_event[ nd->u.scr.nexttimer ].timer - t;
- nd->u.scr.timerid = add_timer(tick+next,npc_timerevent,id,next);
- }
-
- run_script(nd->u.scr.script,te->pos,nd->u.scr.rid,nd->bl.id);
- return 0;
-}
-/*==========================================
- * ƒ^ƒCƒ}[ƒCƒxƒ“ƒgŠJŽn
- *------------------------------------------
- */
-int npc_timerevent_start(struct npc_data *nd, int rid)
-{
- int j,n, next;
-
- nullpo_retr(0, nd);
-
- n=nd->u.scr.timeramount;
- if( nd->u.scr.nexttimer>=0 || n==0 )
- return 0;
-
- for(j=0;j<n;j++){
- if( nd->u.scr.timer_event[j].timer > nd->u.scr.timer )
- break;
- }
- if(j>=n) // check if there is a timer to use !!BEFORE!! you write stuff to the structures [Shinomori]
- return 0;
-
- nd->u.scr.nexttimer=j;
- nd->u.scr.timertick=gettick();
- if (rid >= 0) nd->u.scr.rid=rid; // changed to: attaching to given rid by default [Shinomori]
- // if rid is less than 0 leave it unchanged [celest]
-
- next = nd->u.scr.timer_event[j].timer - nd->u.scr.timer;
- nd->u.scr.timerid = add_timer(gettick()+next,npc_timerevent,nd->bl.id,next);
- return 0;
-}
-/*==========================================
- * ƒ^ƒCƒ}[ƒCƒxƒ“ƒgI—¹
- *------------------------------------------
- */
-int npc_timerevent_stop(struct npc_data *nd)
-{
- nullpo_retr(0, nd);
-
- if( nd->u.scr.nexttimer>=0 ){
- nd->u.scr.nexttimer = -1;
- nd->u.scr.timer += (int)(gettick() - nd->u.scr.timertick);
- if(nd->u.scr.timerid!=-1)
- delete_timer(nd->u.scr.timerid,npc_timerevent);
- nd->u.scr.timerid = -1;
- nd->u.scr.rid = 0;
- }
- return 0;
-}
-/*==========================================
- * ƒ^ƒCƒ}[’l‚ÌŠ“¾
- *------------------------------------------
- */
-int npc_gettimerevent_tick(struct npc_data *nd)
-{
- int tick;
-
- nullpo_retr(0, nd);
-
- tick=nd->u.scr.timer;
-
- if( nd->u.scr.nexttimer>=0 )
- tick += (int)(gettick() - nd->u.scr.timertick);
- return tick;
-}
-/*==========================================
- * ƒ^ƒCƒ}[’l‚ÌÝ’è
- *------------------------------------------
- */
-int npc_settimerevent_tick(struct npc_data *nd,int newtimer)
-{
- int flag;
-
- nullpo_retr(0, nd);
-
- flag= nd->u.scr.nexttimer;
-
- npc_timerevent_stop(nd);
- nd->u.scr.timer=newtimer;
- if(flag>=0)
- npc_timerevent_start(nd, -1);
- return 0;
-}
-
-/*==========================================
- * ƒCƒxƒ“ƒgŒ^‚ÌNPCˆ—
- *------------------------------------------
- */
-int npc_event(struct map_session_data *sd,const char *eventname,int mob_kill)
-{
- struct event_data *ev=(struct event_data *) strdb_search(ev_db,eventname);
- struct npc_data *nd;
- int xs,ys;
- char mobevent[100];
-
- if( sd == NULL ){
- printf("npc_event nullpo?\n");
- }
-
- if(ev==NULL && eventname && strcmp(((eventname)+strlen(eventname)-9),"::OnTouch") == 0)
- return 1;
-
- if(ev==NULL || (nd=ev->nd)==NULL){
- if(mob_kill && (ev==NULL || (nd=ev->nd)==NULL)){
- strcpy( mobevent, eventname);
- strcat( mobevent, "::OnMyMobDead");
- ev= (struct event_data *) strdb_search(ev_db,mobevent);
- if (ev==NULL || (nd=ev->nd)==NULL) {
- if (strnicmp(eventname,"GM_MONSTER",10)!=0)
- printf("npc_event: event not found [%s]\n",mobevent);
- return 0;
- }
- }
- else {
- if(battle_config.error_log)
- printf("npc_event: event not found [%s]\n",eventname);
- return 0;
- }
- }
-
- xs=nd->u.scr.xs;
- ys=nd->u.scr.ys;
- if (xs>=0 && ys>=0 ) {
- if (nd->bl.m != sd->bl.m )
- return 1;
- if ( xs>0 && (sd->bl.x<nd->bl.x-xs/2 || nd->bl.x+xs/2<sd->bl.x) )
- return 1;
- if ( ys>0 && (sd->bl.y<nd->bl.y-ys/2 || nd->bl.y+ys/2<sd->bl.y) )
- return 1;
- }
-
- if ( sd->npc_id!=0) {
-// if (battle_config.error_log)
-// printf("npc_event: npc_id != 0\n");
- int i;
- for(i=0;i<MAX_EVENTQUEUE;i++)
- if (!sd->eventqueue[i][0])
- break;
- if (i==MAX_EVENTQUEUE) {
- if (battle_config.error_log)
- printf("npc_event: event queue is full !\n");
- }else{
-// if (battle_config.etc_log)
-// printf("npc_event: enqueue\n");
- memcpy(sd->eventqueue[i],eventname,50);
- }
- return 1;
- }
- if (nd->flag&1) { // –³Œø‰»‚³‚ê‚Ä‚¢‚é
- npc_event_dequeue(sd);
- return 0;
- }
-
- sd->npc_id=nd->bl.id;
- sd->npc_pos=run_script(nd->u.scr.script,ev->pos,sd->bl.id,nd->bl.id);
- return 0;
-}
-
-
-int npc_command_sub(void *key,void *data,va_list ap)
-{
- char *p=(char *)key;
- struct event_data *ev=(struct event_data *)data;
- char *npcname=va_arg(ap,char *);
- char *command=va_arg(ap,char *);
- char temp[100];
-
- if(strcmp(ev->nd->name,npcname)==0 && (p=strchr(p,':')) && p && strnicmp("::OnCommand",p,10)==0 ){
- sscanf(&p[11],"%s",temp);
-
- if (strcmp(command,temp)==0)
- run_script(ev->nd->u.scr.script,ev->pos,0,ev->nd->bl.id);
- }
-
- return 0;
-}
-
-int npc_command(struct map_session_data *sd,char *npcname,char *command)
-{
- strdb_foreach(ev_db,npc_command_sub,npcname,command);
-
- return 0;
-}
-/*==========================================
- * ÚGŒ^‚ÌNPCˆ—
- *------------------------------------------
- */
-int npc_touch_areanpc(struct map_session_data *sd,int m,int x,int y)
-{
- int i,f=1;
- int xs,ys;
-
- nullpo_retr(1, sd);
-
- if(sd->npc_id)
- return 1;
-
- for(i=0;i<map[m].npc_num;i++) {
- if (map[m].npc[i]->flag&1) { // –³Œø‰»‚³‚ê‚Ä‚¢‚é
- f=0;
- continue;
- }
-
- switch(map[m].npc[i]->bl.subtype) {
- case WARP:
- xs=map[m].npc[i]->u.warp.xs;
- ys=map[m].npc[i]->u.warp.ys;
- break;
- case SCRIPT:
- xs=map[m].npc[i]->u.scr.xs;
- ys=map[m].npc[i]->u.scr.ys;
- break;
- default:
- continue;
- }
- if (x >= map[m].npc[i]->bl.x-xs/2 && x < map[m].npc[i]->bl.x-xs/2+xs &&
- y >= map[m].npc[i]->bl.y-ys/2 && y < map[m].npc[i]->bl.y-ys/2+ys)
- break;
- }
- if (i==map[m].npc_num) {
- if (f) {
- if (battle_config.error_log)
- printf("npc_touch_areanpc : some bug \n");
- }
- return 1;
- }
- switch(map[m].npc[i]->bl.subtype) {
- case WARP:
- skill_stop_dancing(&sd->bl,0);
- pc_setpos(sd,map[m].npc[i]->u.warp.name,map[m].npc[i]->u.warp.x,map[m].npc[i]->u.warp.y,0);
- break;
- case SCRIPT:
- {
- //char *name=(char *)aCallocA(50,sizeof(char)); // fixed [Shinomori]
- char name[50]; // need 24 max + 9 for "::OnTouch"
-
- if(sd->areanpc_id == map[m].npc[i]->bl.id)
- return 1;
- sd->areanpc_id = map[m].npc[i]->bl.id;
-
- sprintf(name,"%s::OnTouch", map[m].npc[i]->name);
-
- if( npc_event(sd,name,0)>0 )
- npc_click(sd,map[m].npc[i]->bl.id);
- //aFree(name);
- break;
- }
- }
- return 0;
-}
-
-/*==========================================
- * ‹ß‚­‚©‚Ç‚¤‚©‚Ì”»’è
- *------------------------------------------
- */
-int npc_checknear(struct map_session_data *sd,int id)
-{
- struct npc_data *nd;
-
- nullpo_retr(0, sd);
-
- nd=(struct npc_data *)map_id2bl(id);
- if (nd==NULL || nd->bl.type!=BL_NPC) {
- if (battle_config.error_log)
- printf("no such npc : %d\n",id);
- return 1;
- }
-
- if (nd->class_<0) // ƒCƒxƒ“ƒgŒn‚Íí‚ÉOK
- return 0;
-
- // ƒGƒŠƒA”»’è
- if (nd->bl.m!=sd->bl.m ||
- nd->bl.x<sd->bl.x-AREA_SIZE-1 || nd->bl.x>sd->bl.x+AREA_SIZE+1 ||
- nd->bl.y<sd->bl.y-AREA_SIZE-1 || nd->bl.y>sd->bl.y+AREA_SIZE+1)
- return 1;
-
- return 0;
-}
-
-/*==========================================
- * NPC‚̃I[ƒvƒ“ƒ`ƒƒƒbƒg”­Œ¾
- *------------------------------------------
- */
-int npc_globalmessage(const char *name,char *mes)
-{
- struct npc_data *nd=(struct npc_data *) strdb_search(npcname_db,name);
- char temp[100];
- char ntemp[50];
- char *ltemp;
-
- if(nd==NULL) return 0;
- if(name==NULL) return 0;
-
- ltemp=strchr(name,'#');
- if(ltemp!=NULL) {
- strncpy(ntemp,name,ltemp - name); // 123#456 ‚Ì # ‚©‚çŒã‚ë‚ð휂·‚é
- ntemp[ltemp - name]=0x00; // strncpy ‚̃oƒOHŽg‚¢•ûŠÔˆá‚Á‚Ä‚éH
- }
-
- snprintf(temp, sizeof temp ,"%s : %s",ntemp,mes);
- clif_GlobalMessage(&nd->bl,temp);
-
- return 0;
-}
-
-/*==========================================
- * ƒNƒŠƒbƒNŽž‚ÌNPCˆ—
- *------------------------------------------
- */
-int npc_click(struct map_session_data *sd,int id)
-{
- struct npc_data *nd;
-
- nullpo_retr(1, sd);
-
- if (sd->npc_id != 0) {
- if (battle_config.error_log)
- printf("npc_click: npc_id != 0\n");
- return 1;
- }
-
- if (npc_checknear(sd,id))
- return 1;
-
- nd=(struct npc_data *)map_id2bl(id);
-
- if (nd->flag&1) // –³Œø‰»‚³‚ê‚Ä‚¢‚é
- return 1;
-
- sd->npc_id=id;
- switch(nd->bl.subtype) {
- case SHOP:
- clif_npcbuysell(sd,id);
- npc_event_dequeue(sd);
- break;
- case SCRIPT:
- sd->npc_pos=run_script(nd->u.scr.script,0,sd->bl.id,id);
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int npc_scriptcont(struct map_session_data *sd,int id)
-{
- struct npc_data *nd;
-
- nullpo_retr(1, sd);
-
- if (id!=sd->npc_id)
- return 1;
- if (npc_checknear(sd,id))
- return 1;
-
- nd=(struct npc_data *)map_id2bl(id);
-
- sd->npc_pos=run_script(nd->u.scr.script,sd->npc_pos,sd->bl.id,id);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int npc_buysellsel(struct map_session_data *sd,int id,int type)
-{
- struct npc_data *nd;
-
- nullpo_retr(1, sd);
-
- if (npc_checknear(sd,id))
- return 1;
-
- nd=(struct npc_data *)map_id2bl(id);
- if (nd->bl.subtype!=SHOP) {
- if (battle_config.error_log)
- printf("no such shop npc : %d\n",id);
- sd->npc_id=0;
- return 1;
- }
- if (nd->flag&1) // –³Œø‰»‚³‚ê‚Ä‚¢‚é
- return 1;
-
- sd->npc_shopid=id;
- if (type==0) {
- clif_buylist(sd,nd);
- } else {
- clif_selllist(sd);
- }
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int npc_buylist(struct map_session_data *sd,int n,unsigned short *item_list)
-{
- struct npc_data *nd;
- double z;
- int i,j,w,skill,itemamount=0,new_=0;
-
- nullpo_retr(3, sd);
- nullpo_retr(3, item_list);
-
- if (npc_checknear(sd,sd->npc_shopid))
- return 3;
-
- nd=(struct npc_data*)map_id2bl(sd->npc_shopid);
- if (nd->bl.subtype!=SHOP)
- return 3;
-
- for(i=0,w=0,z=0;i<n;i++) {
- for(j=0;nd->u.shop_item[j].nameid;j++) {
- if (nd->u.shop_item[j].nameid==item_list[i*2+1])
- break;
- }
- if (nd->u.shop_item[j].nameid==0)
- return 3;
-
- if (itemdb_value_notdc(nd->u.shop_item[j].nameid))
- z+=(double)nd->u.shop_item[j].value * item_list[i*2];
- else
- z+=(double)pc_modifybuyvalue(sd,nd->u.shop_item[j].value) * item_list[i*2];
- itemamount+=item_list[i*2];
-
- switch(pc_checkadditem(sd,item_list[i*2+1],item_list[i*2])) {
- case ADDITEM_EXIST:
- break;
- case ADDITEM_NEW:
- new_++;
- break;
- case ADDITEM_OVERAMOUNT:
- return 2;
- }
-
- w+=itemdb_weight(item_list[i*2+1]) * item_list[i*2];
- }
- if (z > (double)sd->status.zeny)
- return 1; // zeny•s‘«
- if (w+sd->weight > sd->max_weight)
- return 2; // d—Ê’´‰ß
- if (pc_inventoryblank(sd)<new_)
- return 3; // Ží—Þ”’´‰ß
-
- pc_payzeny(sd,(int)z);
- for(i=0;i<n;i++) {
- struct item item_tmp;
-
- memset(&item_tmp,0,sizeof(item_tmp));
- item_tmp.nameid = item_list[i*2+1];
- item_tmp.identify = 1; // npc”Ì”„ƒAƒCƒeƒ€‚ÍŠÓ’èÏ‚Ý
-
- pc_additem(sd,&item_tmp,item_list[i*2]);
- }
-
- //¤lŒoŒ±’l
-/* if ((sd->status.class_ == 5) || (sd->status.class_ == 10) || (sd->status.class_ == 18)) {
- z = z * pc_checkskill(sd,MC_DISCOUNT) / ((1 + 300 / itemamount) * 4000) * battle_config.shop_exp;
- pc_gainexp(sd,0,z);
- }*/
- if (battle_config.shop_exp > 0 && z > 0 && (skill = pc_checkskill(sd,MC_DISCOUNT)) > 0) {
- if (sd->status.skill[MC_DISCOUNT].flag != 0)
- skill = sd->status.skill[MC_DISCOUNT].flag - 2;
- if (skill > 0) {
- z = z * (double)skill * (double)battle_config.shop_exp/10000.;
- if (z < 1)
- z = 1;
- pc_gainexp(sd,0,(int)z);
- }
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int npc_selllist(struct map_session_data *sd,int n,unsigned short *item_list)
-{
- double z;
- int i,skill,itemamount=0;
-
- nullpo_retr(1, sd);
- nullpo_retr(1, item_list);
-
- if (npc_checknear(sd,sd->npc_shopid))
- return 1;
- for(i=0,z=0;i<n;i++) {
- int nameid;
- if (item_list[i*2]-2 <0 || item_list[i*2]-2 >=MAX_INVENTORY)
- return 1;
- nameid=sd->status.inventory[item_list[i*2]-2].nameid;
- if (nameid == 0 ||
- sd->status.inventory[item_list[i*2]-2].amount < item_list[i*2+1])
- return 1;
- if (itemdb_value_notoc(nameid))
- z+=(double)itemdb_value_sell(nameid) * item_list[i*2+1];
- else
- z+=(double)pc_modifysellvalue(sd,itemdb_value_sell(nameid)) * item_list[i*2+1];
- itemamount+=item_list[i*2+1];
- }
-
- if (z > MAX_ZENY) z = MAX_ZENY;
- pc_getzeny(sd,(int)z);
- for(i=0;i<n;i++) {
- int item_id=item_list[i*2]-2;
- if( sd->status.inventory[item_id].nameid>0 && sd->inventory_data[item_id] != NULL &&
- sd->inventory_data[item_id]->type==7 && sd->status.inventory[item_id].amount>0 &&
- sd->status.inventory[item_id].card[0] == (short)0xff00)
- if(search_petDB_index(sd->status.inventory[item_id].nameid, PET_EGG) >= 0)
- intif_delete_petdata((*(long *)(&sd->status.inventory[item_id].card[1])));
- pc_delitem(sd,item_id,item_list[i*2+1],0);
- }
-
- //¤lŒoŒ±’l
-/* if ((sd->status.class_ == 5) || (sd->status.class_ == 10) || (sd->status.class_ == 18)) {
- z = z * pc_checkskill(sd,MC_OVERCHARGE) / ((1 + 500 / itemamount) * 4000) * battle_config.shop_exp ;
- pc_gainexp(sd,0,z);
- }*/
- if (battle_config.shop_exp > 0 && z > 0 && (skill = pc_checkskill(sd,MC_OVERCHARGE)) > 0) {
- if (sd->status.skill[MC_OVERCHARGE].flag != 0)
- skill = sd->status.skill[MC_OVERCHARGE].flag - 2;
- if (skill > 0) {
- z = z * (double)skill * (double)battle_config.shop_exp/10000.;
- if (z < 1)
- z = 1;
- pc_gainexp(sd,0,(int)z);
- }
- }
-
- return 0;
-
-}
-
-// [Valaris] NPC Walking
-
-/*==========================================
- * Time calculation concerning one step next to npc
- *------------------------------------------
- */
-static int calc_next_walk_step(struct npc_data *nd)
-{
- nullpo_retr(0, nd);
-
- if(nd->walkpath.path_pos>=nd->walkpath.path_len)
- return -1;
- if(nd->walkpath.path[nd->walkpath.path_pos]&1)
- return status_get_speed(&nd->bl)*14/10;
- return status_get_speed(&nd->bl);
-}
-
-
-/*==========================================
- * npc Walk processing
- *------------------------------------------
- */
-static int npc_walk(struct npc_data *nd,unsigned int tick,int data)
-{
- int moveblock;
- int i;
- static int dirx[8]={0,-1,-1,-1,0,1,1,1};
- static int diry[8]={1,1,0,-1,-1,-1,0,1};
- int x,y,dx,dy;
-
- nullpo_retr(0, nd);
-
- nd->state.state=MS_IDLE;
- if(nd->walkpath.path_pos>=nd->walkpath.path_len || nd->walkpath.path_pos!=data)
- return 0;
-
- nd->walkpath.path_half ^= 1;
- if(nd->walkpath.path_half==0){
- nd->walkpath.path_pos++;
- if(nd->state.change_walk_target){
- npc_walktoxy_sub(nd);
- return 0;
- }
- }
- else {
- if(nd->walkpath.path[nd->walkpath.path_pos]>=8)
- return 1;
-
- x = nd->bl.x;
- y = nd->bl.y;
- if(map_getcell(nd->bl.m,x,y,CELL_CHKNOPASS)) {
- npc_stop_walking(nd,1);
- return 0;
- }
- nd->dir=nd->walkpath.path[nd->walkpath.path_pos];
- dx = dirx[nd->dir];
- dy = diry[nd->dir];
-
- if(map_getcell(nd->bl.m,x+dx,y+dy,CELL_CHKNOPASS)) {
- npc_walktoxy_sub(nd);
- return 0;
- }
-
- moveblock = ( x/BLOCK_SIZE != (x+dx)/BLOCK_SIZE || y/BLOCK_SIZE != (y+dy)/BLOCK_SIZE);
-
- nd->state.state=MS_WALK;
- map_foreachinmovearea(clif_npcoutsight,nd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,nd);
-
- x += dx;
- y += dy;
-
- if(moveblock) map_delblock(&nd->bl);
- nd->bl.x = x;
- nd->bl.y = y;
- if(moveblock) map_addblock(&nd->bl);
-
- map_foreachinmovearea(clif_npcinsight,nd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,BL_PC,nd);
- nd->state.state=MS_IDLE;
- }
- if((i=calc_next_walk_step(nd))>0){
- i = i>>1;
- if(i < 1 && nd->walkpath.path_half == 0)
- i = 1;
- nd->walktimer=add_timer(tick+i,npc_walktimer,nd->bl.id,nd->walkpath.path_pos);
- nd->state.state=MS_WALK;
-
- if(nd->walkpath.path_pos>=nd->walkpath.path_len)
- clif_fixnpcpos(nd); // When npc stops, retransmission current of a position.
-
- }
- return 0;
-}
-
-int npc_changestate(struct npc_data *nd,int state,int type)
-{
- int i;
-
- nullpo_retr(0, nd);
-
- if(nd->walktimer != -1)
- delete_timer(nd->walktimer,npc_walktimer);
- nd->walktimer=-1;
- nd->state.state=state;
-
- switch(state){
- case MS_WALK:
- if((i=calc_next_walk_step(nd))>0){
- i = i>>2;
- nd->walktimer=add_timer(gettick()+i,npc_walktimer,nd->bl.id,0);
- }
- else
- nd->state.state=MS_IDLE;
- break;
- case MS_DELAY:
- nd->walktimer=add_timer(gettick()+type,npc_walktimer,nd->bl.id,0);
- break;
-
- }
-
- return 0;
-}
-
-static int npc_walktimer(int tid,unsigned int tick,int id,int data)
-{
- struct npc_data *nd;
-
- nd=(struct npc_data*)map_id2bl(id);
- if(nd == NULL || nd->bl.type != BL_NPC)
- return 1;
-
- if(nd->walktimer != tid){
- return 0;
- }
-
- nd->walktimer=-1;
-
- if(nd->bl.prev == NULL)
- return 1;
-
- switch(nd->state.state){
- case MS_WALK:
- npc_walk(nd,tick,data);
- break;
- case MS_DELAY:
- npc_changestate(nd,MS_IDLE,0);
- break;
- default:
- break;
- }
- return 0;
-}
-
-
-static int npc_walktoxy_sub(struct npc_data *nd)
-{
- struct walkpath_data wpd;
-
- nullpo_retr(0, nd);
-
- if(path_search(&wpd,nd->bl.m,nd->bl.x,nd->bl.y,nd->to_x,nd->to_y,nd->state.walk_easy))
- return 1;
- memcpy(&nd->walkpath,&wpd,sizeof(wpd));
-
- nd->state.change_walk_target=0;
- npc_changestate(nd,MS_WALK,0);
-
- clif_movenpc(nd);
-
- return 0;
-}
-
-int npc_walktoxy(struct npc_data *nd,int x,int y,int easy)
-{
- struct walkpath_data wpd;
-
- nullpo_retr(0, nd);
-
- if(nd->state.state == MS_WALK && path_search(&wpd,nd->bl.m,nd->bl.x,nd->bl.y,x,y,0) )
- return 1;
-
- nd->state.walk_easy = easy;
- nd->to_x=x;
- nd->to_y=y;
- if(nd->state.state == MS_WALK) {
- nd->state.change_walk_target=1;
- } else {
- return npc_walktoxy_sub(nd);
- }
-
- return 0;
-}
-
-int npc_stop_walking(struct npc_data *nd,int type)
-{
- nullpo_retr(0, nd);
-
- if(nd->state.state == MS_WALK || nd->state.state == MS_IDLE) {
- int dx=0,dy=0;
-
- nd->walkpath.path_len=0;
- if(type&4){
- dx=nd->to_x-nd->bl.x;
- if(dx<0)
- dx=-1;
- else if(dx>0)
- dx=1;
- dy=nd->to_y-nd->bl.y;
- if(dy<0)
- dy=-1;
- else if(dy>0)
- dy=1;
- }
- nd->to_x=nd->bl.x+dx;
- nd->to_y=nd->bl.y+dy;
- if(dx!=0 || dy!=0){
- npc_walktoxy_sub(nd);
- return 0;
- }
- npc_changestate(nd,MS_IDLE,0);
- }
- if(type&0x01)
- clif_fixnpcpos(nd);
- if(type&0x02) {
- int delay=status_get_dmotion(&nd->bl);
- unsigned int tick = gettick();
- if(nd->canmove_tick < tick)
- nd->canmove_tick = tick + delay;
- }
-
- return 0;
-}
-
-int npc_remove_map (struct npc_data *nd)
-{
- nullpo_retr(1, nd);
-
- if(nd->bl.prev == NULL)
- return 1;
-
-#ifdef PCRE_SUPPORT
- npc_chat_finalize(nd);
-#endif
- clif_clearchar_area(&nd->bl,2);
- strdb_erase(npcname_db, nd->name);
- map_delblock(&nd->bl);
- map_deliddb(&nd->bl);
-
- return 0;
-}
-
-int npc_unload(struct npc_data *nd)
-{
- nullpo_retr (0, nd);
-
- if (nd->chat_id) {
- struct chat_data *cd = (struct chat_data*)map_id2bl(nd->chat_id);
- if (cd) aFree (cd);
- cd = NULL;
- }
- if (nd->bl.subtype == SCRIPT) {
- if (nd->u.scr.timerid != -1)
- delete_timer(nd->u.scr.timerid, npc_timerevent);
- npc_cleareventtimer (nd);
- if (nd->u.scr.timer_event)
- aFree(nd->u.scr.timer_event);
- if (nd->u.scr.src_id == 0) {
- if(nd->u.scr.script) {
- aFree(nd->u.scr.script);
- nd->u.scr.script = NULL;
- }
- if (nd->u.scr.label_list) {
- aFree(nd->u.scr.label_list);
- nd->u.scr.label_list = NULL;
- }
- }
- }
- npc_remove_map (nd);
- aFree(nd);
- nd = NULL;
-
- return 0;
-}
-
-//
-// ‰Šú‰»ŠÖŒW
-//
-
-/*==========================================
- * “Ç‚Ýž‚Þnpcƒtƒ@ƒCƒ‹‚̃NƒŠƒA
- *------------------------------------------
- */
-void npc_clearsrcfile()
-{
- struct npc_src_list *p=npc_src_first;
-
- while( p ) {
- struct npc_src_list *p2=p;
- p=p->next;
- aFree(p2);
- }
- npc_src_first=NULL;
- npc_src_last=NULL;
-}
-/*==========================================
- * “Ç‚Ýž‚Þnpcƒtƒ@ƒCƒ‹‚̒ljÁ
- *------------------------------------------
- */
-void npc_addsrcfile(char *name)
-{
- struct npc_src_list *new_;
- size_t len;
-
- if ( strcmpi(name,"clear")==0 ) {
- npc_clearsrcfile();
- return;
- }
-
- {
- // prevent multiple insert of source files
- struct npc_src_list *p=npc_src_first;
- while( p )
- { // found the file, no need to insert it again
- if( 0==strcmp(name,p->name) )
- return;
- p=p->next;
- }
- }
-
- len = sizeof(*new_) + strlen(name);
- new_=(struct npc_src_list *)aCalloc(1,len);
- new_->next = NULL;
- strncpy(new_->name,name,strlen(name)+1);
- if (npc_src_first==NULL)
- npc_src_first = new_;
- if (npc_src_last)
- npc_src_last->next = new_;
-
- npc_src_last=new_;
-}
-/*==========================================
- * “Ç‚Ýž‚Þnpcƒtƒ@ƒCƒ‹‚Ìíœ
- *------------------------------------------
- */
-void npc_delsrcfile(char *name)
-{
- struct npc_src_list *p=npc_src_first,*pp=NULL,**lp=&npc_src_first;
-
- if ( strcmpi(name,"all")==0 ) {
- npc_clearsrcfile();
- return;
- }
-
- for( ; p; lp=&p->next,pp=p,p=p->next ) {
- if ( strcmp(p->name,name)==0 ) {
- *lp=p->next;
- if ( npc_src_last==p )
- npc_src_last=pp;
- aFree(p);
- break;
- }
- }
-}
-
-/*==========================================
- * warps‰ðÍ
- *------------------------------------------
- */
-int npc_parse_warp(char *w1,char *w2,char *w3,char *w4)
-{
- int x,y,xs,ys,to_x,to_y,m;
- int i,j;
- char mapname[24],to_mapname[24];
- struct npc_data *nd;
-
- // ˆø”‚̌”ƒ`ƒFƒbƒN
- if (sscanf(w1,"%[^,],%d,%d",mapname,&x,&y) != 3 ||
- sscanf(w4,"%d,%d,%[^,],%d,%d",&xs,&ys,to_mapname,&to_x,&to_y) != 5) {
- printf("bad warp line : %s\n",w3);
- return 1;
- }
-
- m=map_mapname2mapid(mapname);
-
- nd=(struct npc_data *)aCalloc(1,sizeof(struct npc_data));
- nd->bl.id=npc_get_new_npc_id();
- nd->n=map_addnpc(m,nd);
-
- nd->bl.prev = nd->bl.next = NULL;
- nd->bl.m=m;
- nd->bl.x=x;
- nd->bl.y=y;
- nd->dir=0;
- nd->flag=0;
- memcpy(nd->name,w3,24);
- memcpy(nd->exname,w3,24);
-
- nd->chat_id=0;
- if (!battle_config.warp_point_debug)
- nd->class_=WARP_CLASS;
- else
- nd->class_=WARP_DEBUG_CLASS;
- nd->speed=200;
- nd->option = 0;
- nd->opt1 = 0;
- nd->opt2 = 0;
- nd->opt3 = 0;
- memcpy(nd->u.warp.name,to_mapname,16);
- xs+=2; ys+=2;
- nd->u.warp.x=to_x;
- nd->u.warp.y=to_y;
- nd->u.warp.xs=xs;
- nd->u.warp.ys=ys;
-
- for(i=0;i<ys;i++) {
- for(j=0;j<xs;j++) {
- if(map_getcell(m,x-xs/2+j,y-ys/2+i,CELL_CHKNOPASS))
- continue;
- map_setcell(m,x-xs/2+j,y-ys/2+i,CELL_SETNPC);
- }
- }
-
-// printf("warp npc %s %d read done\n",mapname,nd->bl.id);
- npc_warp++;
- nd->bl.type=BL_NPC;
- nd->bl.subtype=WARP;
- map_addblock(&nd->bl);
- clif_spawnnpc(nd);
- strdb_insert(npcname_db,nd->name,nd);
-
- return 0;
-}
-
-/*==========================================
- * shops‰ðÍ
- *------------------------------------------
- */
-static int npc_parse_shop(char *w1,char *w2,char *w3,char *w4)
-{
- char *p;
- int x, y, dir, m;
- int max = 100, pos = 0;
- char mapname[24];
- struct npc_data *nd;
-
- // ˆø”‚̌”ƒ`ƒFƒbƒN
- if (sscanf(w1, "%[^,],%d,%d,%d", mapname, &x, &y, &dir) != 4 ||
- strchr(w4, ',') == NULL) {
- printf("bad shop line : %s\n", w3);
- return 1;
- }
- m = map_mapname2mapid(mapname);
-
- nd = (struct npc_data *)aCalloc(1,sizeof(struct npc_data) +
- sizeof(nd->u.shop_item[0]) * (max + 1));
- p = strchr(w4, ',');
-
- while (p && pos < max) {
- int nameid,value;
- struct item_data *id;
- p++;
- if (sscanf(p, "%d:%d", &nameid, &value) != 2)
- break;
- nd->u.shop_item[pos].nameid = nameid;
- id = itemdb_search(nameid);
- if (value < 0)
- value = id->value_buy;
- nd->u.shop_item[pos].value = value;
- // check for bad prices that can possibly cause exploits
- if (value*75/100 < id->value_sell*124/100) {
- sprintf (tmp_output, "Item %s [%d] buying:%d < selling:%d\n",
- id->name, id->nameid, value*75/100, id->value_sell*124/100);
- ShowWarning (tmp_output);
- }
- pos++;
- p=strchr(p,',');
- }
- if (pos == 0) {
- aFree(nd);
- return 1;
- }
- nd->u.shop_item[pos++].nameid = 0;
-
- nd->bl.prev = nd->bl.next = NULL;
- nd->bl.m = m;
- nd->bl.x = x;
- nd->bl.y = y;
- nd->bl.id = npc_get_new_npc_id();
- nd->dir = dir;
- nd->flag = 0;
- memcpy(nd->name, w3, 24);
- nd->class_ = atoi(w4);
- nd->speed = 200;
- nd->chat_id = 0;
- nd->option = 0;
- nd->opt1 = 0;
- nd->opt2 = 0;
- nd->opt3 = 0;
-
- nd = (struct npc_data *)aRealloc(nd,
- sizeof(struct npc_data) + sizeof(nd->u.shop_item[0]) * pos);
-
- //printf("shop npc %s %d read done\n",mapname,nd->bl.id);
- npc_shop++;
- nd->bl.type=BL_NPC;
- nd->bl.subtype=SHOP;
- nd->n=map_addnpc(m,nd);
- map_addblock(&nd->bl);
- clif_spawnnpc(nd);
- strdb_insert(npcname_db,nd->name,nd);
-
- return 0;
-}
-/*==========================================
- * NPC‚̃‰ƒxƒ‹ƒf[ƒ^ƒRƒ“ƒo[ƒg
- *------------------------------------------
- */
-int npc_convertlabel_db(void *key,void *data,va_list ap)
-{
- char *lname=(char *)key;
- int pos=(int)data;
- struct npc_data *nd;
- struct npc_label_list *lst;
- int num;
- char *p=strchr(lname,':');
-
- nullpo_retr(0, ap);
- nullpo_retr(0, nd=va_arg(ap,struct npc_data *));
-
- lst=nd->u.scr.label_list;
- num=nd->u.scr.label_list_num;
- if(!lst){
- lst=(struct npc_label_list *)aCallocA(1,sizeof(struct npc_label_list));
- num=0;
- }else
- lst=(struct npc_label_list *)aRealloc(lst,sizeof(struct npc_label_list)*(num+1));
-
- *p='\0';
-
- // here we check if the label fit into the buffer
- if (strlen(lname)>23) {
- printf("npc_parse_script: label name longer than 23 chars! '%s'\n (%s)", lname, current_file);
- exit(1);
- }
- memcpy(lst[num].name,lname,strlen(lname)+1); //including EOS
-
-
- *p=':';
- lst[num].pos=pos;
- nd->u.scr.label_list=lst;
- nd->u.scr.label_list_num=num+1;
- return 0;
-}
-/*==========================================
- * scripts‰ðÍ
- *------------------------------------------
- */
-static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line,FILE *fp,int *lines)
-{
- int x,y,dir=0,m,xs=0,ys=0,class_=0; // [Valaris] thanks to fov
- char mapname[24];
- unsigned char *srcbuf=NULL,*script;
- int srcsize=65536;
- int startline=0;
- unsigned char line[1024];
- int i;
- struct npc_data *nd;
- int evflag=0;
- struct dbt *label_db;
- char *p;
- struct npc_label_list *label_dup=NULL;
- int label_dupnum=0;
- int src_id=0;
-
- if(strcmp(w1,"-")==0){
- x=0;y=0;m=-1;
- }else{
- // ˆø”‚̌”ƒ`ƒFƒbƒN
- if (sscanf(w1,"%[^,],%d,%d,%d",mapname,&x,&y,&dir) != 4 ||
- ( strcmp(w2,"script")==0 && strchr(w4,',')==NULL) ) {
- printf("bad script line : %s\n",w3);
- return 1;
- }
- m = map_mapname2mapid(mapname);
- }
-
- if(strcmp(w2,"script")==0){
- // ƒXƒNƒŠƒvƒg‚̉ðÍ
- srcbuf=(unsigned char *)aCallocA(srcsize,sizeof(char));
- if (strchr(first_line,'{')) {
- strcpy((char *) srcbuf,strchr(first_line,'{'));
- startline=*lines;
- } else
- srcbuf[0]=0;
- while(1) {
- for(i=strlen((const char *) srcbuf)-1;i>=0 && isspace(srcbuf[i]);i--);
- if (i>=0 && srcbuf[i]=='}')
- break;
- fgets((char *) line,1020,fp);
- (*lines)++;
- if (feof(fp))
- break;
- if (strlen((char *) srcbuf)+strlen((char *) line)+1>=srcsize) {
- srcsize += 65536;
- srcbuf = (unsigned char *)aRealloc(srcbuf, srcsize);
- memset(srcbuf + srcsize - 65536, '\0', 65536);
- }
- if (srcbuf[0]!='{') {
- if (strchr((char *) line,'{')) {
- strcpy((char *) srcbuf,strchr((const char *) line,'{'));
- startline=*lines;
- }
- } else
- strcat((char *) srcbuf,(const char *) line);
- }
- script=(unsigned char *) parse_script((unsigned char *) srcbuf,startline);
- if (script==NULL) {
- // script parse error?
- aFree(srcbuf);
- return 1;
- }
-
- }else{
- // duplicate‚·‚é
-
- char srcname[128];
- struct npc_data *nd2;
- if( sscanf(w2,"duplicate(%[^)])",srcname)!=1 ){
- printf("bad duplicate name (in %s)! : %s",current_file, w2);
- return 0;
- }
- if( (nd2=npc_name2id(srcname))==NULL ){
- printf("bad duplicate name (in %s)! (not exist) : %s\n", current_file, srcname);
- return 0;
- }
- script=(unsigned char *)nd2->u.scr.script;
- label_dup=nd2->u.scr.label_list;
- label_dupnum=nd2->u.scr.label_list_num;
- src_id=nd2->bl.id;
-
- }// end of ƒXƒNƒŠƒvƒg‰ðÍ
-
- nd=(struct npc_data *)aCalloc(1,sizeof(struct npc_data));
-
- if(m==-1){
- // ƒXƒNƒŠƒvƒgƒRƒs[—p‚̃_ƒ~[NPC
-
- }else if( sscanf(w4,"%d,%d,%d",&class_,&xs,&ys)==3) {
- // ÚGŒ^NPC
- int i,j;
-
- if (xs>=0)xs=xs*2+1;
- if (ys>=0)ys=ys*2+1;
-
- if (class_>=0) {
-
- for(i=0;i<ys;i++) {
- for(j=0;j<xs;j++) {
- if(map_getcell(m,x-xs/2+j,y-ys/2+i,CELL_CHKNOPASS))
- continue;
- map_setcell(m,x-xs/2+j,y-ys/2+i,CELL_SETNPC);
- }
- }
- }
-
- nd->u.scr.xs=xs;
- nd->u.scr.ys=ys;
- } else { // ƒNƒŠƒbƒNŒ^NPC
- class_=atoi(w4);
- nd->u.scr.xs=0;
- nd->u.scr.ys=0;
- }
-
- if (class_<0 && m>=0) { // ƒCƒxƒ“ƒgŒ^NPC
- evflag=1;
- }
-
- while((p=strchr(w3,':'))) {
- if (p[1]==':') break;
- }
- if (p) {
- *p=0;
- memcpy(nd->name,w3,24);
- memcpy(nd->exname,p+2,24);
- }else{
- memcpy(nd->name,w3,24);
- memcpy(nd->exname,w3,24);
- }
-
- nd->bl.prev = nd->bl.next = NULL;
- nd->bl.m = m;
- nd->bl.x = x;
- nd->bl.y = y;
- nd->bl.id=npc_get_new_npc_id();
- nd->dir = dir;
- nd->flag=0;
- nd->class_=class_;
- nd->speed=200;
- nd->u.scr.script=(char *) script;
- nd->u.scr.src_id=src_id;
- nd->chat_id=0;
- nd->option = 0;
- nd->opt1 = 0;
- nd->opt2 = 0;
- nd->opt3 = 0;
- nd->walktimer=-1;
-
- //printf("script npc %s %d %d read done\n",mapname,nd->bl.id,nd->class_);
- npc_script++;
- nd->bl.type=BL_NPC;
- nd->bl.subtype=SCRIPT;
- if(m>=0){
- nd->n=map_addnpc(m,nd);
- map_addblock(&nd->bl);
-
- // clear event timers upon initialise
- memset(nd->eventqueue, 0, sizeof(nd->eventqueue));
- for(i = 0; i < MAX_EVENTTIMER; i++)
- nd->eventtimer[i] = -1;
-
- if (evflag) { // ƒCƒxƒ“ƒgŒ^
- struct event_data *ev=(struct event_data *)aCalloc(1,sizeof(struct event_data));
- ev->nd=nd;
- ev->pos=0;
- strdb_insert(ev_db,nd->exname,ev);
- }else
- clif_spawnnpc(nd);
- }
- strdb_insert(npcname_db,nd->exname,nd);
-
-
- //-----------------------------------------
- // ƒ‰ƒxƒ‹ƒf[ƒ^‚Ì€”õ
- if(srcbuf){
- // script–{‘Ì‚ª‚ ‚éꇂ̈—
-
- // ƒ‰ƒxƒ‹ƒf[ƒ^‚̃Rƒ“ƒo[ƒg
- label_db=script_get_label_db();
- strdb_foreach(label_db,npc_convertlabel_db,nd);
-
- // ‚à‚¤Žg‚í‚È‚¢‚̂Ńoƒbƒtƒ@‰ð•ú
- aFree(srcbuf);
-
- }else{
- // duplicate
-
-// nd->u.scr.label_list=aMallocA(sizeof(struct npc_label_list)*label_dupnum);
-// memcpy(nd->u.scr.label_list,label_dup,sizeof(struct npc_label_list)*label_dupnum);
-
- nd->u.scr.label_list=label_dup; // ƒ‰ƒxƒ‹ƒf[ƒ^‹¤—L
- nd->u.scr.label_list_num=label_dupnum;
- }
-
- //-----------------------------------------
- // ƒCƒxƒ“ƒg—pƒ‰ƒxƒ‹ƒf[ƒ^‚̃GƒNƒXƒ|[ƒg
- for(i=0;i<nd->u.scr.label_list_num;i++){
- char *lname=nd->u.scr.label_list[i].name;
- int pos=nd->u.scr.label_list[i].pos;
-
- if ((lname[0]=='O' || lname[0]=='o')&&(lname[1]=='N' || lname[1]=='n')) {
-/*
-I rearrange the code so this is just for commenting; remove it if you have enough if it [Shinomori]
- struct event_data *ev;
- char *buf;
- // ƒGƒNƒXƒ|[ƒg‚³‚ê‚é
- ev=(struct event_data *)aCalloc(1,sizeof(struct event_data));
-why allocing 50 chars ?
- buf=(char *)aCallocA(50,sizeof(char));
-why checking here?
-lname is identical to nd->u.scr.label_list[i].name which is only 24 chars so check for strlen should be 23
- if (strlen(lname)>24) {
- printf("npc_parse_script: label name error (%s) !\n", current_file);
- exit(1);
- }else{
- //struct event_data *ev2;
- ev->nd=nd;
- ev->pos=pos;
- sprintf(buf,"%s::%s",nd->exname,lname);
- //ev2 = strdb_search(ev_db,buf);
- //if(ev2 != NULL) {
- // printf("npc_parse_script : duplicate event %s\n",buf);
- // aFree(ev2);
- //}
-you are sure reentering the same database key will overwrite the existing entry?
- strdb_insert(ev_db,buf,ev);
-anyway instead of removing data from the db and inserting a new one
-wouldn't it be easier just not to insert the new duplicate event, it is a duplicate anyway?
- }
-*/
- // this check is useless here because the buffer is only 24 chars
- // and already overwritten if this is here is reached
- // I leave the check anyway but place it correctly to npc_convertlabel_db
- if (strlen(lname)>23) {
- printf("npc_parse_script: label name longer than 23 chars! '%s' (%s)\n", lname, current_file);
- exit(1);
- }else{
- struct event_data *ev;
- struct event_data *ev2;
- char *buf;
- // ƒGƒNƒXƒ|[ƒg‚³‚ê‚é
-
- // 51 comes from: 24 for npc name + 24 for label + 2 for a "::" and 1 for EOS
- //buf=(char *)aMalloc(51,sizeof(char));
- // but to save some memory we alloc only the really necessary space
- buf=(char *)aMalloc( (3+strlen(nd->exname)+strlen(lname))*sizeof(char));
- sprintf(buf,"%s::%s",nd->exname,lname);
-
- // search the label in ev_db;
- // remember the label is max 50 chars + eos; see the strdb_init below
- ev2 = (struct event_data *)strdb_search(ev_db,buf);
- if(ev2 != NULL) {
- printf("npc_parse_script : duplicate event %s (%s)\n",buf, current_file);
-
- // just skip the label insertion and free the alloced buffer
- aFree(buf);
- }
- else
- { // generate the data and insert it
- ev=(struct event_data *)aCalloc(1,sizeof(struct event_data));
- ev->nd=nd;
- ev->pos=pos;
- strdb_insert(ev_db,buf,ev);
- }
-
- }
- }
- }
-
- //-----------------------------------------
- // ƒ‰ƒxƒ‹ƒf[ƒ^‚©‚çƒ^ƒCƒ}[ƒCƒxƒ“ƒgŽæ‚èž‚Ý
- for(i=0;i<nd->u.scr.label_list_num;i++){
- int t=0,k=0;
- char *lname=nd->u.scr.label_list[i].name;
- int pos=nd->u.scr.label_list[i].pos;
- if(sscanf(lname,"OnTimer%d%n",&t,&k)==1 && lname[k]=='\0') {
- // ƒ^ƒCƒ}[ƒCƒxƒ“ƒg
- struct npc_timerevent_list *te=nd->u.scr.timer_event;
- int j,k=nd->u.scr.timeramount;
- if(te==NULL)
- te=(struct npc_timerevent_list *)aCallocA(1,sizeof(struct npc_timerevent_list));
- else
- te=(struct npc_timerevent_list *)aRealloc( te, sizeof(struct npc_timerevent_list) * (k+1) );
- for(j=0;j<k;j++){
- if(te[j].timer>t){
- memmove(te+j+1,te+j,sizeof(struct npc_timerevent_list)*(k-j));
- break;
- }
- }
- te[j].timer=t;
- te[j].pos=pos;
- nd->u.scr.timer_event=te;
- nd->u.scr.timeramount=k+1;
- }
- }
- nd->u.scr.nexttimer=-1;
- nd->u.scr.timerid=-1;
-
-
- return 0;
-}
-
-/*==========================================
- * functions‰ðÍ
- *------------------------------------------
- */
-static int npc_parse_function(char *w1,char *w2,char *w3,char *w4,char *first_line,FILE *fp,int *lines)
-{
- char *srcbuf=NULL,*script;
- int srcsize=65536;
- int startline=0;
- char line[1024];
- int i;
-// struct dbt *label_db;
- char *p;
-
- // ƒXƒNƒŠƒvƒg‚̉ðÍ
- srcbuf=(char *)aCallocA(srcsize,sizeof(char));
- if (strchr(first_line,'{')) {
- strcpy(srcbuf,strchr(first_line,'{'));
- startline=*lines;
- } else
- srcbuf[0]=0;
- while(1) {
- for(i=strlen(srcbuf)-1;i>=0 && isspace(srcbuf[i]);i--);
- if (i>=0 && srcbuf[i]=='}')
- break;
- fgets(line,1020,fp);
- (*lines)++;
- if (feof(fp))
- break;
- if (strlen(srcbuf)+strlen(line)+1>=srcsize) {
- srcsize += 65536;
- srcbuf = (char *)aRealloc(srcbuf, srcsize);
- memset(srcbuf + srcsize - 65536, '\0', 65536);
- }
- if (srcbuf[0]!='{') {
- if (strchr(line,'{')) {
- strcpy(srcbuf,strchr(line,'{'));
- startline=*lines;
- }
- } else
- strcat(srcbuf,line);
- }
- script= parse_script((unsigned char *) srcbuf,startline);
- if (script==NULL) {
- // script parse error?
- aFree(srcbuf);
- return 1;
- }
-
- p=(char *)aCallocA(50,sizeof(char));
-
- strncpy(p,w3,50);
- strdb_insert(script_get_userfunc_db(),p,script);
-
-// label_db=script_get_label_db();
-
- // ‚à‚¤Žg‚í‚È‚¢‚̂Ńoƒbƒtƒ@‰ð•ú
- aFree(srcbuf);
-
-// printf("function %s => %p\n",p,script);
-
- return 0;
-}
-
-
-/*==========================================
- * mobs‰ðÍ
- *------------------------------------------
- */
-int npc_parse_mob(char *w1,char *w2,char *w3,char *w4)
-{
- int m,x,y,xs,ys,class_,num,delay1,delay2,level;
- int i;
- char mapname[24];
- char mobname[24];
- char eventname[24]="";
- struct mob_data *md;
-
- xs=ys=0;
- delay1=delay2=0;
- // ˆø”‚̌”ƒ`ƒFƒbƒN
- if (sscanf(w1,"%[^,],%d,%d,%d,%d",mapname,&x,&y,&xs,&ys) < 3 ||
- sscanf(w4,"%d,%d,%d,%d,%s",&class_,&num,&delay1,&delay2,eventname) < 2 ) {
- printf("bad monster line : %s\n",w3);
- return 1;
- }
-
- m=map_mapname2mapid(mapname);
-
- if ( num>1 && battle_config.mob_count_rate!=100) {
- if ( (num=num*battle_config.mob_count_rate/100)<1 )
- num=1;
- }
-
- for(i=0;i<num;i++) {
- md=(struct mob_data *)aCalloc(1,sizeof(struct mob_data));
-
- if(class_>4000) { // large/tiny mobs [Valaris]
- md->size=2;
- class_-=4000;
- }
- else if(class_>2000) {
- md->size=1;
- class_-=2000;
- }
-
- md->bl.prev=NULL;
- md->bl.next=NULL;
- md->bl.m=m;
- md->bl.x=x;
- md->bl.y=y;
-
- if(sscanf(w3,"%[^,],%d",mobname,&level) > 1)
- md->level=level;
- if(strcmp(mobname,"--en--")==0)
- memcpy(md->name,mob_db[class_].name,24);
- else if(strcmp(mobname,"--ja--")==0)
- memcpy(md->name,mob_db[class_].jname,24);
- else memcpy(md->name,mobname,24);
-
- md->n = i;
- md->base_class = md->class_ = class_;
- md->bl.id=npc_get_new_npc_id();
- md->m =m;
- md->x0=x;
- md->y0=y;
- md->xs=xs;
- md->ys=ys;
- md->spawndelay1=delay1;
- md->spawndelay2=delay2;
-
- memset(&md->state,0,sizeof(md->state));
- md->timer = -1;
- md->target_id=0;
- md->attacked_id=0;
- md->speed=mob_db[class_].speed;
-
- if (mob_db[class_].mode&0x02)
- md->lootitem=(struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item));
- else
- md->lootitem=NULL;
-
- if (strlen(eventname)>=4) {
- memcpy(md->npc_event,eventname,24);
- }else
- memset(md->npc_event,0,24);
-
- md->bl.type=BL_MOB;
- map_addiddb(&md->bl);
- mob_spawn(md->bl.id);
-
- npc_mob++;
- }
- //printf("warp npc %s %d read done\n",mapname,nd->bl.id);
-
- return 0;
-}
-
-/*==========================================
- * ƒ}ƒbƒvƒtƒ‰ƒOs‚̉ðÍ
- *------------------------------------------
- */
-static int npc_parse_mapflag(char *w1,char *w2,char *w3,char *w4)
-{
- int m;
- char mapname[24],savemap[16];
- int savex,savey;
- char drop_arg1[16],drop_arg2[16];
- int drop_id=0,drop_type=0,drop_per=0;
-
- // ˆø”‚̌”ƒ`ƒFƒbƒN
-// if ( sscanf(w1,"%[^,],%d,%d,%d",mapname,&x,&y,&dir) != 4 )
- if ( sscanf(w1,"%[^,]",mapname) != 1 )
- return 1;
-
- m=map_mapname2mapid(mapname);
- if (m<0)
- return 1;
-
-//ƒ}ƒbƒvƒtƒ‰ƒO
- if ( strcmpi(w3,"nosave")==0) {
- if (strcmp(w4,"SavePoint")==0) {
- memcpy(map[m].save.map,"SavePoint",10);
- map[m].save.x=-1;
- map[m].save.y=-1;
- }else if (sscanf(w4,"%[^,],%d,%d",savemap,&savex,&savey)==3) {
- memcpy(map[m].save.map,savemap,16);
- map[m].save.x=savex;
- map[m].save.y=savey;
- }
- map[m].flag.nosave=1;
- }
- else if (strcmpi(w3,"nomemo")==0) {
- map[m].flag.nomemo=1;
- }
- else if (strcmpi(w3,"noteleport")==0) {
- map[m].flag.noteleport=1;
- }
- else if (strcmpi(w3,"nowarp")==0) {
- map[m].flag.nowarp=1;
- }
- else if (strcmpi(w3,"nowarpto")==0) {
- map[m].flag.nowarpto=1;
- }
- else if (strcmpi(w3,"noreturn")==0) {
- map[m].flag.noreturn=1;
- }
- else if (strcmpi(w3,"monster_noteleport")==0) {
- map[m].flag.monster_noteleport=1;
- }
- else if (strcmpi(w3,"nobranch")==0) {
- map[m].flag.nobranch=1;
- }
- else if (strcmpi(w3,"nopenalty")==0) {
- map[m].flag.nopenalty=1;
- }
- else if (strcmpi(w3,"pvp")==0) {
- map[m].flag.pvp=1;
- }
- else if (strcmpi(w3,"pvp_noparty")==0) {
- map[m].flag.pvp_noparty=1;
- }
- else if (strcmpi(w3,"pvp_noguild")==0) {
- map[m].flag.pvp_noguild=1;
- }
- else if (strcmpi(w3,"pvp_nightmaredrop")==0) {
- if (sscanf(w4,"%[^,],%[^,],%d",drop_arg1,drop_arg2,&drop_per)==3) { int i;
- if(strcmp(drop_arg1,"random")==0)
- drop_id = -1;
- else if(itemdb_exists( (drop_id=atoi(drop_arg1)) )==NULL)
- drop_id = 0;
- if(strcmp(drop_arg2,"inventory")==0)
- drop_type = 1;
- else if(strcmp(drop_arg2,"equip")==0)
- drop_type = 2;
- else if(strcmp(drop_arg2,"all")==0)
- drop_type = 3;
-
- if(drop_id != 0){
- for (i=0;i<MAX_DROP_PER_MAP;i++){
- if(map[m].drop_list[i].drop_id==0){
- map[m].drop_list[i].drop_id = drop_id;
- map[m].drop_list[i].drop_type = drop_type;
- map[m].drop_list[i].drop_per = drop_per;
- break;
- }
- }
- map[m].flag.pvp_nightmaredrop=1;
- }
- }
- }
- else if (strcmpi(w3,"pvp_nocalcrank")==0) {
- map[m].flag.pvp_nocalcrank=1;
- }
- else if (strcmpi(w3,"gvg")==0) {
- map[m].flag.gvg=1;
- }
- else if (strcmpi(w3,"gvg_noparty")==0) {
- map[m].flag.gvg_noparty=1;
- }
- else if (strcmpi(w3,"nozenypenalty")==0) {
- map[m].flag.nozenypenalty=1;
- }
- else if (strcmpi(w3,"notrade")==0) {
- map[m].flag.notrade=1;
- }
- else if (strcmpi(w3,"noskill")==0) {
- map[m].flag.noskill=1;
- }
- else if (battle_config.pk_mode && strcmpi(w3,"nopvp")==0) { // nopvp for pk mode [Valaris]
- map[m].flag.nopvp=1;
- map[m].flag.pvp=0;
- }
- else if (strcmpi(w3,"noicewall")==0) { // noicewall [Valaris]
- map[m].flag.noicewall=1;
- }
- else if (strcmpi(w3,"snow")==0) { // snow [Valaris]
- map[m].flag.snow=1;
- }
- else if (strcmpi(w3,"fog")==0) { // fog [Valaris]
- map[m].flag.fog=1;
- }
- else if (strcmpi(w3,"sakura")==0) { // sakura [Valaris]
- map[m].flag.sakura=1;
- }
- else if (strcmpi(w3,"leaves")==0) { // leaves [Valaris]
- map[m].flag.leaves=1;
- }
- else if (strcmpi(w3,"rain")==0) { // rain [Valaris]
- map[m].flag.rain=1;
- }
- else if (strcmpi(w3,"indoors")==0) { // celest
- map[m].flag.indoors=1;
- }
- else if (strcmpi(w3,"nogo")==0) { // celest
- map[m].flag.nogo=1;
- }
-
- return 0;
-}
-
-void npc_parsesrcfile(char *name)
-{
- int m, lines = 0;
- char line[1024];
-
- FILE *fp = fopen (name,"r");
- if (fp == NULL) {
- ShowError ("File not found : %s\n", name);
- exit(1);
- }
- current_file = name;
-
- while (fgets(line, 1020, fp)) {
- char w1[1024], w2[1024], w3[1024], w4[1024], mapname[1024];
- int i, j, w4pos, count;
- lines++;
-
- if (line[0] == '/' && line[1] == '/')
- continue;
- // •s—v‚ȃXƒy[ƒX‚âƒ^ƒu‚̘A‘±‚Í‹l‚ß‚é
- for (i = j = 0; line[i]; i++) {
- if (line[i]==' ') {
- if (!((line[i+1] && (isspace(line[i+1]) || line[i+1]==',')) ||
- (j && line[j-1]==',')))
- line[j++]=' ';
- } else if (line[i]=='\t') {
- if (!(j && line[j-1]=='\t'))
- line[j++]='\t';
- } else
- line[j++]=line[i];
- }
- // ʼn‚̓^ƒu‹æØ‚è‚Ń`ƒFƒbƒN‚µ‚Ä‚Ý‚ÄAƒ_ƒ‚È‚çƒXƒy[ƒX‹æØ‚è‚ÅŠm”F
- if ((count = sscanf(line,"%[^\t]\t%[^\t]\t%[^\t\r\n]\t%n%[^\t\r\n]", w1, w2, w3, &w4pos, w4)) < 3 &&
- (count = sscanf(line,"%s%s%s%n%s", w1, w2, w3, &w4pos, w4)) < 3) {
- continue;
- }
- // ƒ}ƒbƒv‚Ì‘¶ÝŠm”F
- if (strcmp(w1,"-") !=0 && strcmpi(w1,"function") != 0 ){
- sscanf(w1,"%[^,]",mapname);
- m = map_mapname2mapid(mapname);
- if (strlen(mapname)>16 || m<0) {
- // "mapname" is not assigned to this server
- continue;
- }
- }
- if (strcmpi(w2,"warp") == 0 && count > 3) {
- npc_parse_warp(w1,w2,w3,w4);
- } else if (strcmpi(w2,"shop") == 0 && count > 3) {
- npc_parse_shop(w1,w2,w3,w4);
- } else if (strcmpi(w2,"script") == 0 && count > 3) {
- if (strcmpi(w1,"function") == 0) {
- npc_parse_function(w1,w2,w3,w4,line+w4pos,fp,&lines);
- } else {
- npc_parse_script(w1,w2,w3,w4,line+w4pos,fp,&lines);
- }
- } else if ((i = 0, sscanf(w2,"duplicate%n",&i), (i > 0 && w2[i] == '(')) && count > 3) {
- npc_parse_script(w1,w2,w3,w4,line+w4pos,fp,&lines);
- } else if (strcmpi(w2,"monster") == 0 && count > 3) {
- npc_parse_mob(w1,w2,w3,w4);
- } else if (strcmpi(w2,"mapflag") == 0 && count >= 3) {
- npc_parse_mapflag(w1,w2,w3,w4);
- }
- }
- fclose(fp);
-
- return;
-}
-
-static int npc_read_indoors(void)
-{
- char *buf,*p;
- int s, m;
-
- buf=(char *) grfio_reads("data\\indoorrswtable.txt",&s);
-
- if(buf==NULL)
- return -1;
-
- buf[s]=0;
- for(p=buf;p-buf<s;){
- char buf2[64];
-
- if(sscanf(p,"%[^#]#",buf2) == 1){
- char map_name[64] = "";
- strncpy(map_name, buf2, strlen(buf2) - 4);
- strcat(map_name, ".gat");
- if ((m = map_mapname2mapid(map_name)) >= 0)
- map[m].flag.indoors=1;
- }
-
- p=strchr(p,10);
- if(!p) break;
- p++;
- }
- aFree(buf);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","data\\indoorrswtable.txt");
- ShowStatus(tmp_output);
-
- return 0;
-}
-
-static int ev_db_final(void *key,void *data,va_list ap)
-{
- aFree(data);
- if(strstr((const char *) key,"::")!=NULL)
- aFree(key);
- return 0;
-}
-static int npcname_db_final(void *key,void *data,va_list ap)
-{
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int npc_cleanup_sub (struct block_list *bl, va_list ap) {
- nullpo_retr(0, bl);
-
- switch(bl->type) {
- case BL_NPC:
- npc_unload((struct npc_data *)bl);
- break;
- case BL_MOB:
- mob_unload((struct mob_data *)bl);
- break;
- }
-
- return 0;
-}
-int npc_reload(void)
-{
- struct npc_src_list *nsl;
- int m, last_npc_id;
- time_t last_time = time(0);
- int busy = 0;
- char c = '-';
-
- for (m = 0; m < map_num; m++) {
- map_foreachinarea(npc_cleanup_sub, m, 0, 0, map[m].xs, map[m].ys, 0);
- map[m].npc_num = 0;
- }
- if(ev_db)
- strdb_final(ev_db,ev_db_final);
- if(npcname_db)
- strdb_final(npcname_db,npcname_db_final);
-
- // anything else we should cleanup?
- // Reloading npc's now
- ev_db = strdb_init(51);
- npcname_db = strdb_init(24);
- ev_db->release = ev_release;
- npc_warp = npc_shop = npc_script = npc_mob = 0;
- last_npc_id = npc_id;
-
- for (nsl = npc_src_first; nsl; nsl = nsl->next) {
- npc_parsesrcfile(nsl->name);
- printf("\r");
- ShowStatus("Loading NPCs... Working: ");
- if (last_time != time(0)) {
- last_time = time(0);
- switch(busy) {
- case 0: c='\\'; busy++; break;
- case 1: c='|'; busy++; break;
- case 2: c='/'; busy++; break;
- case 3: c='-'; busy=0;
- }
- }
- printf("[%c]",c);
- fflush(stdout);
- }
- printf("\r");
- ShowInfo ("Done loading '"CL_WHITE"%d"CL_RESET"' NPCs:%30s\n\t-'"
- CL_WHITE"%d"CL_RESET"' Warps\n\t-'"
- CL_WHITE"%d"CL_RESET"' Shops\n\t-'"
- CL_WHITE"%d"CL_RESET"' Scripts\n\t-'"
- CL_WHITE"%d"CL_RESET"' Mobs\n",
- npc_id - last_npc_id, "", npc_warp, npc_shop, npc_script, npc_mob);
-
- return 0;
-}
-/*==========================================
- * I—¹
- *------------------------------------------
- */
-int do_final_npc(void)
-{
- int i;
- struct block_list *bl;
- struct npc_data *nd;
- struct mob_data *md;
- struct pet_data *pd;
-
- if(ev_db)
- strdb_final(ev_db,ev_db_final);
- if(npcname_db)
- strdb_final(npcname_db,npcname_db_final);
-
- npc_clearsrcfile();
-
- for (i = START_NPC_NUM; i < npc_id; i++){
- if((bl = map_id2bl(i))){
- if(bl->type == BL_NPC && (nd = (struct npc_data *)bl)){
- npc_unload(nd);
- }else if (bl->type == BL_MOB && (md = (struct mob_data *)bl)){
- if (md->lootitem){
- aFree(md->lootitem);
- md->lootitem = NULL;
- }
- aFree(md);
- md = NULL;
- }else if(bl->type == BL_PET && (pd = (struct pet_data *)bl)){
- aFree(pd);
- pd = NULL;
- }
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * npc‰Šú‰»
- *------------------------------------------
- */
-int do_init_npc(void)
-{
- struct npc_src_list *nsl;
- time_t last_time = time(0);
- int busy = 0;
- char c = '-';
-
- // indoorrswtable.txt and etcinfo.txt [Celest]
- if (battle_config.indoors_override_grffile)
- npc_read_indoors();
- //npc_read_weather();
-
- // comparing only the first 24 chars of labels that are 50 chars long isn't that nice
- // will cause "duplicated" labels where actually no dup is...
- //ev_db=strdb_init(24);
- ev_db = strdb_init(51);
- npcname_db = strdb_init(24);
- ev_db->release = ev_release;
-
- memset(&ev_tm_b, -1, sizeof(ev_tm_b));
-
- for (nsl = npc_src_first; nsl; nsl = nsl->next) {
- /*if(nsl->prev){ // [Shinomori]
- aFree(nsl->prev);
- nsl->prev = NULL;
- }*/
- //
- npc_parsesrcfile(nsl->name);
- current_file = NULL;
- printf("\r");
- ShowStatus("Loading NPCs... Working: ");
- if (last_time != time(0)) {
- last_time = time(0);
- switch(busy) {
- case 0: c='\\'; busy++; break;
- case 1: c='|'; busy++; break;
- case 2: c='/'; busy++; break;
- case 3: c='-'; busy=0;
- }
- }
- printf("[%c]",c);
- fflush(stdout);
-// printf("\rLoading NPCs [%d]: %-54s",npc_id-START_NPC_NUM,nsl->name);
-// fflush(stdout);
- }
- printf("\r");
- ShowInfo ("Done loading '"CL_WHITE"%d"CL_RESET"' NPCs:%30s\n\t-'"
- CL_WHITE"%d"CL_RESET"' Warps\n\t-'"
- CL_WHITE"%d"CL_RESET"' Shops\n\t-'"
- CL_WHITE"%d"CL_RESET"' Scripts\n\t-'"
- CL_WHITE"%d"CL_RESET"' Mobs\n",
- npc_id - START_NPC_NUM, "", npc_warp, npc_shop, npc_script, npc_mob);
-
- add_timer_func_list(npc_walktimer,"npc_walktimer"); // [Valaris]
- add_timer_func_list(npc_event_timer,"npc_event_timer");
- add_timer_func_list(npc_event_do_clock,"npc_event_do_clock");
- add_timer_func_list(npc_timerevent,"npc_timerevent");
-
- //exit(1);
-
- return 0;
-}
diff --git a/src/map/npc.h b/src/map/npc.h
deleted file mode 100644
index 2f81345d7..000000000
--- a/src/map/npc.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// $Id: npc.h,v 1.5 2004/09/25 11:39:17 MouseJstr Exp $
-#ifndef _NPC_H_
-#define _NPC_H_
-
-#define START_NPC_NUM 110000000
-
-#define WARP_CLASS 45
-#define WARP_DEBUG_CLASS 722
-#define INVISIBLE_CLASS 32767
-
-#ifdef PCRE_SUPPORT
-void npc_chat_finalize(struct npc_data *nd);
-#endif
-int npc_chat_sub(struct block_list *bl, va_list ap);
-int npc_event_dequeue(struct map_session_data *sd);
-int npc_event_timer(int tid,unsigned int tick,int id,int data);
-int npc_event(struct map_session_data *sd,const char *npcname,int);
-int npc_timer_event(const char *eventname); // Added by RoVeRT
-int npc_command(struct map_session_data *sd,char *npcname,char *command);
-int npc_touch_areanpc(struct map_session_data *,int,int,int);
-int npc_click(struct map_session_data *,int);
-int npc_scriptcont(struct map_session_data *,int);
-int npc_checknear(struct map_session_data *,int);
-int npc_buysellsel(struct map_session_data *,int,int);
-int npc_buylist(struct map_session_data *,int,unsigned short *);
-int npc_selllist(struct map_session_data *,int,unsigned short *);
-int npc_parse_mob(char *w1,char *w2,char *w3,char *w4);
-int npc_parse_warp(char *w1,char *w2,char *w3,char *w4);
-int npc_globalmessage(const char *name,char *mes);
-
-int npc_enable(const char *name,int flag);
-struct npc_data* npc_name2id(const char *name);
-
-int npc_walktoxy(struct npc_data *nd,int x,int y,int easy); // npc walking [Valaris]
-int npc_stop_walking(struct npc_data *nd,int type);
-int npc_changestate(struct npc_data *nd,int state,int type);
-
-int npc_get_new_npc_id(void);
-
-void npc_addsrcfile(char *);
-void npc_delsrcfile(char *);
-int do_final_npc(void);
-int do_init_npc(void);
-int npc_event_do_oninit(void);
-int npc_do_ontimer(int,int);
-
-int npc_event_doall(const char *name);
-int npc_event_do(const char *name);
-int npc_event_doall_id(const char *name, int id);
-
-int npc_timerevent_start(struct npc_data *nd, int rid);
-int npc_timerevent_stop(struct npc_data *nd);
-int npc_gettimerevent_tick(struct npc_data *nd);
-int npc_settimerevent_tick(struct npc_data *nd,int newtimer);
-int npc_remove_map(struct npc_data *nd);
-int npc_unload(struct npc_data *nd);
-int npc_reload(void);
-
-extern char *current_file;
-
-#endif
-
diff --git a/src/map/npc_chat.c b/src/map/npc_chat.c
deleted file mode 100644
index c15a26bf0..000000000
--- a/src/map/npc_chat.c
+++ /dev/null
@@ -1,502 +0,0 @@
-#ifdef PCRE_SUPPORT
-
-#include <stdio.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#ifdef __WIN32
-#define __USE_W32_SOCKETS
-#include <windows.h>
-#else
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#endif
-#include <time.h>
-
-#include "../common/timer.h"
-#include "../common/malloc.h"
-#include "../common/version.h"
-#include "../common/nullpo.h"
-#include "../common/showmsg.h"
-
-#include "map.h"
-#include "status.h"
-#include "npc.h"
-#include "chat.h"
-#include "script.h"
-#include "battle.h"
-
-#include "pcre.h"
-
-/**
- * Written by MouseJstr in a vision... (2/21/2005)
- *
- * This allows you to make npc listen for spoken text (global
- * messages) and pattern match against that spoken text using perl
- * regular expressions.
- *
- * Please feel free to copy this code into your own personal ragnarok
- * servers or distributions but please leave my name. Also, please
- * wait until I've put it into the main eA branch which means I
- * believe it is ready for distribution.
- *
- * So, how do people use this?
- *
- * The first and most important function is defpattern
- *
- * defpattern 1, "[^:]+: (.*) loves (.*)", "label";
- *
- * this defines a new pattern in set 1 using perl syntax
- * (http://www.troubleshooters.com/codecorn/littperl/perlreg.htm)
- * and tells it to jump to the supplied label when the pattern
- * is matched.
- *
- * each of the matched Groups will result in a variable being
- * set ($p1$ through $p9$ with $p0$ being the entire string)
- * before the script gets executed.
- *
- * activatepset 1;
- *
- * This activates a set of patterns.. You can have many pattern
- * sets defined and many active all at once. This feature allows
- * you to set up "conversations" and ever changing expectations of
- * the pattern matcher
- *
- * deactivatepset 1;
- *
- * turns off a pattern set;
- *
- * deactivatepset -1;
- *
- * turns off ALL pattern sets;
- *
- * deletepset 1;
- *
- * deletes a pset
- */
-
-/* Structure containing all info associated with a single pattern
- block */
-
-struct pcrematch_entry {
- struct pcrematch_entry *next_;
- char *pattern_;
- pcre *pcre_;
- pcre_extra *pcre_extra_;
- char *label_;
-};
-
-/* A set of patterns that can be activated and deactived with a single
- command */
-
-struct pcrematch_set {
- struct pcrematch_set *next_, *prev_;
- struct pcrematch_entry *head_;
- int setid_;
-};
-
-/*
- * Entire data structure hung off a NPC
- *
- * The reason I have done it this way (a void * in npc_data and then
- * this) was to reduce the number of patches that needed to be applied
- * to a ragnarok distribution to bring this code online. I
- * also wanted people to be able to grab this one file to get updates
- * without having to do a large number of changes.
- */
-
-struct npc_parse {
- struct pcrematch_set *active_;
- struct pcrematch_set *inactive_;
-};
-
-
-/**
- * delete everythign associated with a entry
- *
- * This does NOT do the list management
- */
-
-void finalize_pcrematch_entry(struct pcrematch_entry *e) {
- free(e->pcre_);
- free(e->pcre_extra_);
- aFree(e->pattern_);
- aFree(e->label_);
-}
-
-/**
- * Lookup (and possibly create) a new set of patterns by the set id
- */
-static struct pcrematch_set * lookup_pcreset(struct npc_data *nd,int setid)
-{
- struct pcrematch_set *pcreset;
- struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
- if (npcParse == NULL)
- nd->chatdb = npcParse = (struct npc_parse *)
- aCalloc(sizeof(struct npc_parse), 1);
-
- pcreset = npcParse->active_;
-
- while (pcreset != NULL) {
- if (pcreset->setid_ == setid)
- break;
- pcreset = pcreset->next_;
- }
- if (pcreset == NULL)
- pcreset = npcParse->inactive_;
-
- while (pcreset != NULL) {
- if (pcreset->setid_ == setid)
- break;
- pcreset = pcreset->next_;
- }
-
- if (pcreset == NULL) {
- pcreset = (struct pcrematch_set *)
- aCalloc(sizeof(struct pcrematch_set), 1);
- pcreset->next_ = npcParse->inactive_;
- if (pcreset->next_ != NULL)
- pcreset->next_->prev_ = pcreset;
- pcreset->prev_ = 0;
- npcParse->inactive_ = pcreset;
- pcreset->setid_ = setid;
- }
-
- return pcreset;
-}
-
-/**
- * activate a set of patterns.
- *
- * if the setid does not exist, this will silently return
- */
-
-static void activate_pcreset(struct npc_data *nd,int setid) {
- struct pcrematch_set *pcreset;
- struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
- if (npcParse == NULL)
- return; // Nothing to activate...
- pcreset = npcParse->inactive_;
- while (pcreset != NULL) {
- if (pcreset->setid_ == setid)
- break;
- pcreset = pcreset->next_;
- }
- if (pcreset == NULL)
- return; // not in inactive list
- if (pcreset->next_ != NULL)
- pcreset->next_->prev_ = pcreset->prev_;
- if (pcreset->prev_ != NULL)
- pcreset->prev_->next_ = pcreset->next_;
- else
- npcParse->inactive_ = pcreset->next_;
-
- pcreset->prev_ = NULL;
- pcreset->next_ = npcParse->active_;
- if (pcreset->next_ != NULL)
- pcreset->next_->prev_ = pcreset;
- npcParse->active_ = pcreset;
-}
-
-/**
- * deactivate a set of patterns.
- *
- * if the setid does not exist, this will silently return
- */
-
-static void deactivate_pcreset(struct npc_data *nd,int setid) {
- struct pcrematch_set *pcreset;
- struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
- if (npcParse == NULL)
- return; // Nothing to deactivate...
- if (setid == -1) {
- while(npcParse->active_ != NULL)
- deactivate_pcreset(nd, npcParse->active_->setid_);
- return;
- }
- pcreset = npcParse->active_;
- while (pcreset != NULL) {
- if (pcreset->setid_ == setid)
- break;
- pcreset = pcreset->next_;
- }
- if (pcreset == NULL)
- return; // not in active list
- if (pcreset->next_ != NULL)
- pcreset->next_->prev_ = pcreset->prev_;
- if (pcreset->prev_ != NULL)
- pcreset->prev_->next_ = pcreset->next_;
- else
- npcParse->active_ = pcreset->next_;
-
- pcreset->prev_ = NULL;
- pcreset->next_ = npcParse->inactive_;
- if (pcreset->next_ != NULL)
- pcreset->next_->prev_ = pcreset;
- npcParse->inactive_ = pcreset;
-}
-
-/**
- * delete a set of patterns.
- */
-static void delete_pcreset(struct npc_data *nd,int setid) {
- int active = 1;
- struct pcrematch_set *pcreset;
- struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
- if (npcParse == NULL)
- return; // Nothing to deactivate...
- pcreset = npcParse->active_;
- while (pcreset != NULL) {
- if (pcreset->setid_ == setid)
- break;
- pcreset = pcreset->next_;
- }
- if (pcreset == NULL) {
- active = 0;
- pcreset = npcParse->inactive_;
- while (pcreset != NULL) {
- if (pcreset->setid_ == setid)
- break;
- pcreset = pcreset->next_;
- }
- }
- if (pcreset == NULL)
- return;
-
- if (pcreset->next_ != NULL)
- pcreset->next_->prev_ = pcreset->prev_;
- if (pcreset->prev_ != NULL)
- pcreset->prev_->next_ = pcreset->next_;
- else if(active == 1)
- npcParse->active_ = pcreset->next_;
- else
- npcParse->inactive_ = pcreset->next_;
-
- pcreset->prev_ = NULL;
- pcreset->next_ = NULL;
-
- while (pcreset->head_) {
- struct pcrematch_entry *n = pcreset->head_->next_;;
- finalize_pcrematch_entry(pcreset->head_);
- pcreset->head_ = n;
- }
-
- aFree(pcreset);
-}
-
-/**
- * create a new pattern entry
- */
-static struct pcrematch_entry *create_pcrematch_entry(struct pcrematch_set * set) {
- struct pcrematch_entry * e = (struct pcrematch_entry *)
- aCalloc(sizeof(struct pcrematch_entry), 1);
- struct pcrematch_entry * last = set->head_;
-
- // Normally we would have just stuck it at the end of the list but
- // this doesn't sink up with peoples usage pattern. They wanted
- // the items defined first to have a higher priority then the
- // items defined later.. as a result, we have to do some work up
- // front..
-
- /* if we are the first pattern, stick us at the end */
- if (last == NULL) {
- set->head_ = e;
- return e;
- }
-
- /* Look for the last entry */
- while (last->next_ != NULL)
- last = last->next_;
-
- last->next_ = e;
- e->next_ = NULL;
-
- return e;
-}
-
-/**
- * define/compile a new pattern
- */
-
-void npc_chat_def_pattern(struct npc_data *nd, int setid,
- const char *pattern, const char *label)
-{
- const char *err;
- int erroff;
-
- struct pcrematch_set * s = lookup_pcreset(nd, setid);
- struct pcrematch_entry *e = create_pcrematch_entry(s);
- e->pattern_ = aStrdup(pattern);
- e->label_ = aStrdup(label);
- e->pcre_ = pcre_compile(pattern, PCRE_CASELESS, &err, &erroff, NULL);
- e->pcre_extra_ = pcre_study(e->pcre_, 0, &err);
-}
-
-/**
- * Delete everything associated with a NPC concerning the pattern
- * matching code
- *
- * this could be more efficent but.. how often do you do this?
- */
-void npc_chat_finalize(struct npc_data *nd)
-{
- struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
- if (npcParse == NULL)
- return;
-
- while(npcParse->active_)
- delete_pcreset(nd, npcParse->active_->setid_);
-
- while(npcParse->inactive_)
- delete_pcreset(nd, npcParse->inactive_->setid_);
-}
-
-/**
- * Handler called whenever a global message is spoken in a NPC's area
- */
-int npc_chat_sub(struct block_list *bl, va_list ap)
-{
- struct npc_data *nd = (struct npc_data *)bl;
- struct npc_parse *npcParse = (struct npc_parse *) nd->chatdb;
- unsigned char *msg;
- int len, pos, i;
- struct map_session_data *sd;
- struct npc_label_list *lst;
- struct pcrematch_set *pcreset;
-
- // Not interested in anything you might have to say...
- if (npcParse == NULL || npcParse->active_ == NULL)
- return 0;
-
- msg = va_arg(ap,unsigned char*);
- len = va_arg(ap,int);
- sd = va_arg(ap,struct map_session_data *);
-
- // grab the active list
- pcreset = npcParse->active_;
-
- // interate across all active sets
- while (pcreset != NULL) {
- struct pcrematch_entry *e = pcreset->head_;
- // interate across all patterns in that set
- while (e != NULL) {
- int offsets[20];
- char buf[255];
- // perform pattern match
- int r = pcre_exec(e->pcre_, e->pcre_extra_, (char *) msg, len, 0,
- 0, offsets, sizeof(offsets) / sizeof(offsets[0]));
- if (r >= 0) {
- // save out the matched strings
- switch (r) {
- case 10:
- memcpy(buf, &msg[offsets[18]], offsets[19]);
- buf[offsets[19]] = '\0';
- set_var(sd, "$p9$", buf);
- case 9:
- memcpy(buf, &msg[offsets[16]], offsets[17]);
- buf[offsets[17]] = '\0';
- set_var(sd, "$p8$", buf);
- case 8:
- memcpy(buf, &msg[offsets[14]], offsets[15]);
- buf[offsets[15]] = '\0';
- set_var(sd, "$p7$", buf);
- case 7:
- memcpy(buf, &msg[offsets[12]], offsets[13]);
- buf[offsets[13]] = '\0';
- set_var(sd, "$p6$", buf);
- case 6:
- memcpy(buf, &msg[offsets[10]], offsets[11]);
- buf[offsets[11]] = '\0';
- set_var(sd, "$p5$", buf);
- case 5:
- memcpy(buf, &msg[offsets[8]], offsets[9]);
- buf[offsets[9]] = '\0';
- set_var(sd, "$p4$", buf);
- case 4:
- memcpy(buf, &msg[offsets[6]], offsets[7]);
- buf[offsets[7]] = '\0';
- set_var(sd, "$p3$", buf);
- case 3:
- memcpy(buf, &msg[offsets[4]], offsets[5]);
- buf[offsets[5]] = '\0';
- set_var(sd, "$p2$", buf);
- case 2:
- memcpy(buf, &msg[offsets[2]], offsets[3]);
- buf[offsets[3]] = '\0';
- set_var(sd, "$p1$", buf);
- case 1:
- memcpy(buf, &msg[offsets[0]], offsets[1]);
- buf[offsets[1]] = '\0';
- set_var(sd, "$p0$", buf);
- }
-
- // find the target label.. this sucks..
- lst=nd->u.scr.label_list;
- pos = -1;
- for (i = 0; i < nd->u.scr.label_list_num; i++) {
- if (strncmp(lst[i].name, e->label_, sizeof(lst[i].name)) == 0) {
- pos = lst[i].pos;
- break;
- }
- }
- if (pos == -1) {
- printf("Unable to find label: %s", e->label_);
- // unable to find label... do something..
- return 0;
- }
- // run the npc script
- run_script(nd->u.scr.script,pos,sd->bl.id,nd->bl.id);
- return 0;
- }
- e = e->next_;
- }
- pcreset = pcreset->next_;
- }
-
- return 0;
-}
-
-// Various script builtins used to support these functions
-
-int buildin_defpattern(struct script_state *st) {
- int setid=conv_num(st,& (st->stack->stack_data[st->start+2]));
- char *pattern=conv_str(st,& (st->stack->stack_data[st->start+3]));
- char *label=conv_str(st,& (st->stack->stack_data[st->start+4]));
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
-
- npc_chat_def_pattern(nd, setid, pattern, label);
-
- return 0;
-}
-
-int buildin_activatepset(struct script_state *st) {
- int setid=conv_num(st,& (st->stack->stack_data[st->start+2]));
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
-
- activate_pcreset(nd, setid);
-
- return 0;
-}
-int buildin_deactivatepset(struct script_state *st) {
- int setid=conv_num(st,& (st->stack->stack_data[st->start+2]));
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
-
- deactivate_pcreset(nd, setid);
-
- return 0;
-}
-int buildin_deletepset(struct script_state *st) {
- int setid=conv_num(st,& (st->stack->stack_data[st->start+2]));
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
-
- delete_pcreset(nd, setid);
-
- return 0;
-}
-
-
-#endif
diff --git a/src/map/party.c b/src/map/party.c
deleted file mode 100644
index 7eb3f02dc..000000000
--- a/src/map/party.c
+++ /dev/null
@@ -1,657 +0,0 @@
-// $Id: party.c,v 1.2 2004/09/22 02:59:47 Akitasha Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "party.h"
-#include "db.h"
-#include "timer.h"
-#include "socket.h"
-#include "nullpo.h"
-#include "malloc.h"
-#include "pc.h"
-#include "map.h"
-#include "battle.h"
-#include "intif.h"
-#include "clif.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-#define PARTY_SEND_XYHP_INVERVAL 1000 // À•W‚â‚g‚o‘—M‚ÌŠÔŠu
-
-static struct dbt* party_db;
-
-int party_send_xyhp_timer(int tid,unsigned int tick,int id,int data);
-/*==========================================
- * I—¹
- *------------------------------------------
- */
-static int party_db_final(void *key,void *data,va_list ap)
-{
- aFree(data);
- return 0;
-}
-void do_final_party(void)
-{
- if(party_db)
- numdb_final(party_db,party_db_final);
-}
-// ‰Šú‰»
-void do_init_party(void)
-{
- party_db=numdb_init();
- add_timer_func_list(party_send_xyhp_timer,"party_send_xyhp_timer");
- add_timer_interval(gettick()+PARTY_SEND_XYHP_INVERVAL,party_send_xyhp_timer,0,0,PARTY_SEND_XYHP_INVERVAL);
-}
-
-// ŒŸõ
-struct party *party_search(int party_id)
-{
- return (struct party *) numdb_search(party_db,party_id);
-}
-int party_searchname_sub(void *key,void *data,va_list ap)
-{
- struct party *p=(struct party *)data,**dst;
- char *str;
- str=va_arg(ap,char *);
- dst=va_arg(ap,struct party **);
- if(strcmpi(p->name,str)==0)
- *dst=p;
- return 0;
-}
-// ƒp[ƒeƒB–¼ŒŸõ
-struct party* party_searchname(char *str)
-{
- struct party *p=NULL;
- numdb_foreach(party_db,party_searchname_sub,str,&p);
- return p;
-}
-// 쬗v‹
-int party_create(struct map_session_data *sd,char *name,int item,int item2)
-{
- nullpo_retr(0, sd);
-
- if(sd->status.party_id==0)
- intif_create_party(sd,name,item,item2);
- else
- clif_party_created(sd,2);
- return 0;
-}
-
-// 쬉”Û
-int party_created(int account_id,int fail,int party_id,char *name)
-{
- struct map_session_data *sd;
- sd=map_id2sd(account_id);
-
- nullpo_retr(0, sd);
-
- if(fail==0){
- struct party *p;
- sd->status.party_id=party_id;
- if((p=(struct party *) numdb_search(party_db,party_id))!=NULL){
- printf("party: id already exists!\n");
- exit(1);
- }
- p=(struct party *)aCalloc(1,sizeof(struct party));
- p->party_id=party_id;
- memcpy(p->name,name,24);
- numdb_insert(party_db,party_id,p);
- clif_party_created(sd,0);
- }else{
- clif_party_created(sd,1);
- }
- return 0;
-}
-
-// î•ñ—v‹
-int party_request_info(int party_id)
-{
- return intif_request_partyinfo(party_id);
-}
-
-// Š‘®ƒLƒƒƒ‰‚ÌŠm”F
-int party_check_member(struct party *p)
-{
- int i;
- struct map_session_data *sd;
-
- nullpo_retr(0, p);
-
- for(i=0;i<fd_max;i++){
- if(session[i] && (sd=(struct map_session_data *) session[i]->session_data) && sd->state.auth){
- if(sd->status.party_id==p->party_id){
- int j,f=1;
- for(j=0;j<MAX_PARTY;j++){ // ƒp[ƒeƒB‚Ƀf[ƒ^‚ª‚ ‚é‚©Šm”F
- if( p->member[j].account_id==sd->status.account_id){
- if( strcmp(p->member[j].name,sd->status.name)==0 )
- f=0; // ƒf[ƒ^‚ª‚ ‚é
- else
- p->member[j].sd=NULL; // “¯C•ÊƒLƒƒƒ‰‚¾‚Á‚½
- }
- }
- if(f){
- sd->status.party_id=0;
- if(battle_config.error_log)
- printf("party: check_member %d[%s] is not member\n",sd->status.account_id,sd->status.name);
- }
- }
- }
- }
- return 0;
-}
-
-// î•ñŠ“¾Ž¸”si‚»‚ÌID‚̃Lƒƒƒ‰‚ð‘S•”–¢Š‘®‚É‚·‚éj
-int party_recv_noinfo(int party_id)
-{
- int i;
- struct map_session_data *sd;
- for(i=0;i<fd_max;i++){
- if(session[i] && (sd=(struct map_session_data *) session[i]->session_data) && sd->state.auth){
- if(sd->status.party_id==party_id)
- sd->status.party_id=0;
- }
- }
- return 0;
-}
-// î•ñŠ“¾
-int party_recv_info(struct party *sp)
-{
- struct party *p;
- int i;
-
- nullpo_retr(0, sp);
-
- if((p=(struct party *) numdb_search(party_db,sp->party_id))==NULL){
- p=(struct party *)aCalloc(1,sizeof(struct party));
- numdb_insert(party_db,sp->party_id,p);
-
- // ʼn‚̃[ƒh‚Ȃ̂ц[ƒU[‚̃`ƒFƒbƒN‚ðs‚¤
- party_check_member(sp);
- }
- memcpy(p,sp,sizeof(struct party));
-
- for(i=0;i<MAX_PARTY;i++){ // sd‚ÌÝ’è
- struct map_session_data *sd = map_id2sd(p->member[i].account_id);
- p->member[i].sd=(sd!=NULL && sd->status.party_id==p->party_id && !sd->state.waitingdisconnect)?sd:NULL;
- }
-
- clif_party_info(p,-1);
-
- for(i=0;i<MAX_PARTY;i++){ // Ý’èî•ñ‚Ì‘—M
-// struct map_session_data *sd = map_id2sd(p->member[i].account_id);
- struct map_session_data *sd = p->member[i].sd;
- if(sd!=NULL && sd->party_sended==0){
- clif_party_option(p,sd,0x100);
- sd->party_sended=1;
- }
- }
-
- return 0;
-}
-
-// ƒp[ƒeƒB‚Ö‚ÌŠ©—U
-int party_invite(struct map_session_data *sd,int account_id)
-{
- struct map_session_data *tsd= map_id2sd(account_id);
- struct party *p=party_search(sd->status.party_id);
- int i;
-
- nullpo_retr(0, sd);
-
- if(tsd==NULL || p==NULL)
- return 0;
- if(!battle_config.invite_request_check) {
- if (tsd->guild_invite>0 || tsd->trade_partner) { // ‘ŠŽè‚ªŽæˆø’†‚©‚Ç‚¤‚©
- clif_party_inviteack(sd,tsd->status.name,0);
- return 0;
- }
- }
- if( tsd->status.party_id>0 || tsd->party_invite>0 ){ // ‘ŠŽè‚ÌŠ‘®Šm”F
- clif_party_inviteack(sd,tsd->status.name,0);
- return 0;
- }
- for(i=0;i<MAX_PARTY;i++){ // “¯ƒAƒJƒEƒ“ƒgŠm”F
- if(p->member[i].account_id==account_id){
- clif_party_inviteack(sd,tsd->status.name,0);
- return 0;
- }
- }
-
- tsd->party_invite=sd->status.party_id;
- tsd->party_invite_account=sd->status.account_id;
-
- clif_party_invite(sd,tsd);
- return 0;
-}
-// ƒp[ƒeƒBŠ©—U‚Ö‚Ì•Ô“š
-int party_reply_invite(struct map_session_data *sd,int account_id,int flag)
-{
- struct map_session_data *tsd= map_id2sd(account_id);
-
- nullpo_retr(0, sd);
-
- if(flag==1){ // ³‘ø
- //interŽI‚֒ljÁ—v‹
- intif_party_addmember( sd->party_invite, sd->status.account_id );
- return 0;
- }
- else { // ‹‘”Û
- sd->party_invite=0;
- sd->party_invite_account=0;
- if(tsd==NULL)
- return 0;
- clif_party_inviteack(tsd,sd->status.name,1);
- }
- return 0;
-}
-// ƒp[ƒeƒB‚ª’ljÁ‚³‚ꂽ
-int party_member_added(int party_id,int account_id,int flag)
-{
- struct map_session_data *sd = map_id2sd(account_id),*sd2;
- if(sd == NULL){
- if (flag == 0) {
- if(battle_config.error_log)
- printf("party: member added error %d is not online\n",account_id);
- intif_party_leave(party_id,account_id); // ƒLƒƒƒ‰‘¤‚É“o˜^‚Å‚«‚È‚©‚Á‚½‚½‚ß’E‘Þ—v‹‚ðo‚·
- }
- return 0;
- }
- sd2=map_id2sd(sd->party_invite_account);
- sd->party_invite=0;
- sd->party_invite_account=0;
-
- if(flag==1){ // Ž¸”s
- if( sd2!=NULL )
- clif_party_inviteack(sd2,sd->status.name,0);
- return 0;
- }
-
- // ¬Œ÷
- sd->party_sended=0;
- sd->status.party_id=party_id;
-
- if( sd2!=NULL)
- clif_party_inviteack(sd2,sd->status.name,2);
-
- // ‚¢‚¿‚¨‚¤‹£‡Šm”F
- party_check_conflict(sd);
-
- return 0;
-}
-// ƒp[ƒeƒBœ–¼—v‹
-int party_removemember(struct map_session_data *sd,int account_id,char *name)
-{
- struct party *p;
- int i;
-
- nullpo_retr(0, sd);
-
- if( (p = party_search(sd->status.party_id)) == NULL )
- return 0;
-
- for(i=0;i<MAX_PARTY;i++){ // ƒŠ[ƒ_[‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
- if(p->member[i].account_id==sd->status.account_id)
- if(p->member[i].leader==0)
- return 0;
- }
-
- for(i=0;i<MAX_PARTY;i++){ // Š‘®‚µ‚Ä‚¢‚é‚©’²‚ׂé
- if(p->member[i].account_id==account_id){
- intif_party_leave(p->party_id,account_id);
- return 0;
- }
- }
- return 0;
-}
-
-// ƒp[ƒeƒB’E‘Þ—v‹
-int party_leave(struct map_session_data *sd)
-{
- struct party *p;
- int i;
-
- nullpo_retr(0, sd);
-
- if( (p = party_search(sd->status.party_id)) == NULL )
- return 0;
-
- for(i=0;i<MAX_PARTY;i++){ // Š‘®‚µ‚Ä‚¢‚é‚©
- if(p->member[i].account_id==sd->status.account_id){
- intif_party_leave(p->party_id,sd->status.account_id);
- return 0;
- }
- }
- return 0;
-}
-// ƒp[ƒeƒBƒƒ“ƒo‚ª’E‘Þ‚µ‚½
-int party_member_leaved(int party_id,int account_id,char *name)
-{
- struct map_session_data *sd=map_id2sd(account_id);
- struct party *p=party_search(party_id);
- if(p!=NULL){
- int i;
- for(i=0;i<MAX_PARTY;i++)
- if(p->member[i].account_id==account_id){
- clif_party_leaved(p,sd,account_id,name,0x00);
- p->member[i].account_id=0;
- p->member[i].sd=NULL;
- }
- }
- if(sd!=NULL && sd->status.party_id==party_id){
- sd->status.party_id=0;
- sd->party_sended=0;
- }
- return 0;
-}
-// ƒp[ƒeƒB‰ðŽU’Ê’m
-int party_broken(int party_id)
-{
- struct party *p;
- int i;
- if( (p=party_search(party_id))==NULL )
- return 0;
-
- for(i=0;i<MAX_PARTY;i++){
- if(p->member[i].sd!=NULL){
- clif_party_leaved(p,p->member[i].sd,
- p->member[i].account_id,p->member[i].name,0x10);
- p->member[i].sd->status.party_id=0;
- p->member[i].sd->party_sended=0;
- }
- }
- numdb_erase(party_db,party_id);
- return 0;
-}
-// ƒp[ƒeƒB‚ÌÝ’è•ÏX—v‹
-int party_changeoption(struct map_session_data *sd,int exp,int item)
-{
- struct party *p;
-
- nullpo_retr(0, sd);
-
- if( sd->status.party_id==0 || (p=party_search(sd->status.party_id))==NULL )
- return 0;
- intif_party_changeoption(sd->status.party_id,sd->status.account_id,exp,item);
- return 0;
-}
-// ƒp[ƒeƒB‚ÌÝ’è•ÏX’Ê’m
-int party_optionchanged(int party_id,int account_id,int exp,int item,int flag)
-{
- struct party *p;
- struct map_session_data *sd=map_id2sd(account_id);
- if( (p=party_search(party_id))==NULL)
- return 0;
-
- if(!(flag&0x01)) p->exp=exp;
- if(!(flag&0x10)) p->item=item;
- clif_party_option(p,sd,flag);
- return 0;
-}
-
-// ƒp[ƒeƒBƒƒ“ƒo‚̈ړ®’Ê’m
-int party_recv_movemap(int party_id,int account_id,char *map,int online,int lv)
-{
- struct party *p;
- int i;
- if( (p=party_search(party_id))==NULL)
- return 0;
- for(i=0;i<MAX_PARTY;i++){
- struct party_member *m=&p->member[i];
- if( m == NULL ){
- printf("party_recv_movemap nullpo?\n");
- return 0;
- }
- if(m->account_id==account_id){
- memcpy(m->map,map,16);
- m->online=online;
- m->lv=lv;
- break;
- }
- }
- if(i==MAX_PARTY){
- if(battle_config.error_log)
- printf("party: not found member %d on %d[%s]",account_id,party_id,p->name);
- return 0;
- }
-
- for(i=0;i<MAX_PARTY;i++){ // sdÄÝ’è
- struct map_session_data *sd= map_id2sd(p->member[i].account_id);
- p->member[i].sd=(sd!=NULL && sd->status.party_id==p->party_id && !sd->state.waitingdisconnect)?sd:NULL;
- }
-
- party_send_xy_clear(p); // À•WÄ’Ê’m—v¿
-
- clif_party_info(p,-1);
- return 0;
-}
-
-// ƒp[ƒeƒBƒƒ“ƒo‚̈ړ®
-int party_send_movemap(struct map_session_data *sd)
-{
- struct party *p;
-
- nullpo_retr(0, sd);
-
- if( sd->status.party_id==0 )
- return 0;
- intif_party_changemap(sd,1);
-
- if( sd->party_sended!=0 ) // ‚à‚¤ƒp[ƒeƒBƒf[ƒ^‚Í‘—MÏ‚Ý
- return 0;
-
- // ‹£‡Šm”F
- party_check_conflict(sd);
-
- // ‚ ‚é‚È‚çƒp[ƒeƒBî•ñ‘—M
- if( (p=party_search(sd->status.party_id))!=NULL ){
- party_check_member(p); // Š‘®‚ðŠm”F‚·‚é
- if(sd->status.party_id==p->party_id){
- clif_party_info(p,sd->fd);
- clif_party_option(p,sd,0x100);
- sd->party_sended=1;
- }
- }
-
- return 0;
-}
-// ƒp[ƒeƒBƒƒ“ƒo‚̃ƒOƒAƒEƒg
-int party_send_logout(struct map_session_data *sd)
-{
- struct party *p;
-
- nullpo_retr(0, sd);
-
- if( sd->status.party_id>0 )
- intif_party_changemap(sd,0);
-
- // sd‚ª–³Œø‚É‚È‚é‚̂Ńp[ƒeƒBî•ñ‚©‚çíœ
- if( (p=party_search(sd->status.party_id))!=NULL ){
- int i;
- for(i=0;i<MAX_PARTY;i++)
- if(p->member[i].sd==sd)
- p->member[i].sd=NULL;
- }
-
- return 0;
-}
-// ƒp[ƒeƒBƒƒbƒZ[ƒW‘—M
-int party_send_message(struct map_session_data *sd,char *mes,int len)
-{
- if(sd->status.party_id==0)
- return 0;
- intif_party_message(sd->status.party_id,sd->status.account_id,mes,len);
- party_recv_message(sd->status.party_id,sd->status.account_id,mes,len);
- return 0;
-}
-
-// ƒp[ƒeƒBƒƒbƒZ[ƒWŽóM
-int party_recv_message(int party_id,int account_id,char *mes,int len)
-{
- struct party *p;
- if( (p=party_search(party_id))==NULL)
- return 0;
- clif_party_message(p,account_id,mes,len);
- return 0;
-}
-// ƒp[ƒeƒB‹£‡Šm”F
-int party_check_conflict(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- intif_party_checkconflict(sd->status.party_id,sd->status.account_id,sd->status.name);
- return 0;
-}
-
-
-// ˆÊ’u‚â‚g‚o’Ê’m—p
-int party_send_xyhp_timer_sub(void *key,void *data,va_list ap)
-{
- struct party *p=(struct party *)data;
- int i;
-
- nullpo_retr(0, p);
-
- for(i=0;i<MAX_PARTY;i++){
- struct map_session_data *sd;
- if((sd=p->member[i].sd)!=NULL){
- // À•W’Ê’m
- if(sd->party_x!=sd->bl.x || sd->party_y!=sd->bl.y){
- clif_party_xy(p,sd);
- sd->party_x=sd->bl.x;
- sd->party_y=sd->bl.y;
- }
- // ‚g‚o’Ê’m
- if(sd->party_hp!=sd->status.hp){
- clif_party_hp(p,sd);
- sd->party_hp=sd->status.hp;
- }
-
- }
- }
- return 0;
-}
-// ˆÊ’u‚â‚g‚o’Ê’m
-int party_send_xyhp_timer(int tid,unsigned int tick,int id,int data)
-{
- numdb_foreach(party_db,party_send_xyhp_timer_sub,tick);
- return 0;
-}
-
-// ˆÊ’u’Ê’mƒNƒŠƒA
-int party_send_xy_clear(struct party *p)
-{
- int i;
-
- nullpo_retr(0, p);
-
- for(i=0;i<MAX_PARTY;i++){
- struct map_session_data *sd;
- if((sd=p->member[i].sd)!=NULL){
- sd->party_x=-1;
- sd->party_y=-1;
- sd->party_hp=-1;
- }
- }
- return 0;
-}
-// HP’Ê’m‚Ì•K—v«ŒŸ¸—pimap_foreachinmovearea‚©‚çŒÄ‚΂ê‚éj
-int party_send_hp_check(struct block_list *bl,va_list ap)
-{
- int party_id;
- int *flag;
- struct map_session_data *sd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, sd=(struct map_session_data *)bl);
-
- party_id=va_arg(ap,int);
- flag=va_arg(ap,int *);
-
- if(sd->status.party_id==party_id){
- *flag=1;
- sd->party_hp=-1;
- }
- return 0;
-}
-
-// exp share and added zeny share [Valaris]
-int party_exp_share(struct party *p,int map,int base_exp,int job_exp,int zeny)
-{
- struct map_session_data *sd;
- int i,c;
-
- nullpo_retr(0, p);
-
- for (i=c=0; i < MAX_PARTY; i++)
- if ((sd = p->member[i].sd) != NULL && p->member[i].online && sd->bl.m == map /*&& session[sd->fd] != NULL*/) // should be done in socket.c
- c++;
-
- if(c == 0)
- return 0;
- for (i = 0; i < MAX_PARTY; i++)
- if ((sd = p->member[i].sd) != NULL && p->member[i].online && sd->bl.m == map /*&& session[sd->fd] != NULL*/) {
- if (battle_config.idle_no_share && (/* pc_issit(sd) || */ sd->chatID || (sd->idletime < (tick_ - 120))))
- continue;
- #ifdef TWILIGHT
- pc_gainexp(sd,base_exp,job_exp);
- #else
- pc_gainexp(sd,(base_exp/c)+1,(job_exp/c)+1);
- #endif
- if (battle_config.zeny_from_mobs) // zeny from mobs [Valaris]
- pc_getzeny(sd,(zeny/c)+1);
- }
- return 0;
-}
-
-// “¯‚¶ƒ}ƒbƒv‚̃p[ƒeƒBƒƒ“ƒo[‘S‘̂Ɉ—‚ð‚©‚¯‚é
-// type==0 “¯‚¶ƒ}ƒbƒv
-// !=0 ‰æ–Ê“à
-void party_foreachsamemap(int (*func)(struct block_list*,va_list),
- struct map_session_data *sd,int type,...)
-{
- struct party *p;
- va_list ap;
- int i;
- int x0,y0,x1,y1;
- struct block_list *list[MAX_PARTY];
- int blockcount=0;
-
- nullpo_retv(sd);
-
- if((p=party_search(sd->status.party_id))==NULL)
- return;
-
- x0=sd->bl.x-AREA_SIZE;
- y0=sd->bl.y-AREA_SIZE;
- x1=sd->bl.x+AREA_SIZE;
- y1=sd->bl.y+AREA_SIZE;
-
- va_start(ap,type);
-
- for(i=0;i<MAX_PARTY;i++){
- struct party_member *m=&p->member[i];
- if(m->sd!=NULL){
- if(sd->bl.m!=m->sd->bl.m)
- continue;
- if(type!=0 &&
- (m->sd->bl.x<x0 || m->sd->bl.y<y0 ||
- m->sd->bl.x>x1 || m->sd->bl.y>y1 ) )
- continue;
- list[blockcount++]=&m->sd->bl;
- }
- }
-
- map_freeblock_lock(); // ƒƒ‚ƒŠ‚©‚ç‚̉ð•ú‚ð‹ÖŽ~‚·‚é
-
- for(i=0;i<blockcount;i++)
- if(list[i]->prev) // —LŒø‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
- func(list[i],ap);
-
- map_freeblock_unlock(); // ‰ð•ú‚ð‹–‰Â‚·‚é
-
- va_end(ap);
-}
diff --git a/src/map/party.h b/src/map/party.h
deleted file mode 100644
index 203dd1057..000000000
--- a/src/map/party.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// $Id: party.h,v 1.3 2004/09/25 05:32:18 MouseJstr Exp $
-#ifndef _PARTY_H_
-#define _PARTY_H_
-
-#include <stdarg.h>
-
-struct party;
-struct map_session_data;
-struct block_list;
-
-void do_init_party(void);
-void do_final_party(void);
-struct party *party_search(int party_id);
-struct party* party_searchname(char *str);
-
-int party_create(struct map_session_data *sd,char *name, int item, int item2);
-int party_created(int account_id,int fail,int party_id,char *name);
-int party_request_info(int party_id);
-int party_invite(struct map_session_data *sd,int account_id);
-int party_member_added(int party_id,int account_id,int flag);
-int party_leave(struct map_session_data *sd);
-int party_removemember(struct map_session_data *sd,int account_id,char *name);
-int party_member_leaved(int party_id,int account_id,char *name);
-int party_reply_invite(struct map_session_data *sd,int account_id,int flag);
-int party_recv_noinfo(int party_id);
-int party_recv_info(struct party *sp);
-int party_recv_movemap(int party_id,int account_id,char *map,int online,int lv);
-int party_broken(int party_id);
-int party_optionchanged(int party_id,int account_id,int exp,int item,int flag);
-int party_changeoption(struct map_session_data *sd,int exp,int item);
-
-int party_send_movemap(struct map_session_data *sd);
-int party_send_logout(struct map_session_data *sd);
-
-int party_send_message(struct map_session_data *sd,char *mes,int len);
-int party_recv_message(int party_id,int account_id,char *mes,int len);
-
-int party_check_conflict(struct map_session_data *sd);
-
-int party_send_xy_clear(struct party *p);
-int party_send_hp_check(struct block_list *bl,va_list ap);
-
-int party_exp_share(struct party *p,int map,int base_exp,int job_exp,int zeny);
-
-void party_foreachsamemap(int (*func)(struct block_list *,va_list),struct map_session_data *sd,int type,...);
-
-#endif
diff --git a/src/map/path.c b/src/map/path.c
deleted file mode 100644
index c2b852469..000000000
--- a/src/map/path.c
+++ /dev/null
@@ -1,470 +0,0 @@
-// $Id: path.c,v 1.1.1.1 2004/09/10 17:27:00 MagicalTux Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "map.h"
-#include "battle.h"
-#include "nullpo.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-//#define PATH_STANDALONETEST
-
-#define MAX_HEAP 150
-struct tmp_path { short x,y,dist,before,cost; char dir,flag;};
-#define calc_index(x,y) (((x)+(y)*MAX_WALKPATH) & (MAX_WALKPATH*MAX_WALKPATH-1))
-
-/*==========================================
- * Œo˜H’Tõ•â•heap push
- *------------------------------------------
- */
-static void push_heap_path(int *heap,struct tmp_path *tp,int index)
-{
- int i,h;
-
- if( heap == NULL || tp == NULL ){
- printf("push_heap_path nullpo\n");
- return;
- }
-
- heap[0]++;
-
- for(h=heap[0]-1,i=(h-1)/2;
- h>0 && tp[index].cost<tp[heap[i+1]].cost;
- i=(h-1)/2)
- heap[h+1]=heap[i+1],h=i;
- heap[h+1]=index;
-}
-
-/*==========================================
- * Œo˜H’Tõ•â•heap update
- * cost‚ªŒ¸‚Á‚½‚̂Ū‚Ì•û‚ÖˆÚ“®
- *------------------------------------------
- */
-static void update_heap_path(int *heap,struct tmp_path *tp,int index)
-{
- int i,h;
-
- nullpo_retv(heap);
- nullpo_retv(tp);
-
- for(h=0;h<heap[0];h++)
- if(heap[h+1]==index)
- break;
- if(h==heap[0]){
- fprintf(stderr,"update_heap_path bug\n");
- exit(1);
- }
- for(i=(h-1)/2;
- h>0 && tp[index].cost<tp[heap[i+1]].cost;
- i=(h-1)/2)
- heap[h+1]=heap[i+1],h=i;
- heap[h+1]=index;
-}
-
-/*==========================================
- * Œo˜H’Tõ•â•heap pop
- *------------------------------------------
- */
-static int pop_heap_path(int *heap,struct tmp_path *tp)
-{
- int i,h,k;
- int ret,last;
-
- nullpo_retr(-1, heap);
- nullpo_retr(-1, tp);
-
- if(heap[0]<=0)
- return -1;
- ret=heap[1];
- last=heap[heap[0]];
- heap[0]--;
-
- for(h=0,k=2;k<heap[0];k=k*2+2){
- if(tp[heap[k+1]].cost>tp[heap[k]].cost)
- k--;
- heap[h+1]=heap[k+1], h=k;
- }
- if(k==heap[0])
- heap[h+1]=heap[k], h=k-1;
-
- for(i=(h-1)/2;
- h>0 && tp[heap[i+1]].cost>tp[last].cost;
- i=(h-1)/2)
- heap[h+1]=heap[i+1],h=i;
- heap[h+1]=last;
-
- return ret;
-}
-
-/*==========================================
- * Œ»Ý‚Ì“_‚ÌcostŒvŽZ
- *------------------------------------------
- */
-static int calc_cost(struct tmp_path *p,int x1,int y1)
-{
- int xd,yd;
-
- nullpo_retr(0, p);
-
- xd=x1-p->x;
- if(xd<0) xd=-xd;
- yd=y1-p->y;
- if(yd<0) yd=-yd;
- return (xd+yd)*10+p->dist;
-}
-
-/*==========================================
- * •K—v‚È‚çpath‚ð’ljÁ/C³‚·‚é
- *------------------------------------------
- */
-static int add_path(int *heap,struct tmp_path *tp,int x,int y,int dist,int dir,int before,int x1,int y1)
-{
- int i;
-
- nullpo_retr(0, heap);
- nullpo_retr(0, tp);
-
- i=calc_index(x,y);
-
- if(tp[i].x==x && tp[i].y==y){
- if(tp[i].dist>dist){
- tp[i].dist=dist;
- tp[i].dir=dir;
- tp[i].before=before;
- tp[i].cost=calc_cost(&tp[i],x1,y1);
- if(tp[i].flag)
- push_heap_path(heap,tp,i);
- else
- update_heap_path(heap,tp,i);
- tp[i].flag=0;
- }
- return 0;
- }
-
- if(tp[i].x || tp[i].y)
- return 1;
-
- tp[i].x=x;
- tp[i].y=y;
- tp[i].dist=dist;
- tp[i].dir=dir;
- tp[i].before=before;
- tp[i].cost=calc_cost(&tp[i],x1,y1);
- tp[i].flag=0;
- push_heap_path(heap,tp,i);
-
- return 0;
-}
-
-
-/*==========================================
- * (x,y)‚ªˆÚ“®•s‰Â”\’n‘Ñ‚©‚Ç‚¤‚©
- * flag 0x10000 ‰“‹——£UŒ‚”»’è
- *------------------------------------------
- */
-static int can_place(struct map_data *m,int x,int y,int flag)
-{
- nullpo_retr(0, m);
-
- if(map_getcellp(m,x,y,CELL_CHKPASS))
- return 1;
- else if((flag&0x10000)&&map_getcellp(m,x,y,CELL_CHKGROUND))
- return 1;
- return 0;
-}
-
-/*==========================================
- * (x0,y0)‚©‚ç(x1,y1)‚Ö1•à‚ňړ®‰Â”\‚©ŒvŽZ
- *------------------------------------------
- */
-static int can_move(struct map_data *m,int x0,int y0,int x1,int y1,int flag)
-{
- nullpo_retr(0, m);
-
- if(x0-x1<-1 || x0-x1>1 || y0-y1<-1 || y0-y1>1)
- return 0;
- if(x1<0 || y1<0 || x1>=m->xs || y1>=m->ys)
- return 0;
- if(!can_place(m,x0,y0,flag))
- return 0;
- if(!can_place(m,x1,y1,flag))
- return 0;
- if(x0==x1 || y0==y1)
- return 1;
- if(!can_place(m,x0,y1,flag) || !can_place(m,x1,y0,flag))
- return 0;
- return 1;
-}
-/*==========================================
- * (x0,y0)‚©‚ç(dx,dy)•ûŒü‚ÖcountƒZƒ‹•ª
- * ‚«”ò‚΂µ‚½‚ ‚Æ‚ÌÀ•W‚ðŠ“¾
- *------------------------------------------
- */
-int path_blownpos(int m,int x0,int y0,int dx,int dy,int count)
-{
- struct map_data *md;
-
- if(!map[m].gat)
- return -1;
- md=&map[m];
-
- if(count>15){ // Å‘å10ƒ}ƒX‚ɧŒÀ
- if(battle_config.error_log)
- printf("path_blownpos: count too many %d !\n",count);
- count=15;
- }
- if(dx>1 || dx<-1 || dy>1 || dy<-1){
- if(battle_config.error_log)
- printf("path_blownpos: illeagal dx=%d or dy=%d !\n",dx,dy);
- dx=(dx>=0)?1:((dx<0)?-1:0);
- dy=(dy>=0)?1:((dy<0)?-1:0);
- }
-
- while( (count--)>0 && (dx!=0 || dy!=0) ){
- if( !can_move(md,x0,y0,x0+dx,y0+dy,0) ){
- int fx=(dx!=0 && can_move(md,x0,y0,x0+dx,y0,0));
- int fy=(dy!=0 && can_move(md,x0,y0,x0,y0+dy,0));
- if( fx && fy ){
- if(rand()&1) dx=0;
- else dy=0;
- }
- if( !fx ) dx=0;
- if( !fy ) dy=0;
- }
- x0+=dx;
- y0+=dy;
- }
- return (x0<<16)|y0;
-}
-
-/*==========================================
- * êÀËå×îÍô?ª¬Ê¦Òöª«ªÉª¦ª«ªòÚ÷ª¹
- *------------------------------------------
- */
-#define swap(x,y) { int t; t = x; x = y; y = t; }
-int path_search_long(struct shootpath_data *spd,int m,int x0,int y0,int x1,int y1)
-{
- int dx, dy;
- int wx = 0, wy = 0;
- int weight;
- struct map_data *md;
-
- if (!map[m].gat)
- return 0;
- md = &map[m];
-
- dx = (x1 - x0);
- if (dx < 0) {
- swap(x0, x1);
- swap(y0, y1);
- dx = -dx;
- }
- dy = (y1 - y0);
-
- if (spd) {
- spd->rx = spd->ry = 0;
- spd->len = 1;
- spd->x[0] = x0;
- spd->y[0] = y0;
- }
-
- if (map_getcellp(md,x1,y1,CELL_CHKWALL))
- return 0;
-
- if (dx > abs(dy)) {
- weight = dx;
- if (spd)
- spd->ry=1;
- } else {
- weight = abs(y1 - y0);
- if (spd)
- spd->rx=1;
- }
-
- while (x0 != x1 || y0 != y1) {
- if (map_getcellp(md,x0,y0,CELL_CHKWALL))
- return 0;
- wx += dx;
- wy += dy;
- if (wx >= weight) {
- wx -= weight;
- x0 ++;
- }
- if (wy >= weight) {
- wy -= weight;
- y0 ++;
- } else if (wy < 0) {
- wy += weight;
- y0 --;
- }
- if (spd && spd->len<MAX_WALKPATH) {
- spd->x[spd->len] = x0;
- spd->y[spd->len] = y0;
- spd->len++;
- }
- }
-
- return 1;
-}
-
-/*==========================================
- * path’Tõ (x0,y0)->(x1,y1)
- *------------------------------------------
- */
-int path_search(struct walkpath_data *wpd,int m,int x0,int y0,int x1,int y1,int flag)
-{
- int heap[MAX_HEAP+1];
- struct tmp_path tp[MAX_WALKPATH*MAX_WALKPATH];
- int i,rp,x,y;
- struct map_data *md;
- int dx,dy;
-
- nullpo_retr(0, wpd);
-
- if(!map[m].gat)
- return -1;
- md=&map[m];
- if(x1<0 || x1>=md->xs || y1<0 || y1>=md->ys || map_getcellp(md,x1,y1,CELL_CHKNOPASS))
- return -1;
-
- // easy
- dx = (x1-x0<0) ? -1 : 1;
- dy = (y1-y0<0) ? -1 : 1;
- for(x=x0,y=y0,i=0;x!=x1 || y!=y1;){
- if(i>=sizeof(wpd->path))
- return -1;
- if(x!=x1 && y!=y1){
- if(!can_move(md,x,y,x+dx,y+dy,flag))
- break;
- x+=dx;
- y+=dy;
- wpd->path[i++]=(dx<0) ? ((dy>0)? 1 : 3) : ((dy<0)? 5 : 7);
- } else if(x!=x1){
- if(!can_move(md,x,y,x+dx,y ,flag))
- break;
- x+=dx;
- wpd->path[i++]=(dx<0) ? 2 : 6;
- } else { // y!=y1
- if(!can_move(md,x,y,x ,y+dy,flag))
- break;
- y+=dy;
- wpd->path[i++]=(dy>0) ? 0 : 4;
- }
- if(x==x1 && y==y1){
- wpd->path_len=i;
- wpd->path_pos=0;
- wpd->path_half=0;
- return 0;
- }
- }
- if(flag&1)
- return -1;
-
- memset(tp,0,sizeof(tp));
-
- i=calc_index(x0,y0);
- tp[i].x=x0;
- tp[i].y=y0;
- tp[i].dist=0;
- tp[i].dir=0;
- tp[i].before=0;
- tp[i].cost=calc_cost(&tp[i],x1,y1);
- tp[i].flag=0;
- heap[0]=0;
- push_heap_path(heap,tp,calc_index(x0,y0));
- while(1){
- int e=0,fromdir;
-
- if(heap[0]==0)
- return -1;
- rp=pop_heap_path(heap,tp);
- x=tp[rp].x;
- y=tp[rp].y;
- if(x==x1 && y==y1){
- int len,j;
-
- for(len=0,i=rp;len<100 && i!=calc_index(x0,y0);i=tp[i].before,len++);
- if(len==100 || len>=sizeof(wpd->path))
- return -1;
- wpd->path_len=len;
- wpd->path_pos=0;
- wpd->path_half=0;
- for(i=rp,j=len-1;j>=0;i=tp[i].before,j--)
- wpd->path[j]=tp[i].dir;
-
- return 0;
- }
- fromdir=tp[rp].dir;
- if(can_move(md,x,y,x+1,y-1,flag))
- e+=add_path(heap,tp,x+1,y-1,tp[rp].dist+14,5,rp,x1,y1);
- if(can_move(md,x,y,x+1,y ,flag))
- e+=add_path(heap,tp,x+1,y ,tp[rp].dist+10,6,rp,x1,y1);
- if(can_move(md,x,y,x+1,y+1,flag))
- e+=add_path(heap,tp,x+1,y+1,tp[rp].dist+14,7,rp,x1,y1);
- if(can_move(md,x,y,x ,y+1,flag))
- e+=add_path(heap,tp,x ,y+1,tp[rp].dist+10,0,rp,x1,y1);
- if(can_move(md,x,y,x-1,y+1,flag))
- e+=add_path(heap,tp,x-1,y+1,tp[rp].dist+14,1,rp,x1,y1);
- if(can_move(md,x,y,x-1,y ,flag))
- e+=add_path(heap,tp,x-1,y ,tp[rp].dist+10,2,rp,x1,y1);
- if(can_move(md,x,y,x-1,y-1,flag))
- e+=add_path(heap,tp,x-1,y-1,tp[rp].dist+14,3,rp,x1,y1);
- if(can_move(md,x,y,x ,y-1,flag))
- e+=add_path(heap,tp,x ,y-1,tp[rp].dist+10,4,rp,x1,y1);
- tp[rp].flag=1;
- if(e || heap[0]>=MAX_HEAP-5)
- return -1;
- }
- return -1;
-}
-
-#ifdef PATH_STANDALONETEST
-char gat[64][64]={
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,1,0,0,0,0,0},
-};
-struct map_data map[1];
-
-/*==========================================
- * Œo˜H’Tõƒ‹[ƒ`ƒ“’P‘̃eƒXƒg—pmainŠÖ”
- *------------------------------------------
- */
-void main(int argc,char *argv[])
-{
- struct walkpath_data wpd;
-
- map[0].gat=gat;
- map[0].xs=64;
- map[0].ys=64;
-
- path_search(&wpd,0,3,4,5,4);
- path_search(&wpd,0,5,4,3,4);
- path_search(&wpd,0,6,4,3,4);
- path_search(&wpd,0,7,4,3,4);
- path_search(&wpd,0,4,3,4,5);
- path_search(&wpd,0,4,2,4,5);
- path_search(&wpd,0,4,1,4,5);
- path_search(&wpd,0,4,5,4,3);
- path_search(&wpd,0,4,6,4,3);
- path_search(&wpd,0,4,7,4,3);
- path_search(&wpd,0,7,4,3,4);
- path_search(&wpd,0,8,4,3,4);
- path_search(&wpd,0,9,4,3,4);
- path_search(&wpd,0,10,4,3,4);
- path_search(&wpd,0,11,4,3,4);
- path_search(&wpd,0,12,4,3,4);
- path_search(&wpd,0,13,4,3,4);
- path_search(&wpd,0,14,4,3,4);
- path_search(&wpd,0,15,4,3,4);
- path_search(&wpd,0,16,4,3,4);
- path_search(&wpd,0,17,4,3,4);
- path_search(&wpd,0,18,4,3,4);
-}
-#endif
diff --git a/src/map/pc.c b/src/map/pc.c
deleted file mode 100644
index e0c13012d..000000000
--- a/src/map/pc.c
+++ /dev/null
@@ -1,7337 +0,0 @@
-// $Id: pc.c 101 2004-12-13 7:23:07 PM Celestia $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <time.h>
-
-#include "socket.h" // [Valaris]
-#include "timer.h"
-#include "db.h"
-
-#include "malloc.h"
-#include "map.h"
-#include "chrif.h"
-#include "clif.h"
-#include "intif.h"
-#include "pc.h"
-#include "status.h"
-#include "npc.h"
-#include "mob.h"
-#include "pet.h"
-#include "itemdb.h"
-#include "script.h"
-#include "battle.h"
-#include "skill.h"
-#include "party.h"
-#include "guild.h"
-#include "chat.h"
-#include "trade.h"
-#include "storage.h"
-#include "vending.h"
-#include "nullpo.h"
-#include "atcommand.h"
-#include "log.h"
-#include "showmsg.h"
-
-#ifndef TXT_ONLY // mail system [Valaris]
-#include "mail.h"
-#endif
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-#define PVP_CALCRANK_INTERVAL 1000 // PVP‡ˆÊŒvŽZ‚ÌŠÔŠu
-
-static int exp_table[14][MAX_LEVEL];
-static short statp[MAX_LEVEL];
-
-extern char msg_table[1000][256];
-
-// h-files are for declarations, not for implementations... [Shinomori]
-struct skill_tree_entry skill_tree[3][25][MAX_SKILL_TREE];
-// timer for night.day implementation
-int day_timer_tid;
-int night_timer_tid;
-
-static int dirx[8]={0,-1,-1,-1,0,1,1,1};
-static int diry[8]={1,1,0,-1,-1,-1,0,1};
-
-static unsigned int equip_pos[11]={0x0080,0x0008,0x0040,0x0004,0x0001,0x0200,0x0100,0x0010,0x0020,0x0002,0x8000};
-
-//static struct dbt *gm_account_db;
-static struct gm_account *gm_account = NULL;
-static int GM_num = 0;
-
-int pc_isGM(struct map_session_data *sd) {
-// struct gm_account *p;
- int i;
-
- nullpo_retr(0, sd);
-
- if(sd->bl.type!=BL_PC )
- return 0;
-
-/* p = numdb_search(gm_account_db, sd->status.account_id);
- if (p == NULL)
- return 0;
- return p->level;*/
-
- //For console [Wizputer]
- if ( sd->fd == 0 )
- return 99;
-
- for(i = 0; i < GM_num; i++)
- if (gm_account[i].account_id == sd->status.account_id)
- return gm_account[i].level;
- return 0;
-
-}
-
-int pc_iskiller(struct map_session_data *src, struct map_session_data *target) {
- nullpo_retr(0, src);
-
- if(src->bl.type!=BL_PC )
- return 0;
- if (src->special_state.killer)
- return 1;
-
- if(target->bl.type!=BL_PC )
- return 0;
- if (target->special_state.killable)
- return 1;
-
- return 0;
-}
-
-
-int pc_set_gm_level(int account_id, int level) {
- int i;
- for (i = 0; i < GM_num; i++) {
- if (account_id == gm_account[i].account_id) {
- gm_account[i].level = level;
- return 0;
- }
- }
-
- GM_num++;
- gm_account = (struct gm_account *) aRealloc(gm_account, sizeof(struct gm_account) * GM_num);
- gm_account[GM_num - 1].account_id = account_id;
- gm_account[GM_num - 1].level = level;
- return 0;
-}
-
-static int distance(int x0, int y0, int x1, int y1) {
- int dx, dy;
-
- dx = abs(x0-x1);
- dy = abs(y0-y1);
- return dx>dy ? dx : dy;
-}
-
-static int pc_invincible_timer(int tid,unsigned int tick,int id,int data) {
- struct map_session_data *sd;
-
- if( (sd=(struct map_session_data *)map_id2sd(id)) == NULL || sd->bl.type!=BL_PC )
- return 1;
-
- if(sd->invincible_timer != tid){
- if(battle_config.error_log)
- printf("invincible_timer %d != %d\n",sd->invincible_timer,tid);
- return 0;
- }
- sd->invincible_timer=-1;
- skill_unit_move(&sd->bl,tick,1);
-
- return 0;
-}
-
-int pc_setinvincibletimer(struct map_session_data *sd,int val) {
- nullpo_retr(0, sd);
-
- if(sd->invincible_timer != -1)
- delete_timer(sd->invincible_timer,pc_invincible_timer);
- sd->invincible_timer = add_timer(gettick()+val,pc_invincible_timer,sd->bl.id,0);
- return 0;
-}
-
-int pc_delinvincibletimer(struct map_session_data *sd) {
- nullpo_retr(0, sd);
-
- if(sd->invincible_timer != -1) {
- delete_timer(sd->invincible_timer,pc_invincible_timer);
- sd->invincible_timer = -1;
- }
- skill_unit_move(&sd->bl,gettick(),1);
- return 0;
-}
-
-static int pc_spiritball_timer(int tid,unsigned int tick,int id,int data) {
- struct map_session_data *sd;
-
- if( (sd=(struct map_session_data *)map_id2sd(id)) == NULL || sd->bl.type!=BL_PC )
- return 1;
-
- if(sd->spirit_timer[0] != tid){
- if(battle_config.error_log)
- printf("spirit_timer %d != %d\n",sd->spirit_timer[0],tid);
- return 0;
- }
-
- if(sd->spiritball <= 0) {
- if(battle_config.error_log)
- printf("Spiritballs are already 0 when pc_spiritball_timer gets called");
- sd->spiritball = 0;
- return 0;
- }
-
- sd->spiritball--;
- // I leave this here as bad example [Shinomori]
- //memcpy( &sd->spirit_timer[0], &sd->spirit_timer[1], sizeof(sd->spirit_timer[0]) * sd->spiritball );
- memmove( sd->spirit_timer+0, sd->spirit_timer+1, (sd->spiritball)*sizeof(int) );
- sd->spirit_timer[sd->spiritball]=-1;
-
- clif_spiritball(sd);
-
- return 0;
-}
-
-int pc_addspiritball(struct map_session_data *sd,int interval,int max) {
- nullpo_retr(0, sd);
-
- if(max > MAX_SKILL_LEVEL)
- max = MAX_SKILL_LEVEL;
- if(sd->spiritball < 0)
- sd->spiritball = 0;
-
- if(sd->spiritball >= max) {
- if(sd->spirit_timer[0] != -1)
- delete_timer(sd->spirit_timer[0],pc_spiritball_timer);
- // I leave this here as bad example [Shinomori]
- //memcpy( &sd->spirit_timer[0], &sd->spirit_timer[1], sizeof(sd->spirit_timer[0]) * (sd->spiritball - 1));
- memmove( sd->spirit_timer+0, sd->spirit_timer+1, (sd->spiritball - 1)*sizeof(int) );
- //sd->spirit_timer[sd->spiritball-1] = -1; // intentionally, but will be overwritten
- } else
- sd->spiritball++;
-
- sd->spirit_timer[sd->spiritball-1] = add_timer(gettick()+interval,pc_spiritball_timer,sd->bl.id,0);
- clif_spiritball(sd);
-
- return 0;
-}
-
-int pc_delspiritball(struct map_session_data *sd,int count,int type) {
- int i;
-
- nullpo_retr(0, sd);
-
- if(sd->spiritball <= 0) {
- sd->spiritball = 0;
- return 0;
- }
-
- if(count > sd->spiritball)
- count = sd->spiritball;
- sd->spiritball -= count;
- if(count > MAX_SKILL_LEVEL)
- count = MAX_SKILL_LEVEL;
-
- for(i=0;i<count;i++) {
- if(sd->spirit_timer[i] != -1) {
- delete_timer(sd->spirit_timer[i],pc_spiritball_timer);
- sd->spirit_timer[i] = -1;
- }
- }
- for(i=count;i<MAX_SKILL_LEVEL;i++) {
- sd->spirit_timer[i-count] = sd->spirit_timer[i];
- sd->spirit_timer[i] = -1;
- }
-
- if(!type)
- clif_spiritball(sd);
-
- return 0;
-}
-
-int pc_setrestartvalue(struct map_session_data *sd,int type) {
- //?¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
- struct pc_base_job s_class;
-
- nullpo_retr(0, sd);
-
- s_class = pc_calc_base_job(sd->status.class_);
-
- //-----------------------
- // Ž€–S‚µ‚½
- if(sd->special_state.restart_full_recover || // ƒIƒVƒŠƒXƒJ?ƒh
- sd->state.snovice_flag == 4) { // [Celest]
- sd->status.hp=sd->status.max_hp;
- sd->status.sp=sd->status.max_sp;
- if (sd->state.snovice_flag == 4) {
- sd->state.snovice_flag = 0;
- status_change_start(&sd->bl,SkillStatusChangeTable[MO_STEELBODY],1,0,0,0,skill_get_time(MO_STEELBODY,1),0 );
- }
- }
- else {
- if(s_class.job == 0 && battle_config.restart_hp_rate < 50) { //ƒmƒr‚Í”¼•ª‰ñ•œ
- sd->status.hp=(sd->status.max_hp)/2;
- }
- else {
- if(battle_config.restart_hp_rate <= 0)
- sd->status.hp = 1;
- else {
- sd->status.hp = sd->status.max_hp * battle_config.restart_hp_rate /100;
- if(sd->status.hp <= 0)
- sd->status.hp = 1;
- }
- }
- if(battle_config.restart_sp_rate > 0) {
- int sp = sd->status.max_sp * battle_config.restart_sp_rate /100;
- if(sd->status.sp < sp)
- sd->status.sp = sp;
- }
- }
- if(type&1)
- clif_updatestatus(sd,SP_HP);
- if(type&1)
- clif_updatestatus(sd,SP_SP);
-
- /* removed exp penalty on spawn [Valaris] */
-
- if(type&2 && sd->status.class_ != 0 && battle_config.zeny_penalty > 0 && !map[sd->bl.m].flag.nozenypenalty) {
- int zeny = (int)((double)sd->status.zeny * (double)battle_config.zeny_penalty / 10000.);
- if(zeny < 1) zeny = 1;
- sd->status.zeny -= zeny;
- if(sd->status.zeny < 0) sd->status.zeny = 0;
- clif_updatestatus(sd,SP_ZENY);
- }
-
- return 0;
-}
-
-/*==========================================
- * Ž©•ª‚ðƒƒbƒN‚µ‚Ä‚¢‚éMOB‚Ì?‚ð?‚¦‚é(foreachclient)
- *------------------------------------------
- */
-static int pc_counttargeted_sub(struct block_list *bl,va_list ap)
-{
- int id,*c,target_lv;
- struct block_list *src;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- id=va_arg(ap,int);
-
- nullpo_retr(0, c=va_arg(ap,int *));
-
- src=va_arg(ap,struct block_list *);
- target_lv=va_arg(ap,int);
- if(id == bl->id || (src && id == src->id)) return 0;
- if(bl->type == BL_PC) {
- struct map_session_data *sd=(struct map_session_data *)bl;
- if( sd && sd->attacktarget == id && sd->attacktimer != -1 && sd->attacktarget_lv >= target_lv)
- (*c)++;
- }
- else if(bl->type == BL_MOB) {
- struct mob_data *md = (struct mob_data *)bl;
- if(md && md->target_id == id && md->timer != -1 && md->state.state == MS_ATTACK && md->target_lv >= target_lv)
-
- (*c)++;
- //printf("md->target_lv:%d, target_lv:%d\n",((struct mob_data *)bl)->target_lv,target_lv);
- }
- return 0;
-}
-
-int pc_counttargeted(struct map_session_data *sd,struct block_list *src,int target_lv)
-{
- int c=0;
- map_foreachinarea(pc_counttargeted_sub, sd->bl.m,
- sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE,
- sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,0,sd->bl.id,&c,src,target_lv);
- return c;
-}
-
-/*==========================================
- * ƒ?ƒJƒ‹ƒvƒƒgƒ^ƒCƒv錾 (•K—v‚È•¨‚Ì‚Ý)
- *------------------------------------------
- */
-static int pc_walktoxy_sub(struct map_session_data *);
-
-/*==========================================
- * save‚É•K—v‚ȃXƒe?ƒ^ƒXC³‚ðs‚È‚¤
- *------------------------------------------
- */
-int pc_makesavestatus(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- // •bÌF‚ÍF?•¾ŠQ‚ª‘½‚¢‚Ì‚Å•Û‘¶?Û‚É‚Í‚µ‚È‚¢
- if(!battle_config.save_clothcolor)
- sd->status.clothes_color=0;
-
- // Ž€–S?‘Ô‚¾‚Á‚½‚Ì‚Åhp‚ð1AˆÊ’u‚ðƒZ?ƒuꊂÉ?X
- if(!sd->state.waitingdisconnect) {
- if(pc_isdead(sd)){
- pc_setrestartvalue(sd,0);
- memcpy(&sd->status.last_point,&sd->status.save_point,sizeof(sd->status.last_point));
- } else {
- memcpy(sd->status.last_point.map,sd->mapname,24);
- sd->status.last_point.x = sd->bl.x;
- sd->status.last_point.y = sd->bl.y;
- }
-
- // ƒZ?ƒu‹ÖŽ~ƒ}ƒbƒv‚¾‚Á‚½‚Ì‚ÅŽw’èˆÊ’u‚Ɉړ®
- if(map[sd->bl.m].flag.nosave){
- struct map_data *m=&map[sd->bl.m];
- if(strcmp(m->save.map,"SavePoint")==0)
- memcpy(&sd->status.last_point,&sd->status.save_point,sizeof(sd->status.last_point));
- else
- memcpy(&sd->status.last_point,&m->save,sizeof(sd->status.last_point));
- }
- }
-
- //ƒ}ƒi?ƒ|ƒCƒ“ƒg‚ªƒvƒ‰ƒX‚¾‚Á‚½ê‡0‚É
- if(battle_config.muting_players && sd->status.manner > 0)
- sd->status.manner = 0;
-
- return 0;
-}
-
-/*==========================================
- * Ú?Žb̉Šú‰»
- *------------------------------------------
- */
-int pc_setnewpc(struct map_session_data *sd, int account_id, int char_id, int login_id1, int client_tick, int sex, int fd) {
- nullpo_retr(0, sd);
-
- sd->bl.id = account_id;
- sd->char_id = char_id;
- sd->login_id1 = login_id1;
- sd->login_id2 = 0; // at this point, we can not know the value :(
- sd->client_tick = client_tick;
- sd->sex = sex;
- sd->state.auth = 0;
- sd->bl.type = BL_PC;
- sd->canact_tick = sd->canmove_tick = gettick();
- sd->canlog_tick = gettick();
- sd->state.waitingdisconnect = 0;
-
- return 0;
-}
-
-int pc_equippoint(struct map_session_data *sd,int n)
-{
- int ep = 0;
- //?¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
- struct pc_base_job s_class;
-
- nullpo_retr(0, sd);
-
- s_class = pc_calc_base_job(sd->status.class_);
-
- if(sd->inventory_data[n]) {
- ep = sd->inventory_data[n]->equip;
- if(sd->inventory_data[n]->look == 1 || sd->inventory_data[n]->look == 2 || sd->inventory_data[n]->look == 6) {
- if(ep == 2 && (pc_checkskill(sd,AS_LEFT) > 0 || s_class.job == 12))
- return 34;
- }
- }
- return ep;
-}
-
-int pc_setinventorydata(struct map_session_data *sd)
-{
- int i,id;
-
- nullpo_retr(0, sd);
-
- for(i=0;i<MAX_INVENTORY;i++) {
- id = sd->status.inventory[i].nameid;
- sd->inventory_data[i] = itemdb_search(id);
- }
- return 0;
-}
-
-int pc_calcweapontype(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- if(sd->weapontype1 != 0 && sd->weapontype2 == 0)
- sd->status.weapon = sd->weapontype1;
- if(sd->weapontype1 == 0 && sd->weapontype2 != 0)// ¶Žè•Ší Only
- sd->status.weapon = sd->weapontype2;
- else if(sd->weapontype1 == 1 && sd->weapontype2 == 1)// ?’Z?
- sd->status.weapon = 0x11;
- else if(sd->weapontype1 == 2 && sd->weapontype2 == 2)// ??Žè?
- sd->status.weapon = 0x12;
- else if(sd->weapontype1 == 6 && sd->weapontype2 == 6)// ??Žè•€
- sd->status.weapon = 0x13;
- else if( (sd->weapontype1 == 1 && sd->weapontype2 == 2) ||
- (sd->weapontype1 == 2 && sd->weapontype2 == 1) ) // ’Z? - ?Žè?
- sd->status.weapon = 0x14;
- else if( (sd->weapontype1 == 1 && sd->weapontype2 == 6) ||
- (sd->weapontype1 == 6 && sd->weapontype2 == 1) ) // ’Z? - •€
- sd->status.weapon = 0x15;
- else if( (sd->weapontype1 == 2 && sd->weapontype2 == 6) ||
- (sd->weapontype1 == 6 && sd->weapontype2 == 2) ) // ?Žè? - •€
- sd->status.weapon = 0x16;
- else
- sd->status.weapon = sd->weapontype1;
-
- return 0;
-}
-
-int pc_setequipindex(struct map_session_data *sd)
-{
- int i,j;
-
- nullpo_retr(0, sd);
-
- for(i=0;i<11;i++)
- sd->equip_index[i] = -1;
-
- for(i=0;i<MAX_INVENTORY;i++) {
- if(sd->status.inventory[i].nameid <= 0)
- continue;
- if(sd->status.inventory[i].equip) {
- for(j=0;j<11;j++)
- if(sd->status.inventory[i].equip & equip_pos[j])
- sd->equip_index[j] = i;
- if(sd->status.inventory[i].equip & 0x0002) {
- if(sd->inventory_data[i])
- sd->weapontype1 = sd->inventory_data[i]->look;
- else
- sd->weapontype1 = 0;
- }
- if(sd->status.inventory[i].equip & 0x0020) {
- if(sd->inventory_data[i]) {
- if(sd->inventory_data[i]->type == 4) {
- if(sd->status.inventory[i].equip == 0x0020)
- sd->weapontype2 = sd->inventory_data[i]->look;
- else
- sd->weapontype2 = 0;
- }
- else
- sd->weapontype2 = 0;
- }
- else
- sd->weapontype2 = 0;
- }
- }
- }
- pc_calcweapontype(sd);
-
- return 0;
-}
-
-int pc_isequip(struct map_session_data *sd,int n)
-{
- struct item_data *item;
- struct status_change *sc_data;
- //?¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
-
- nullpo_retr(0, sd);
-
- item = sd->inventory_data[n];
- sc_data = status_get_sc_data(&sd->bl);
- //s_class = pc_calc_base_job(sd->status.class_);
-
- if( battle_config.gm_allequip>0 && pc_isGM(sd)>=battle_config.gm_allequip )
- return 1;
-
- if(item == NULL)
- return 0;
- if(item->sex != 2 && sd->status.sex != item->sex)
- return 0;
- if(item->elv > 0 && sd->status.base_level < item->elv)
- return 0;
-// -- moonsoul (below statement substituted for commented out version further below
-// as it allows all advanced classes to equip items their normal versions
-// could equip)
-//
- if(((sd->status.class_==13 || sd->status.class_==4014) && ((1<<7)&item->class_) == 0) || // have mounted classes use unmounted equipment [Valaris]
- ((sd->status.class_==21 || sd->status.class_==4022) && ((1<<14)&item->class_) == 0))
- return 0;
- if(sd->status.class_!=13 && sd->status.class_!=4014 && sd->status.class_!=21 && sd->status.class_!=4022)
- if((sd->status.class_<=4000 && ((1<<sd->status.class_)&item->class_) == 0) || (sd->status.class_>4000 && sd->status.class_<4023 && ((1<<(sd->status.class_-4001))&item->class_) == 0) ||
- (sd->status.class_>=4023 && ((1<<(sd->status.class_-4023))&item->class_) == 0))
- return 0;
-// if(((1<<sd->status.class_)&item->class_) == 0)
-// return 0;
- if(map[sd->bl.m].flag.pvp && (item->flag.no_equip&1)) //optimized by Lupus
- return 0;
- if(map[sd->bl.m].flag.gvg && (item->flag.no_equip>1)) //optimized by Lupus
- return 0;
- if(item->equip & 0x0002 && sc_data && sc_data[SC_STRIPWEAPON].timer != -1)
- return 0;
- if(item->equip & 0x0020 && sc_data && sc_data[SC_STRIPSHIELD].timer != -1)
- return 0;
- if(item->equip & 0x0010 && sc_data && sc_data[SC_STRIPARMOR].timer != -1)
- return 0;
- if(item->equip & 0x0100 && sc_data && sc_data[SC_STRIPHELM].timer != -1)
- return 0;
- return 1;
-}
-
-//‘•”õ”j‰ó
-int pc_break_equip(struct map_session_data *sd, unsigned short where)
-{
- int i;
- int sc;
-
- nullpo_retr(-1, sd);
- if(sd->unbreakable_equip & where)
- return 0;
- if(sd->unbreakable >= rand()%100)
- return 0;
- switch (where) {
- case EQP_WEAPON:
- sc = SC_CP_WEAPON;
- break;
- case EQP_ARMOR:
- sc = SC_CP_ARMOR;
- break;
- case EQP_SHIELD:
- sc = SC_CP_SHIELD;
- break;
- case EQP_HELM:
- sc = SC_CP_HELM;
- break;
- default:
- return 0;
- }
- if(sd->sc_count && sd->sc_data[sc].timer != -1)
- return 0;
-
- for (i=0;i<MAX_INVENTORY;i++) {
- if (sd->status.inventory[i].equip & where &&
- sd->status.inventory[i].attribute != 1) {
- sd->status.inventory[i].attribute = 1;
- pc_unequipitem(sd,i,3);
- sprintf(tmp_output, "%s has broken.",sd->inventory_data[i]->jname);
- clif_emotion(&sd->bl,23);
- clif_displaymessage(sd->fd, tmp_output);
- clif_equiplist(sd);
- break;
- }
- }
-
- return 1;
-}
-
-/*==========================================
- * session id‚É–â‘è–³‚µ
- * charŽI‚©‚ç‘—‚ç‚ê‚Ä‚«‚½ƒXƒe?ƒ^ƒX‚ðÝ’è
- *------------------------------------------
- */
-int pc_authok(int id, int login_id2, time_t connect_until_time, struct mmo_charstatus *st)
-{
- struct map_session_data *sd = NULL;
-
- struct party *p;
- struct guild *g;
- int i;
- unsigned long tick = gettick();
-
- sd = map_id2sd(id);
- nullpo_retr(1, sd);
-
- // check if double login occured
- if(sd->new_fd){
- // 2dloginó‘Ô‚¾‚Á‚½‚Ì‚ÅA—¼•û—Ž‚·
- clif_authfail_fd(sd->fd,2); // same id
- clif_authfail_fd(sd->new_fd,8); // same id
- return 1;
- }
- sd->login_id2 = login_id2;
- memcpy(&sd->status, st, sizeof(*st));
-
- if (sd->status.sex != sd->sex) {
- clif_authfail_fd(sd->fd, 0);
- return 1;
- }
-
- memset(&sd->state, 0, sizeof(sd->state));
- // Šî–{“I‚ȉŠú‰»
- sd->state.connect_new = 1;
- sd->bl.prev = sd->bl.next = NULL;
-
- sd->weapontype1 = sd->weapontype2 = 0;
- sd->view_class = sd->status.class_;
- sd->speed = DEFAULT_WALK_SPEED;
- sd->state.dead_sit = 0;
- sd->dir = 0;
- sd->head_dir = 0;
- sd->state.auth = 1;
- sd->walktimer = -1;
- sd->next_walktime = -1;
- sd->attacktimer = -1;
- sd->followtimer = -1; // [MouseJstr]
- sd->skilltimer = -1;
- sd->skillitem = -1;
- sd->skillitemlv = -1;
- sd->invincible_timer = -1;
-
- sd->deal_locked = 0;
- sd->trade_partner = 0;
-
- sd->inchealhptick = 0;
- sd->inchealsptick = 0;
- sd->hp_sub = 0;
- sd->sp_sub = 0;
- sd->inchealspirithptick = 0;
- sd->inchealspiritsptick = 0;
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->canregen_tick = tick;
- sd->attackabletime = tick;
- sd->reg_num = 0;
- sd->doridori_counter = 0;
- sd->change_level = pc_readglobalreg(sd,"jobchange_level");
-
-#ifndef TXT_ONLY // mail system [Valaris]
- if(battle_config.mail_system)
- sd->mail_counter = 0;
-#endif
- sd->spiritball = 0;
- for(i = 0; i < MAX_SKILL_LEVEL; i++)
- sd->spirit_timer[i] = -1;
- for(i = 0; i < MAX_SKILLTIMERSKILL; i++)
- sd->skilltimerskill[i].timer = -1;
- sd->timerskill_count=0;
-
- memset(sd->blockskill,0,sizeof(sd->blockskill));
-
- memset(&sd->dev,0,sizeof(struct square));
- for(i = 0; i < 5; i++) {
- sd->dev.val1[i] = 0;
- sd->dev.val2[i] = 0;
- }
-
- // ƒAƒJƒEƒ“ƒg??‚Ì‘—M—v‹
- intif_request_accountreg(sd);
-
- // ƒAƒCƒeƒ€ƒ`ƒFƒbƒN
- pc_setinventorydata(sd);
- pc_checkitem(sd);
-
- // pet
- sd->petDB = NULL;
- sd->pd = NULL;
- sd->pet_hungry_timer = -1;
- memset(&sd->pet, 0, sizeof(struct s_pet));
-
- // ƒXƒe?ƒ^ƒXˆÙí‚̉Šú‰»
- for(i = 0; i < MAX_STATUSCHANGE; i++) {
- sd->sc_data[i].timer=-1;
- sd->sc_data[i].val1 = sd->sc_data[i].val2 = sd->sc_data[i].val3 = sd->sc_data[i].val4 = 0;
- }
- sd->sc_count=0;
- if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
- (pc_isGM(sd) >= get_atcommand_level(AtCommand_Hide)))
- sd->status.option &= (OPTION_MASK | OPTION_HIDE);
- else
- sd->status.option &= OPTION_MASK;
-
- // ƒXƒLƒ‹ƒ†ƒjƒbƒg?ŒW‚̉Šú‰»
- memset(sd->skillunit, 0, sizeof(sd->skillunit));
- memset(sd->skillunittick, 0, sizeof(sd->skillunittick));
-
- // ƒp?ƒeƒB??ŒW‚̉Šú‰»
- sd->party_sended = 0;
- sd->party_invite = 0;
- sd->party_x = -1;
- sd->party_y = -1;
- sd->party_hp = -1;
-
- // ƒMƒ‹ƒh?ŒW‚̉Šú‰»
- sd->guild_sended = 0;
- sd->guild_invite = 0;
- sd->guild_alliance = 0;
-
- // ƒCƒxƒ“ƒg?ŒW‚̉Šú‰»
- memset(sd->eventqueue, 0, sizeof(sd->eventqueue));
- for(i = 0; i < MAX_EVENTTIMER; i++)
- sd->eventtimer[i] = -1;
- sd->eventcount=0;
-
- // ˆÊ’u‚ÌÝ’è
- if (pc_setpos(sd,sd->status.last_point.map, sd->status.last_point.x, sd->status.last_point.y, 0) != 0) {
- if(battle_config.error_log) {
- char buf[32];
- sprintf(buf, "Last_point_map %s not found\n", sd->status.last_point.map);
- ShowError (buf);
- }
- // try warping to a default map instead
- if (pc_setpos(sd, "prontera.gat", 273, 354, 0) != 0) {
- // if we fail again
- clif_authfail_fd(sd->fd, 0);
- return 1;
- }
- }
-
- // pet
- if (sd->status.pet_id > 0)
- intif_request_petdata(sd->status.account_id, sd->status.char_id, sd->status.pet_id);
-
- // ƒp?ƒeƒBAƒMƒ‹ƒhƒf?ƒ^‚Ì—v‹
- if (sd->status.party_id > 0 && (p = party_search(sd->status.party_id)) == NULL)
- party_request_info(sd->status.party_id);
- if (sd->status.guild_id > 0 && (g = guild_search(sd->status.guild_id)) == NULL)
- guild_request_info(sd->status.guild_id);
-
- // pvp‚ÌÝ’è
- sd->pvp_rank = 0;
- sd->pvp_point = 0;
- sd->pvp_timer = -1;
-
- // ’Ê’m
-
- clif_authok(sd);
- map_addnickdb(sd);
- if (map_charid2nick(sd->status.char_id) == NULL)
- map_addchariddb(sd->status.char_id, sd->status.name);
-
- //ƒXƒpƒmƒr—pŽ€‚ɃJƒEƒ“ƒ^?‚̃XƒNƒŠƒvƒg??‚©‚ç‚Ì?‚Ýo‚µ‚Æsd‚ւ̃Zƒbƒg
- sd->die_counter = pc_readglobalreg(sd,"PC_DIE_COUNTER");
-
- // Automated script events
- if (script_config.event_requires_trigger) {
- sd->state.event_death = pc_readglobalreg(sd, script_config.die_event_name);
- sd->state.event_kill = pc_readglobalreg(sd, script_config.kill_event_name);
- sd->state.event_disconnect = pc_readglobalreg(sd, script_config.logout_event_name);
- // if script triggers are not required
- } else {
- sd->state.event_death = 1;
- sd->state.event_kill = 1;
- sd->state.event_disconnect = 1;
- }
-
- if (night_flag == 1 && !map[sd->bl.m].flag.indoors) {
- char tmpstr[1024];
- strcpy(tmpstr, msg_txt(500)); // Actually, it's the night...
- clif_wis_message(sd->fd, wisp_server_name, tmpstr, strlen(tmpstr)+1);
- if (battle_config.night_darkness_level > 0)
- clif_specialeffect(&sd->bl, 474 + battle_config.night_darkness_level, 0);
- else
- //clif_specialeffect(&sd->bl, 483, 0); // default darkness level
- sd->opt2 |= STATE_BLIND;
- }
-
- // ƒXƒe?ƒ^ƒX‰ŠúŒvŽZ‚È‚Ç
- status_calc_pc(sd,1);
-
- if (pc_isGM(sd))
- sprintf(tmp_output,"GM Character '"CL_WHITE"%s"CL_RESET"' logged in. (Acc. ID: '"CL_WHITE"%d"CL_RESET"', GM Level '"CL_WHITE"%d"CL_RESET"').\n", sd->status.name, sd->status.account_id, pc_isGM(sd));
- else
- sprintf(tmp_output,"Character '"CL_WHITE"%s"CL_RESET"' logged in. (Account ID: '"CL_WHITE"%d"CL_RESET"').\n", sd->status.name, sd->status.account_id);
- ShowInfo(tmp_output);
-
- if (script_config.event_script_type == 0) {
- struct npc_data *npc;
- //printf("pc: OnPCLogin event done. (%d events)\n", npc_event_doall("OnPCLogin") );
- if ((npc = npc_name2id(script_config.login_event_name))) {
- run_script(npc->u.scr.script,0,sd->bl.id,npc->bl.id); // PCLoginNPC
- sprintf (tmp_output, "Event '"CL_WHITE"%s"CL_RESET"' executed.\n", script_config.login_event_name);
- ShowStatus(tmp_output);
- }
- } else {
- sprintf (tmp_output, "%d '"CL_WHITE"%s"CL_RESET"' events executed.\n",
- npc_event_doall_id(script_config.login_event_name, sd->bl.id), script_config.login_event_name);
- ShowStatus(tmp_output);
- }
-
- // Send friends list
- clif_friends_list_send(sd);
-
- // Message of the Day‚Ì‘—M
- {
- char buf[256];
- FILE *fp;
- if ((fp = fopen(motd_txt, "r")) != NULL) {
- while (fgets(buf, sizeof(buf)-1, fp) != NULL) {
- int i;
- for(i=0; buf[i]; i++) {
- if (buf[i] == '\r' || buf[i]== '\n') {
- buf[i] = 0;
- break;
- }
- }
- if (battle_config.motd_type)
- clif_disp_onlyself(sd,buf,strlen(buf));
- else
- clif_displaymessage(sd->fd, buf);
- }
- fclose(fp);
- }
- else if(battle_config.error_log) {
- sprintf(tmp_output, "In function pc_atuhok() -> File '"CL_WHITE"%s"CL_RESET"' not found.\n", motd_txt);
- ShowWarning(tmp_output);
- }
- }
-
-#ifndef TXT_ONLY
- if(battle_config.mail_system)
- mail_check(sd,1); // check mail at login [Valaris]
-#endif
-
- // message of the limited time of the account
- if (connect_until_time != 0) { // don't display if it's unlimited or unknow value
- char tmpstr[1024];
- strftime(tmpstr, sizeof(tmpstr) - 1, msg_txt(501), localtime(&connect_until_time)); // "Your account time limit is: %d-%m-%Y %H:%M:%S."
- clif_wis_message(sd->fd, wisp_server_name, tmpstr, strlen(tmpstr)+1);
- }
-
- return 0;
-}
-
-/*==========================================
- * session id‚É–â‘è‚ ‚è‚È‚Ì‚ÅŒãŽn––
- *------------------------------------------
- */
-int pc_authfail(int id) {
- struct map_session_data *sd;
-
- sd = map_id2sd(id);
- if (sd == NULL)
- return 1;
-
- if(sd->new_fd){
- // 2dloginó‘Ô‚¾‚Á‚½‚Ì‚ÅAV‚µ‚¢Ú‘±‚Ì‚Ý—Ž‚·
- clif_authfail_fd(sd->new_fd,0);
- sd->new_fd=0;
- return 0;
- }
-
- clif_authfail_fd(sd->fd, 0);
-
- return 0;
-}
-
-static int pc_calc_skillpoint(struct map_session_data* sd)
-{
- int i,skill,skill_point=0;
-
- nullpo_retr(0, sd);
-
- for(i=1;i<MAX_SKILL;i++){
- if( (skill = pc_checkskill(sd,i)) > 0) {
- if(!(skill_get_inf2(i)&0x01) || battle_config.quest_skill_learn) {
- if(!sd->status.skill[i].flag)
- skill_point += skill;
- else if(sd->status.skill[i].flag > 2 && sd->status.skill[i].flag != 13) {
- skill_point += (sd->status.skill[i].flag - 2);
- }
- }
- }
- }
-
- return skill_point;
-}
-
-/*==========================================
- * ?‚¦‚ç‚ê‚éƒXƒLƒ‹‚ÌŒvŽZ
- *------------------------------------------
- */
-int pc_calc_skilltree(struct map_session_data *sd)
-{
- int i,id=0,flag;
- int c=0, s=0;
- //?¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
- struct pc_base_job s_class;
-
- nullpo_retr(0, sd);
-
- s_class = pc_calc_base_job(sd->status.class_);
- c = s_class.job;
- //s = (s_class.upper==1) ? 1 : 0 ; //?¶ˆÈŠO‚Í’Êí‚̃XƒLƒ‹H
- s = s_class.upper;
-
- c = pc_calc_skilltree_normalize_job(c, sd);
-
- for(i=0;i<MAX_SKILL;i++){
-// if(skill_get_inf2(i) & 0x01)
-// continue;
- if (sd->status.skill[i].flag != 13)
- sd->status.skill[i].id=0;
- if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){ // cardƒXƒLƒ‹‚È‚çA
- sd->status.skill[i].lv=(sd->status.skill[i].flag==1)?0:sd->status.skill[i].flag-2; // –{?‚Ìlv‚É
- sd->status.skill[i].flag=0; // flag‚Í0‚É‚µ‚Ä‚¨‚­
- }
- }
-
- if (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill){
- // ‘S‚ẴXƒLƒ‹
- for(i=1;i<158;i++)
- sd->status.skill[i].id=i;
- for(i=210;i<291;i++)
- sd->status.skill[i].id=i;
- for(i=304;i<338;i++){
- if(i==331) continue;
- sd->status.skill[i].id=i;
- }
- for(i=355;i<411;i++)
- sd->status.skill[i].id=i;
- for(i=475;i<480;i++)
- sd->status.skill[i].id=i;
- } else {
- do {
- flag=0;
- for(i=0;(id=skill_tree[s][c][i].id)>0;i++){
- int j,f=1;
- if(!battle_config.skillfree) {
- for(j=0;j<5;j++) {
- if( skill_tree[s][c][i].need[j].id &&
- pc_checkskill(sd,skill_tree[s][c][i].need[j].id) <
- skill_tree[s][c][i].need[j].lv) {
- f=0;
- break;
- }
- }
- if (sd->status.job_level < skill_tree[s][c][i].joblv)
- f=0;
- else if (id >= 2 && id <= 53 && pc_checkskill(sd, NV_BASIC) < 9)
- f=0;
- }
- if(f && sd->status.skill[id].id==0 ){
- sd->status.skill[id].id=id;
- flag=1;
- }
- }
- } while(flag);
- }
-// if(battle_config.etc_log)
-// printf("calc skill_tree\n");
- return 0;
-}
-
-// Make sure all the skills are in the correct condition
-// before persisting to the backend.. [MouseJstr]
-int pc_clean_skilltree(struct map_session_data *sd) {
- int i;
- for (i = 0; i < MAX_SKILL; i++){
- if (sd->status.skill[i].flag == 13){
- sd->status.skill[i].id = 0;
- sd->status.skill[i].lv = 0;
- sd->status.skill[i].flag = 0;
- }
- }
-
- return 0;
-}
-
-int pc_calc_skilltree_normalize_job(int c, struct map_session_data *sd) {
- //if((battle_config.skillup_limit) && ((c >= 0 && c < 23) || (c >= 4001 && c < 4023) || (c >= 4023 && c < 4045))) {
- if (battle_config.skillup_limit && c >= 0 && c < 23) {
- int skill_point = pc_calc_skillpoint(sd);
- if(skill_point < 9)
- c = 0;
- //else if((sd->status.skill_point >= sd->status.job_level && skill_point < 58) && ((c > 6 && c < 23) || (c > 4007 && c < 4023) || (c > 4029 && c < 4045))) {
- //else if ((sd->status.skill_point >= sd->status.job_level && skill_point < 58) && (c > 6 && c < 23)) {
- else if (sd->status.skill_point >= sd->status.job_level && ((sd->change_level > 0 && skill_point < sd->change_level+8) || skill_point < 58) && (c > 6 && c < 23)) {
- switch(c) {
- case 7:
- case 13:
- case 14:
- case 21:
- c = 1;
- break;
- case 8:
- case 15:
- c = 4;
- break;
- case 9:
- case 16:
- c = 2;
- break;
- case 10:
- case 18:
- c = 5;
- break;
- case 11:
- case 19:
- case 20:
- c = 3;
- break;
- case 12:
- case 17:
- c = 6;
- break;
-#if 0
- case 4008:
- case 4014:
- case 4015:
- case 4022:
- c = 4002;
- break;
- case 4009:
- case 4016:
- c = 4005;
- break;
- case 4010:
- case 4017:
- c = 4003;
- break;
- case 4011:
- case 4019:
- c = 4006;
- break;
- case 4012:
- case 4020:
- case 4021:
- c = 4004;
- break;
- case 4013:
- case 4018:
- c = 4007;
- break;
- case 4030:
- case 4036:
- case 4037:
- case 4044:
- c = 4024;
- break;
- case 4031:
- case 4038:
- c = 4027;
- break;
- case 4032:
- case 4039:
- c = 4025;
- break;
- case 4033:
- case 4040:
- c = 4028;
- break;
- case 4034:
- case 4041:
- case 4042:
- c = 4026;
- break;
- case 4035:
- case 4043:
- c = 4029;
- break;
-#endif
- }
- }
- }
- return c;
-}
-
-/*==========================================
- * d—ʃAƒCƒRƒ“‚ÌŠm”F
- *------------------------------------------
- */
-int pc_checkweighticon(struct map_session_data *sd)
-{
- int flag=0;
-
- nullpo_retr(0, sd);
-
- if(sd->weight*2 >= sd->max_weight)
- flag=1;
- if(sd->weight*10 >= sd->max_weight*9)
- flag=2;
-
- if(flag==1){
- if(sd->sc_data[SC_WEIGHT50].timer==-1)
- status_change_start(&sd->bl,SC_WEIGHT50,0,0,0,0,0,0);
- }else{
- status_change_end(&sd->bl,SC_WEIGHT50,-1);
- }
- if(flag==2){
- if(sd->sc_data[SC_WEIGHT90].timer==-1)
- status_change_start(&sd->bl,SC_WEIGHT90,0,0,0,0,0,0);
- }else{
- status_change_end(&sd->bl,SC_WEIGHT90,-1);
- }
- return 0;
-}
-
-/*==========================================
- * ? ”õ•i‚É‚æ‚é”\—Í“™‚̃{?ƒiƒXÝ’è
- *------------------------------------------
- */
-int pc_bonus(struct map_session_data *sd,int type,int val)
-{
- int i;
- nullpo_retr(0, sd);
-
- switch(type){
- case SP_STR:
- case SP_AGI:
- case SP_VIT:
- case SP_INT:
- case SP_DEX:
- case SP_LUK:
- if(sd->state.lr_flag != 2)
- sd->parame[type-SP_STR]+=val;
- break;
- case SP_ATK1:
- if(!sd->state.lr_flag)
- sd->watk+=val;
- else if(sd->state.lr_flag == 1)
- sd->watk_+=val;
- break;
- case SP_ATK2:
- if(!sd->state.lr_flag)
- sd->watk2+=val;
- else if(sd->state.lr_flag == 1)
- sd->watk_2+=val;
- break;
- case SP_BASE_ATK:
- if(sd->state.lr_flag != 2)
- sd->base_atk+=val;
- break;
- case SP_MATK1:
- if(sd->state.lr_flag != 2)
- sd->matk1 += val;
- break;
- case SP_MATK2:
- if(sd->state.lr_flag != 2)
- sd->matk2 += val;
- break;
- case SP_MATK:
- if(sd->state.lr_flag != 2) {
- sd->matk1 += val;
- sd->matk2 += val;
- }
- break;
- case SP_DEF1:
- if(sd->state.lr_flag != 2)
- sd->def+=val;
- break;
- case SP_MDEF1:
- if(sd->state.lr_flag != 2)
- sd->mdef+=val;
- break;
- case SP_MDEF2:
- if(sd->state.lr_flag != 2)
- sd->mdef+=val;
- break;
- case SP_HIT:
- if(sd->state.lr_flag != 2)
- sd->hit+=val;
- else
- sd->arrow_hit+=val;
- break;
- case SP_FLEE1:
- if(sd->state.lr_flag != 2)
- sd->flee+=val;
- break;
- case SP_FLEE2:
- if(sd->state.lr_flag != 2)
- sd->flee2+=val*10;
- break;
- case SP_CRITICAL:
- if(sd->state.lr_flag != 2)
- sd->critical+=val*10;
- else
- sd->arrow_cri += val*10;
- break;
- case SP_ATKELE:
- if(!sd->state.lr_flag)
- sd->atk_ele=val;
- else if(sd->state.lr_flag == 1)
- sd->atk_ele_=val;
- else if(sd->state.lr_flag == 2)
- sd->arrow_ele=val;
- break;
- case SP_DEFELE:
- if(sd->state.lr_flag != 2)
- sd->def_ele=val;
- break;
- case SP_MAXHP:
- if(sd->state.lr_flag != 2)
- sd->status.max_hp+=val;
- break;
- case SP_MAXSP:
- if(sd->state.lr_flag != 2)
- sd->status.max_sp+=val;
- break;
- case SP_CASTRATE:
- if(sd->state.lr_flag != 2)
- sd->castrate+=val;
- break;
- case SP_MAXHPRATE:
- if(sd->state.lr_flag != 2)
- sd->hprate+=val;
- break;
- case SP_MAXSPRATE:
- if(sd->state.lr_flag != 2)
- sd->sprate+=val;
- break;
- case SP_SPRATE:
- if(sd->state.lr_flag != 2)
- sd->dsprate+=val;
- break;
- case SP_ATTACKRANGE:
- if(!sd->state.lr_flag)
- sd->attackrange += val;
- else if(sd->state.lr_flag == 1)
- sd->attackrange_ += val;
- else if(sd->state.lr_flag == 2)
- sd->arrow_range += val;
- break;
- case SP_ADD_SPEED:
- if(sd->state.lr_flag != 2)
- sd->speed -= val;
- break;
- case SP_SPEED_RATE:
- if(sd->state.lr_flag != 2) {
- if(sd->speed_rate > 100-val)
- sd->speed_rate = 100-val;
- }
- break;
- case SP_SPEED_ADDRATE:
- if(sd->state.lr_flag != 2)
- sd->speed_add_rate = sd->speed_add_rate * (100-val)/100;
- break;
- case SP_ASPD:
- if(sd->state.lr_flag != 2)
- sd->aspd -= val*10;
- break;
- case SP_ASPD_RATE:
- if(sd->state.lr_flag != 2) {
- if(sd->aspd_rate > 100-val)
- sd->aspd_rate = 100-val;
- }
- break;
- case SP_ASPD_ADDRATE:
- if(sd->state.lr_flag != 2)
- sd->aspd_add_rate = sd->aspd_add_rate * (100-val)/100;
- break;
- case SP_HP_RECOV_RATE:
- if(sd->state.lr_flag != 2)
- sd->hprecov_rate += val;
- break;
- case SP_SP_RECOV_RATE:
- if(sd->state.lr_flag != 2)
- sd->sprecov_rate += val;
- break;
- case SP_CRITICAL_DEF:
- if(sd->state.lr_flag != 2)
- sd->critical_def += val;
- break;
- case SP_NEAR_ATK_DEF:
- if(sd->state.lr_flag != 2)
- sd->near_attack_def_rate += val;
- break;
- case SP_LONG_ATK_DEF:
- if(sd->state.lr_flag != 2)
- sd->long_attack_def_rate += val;
- break;
- case SP_DOUBLE_RATE:
- if(sd->state.lr_flag == 0 && sd->double_rate < val)
- sd->double_rate = val;
- break;
- case SP_DOUBLE_ADD_RATE:
- if(sd->state.lr_flag == 0)
- sd->double_add_rate += val;
- break;
- case SP_MATK_RATE:
- if(sd->state.lr_flag != 2)
- sd->matk_rate += val;
- break;
- case SP_IGNORE_DEF_ELE:
- if(!sd->state.lr_flag)
- sd->ignore_def_ele |= 1<<val;
- else if(sd->state.lr_flag == 1)
- sd->ignore_def_ele_ |= 1<<val;
- break;
- case SP_IGNORE_DEF_RACE:
- if(!sd->state.lr_flag)
- sd->ignore_def_race |= 1<<val;
- else if(sd->state.lr_flag == 1)
- sd->ignore_def_race_ |= 1<<val;
- break;
- case SP_ATK_RATE:
- if(sd->state.lr_flag != 2)
- sd->atk_rate += val;
- break;
- case SP_MAGIC_ATK_DEF:
- if(sd->state.lr_flag != 2)
- sd->magic_def_rate += val;
- break;
- case SP_MISC_ATK_DEF:
- if(sd->state.lr_flag != 2)
- sd->misc_def_rate += val;
- break;
- case SP_IGNORE_MDEF_ELE:
- if(sd->state.lr_flag != 2)
- sd->ignore_mdef_ele |= 1<<val;
- break;
- case SP_IGNORE_MDEF_RACE:
- if(sd->state.lr_flag != 2)
- sd->ignore_mdef_race |= 1<<val;
- break;
- case SP_PERFECT_HIT_RATE:
- if(sd->state.lr_flag != 2 && sd->perfect_hit < val)
- sd->perfect_hit = val;
- break;
- case SP_PERFECT_HIT_ADD_RATE:
- if(sd->state.lr_flag != 2)
- sd->perfect_hit_add += val;
- break;
- case SP_CRITICAL_RATE:
- if(sd->state.lr_flag != 2)
- sd->critical_rate+=val;
- break;
- case SP_GET_ZENY_NUM:
- if(sd->state.lr_flag != 2 && sd->get_zeny_num < val)
- sd->get_zeny_num = val;
- break;
- case SP_ADD_GET_ZENY_NUM:
- if(sd->state.lr_flag != 2)
- sd->get_zeny_add_num += val;
- break;
- case SP_DEF_RATIO_ATK_ELE:
- if(!sd->state.lr_flag)
- sd->def_ratio_atk_ele |= 1<<val;
- else if(sd->state.lr_flag == 1)
- sd->def_ratio_atk_ele_ |= 1<<val;
- break;
- case SP_DEF_RATIO_ATK_RACE:
- if(!sd->state.lr_flag)
- sd->def_ratio_atk_race |= 1<<val;
- else if(sd->state.lr_flag == 1)
- sd->def_ratio_atk_race_ |= 1<<val;
- break;
- case SP_HIT_RATE:
- if(sd->state.lr_flag != 2)
- sd->hit_rate += val;
- break;
- case SP_FLEE_RATE:
- if(sd->state.lr_flag != 2)
- sd->flee_rate += val;
- break;
- case SP_FLEE2_RATE:
- if(sd->state.lr_flag != 2)
- sd->flee2_rate += val;
- break;
- case SP_DEF_RATE:
- if(sd->state.lr_flag != 2)
- sd->def_rate += val;
- break;
- case SP_DEF2_RATE:
- if(sd->state.lr_flag != 2)
- sd->def2_rate += val;
- break;
- case SP_MDEF_RATE:
- if(sd->state.lr_flag != 2)
- sd->mdef_rate += val;
- break;
- case SP_MDEF2_RATE:
- if(sd->state.lr_flag != 2)
- sd->mdef2_rate += val;
- break;
- case SP_RESTART_FULL_RECORVER:
- if(sd->state.lr_flag != 2)
- sd->special_state.restart_full_recover = 1;
- break;
- case SP_NO_CASTCANCEL:
- if(sd->state.lr_flag != 2)
- sd->special_state.no_castcancel = 1;
- break;
- case SP_NO_CASTCANCEL2:
- if(sd->state.lr_flag != 2)
- sd->special_state.no_castcancel2 = 1;
- break;
- case SP_NO_SIZEFIX:
- if(sd->state.lr_flag != 2)
- sd->special_state.no_sizefix = 1;
- break;
- case SP_NO_MAGIC_DAMAGE:
- if(sd->state.lr_flag != 2)
- sd->special_state.no_magic_damage = 1;
- break;
- case SP_NO_WEAPON_DAMAGE:
- if(sd->state.lr_flag != 2)
- sd->special_state.no_weapon_damage = 1;
- break;
- case SP_NO_GEMSTONE:
- if(sd->state.lr_flag != 2)
- sd->special_state.no_gemstone = 1;
- break;
- case SP_INFINITE_ENDURE:
- if(sd->state.lr_flag != 2)
- sd->special_state.infinite_endure = 1;
- break;
- case SP_SPLASH_RANGE:
- if(sd->state.lr_flag != 2 && sd->splash_range < val)
- sd->splash_range = val;
- break;
- case SP_SPLASH_ADD_RANGE:
- if(sd->state.lr_flag != 2)
- sd->splash_add_range += val;
- break;
- case SP_SHORT_WEAPON_DAMAGE_RETURN:
- if(sd->state.lr_flag != 2)
- sd->short_weapon_damage_return += val;
- break;
- case SP_LONG_WEAPON_DAMAGE_RETURN:
- if(sd->state.lr_flag != 2)
- sd->long_weapon_damage_return += val;
- break;
- case SP_MAGIC_DAMAGE_RETURN: //AppleGirl Was Here
- if(sd->state.lr_flag != 2)
- sd->magic_damage_return += val;
- break;
- case SP_ALL_STATS: // [Valaris]
- if(sd->state.lr_flag!=2) {
- sd->parame[SP_STR-SP_STR]+=val;
- sd->parame[SP_AGI-SP_STR]+=val;
- sd->parame[SP_VIT-SP_STR]+=val;
- sd->parame[SP_INT-SP_STR]+=val;
- sd->parame[SP_DEX-SP_STR]+=val;
- sd->parame[SP_LUK-SP_STR]+=val;
- }
- break;
- case SP_AGI_VIT: // [Valaris]
- if(sd->state.lr_flag!=2) {
- sd->parame[SP_AGI-SP_STR]+=val;
- sd->parame[SP_VIT-SP_STR]+=val;
- }
- break;
- case SP_AGI_DEX_STR: // [Valaris]
- if(sd->state.lr_flag!=2) {
- sd->parame[SP_AGI-SP_STR]+=val;
- sd->parame[SP_DEX-SP_STR]+=val;
- sd->parame[SP_STR-SP_STR]+=val;
- }
- break;
- case SP_PERFECT_HIDE: // [Valaris]
- if(sd->state.lr_flag!=2) {
- sd->perfect_hiding=1;
- }
- break;
- case SP_DISGUISE: // Disguise script for items [Valaris]
- if(sd->state.lr_flag!=2 && sd->disguiseflag==0) {
- if(pc_isriding(sd)) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
- clif_displaymessage(sd->fd, "Cannot wear disguise when riding a Peco.");
- break;
- }
- sd->disguise=val;
- clif_clearchar(&sd->bl, 9);
- pc_setpos(sd, sd->mapname, sd->bl.x, sd->bl.y, 3);
- }
- break;
- case SP_UNBREAKABLE:
- if(sd->state.lr_flag!=2) {
- sd->unbreakable += val;
- }
- break;
- case SP_UNBREAKABLE_WEAPON:
- if(sd->state.lr_flag != 2)
- sd->unbreakable_equip |= EQP_WEAPON;
- break;
- case SP_UNBREAKABLE_ARMOR:
- if(sd->state.lr_flag != 2)
- sd->unbreakable_equip |= EQP_ARMOR;
- break;
- case SP_UNBREAKABLE_HELM:
- if(sd->state.lr_flag != 2)
- sd->unbreakable_equip |= EQP_HELM;
- break;
- case SP_UNBREAKABLE_SHIELD:
- if(sd->state.lr_flag != 2)
- sd->unbreakable_equip |= EQP_SHIELD;
- break;
- case SP_CLASSCHANGE: // [Valaris]
- if(sd->state.lr_flag !=2){
- sd->classchange=val;
- }
- break;
- case SP_LONG_ATK_RATE:
- if(sd->status.weapon == 11 && sd->state.lr_flag != 2)
- sd->atk_rate += val;
- break;
- case SP_BREAK_WEAPON_RATE:
- if(sd->state.lr_flag != 2)
- sd->break_weapon_rate+=val;
- break;
- case SP_BREAK_ARMOR_RATE:
- if(sd->state.lr_flag != 2)
- sd->break_armor_rate+=val;
- break;
- case SP_ADD_STEAL_RATE:
- if(sd->state.lr_flag != 2)
- sd->add_steal_rate+=val;
- break;
- case SP_DELAYRATE:
- if(sd->state.lr_flag != 2)
- sd->delayrate+=val;
- break;
- case SP_CRIT_ATK_RATE:
- if(sd->state.lr_flag != 2)
- sd->crit_atk_rate += val;
- break;
- case SP_NO_REGEN:
- if(sd->state.lr_flag != 2)
- sd->no_regen = val;
- break;
- case SP_UNSTRIPABLE_WEAPON:
- if(sd->state.lr_flag != 2)
- sd->unstripable_equip |= EQP_WEAPON;
- break;
- case SP_UNSTRIPABLE:
- case SP_UNSTRIPABLE_ARMOR:
- if(sd->state.lr_flag != 2)
- sd->unstripable_equip |= EQP_ARMOR;
- break;
- case SP_UNSTRIPABLE_HELM:
- if(sd->state.lr_flag != 2)
- sd->unstripable_equip |= EQP_HELM;
- break;
- case SP_UNSTRIPABLE_SHIELD:
- if(sd->state.lr_flag != 2)
- sd->unstripable_equip |= EQP_SHIELD;
- break;
- case SP_SP_GAIN_VALUE:
- if(!sd->state.lr_flag)
- sd->sp_gain_value += val;
- break;
- case SP_IGNORE_DEF_MOB: // 0:normal monsters only, 1:affects boss monsters as well
- if(!sd->state.lr_flag)
- sd->ignore_def_mob |= 1<<val;
- else if(sd->state.lr_flag == 1)
- sd->ignore_def_mob_ |= 1<<val;
- break;
- case SP_HP_GAIN_VALUE:
- if(!sd->state.lr_flag)
- sd->hp_gain_value += val;
- break;
- case SP_DAMAGE_WHEN_UNEQUIP:
- if(!sd->state.lr_flag) {
- for (i=0; i<11; i++) {
- if (sd->inventory_data[current_equip_item_index]->equip & equip_pos[i]) {
- sd->unequip_losehp[i] += val;
- break;
- }
- }
- }
- break;
- case SP_LOSESP_WHEN_UNEQUIP:
- if(!sd->state.lr_flag) {
- for (i=0; i<11; i++) {
- if (sd->inventory_data[current_equip_item_index]->equip & equip_pos[i]) {
- sd->unequip_losesp[i] += val;
- break;
- }
- }
- }
- break;
- default:
- if(battle_config.error_log)
- printf("pc_bonus: unknown type %d %d !\n",type,val);
- break;
- }
- return 0;
-}
-
-/*==========================================
- * ? ”õ•i‚É‚æ‚é”\—Í“™‚̃{?ƒiƒXÝ’è
- *------------------------------------------
- */
-int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- switch(type){
- case SP_ADDELE:
- if(!sd->state.lr_flag)
- sd->addele[type2]+=val;
- else if(sd->state.lr_flag == 1)
- sd->addele_[type2]+=val;
- else if(sd->state.lr_flag == 2)
- sd->arrow_addele[type2]+=val;
- break;
- case SP_ADDRACE:
- if(!sd->state.lr_flag)
- sd->addrace[type2]+=val;
- else if(sd->state.lr_flag == 1)
- sd->addrace_[type2]+=val;
- else if(sd->state.lr_flag == 2)
- sd->arrow_addrace[type2]+=val;
- break;
- case SP_ADDSIZE:
- if(!sd->state.lr_flag)
- sd->addsize[type2]+=val;
- else if(sd->state.lr_flag == 1)
- sd->addsize_[type2]+=val;
- else if(sd->state.lr_flag == 2)
- sd->arrow_addsize[type2]+=val;
- break;
- case SP_SUBELE:
- if(sd->state.lr_flag != 2)
- sd->subele[type2]+=val;
- break;
- case SP_SUBRACE:
- if(sd->state.lr_flag != 2)
- sd->subrace[type2]+=val;
- break;
- case SP_ADDEFF:
- if(sd->state.lr_flag != 2)
- sd->addeff[type2]+=val;
- else
- sd->arrow_addeff[type2]+=val;
- break;
- case SP_ADDEFF2:
- if(sd->state.lr_flag != 2)
- sd->addeff2[type2]+=val;
- else
- sd->arrow_addeff2[type2]+=val;
- break;
- case SP_RESEFF:
- if(sd->state.lr_flag != 2)
- sd->reseff[type2]+=val;
- break;
- case SP_MAGIC_ADDELE:
- if(sd->state.lr_flag != 2)
- sd->magic_addele[type2]+=val;
- break;
- case SP_MAGIC_ADDRACE:
- if(sd->state.lr_flag != 2)
- sd->magic_addrace[type2]+=val;
- break;
- case SP_MAGIC_SUBRACE:
- if(sd->state.lr_flag != 2)
- sd->magic_subrace[type2]+=val;
- break;
- case SP_ADD_DAMAGE_CLASS:
- if(!sd->state.lr_flag) {
- for(i=0;i<sd->add_damage_class_count;i++) {
- if(sd->add_damage_classid[i] == type2) {
- sd->add_damage_classrate[i] += val;
- break;
- }
- }
- if(i >= sd->add_damage_class_count && sd->add_damage_class_count < 10) {
- sd->add_damage_classid[sd->add_damage_class_count] = type2;
- sd->add_damage_classrate[sd->add_damage_class_count] += val;
- sd->add_damage_class_count++;
- }
- }
- else if(sd->state.lr_flag == 1) {
- for(i=0;i<sd->add_damage_class_count_;i++) {
- if(sd->add_damage_classid_[i] == type2) {
- sd->add_damage_classrate_[i] += val;
- break;
- }
- }
- if(i >= sd->add_damage_class_count_ && sd->add_damage_class_count_ < 10) {
- sd->add_damage_classid_[sd->add_damage_class_count_] = type2;
- sd->add_damage_classrate_[sd->add_damage_class_count_] += val;
- sd->add_damage_class_count_++;
- }
- }
- break;
- case SP_ADD_MAGIC_DAMAGE_CLASS:
- if(sd->state.lr_flag != 2) {
- for(i=0;i<sd->add_magic_damage_class_count;i++) {
- if(sd->add_magic_damage_classid[i] == type2) {
- sd->add_magic_damage_classrate[i] += val;
- break;
- }
- }
- if(i >= sd->add_magic_damage_class_count && sd->add_magic_damage_class_count < 10) {
- sd->add_magic_damage_classid[sd->add_magic_damage_class_count] = type2;
- sd->add_magic_damage_classrate[sd->add_magic_damage_class_count] += val;
- sd->add_magic_damage_class_count++;
- }
- }
- break;
- case SP_ADD_DEF_CLASS:
- if(sd->state.lr_flag != 2) {
- for(i=0;i<sd->add_def_class_count;i++) {
- if(sd->add_def_classid[i] == type2) {
- sd->add_def_classrate[i] += val;
- break;
- }
- }
- if(i >= sd->add_def_class_count && sd->add_def_class_count < 10) {
- sd->add_def_classid[sd->add_def_class_count] = type2;
- sd->add_def_classrate[sd->add_def_class_count] += val;
- sd->add_def_class_count++;
- }
- }
- break;
- case SP_ADD_MDEF_CLASS:
- if(sd->state.lr_flag != 2) {
- for(i=0;i<sd->add_mdef_class_count;i++) {
- if(sd->add_mdef_classid[i] == type2) {
- sd->add_mdef_classrate[i] += val;
- break;
- }
- }
- if(i >= sd->add_mdef_class_count && sd->add_mdef_class_count < 10) {
- sd->add_mdef_classid[sd->add_mdef_class_count] = type2;
- sd->add_mdef_classrate[sd->add_mdef_class_count] += val;
- sd->add_mdef_class_count++;
- }
- }
- break;
- case SP_HP_DRAIN_RATE:
- if(!sd->state.lr_flag) {
- sd->hp_drain_rate += type2;
- sd->hp_drain_per += val;
- }
- else if(sd->state.lr_flag == 1) {
- sd->hp_drain_rate_ += type2;
- sd->hp_drain_per_ += val;
- }
- break;
- case SP_HP_DRAIN_VALUE:
- if(!sd->state.lr_flag) {
- sd->hp_drain_rate += type2;
- sd->hp_drain_value += val;
- }
- else if(sd->state.lr_flag == 1) {
- sd->hp_drain_rate_ += type2;
- sd->hp_drain_value_ += val;
- }
- break;
- case SP_SP_DRAIN_RATE:
- if(!sd->state.lr_flag) {
- sd->sp_drain_rate += type2;
- sd->sp_drain_per += val;
- }
- else if(sd->state.lr_flag == 1) {
- sd->sp_drain_rate_ += type2;
- sd->sp_drain_per_ += val;
- }
- sd->sp_drain_type = 0;
- break;
- case SP_SP_DRAIN_VALUE:
- if(!sd->state.lr_flag) {
- sd->sp_drain_rate += type2;
- sd->sp_drain_value += val;
- }
- else if(sd->state.lr_flag == 1) {
- sd->sp_drain_rate_ += type2;
- sd->sp_drain_value_ += val;
- }
- sd->sp_drain_type = 0;
- break;
- case SP_WEAPON_COMA_ELE:
- if(sd->state.lr_flag != 2)
- sd->weapon_coma_ele[type2] += val;
- break;
- case SP_WEAPON_COMA_RACE:
- if(sd->state.lr_flag != 2)
- sd->weapon_coma_race[type2] += val;
- break;
- case SP_RANDOM_ATTACK_INCREASE: // [Valaris]
- if(sd->state.lr_flag !=2){
- sd->random_attack_increase_add = type2;
- sd->random_attack_increase_per += val;
- }
- break;
- case SP_WEAPON_ATK:
- if(sd->state.lr_flag != 2)
- sd->weapon_atk[type2]+=val;
- break;
- case SP_WEAPON_ATK_RATE:
- if(sd->state.lr_flag != 2)
- sd->weapon_atk_rate[type2]+=val;
- break;
- case SP_CRITICAL_ADDRACE:
- if(sd->state.lr_flag != 2)
- sd->critaddrace[type2]+=val;
- break;
- case SP_ADDEFF_WHENHIT:
- if(sd->state.lr_flag != 2) {
- sd->addeff3[type2]+=val;
- sd->addeff3_type[type2]=1;
- }
- break;
- case SP_ADDEFF_WHENHIT_SHORT:
- if(sd->state.lr_flag != 2) {
- sd->addeff3[type2]+=val;
- sd->addeff3_type[type2]=0;
- }
- break;
- case SP_SKILL_ATK:
- if(sd->state.lr_flag != 2) {
- if (sd->skillatk[0] == type2)
- sd->skillatk[1] += val;
- else {
- sd->skillatk[0] = type2;
- sd->skillatk[1] = val;
- }
- }
- break;
- case SP_ADD_DAMAGE_BY_CLASS:
- if(sd->state.lr_flag != 2) {
- for(i=0;i<sd->add_damage_class_count2;i++) {
- if(sd->add_damage_classid2[i] == type2) {
- sd->add_damage_classrate2[i] += val;
- break;
- }
- }
- if(i >= sd->add_damage_class_count2 && sd->add_damage_class_count2 < 10) {
- sd->add_damage_classid2[sd->add_damage_class_count2] = type2;
- sd->add_damage_classrate2[sd->add_damage_class_count2] += val;
- sd->add_damage_class_count2++;
- }
- }
- break;
- case SP_HP_LOSS_RATE:
- if(sd->state.lr_flag != 2) {
- sd->hp_loss_value = type2;
- sd->hp_loss_rate = val;
- }
- break;
- case SP_ADDRACE2:
- if (type2 > 0 && type2 < MAX_MOB_RACE_DB)
- break;
- if(sd->state.lr_flag != 2)
- sd->addrace2[type2] += val;
- else
- sd->addrace2_[type2] += val;
- break;
- case SP_SUBSIZE:
- if(sd->state.lr_flag != 2)
- sd->subsize[type2]+=val;
- break;
- case SP_SUBRACE2:
- if(sd->state.lr_flag != 2)
- sd->subrace2[type2]+=val;
- break;
- case SP_ADD_ITEM_HEAL_RATE:
- if(sd->state.lr_flag != 2)
- sd->itemhealrate[type2 - 1] += val;
- break;
- case SP_EXP_ADDRACE:
- if(sd->state.lr_flag != 2)
- sd->expaddrace[type2]+=val;
- break;
- case SP_SP_GAIN_RACE:
- if(sd->state.lr_flag != 2)
- sd->sp_gain_race[type2]+=val;
- break;
-
- default:
- if(battle_config.error_log)
- printf("pc_bonus2: unknown type %d %d %d!\n",type,type2,val);
- break;
- }
- return 0;
-}
-
-int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val)
-{
- int i;
- switch(type){
- case SP_ADD_MONSTER_DROP_ITEM:
- if(sd->state.lr_flag != 2) {
- for(i=0;i<sd->monster_drop_item_count;i++) {
- if(sd->monster_drop_itemid[i] == type2) {
- sd->monster_drop_race[i] |= 1<<type3;
- if(sd->monster_drop_itemrate[i] < val)
- sd->monster_drop_itemrate[i] = val;
- break;
- }
- }
- if(i >= sd->monster_drop_item_count && sd->monster_drop_item_count < 10) {
- sd->monster_drop_itemid[sd->monster_drop_item_count] = type2;
- sd->monster_drop_race[sd->monster_drop_item_count] |= 1<<type3;
- sd->monster_drop_itemrate[sd->monster_drop_item_count] = val;
- sd->monster_drop_item_count++;
- }
- }
- break;
- case SP_AUTOSPELL:
- if(sd->state.lr_flag != 2){
- sd->autospell_id = type2;
- sd->autospell_lv = type3;
- sd->autospell_rate = val;
- }
- break;
- case SP_AUTOSPELL_WHENHIT:
- if(sd->state.lr_flag != 2){
- sd->autospell2_id = type2;
- sd->autospell2_lv = type3;
- sd->autospell2_rate = val;
- sd->autospell2_type = 1; // enemy
- }
- break;
- case SP_HP_LOSS_RATE:
- if(sd->state.lr_flag != 2) {
- sd->hp_loss_value = type2;
- sd->hp_loss_rate = type3;
- sd->hp_loss_type = val;
- }
- break;
- case SP_SP_DRAIN_RATE:
- if(!sd->state.lr_flag) {
- sd->sp_drain_rate += type2;
- sd->sp_drain_per += type3;
- }
- else if(sd->state.lr_flag == 1) {
- sd->sp_drain_rate_ += type2;
- sd->sp_drain_per_ += type3;
- }
- sd->sp_drain_type = val;
- break;
- case SP_SP_DRAIN_VALUE:
- if(!sd->state.lr_flag) {
- sd->sp_drain_rate += type2;
- sd->sp_drain_value += type3;
- }
- else if(sd->state.lr_flag == 1) {
- sd->sp_drain_rate_ += type2;
- sd->sp_drain_value_ += type3;
- }
- sd->sp_drain_type = val;
- default:
- if(battle_config.error_log)
- printf("pc_bonus3: unknown type %d %d %d %d!\n",type,type2,type3,val);
- break;
- }
-
- return 0;
-}
-
-int pc_bonus4(struct map_session_data *sd,int type,int type2,int type3,int type4,int val)
-{
- switch(type){
- case SP_AUTOSPELL_WHENHIT:
- if(sd->state.lr_flag != 2){
- sd->autospell2_id = type2;
- sd->autospell2_lv = type3;
- sd->autospell2_rate = type4;
- sd->autospell2_type = val; // 0: self, 1: enemy
- }
- break;
- default:
- if(battle_config.error_log)
- printf("pc_bonus4: unknown type %d %d %d %d %d!\n",type,type2,type3,type4,val);
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒNƒŠƒvƒg‚É‚æ‚éƒXƒLƒ‹Š“¾
- *------------------------------------------
- */
-int pc_skill(struct map_session_data *sd,int id,int level,int flag)
-{
- nullpo_retr(0, sd);
-
- if(level>MAX_SKILL_LEVEL){
- if(battle_config.error_log)
- printf("support card skill only!\n");
- return 0;
- }
- if(!flag && (sd->status.skill[id].id == id || level == 0)){ // ƒNƒGƒXƒgŠ“¾‚Ȃ炱‚±‚Å?Œ‚ðŠm”F‚µ‚Ä‘—M‚·‚é
- sd->status.skill[id].lv=level;
- status_calc_pc(sd,0);
- clif_skillinfoblock(sd);
- }
- else if(flag==2 && (sd->status.skill[id].id == id || level == 0)){ // ƒNƒGƒXƒgŠ“¾‚Ȃ炱‚±‚Å?Œ‚ðŠm”F‚µ‚Ä‘—M‚·‚é
- sd->status.skill[id].lv+=level;
- status_calc_pc(sd,0);
- clif_skillinfoblock(sd);
- }
- else if(sd->status.skill[id].lv < level){ // ?‚¦‚ç‚ê‚邪lv‚ª¬‚³‚¢‚È‚ç
- if(sd->status.skill[id].id==id)
- sd->status.skill[id].flag=sd->status.skill[id].lv+2; // lv‚ð‹L‰¯
- else {
- sd->status.skill[id].id=id;
- sd->status.skill[id].flag=1; // cardƒXƒLƒ‹‚Æ‚·‚é
- }
- sd->status.skill[id].lv=level;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int pc_blockskill_end(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd = map_id2sd(id);
- if (data <= 0 || data >= MAX_SKILL)
- return 0;
- if (sd) sd->blockskill[data] = 0;
-
- return 1;
-}
-int pc_blockskill_start (struct map_session_data *sd, int skillid, int tick)
-{
- nullpo_retr (-1, sd);
-
- if (skillid >= 10000 && skillid < 10015)
- skillid -= 9500;
- else if (skillid < 1 || skillid > MAX_SKILL)
- return -1;
-
- sd->blockskill[skillid] = 1;
- return add_timer(gettick()+tick,pc_blockskill_end,sd->bl.id,skillid);
-}
-
-/*==========================================
- * ƒJ?ƒh?“ü
- *------------------------------------------
- */
-int pc_insert_card(struct map_session_data *sd,int idx_card,int idx_equip)
-{
- nullpo_retr(0, sd);
-
- if(idx_card >= 0 && idx_card < MAX_INVENTORY && idx_equip >= 0 && idx_equip < MAX_INVENTORY && sd->inventory_data[idx_card]) {
- int i;
- int nameid=sd->status.inventory[idx_equip].nameid;
- int cardid=sd->status.inventory[idx_card].nameid;
- int ep=sd->inventory_data[idx_card]->equip;
-
- if( nameid <= 0 || sd->inventory_data[idx_equip] == NULL ||
- (sd->inventory_data[idx_equip]->type!=4 && sd->inventory_data[idx_equip]->type!=5)|| // ? ”õ‚¶‚á‚È‚¢
- ( sd->status.inventory[idx_equip].identify==0 ) || // –¢ŠÓ’è
- ( sd->status.inventory[idx_equip].card[0]==0x00ff) || // »‘¢•Ší
- ( sd->status.inventory[idx_equip].card[0]==0x00fe) ||
- ( (sd->inventory_data[idx_equip]->equip&ep)==0 ) || // ? ”õŒÂŠˆá‚¢
- ( sd->inventory_data[idx_equip]->type==4 && ep==32) || // ? Žè•Ší‚Æ‚ƒJ?ƒh
- ( sd->status.inventory[idx_equip].card[0]==(short)0xff00) || sd->status.inventory[idx_equip].equip){
-
- clif_insert_card(sd,idx_equip,idx_card,1);
- return 0;
- }
- for(i=0;i<sd->inventory_data[idx_equip]->slot;i++){
- if( sd->status.inventory[idx_equip].card[i] == 0){
- // ‹ó‚«ƒXƒƒbƒg‚ª‚ ‚Á‚½‚Ì‚Å·‚µ?‚Þ
- sd->status.inventory[idx_equip].card[i]=cardid;
-
- // ƒJ?ƒh‚ÍŒ¸‚ç‚·
- clif_insert_card(sd,idx_equip,idx_card,0);
- pc_delitem(sd,idx_card,1,1);
- return 0;
- }
- }
- }
- else
- clif_insert_card(sd,idx_equip,idx_card,1);
-
- return 0;
-}
-
-//
-// ƒAƒCƒeƒ€•¨
-//
-
-/*==========================================
- * ƒXƒLƒ‹‚É‚æ‚锃‚¢’lC³
- *------------------------------------------
- */
-int pc_modifybuyvalue(struct map_session_data *sd,int orig_value)
-{
- int skill,val = orig_value,rate1 = 0,rate2 = 0;
- if((skill=pc_checkskill(sd,MC_DISCOUNT))>0) // ƒfƒBƒXƒJƒEƒ“ƒg
- rate1 = 5+skill*2-((skill==10)? 1:0);
- if((skill=pc_checkskill(sd,RG_COMPULSION))>0) // ƒRƒ€ƒpƒ‹ƒVƒ‡ƒ“ƒfƒBƒXƒJƒEƒ“ƒg
- rate2 = 5+skill*4;
- if(rate1 < rate2) rate1 = rate2;
- if(rate1)
- val = (int)((double)orig_value*(double)(100-rate1)/100.);
- if(val < 0) val = 0;
- if(orig_value > 0 && val < 1) val = 1;
-
- return val;
-}
-
-/*==========================================
- * ƒXƒLƒ‹‚É‚æ‚é?‚è’lC³
- *------------------------------------------
- */
-int pc_modifysellvalue(struct map_session_data *sd,int orig_value)
-{
- int skill,val = orig_value,rate = 0;
- if((skill=pc_checkskill(sd,MC_OVERCHARGE))>0) // ƒI?ƒo?ƒ`ƒƒ?ƒW
- rate = 5+skill*2-((skill==10)? 1:0);
- if(rate)
- val = (int)((double)orig_value*(double)(100+rate)/100.);
- if(val < 0) val = 0;
- if(orig_value > 0 && val < 1) val = 1;
-
- return val;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€‚𔃂Á‚½ŽbÉAV‚µ‚¢ƒAƒCƒeƒ€—“‚ðŽg‚¤‚©A
- * 3–œŒÂ§ŒÀ‚É‚©‚©‚é‚©Šm”F
- *------------------------------------------
- */
-int pc_checkadditem(struct map_session_data *sd,int nameid,int amount)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- if(itemdb_isequip(nameid))
- return ADDITEM_NEW;
-
- for(i=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid==nameid){
- if(sd->status.inventory[i].amount+amount > MAX_AMOUNT)
- return ADDITEM_OVERAMOUNT;
- return ADDITEM_EXIST;
- }
- }
-
- if(amount > MAX_AMOUNT)
- return ADDITEM_OVERAMOUNT;
- return ADDITEM_NEW;
-}
-
-/*==========================================
- * ‹ó‚«ƒAƒCƒeƒ€—“‚ÌŒÂ?
- *------------------------------------------
- */
-int pc_inventoryblank(struct map_session_data *sd)
-{
- int i,b;
-
- nullpo_retr(0, sd);
-
- for(i=0,b=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid==0)
- b++;
- }
-
- return b;
-}
-
-/*==========================================
- * ‚¨‹à‚ð?‚¤
- *------------------------------------------
- */
-int pc_payzeny(struct map_session_data *sd,int zeny)
-{
- double z;
-
- nullpo_retr(0, sd);
-
- z = (double)sd->status.zeny;
- if(sd->status.zeny<zeny || z - (double)zeny > MAX_ZENY)
- return 1;
- sd->status.zeny-=zeny;
- clif_updatestatus(sd,SP_ZENY);
-
- return 0;
-}
-
-/*==========================================
- * ‚¨‹à‚𓾂é
- *------------------------------------------
- */
-int pc_getzeny(struct map_session_data *sd,int zeny)
-{
- double z;
-
- nullpo_retr(0, sd);
-
- z = (double)sd->status.zeny;
- if(z + (double)zeny > MAX_ZENY) {
- zeny = 0;
- sd->status.zeny = MAX_ZENY;
- }
- sd->status.zeny+=zeny;
- clif_updatestatus(sd,SP_ZENY);
-
- return 0;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€‚ð’T‚µ‚ÄAƒCƒ“ƒfƒbƒNƒX‚ð•Ô‚·
- *------------------------------------------
- */
-int pc_search_inventory(struct map_session_data *sd,int item_id)
-{
- int i;
-
- nullpo_retr(-1, sd);
-
- for(i=0;i<MAX_INVENTORY;i++) {
- if(sd->status.inventory[i].nameid == item_id &&
- (sd->status.inventory[i].amount > 0 || item_id == 0))
- return i;
- }
-
- return -1;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€’ljÁBŒÂ?‚Ì‚Ýitem\‘¢?‚Ì?Žš‚𖳎‹
- *------------------------------------------
- */
-int pc_additem(struct map_session_data *sd,struct item *item_data,int amount)
-{
- struct item_data *data;
- int i,w;
-
- nullpo_retr(1, sd);
- nullpo_retr(1, item_data);
-
- if(item_data->nameid <= 0 || amount <= 0)
- return 1;
- data = itemdb_search(item_data->nameid);
- if((w = data->weight*amount) + sd->weight > sd->max_weight)
- return 2;
-
- i = MAX_INVENTORY;
-
- if(!itemdb_isequip2(data)){
- // ‘• ”õ•i‚Å‚Í‚È‚¢‚Ì‚ÅAŠùŠ—L•i‚È‚çŒÂ”‚̂ݕω»‚³‚¹‚é
- for(i=0;i<MAX_INVENTORY;i++)
- if(sd->status.inventory[i].nameid == item_data->nameid &&
- sd->status.inventory[i].card[0] == item_data->card[0] && sd->status.inventory[i].card[1] == item_data->card[1] &&
- sd->status.inventory[i].card[2] == item_data->card[2] && sd->status.inventory[i].card[3] == item_data->card[3]) {
- if(sd->status.inventory[i].amount+amount > MAX_AMOUNT)
- return 5;
- sd->status.inventory[i].amount+=amount;
- clif_additem(sd,i,amount,0);
- break;
- }
- }
- if(i >= MAX_INVENTORY){
- // ‘• ”õ•i‚©–¢Š—L•i‚¾‚Á‚½‚Ì‚Å‹ó‚«—“‚֒ljÁ
- i = pc_search_inventory(sd,0);
- if(i >= 0) {
- memcpy(&sd->status.inventory[i],item_data,sizeof(sd->status.inventory[0]));
- sd->status.inventory[i].amount=amount;
- sd->inventory_data[i]=data;
- clif_additem(sd,i,amount,0);
- }
- else return 4;
- }
- sd->weight += w;
- clif_updatestatus(sd,SP_WEIGHT);
-
- return 0;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€‚ðŒ¸‚ç‚·
- *------------------------------------------
- */
-int pc_delitem(struct map_session_data *sd,int n,int amount,int type)
-{
- nullpo_retr(1, sd);
-
- if(sd->status.inventory[n].nameid==0 || amount <= 0 || sd->status.inventory[n].amount<amount || sd->inventory_data[n] == NULL)
- return 1;
-
- sd->status.inventory[n].amount -= amount;
- sd->weight -= sd->inventory_data[n]->weight*amount ;
- if(sd->status.inventory[n].amount<=0){
- if(sd->status.inventory[n].equip)
- pc_unequipitem(sd,n,3);
- memset(&sd->status.inventory[n],0,sizeof(sd->status.inventory[0]));
- sd->inventory_data[n] = NULL;
- }
- if(!(type&1))
- clif_delitem(sd,n,amount);
- if(!(type&2))
- clif_updatestatus(sd,SP_WEIGHT);
-
- return 0;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€‚ð—Ž‚·
- *------------------------------------------
- */
-int pc_dropitem(struct map_session_data *sd,int n,int amount)
-{
- nullpo_retr(1, sd);
-
- if(n < 0 || n >= MAX_INVENTORY)
- return 1;
-
- if(amount <= 0)
- return 1;
-
- if (sd->status.inventory[n].nameid <= 0 ||
- sd->status.inventory[n].amount < amount ||
- sd->trade_partner != 0 || sd->vender_id != 0 ||
- sd->status.inventory[n].amount <= 0 ||
- itemdb_isdropable(sd->status.inventory[n].nameid) == 0 || // Celest
- pc_candrop(sd,sd->status.inventory[n].nameid))
- return 1;
- map_addflooritem(&sd->status.inventory[n], amount, sd->bl.m, sd->bl.x, sd->bl.y, NULL, NULL, NULL, 0);
- pc_delitem(sd, n, amount, 0);
-
- return 0;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€‚ðE‚¤
- *------------------------------------------
- */
-int pc_takeitem(struct map_session_data *sd,struct flooritem_data *fitem)
-{
- int flag;
- unsigned int tick = gettick();
- struct map_session_data *first_sd = NULL,*second_sd = NULL,*third_sd = NULL;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, fitem);
-
- if(fitem->first_get_id > 0) {
- first_sd = map_id2sd(fitem->first_get_id);
- if(tick < fitem->first_get_tick) {
- if(fitem->first_get_id != sd->bl.id && !(first_sd && first_sd->status.party_id == sd->status.party_id)) {
- clif_additem(sd,0,0,6);
- return 0;
- }
- }
- else if(fitem->second_get_id > 0) {
- second_sd = map_id2sd(fitem->second_get_id);
- if(tick < fitem->second_get_tick) {
- if(fitem->first_get_id != sd->bl.id && fitem->second_get_id != sd->bl.id &&
- !(first_sd && first_sd->status.party_id == sd->status.party_id) && !(second_sd && second_sd->status.party_id == sd->status.party_id)) {
- clif_additem(sd,0,0,6);
- return 0;
- }
- }
- else if(fitem->third_get_id > 0) {
- third_sd = map_id2sd(fitem->third_get_id);
- if(tick < fitem->third_get_tick) {
- if(fitem->first_get_id != sd->bl.id && fitem->second_get_id != sd->bl.id && fitem->third_get_id != sd->bl.id &&
- !(first_sd && first_sd->status.party_id == sd->status.party_id) && !(second_sd && second_sd->status.party_id == sd->status.party_id) &&
- !(third_sd && third_sd->status.party_id == sd->status.party_id)) {
- clif_additem(sd,0,0,6);
- return 0;
- }
- }
- }
- }
- }
- if((flag = pc_additem(sd,&fitem->item_data,fitem->item_data.amount)))
- // d—Êover‚Ŏ擾Ž¸”s
- clif_additem(sd,0,0,flag);
- else {
- /* Žæ“¾¬Œ÷ */
- if(sd->attacktimer != -1)
- pc_stopattack(sd);
- clif_takeitem(&sd->bl,&fitem->bl);
- map_clearflooritem(fitem->bl.id);
- }
- return 0;
-}
-
-int pc_isUseitem(struct map_session_data *sd,int n)
-{
- struct item_data *item;
- int nameid;
-
- nullpo_retr(0, sd);
-
- item = sd->inventory_data[n];
- nameid = sd->status.inventory[n].nameid;
-
- if(item == NULL)
- return 0;
- if(item->type != 0 && item->type != 2)
- return 0;
- if((nameid == 605) && map[sd->bl.m].flag.gvg)
- return 0;
- if(nameid == 601 && (map[sd->bl.m].flag.noteleport || map[sd->bl.m].flag.gvg)) {
- clif_skill_teleportmessage(sd,0);
- return 0;
- }
- if(nameid == 602 && map[sd->bl.m].flag.noreturn)
- return 0;
- if(nameid == 604 && (map[sd->bl.m].flag.nobranch || map[sd->bl.m].flag.gvg))
- return 0;
- if(item->sex != 2 && sd->status.sex != item->sex)
- return 0;
- if(item->elv > 0 && sd->status.base_level < item->elv)
- return 0;
- if(((sd->status.class_==13 || sd->status.class_==4014) && ((1<<7)&item->class_) == 0) || // have mounted classes use unmounted items [Valaris]
- ((sd->status.class_==21 || sd->status.class_==4022) && ((1<<14)&item->class_) == 0))
- return 0;
- if(sd->status.class_!=13 && sd->status.class_!=4014 && sd->status.class_!=21 && sd->status.class_!=4022)
- if((sd->status.class_<=4000 && ((1<<sd->status.class_)&item->class_) == 0) || (sd->status.class_>4000 && sd->status.class_<4023 && ((1<<(sd->status.class_-4001))&item->class_) == 0) ||
- (sd->status.class_>=4023 && ((1<<(sd->status.class_-4023))&item->class_) == 0))
- return 0;
-
- if((log_config.branch > 0) && (nameid == 604))
- log_branch(sd);
-
- return 1;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€‚ðŽg‚¤
- *------------------------------------------
- */
-int pc_useitem(struct map_session_data *sd,int n)
-{
- int amount;
-
- nullpo_retr(1, sd);
-
- if(n >=0 && n < MAX_INVENTORY) {
- char *script;
- sd->itemid = sd->status.inventory[n].nameid;
- amount = sd->status.inventory[n].amount;
- if(sd->status.inventory[n].nameid <= 0 ||
- sd->status.inventory[n].amount <= 0 ||
- sd->sc_data[SC_BERSERK].timer!=-1 ||
- sd->sc_data[SC_MARIONETTE].timer!=-1 ||
- (pc_issit(sd) && (sd->itemid == 605 || sd->itemid == 606)) ||
- //added item_noequip.txt items check by Maya&[Lupus]
- (map[sd->bl.m].flag.pvp && (sd->inventory_data[n]->flag.no_equip&1) ) || // PVP
- (map[sd->bl.m].flag.gvg && (sd->inventory_data[n]->flag.no_equip>1) ) || // GVG
- !pc_isUseitem(sd,n) ) {
- clif_useitemack(sd,n,0,0);
- return 1;
- }
- script = sd->inventory_data[n]->use_script;
- amount = sd->status.inventory[n].amount;
- clif_useitemack(sd,n,amount-1,1);
- run_script(script,0,sd->bl.id,0);
- pc_delitem(sd,n,1,1);
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒJ?ƒgƒAƒCƒeƒ€’ljÁBŒÂ?‚Ì‚Ýitem\‘¢?‚Ì?Žš‚𖳎‹
- *------------------------------------------
- */
-int pc_cart_additem(struct map_session_data *sd,struct item *item_data,int amount)
-{
- struct item_data *data;
- int i,w;
-
- nullpo_retr(1, sd);
- nullpo_retr(1, item_data);
-
- if(item_data->nameid <= 0 || amount <= 0)
- return 1;
- data = itemdb_search(item_data->nameid);
-
- if((w=data->weight*amount) + sd->cart_weight > sd->cart_max_weight)
- return 1;
-
- i=MAX_CART;
- if(!itemdb_isequip2(data)){
- // ‘• ”õ•i‚Å‚Í‚È‚¢‚Ì‚ÅAŠùŠ—L•i‚È‚çŒÂ”‚̂ݕω»‚³‚¹‚é
- for(i=0;i<MAX_CART;i++){
- if(sd->status.cart[i].nameid==item_data->nameid &&
- sd->status.cart[i].card[0] == item_data->card[0] && sd->status.cart[i].card[1] == item_data->card[1] &&
- sd->status.cart[i].card[2] == item_data->card[2] && sd->status.cart[i].card[3] == item_data->card[3]){
- if(sd->status.cart[i].amount+amount > MAX_AMOUNT)
- return 1;
- sd->status.cart[i].amount+=amount;
- clif_cart_additem(sd,i,amount,0);
- break;
- }
- }
- }
- if(i >= MAX_CART){
- // ‘• ”õ•i‚©–¢Š—L•i‚¾‚Á‚½‚Ì‚Å‹ó‚«—“‚֒ljÁ
- for(i=0;i<MAX_CART;i++){
- if(sd->status.cart[i].nameid==0){
- memcpy(&sd->status.cart[i],item_data,sizeof(sd->status.cart[0]));
- sd->status.cart[i].amount=amount;
- sd->cart_num++;
- clif_cart_additem(sd,i,amount,0);
- break;
- }
- }
- if(i >= MAX_CART)
- return 1;
- }
- sd->cart_weight += w;
- clif_updatestatus(sd,SP_CARTINFO);
-
- return 0;
-}
-
-/*==========================================
- * ƒJ?ƒgƒAƒCƒeƒ€‚ðŒ¸‚ç‚·
- *------------------------------------------
- */
-int pc_cart_delitem(struct map_session_data *sd,int n,int amount,int type)
-{
- nullpo_retr(1, sd);
-
- if(sd->status.cart[n].nameid==0 ||
- sd->status.cart[n].amount<amount)
- return 1;
-
- sd->status.cart[n].amount -= amount;
- sd->cart_weight -= itemdb_weight(sd->status.cart[n].nameid)*amount ;
- if(sd->status.cart[n].amount <= 0){
- memset(&sd->status.cart[n],0,sizeof(sd->status.cart[0]));
- sd->cart_num--;
- }
- if(!type) {
- clif_cart_delitem(sd,n,amount);
- clif_updatestatus(sd,SP_CARTINFO);
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒJ?ƒg‚ÖƒAƒCƒeƒ€ˆÚ“®
- *------------------------------------------
- */
-int pc_putitemtocart(struct map_session_data *sd,int idx,int amount) {
- struct item *item_data;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, item_data = &sd->status.inventory[idx]);
-
- if(itemdb_isdropable(sd->status.inventory[idx].nameid) == 0)
- return 1;
- if(pc_candrop(sd,sd->status.inventory[idx].nameid)==1)
- return 1;
- if (item_data->nameid==0 || item_data->amount<amount || sd->vender_id)
- return 1;
- if (pc_cart_additem(sd,item_data,amount) == 0)
- return pc_delitem(sd,idx,amount,0);
-
- return 1;
-}
-
-/*==========================================
- * ƒJ?ƒg?‚̃AƒCƒeƒ€?Šm”F(ŒÂ?‚Ì·•ª‚ð•Ô‚·)
- *------------------------------------------
- */
-int pc_cartitem_amount(struct map_session_data *sd,int idx,int amount)
-{
- struct item *item_data;
-
- nullpo_retr(-1, sd);
- nullpo_retr(-1, item_data=&sd->status.cart[idx]);
-
- if( item_data->nameid==0 || !item_data->amount)
- return -1;
- return item_data->amount-amount;
-}
-/*==========================================
- * ƒJ?ƒg‚©‚çƒAƒCƒeƒ€ˆÚ“®
- *------------------------------------------
- */
-
-int pc_getitemfromcart(struct map_session_data *sd,int idx,int amount)
-{
- struct item *item_data;
- int flag;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, item_data=&sd->status.cart[idx]);
-
- if( item_data->nameid==0 || item_data->amount<amount || sd->vender_id )
- return 1;
- if((flag = pc_additem(sd,item_data,amount)) == 0)
- return pc_cart_delitem(sd,idx,amount,0);
-
- clif_additem(sd,0,0,flag);
- return 1;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€ŠÓ’è
- *------------------------------------------
- */
-int pc_item_identify(struct map_session_data *sd,int idx)
-{
- int flag=1;
-
- nullpo_retr(0, sd);
-
- // Celest
- if (sd->skillid == BS_REPAIRWEAPON)
- return pc_item_repair (sd, idx);
- else if (sd->skillid == WS_WEAPONREFINE)
- return pc_item_refine (sd, idx);
-
- if(idx >= 0 && idx < MAX_INVENTORY) {
- if(sd->status.inventory[idx].nameid > 0 && sd->status.inventory[idx].identify == 0 ){
- flag=0;
- sd->status.inventory[idx].identify=1;
- }
- clif_item_identified(sd,idx,flag);
- }
- else
- clif_item_identified(sd,idx,flag);
-
- return !flag;
-}
-
-/*==========================================
- * Weapon Repair [Celest]
- *------------------------------------------
- */
-int pc_item_repair(struct map_session_data *sd,int idx)
-{
- int flag=1, material;
- int materials[5] = { 0, 1002, 998, 999, 756 };
- struct item *item;
-
- nullpo_retr(0, sd);
-
- item = &sd->status.inventory[idx];
-
- if(idx >= 0 && idx < MAX_INVENTORY) {
- if(item->nameid > 0 && item->attribute == 1 ) {
- if (itemdb_type(item->nameid)==4)
- material = materials [itemdb_wlv (item->nameid)];
- else
- material = materials [3];
-
- if (pc_search_inventory(sd, material) < 0 ) { //fixed by Lupus (item pos can be = 0!)
- clif_skill_fail(sd,sd->skillid,0,0);
- return 0;
- }
- flag=0;
- item->attribute=0;
- //Temporary Weapon Repair code [DracoRPG]
- pc_delitem(sd, pc_search_inventory(sd, material), 1, 0);
- clif_equiplist(sd);
- clif_produceeffect(sd, 0, item->nameid);
- clif_misceffect(&sd->bl, 3);
- clif_displaymessage(sd->fd,"Item has been repaired.");
- }
- }
-
- return !flag;
-}
-
-/*==========================================
- * Weapon Refining [Celest]
- *------------------------------------------
- */
-int pc_item_refine(struct map_session_data *sd,int idx)
-{
- int flag = 1, i = 0, ep = 0, per;
- int material[5] = { 0, 1010, 1011, 984, 984 };
- struct item *item;
-
- nullpo_retr(0, sd);
- item = &sd->status.inventory[idx];
-
- if(idx >= 0 && idx < MAX_INVENTORY) {
- if(item->nameid > 0 && itemdb_type(item->nameid)==4) {
- // if it's no longer refineable
- if (item->refine >= sd->skilllv || item->refine == 10) {
- clif_skill_fail(sd,sd->skillid,0,0);
- return 0;
- }
- if ((i=pc_search_inventory(sd, material [itemdb_wlv (item->nameid)])) < 0 ) { //fixed by Lupus (item pos can be = 0!)
- clif_skill_fail(sd,sd->skillid,0,0);
- return 0;
- }
-
- per = percentrefinery [itemdb_wlv (item->nameid)][(int)item->refine];
- //per += pc_checkskill(sd,BS_WEAPONRESEARCH);
- per *= (75 + sd->status.job_level/2)/100;
-
- if (per > rand() % 100) {
- flag = 0;
- item->refine++;
- pc_delitem(sd, i, 1, 0);
- if(item->equip) {
- ep = item->equip;
- pc_unequipitem(sd,idx,3);
- }
- clif_refine(sd->fd,sd,0,idx,item->refine);
- clif_delitem(sd,idx,1);
- clif_additem(sd,idx,1,0);
- if (ep)
- pc_equipitem(sd,idx,ep);
- clif_misceffect(&sd->bl,3);
- }
- else {
- pc_delitem(sd, i, 1, 0);
- item->refine = 0;
- if(item->equip)
- pc_unequipitem(sd,idx,3);
- clif_refine(sd->fd,sd,1,idx,item->refine);
- pc_delitem(sd,idx,1,0);
- clif_misceffect(&sd->bl,2);
-
- clif_emotion(&sd->bl, 23);
- }
- }
- }
-
- return !flag;
-}
-
-/*==========================================
- * ƒXƒeƒBƒ‹•iŒöŠJ
- *------------------------------------------
- */
-int pc_show_steal(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd;
- int itemid;
- int type;
-
- struct item_data *item=NULL;
- char output[100];
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, sd=va_arg(ap,struct map_session_data *));
-
- itemid=va_arg(ap,int);
- type=va_arg(ap,int);
-
- if(!type){
- if((item=itemdb_exists(itemid))==NULL)
- sprintf(output,"%s stole an Unknown_Item.",sd->status.name);
- else
- sprintf(output,"%s stole %s.",sd->status.name,item->jname);
- clif_displaymessage( ((struct map_session_data *)bl)->fd, output);
- }else{
- sprintf(output,"%s has not stolen the item because of being overweight.",sd->status.name);
- clif_displaymessage( ((struct map_session_data *)bl)->fd, output);
- }
-
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-//** pc.c: Small Steal Item fix by fritz
-int pc_steal_item(struct map_session_data *sd,struct block_list *bl)
-{
- if(sd != NULL && bl != NULL && bl->type == BL_MOB) {
- int i,skill,itemid,flag, count;
- struct mob_data *md;
- md=(struct mob_data *)bl;
- if(!md->state.steal_flag && mob_db[md->class_].mexp <= 0 && !(mob_db[md->class_].mode&0x20) &&
- (!(md->class_>1324 && md->class_<1364))) // prevent stealing from treasure boxes [Valaris]
- {
- if (md->sc_data && (md->sc_data[SC_STONE].timer != -1 || md->sc_data[SC_FREEZE].timer != -1))
- return 0;
- skill = battle_config.skill_steal_type == 1
- ? (sd->paramc[4] - mob_db[md->class_].dex)/2 + pc_checkskill(sd,TF_STEAL)*6 + 10
- : sd->paramc[4] - mob_db[md->class_].dex + pc_checkskill(sd,TF_STEAL)*3 + 10;
-
- if(0 < skill)
- {
- for(count = 10; count <= 10 && count != 0; count--) //8 -> 10 Lupus
- {
- i = rand()%10; //8 -> 10 Lupus
- itemid = mob_db[md->class_].dropitem[i].nameid;
-
- if(itemid > 0 && itemdb_type(itemid) != 6)
- {
- //fixed rate. From Freya [Lupus]
- if (rand() % 10000 < ((mob_db[md->class_].dropitem[i].p * skill) / 100 + sd->add_steal_rate))
- {
- struct item tmp_item;
- memset(&tmp_item,0,sizeof(tmp_item));
- tmp_item.nameid = itemid;
- tmp_item.amount = 1;
- tmp_item.identify = 1;
- flag = pc_additem(sd,&tmp_item,1);
- if(battle_config.show_steal_in_same_party)
- {
- party_foreachsamemap(pc_show_steal,sd,1,sd,tmp_item.nameid,0);
- }
-
- if(flag)
- {
- if(battle_config.show_steal_in_same_party)
- {
- party_foreachsamemap(pc_show_steal,sd,1,sd,tmp_item.nameid,1);
- }
-
- clif_additem(sd,0,0,flag);
- }
- md->state.steal_flag = 1;
- return 1;
- }
- }
- }
- }
- }
- }
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int pc_steal_coin(struct map_session_data *sd,struct block_list *bl)
-{
- if(sd != NULL && bl != NULL && bl->type == BL_MOB) {
- int rate,skill;
- struct mob_data *md=(struct mob_data *)bl;
- if(md && !md->state.steal_coin_flag) {
- if (md->sc_data && (md->sc_data[SC_STONE].timer != -1 || md->sc_data[SC_FREEZE].timer != -1))
- return 0;
- skill = pc_checkskill(sd,RG_STEALCOIN)*10;
- rate = skill + (sd->status.base_level - mob_db[md->class_].lv)*3 + sd->paramc[4]*2 + sd->paramc[5]*2;
- if(rand()%1000 < rate) {
- pc_getzeny(sd,mob_db[md->class_].lv*10 + rand()%100);
- md->state.steal_coin_flag = 1;
- return 1;
- }
- }
- }
-
- return 0;
-}
-//
-//
-//
-/*==========================================
- * PC‚̈ʒuÝ’è
- *------------------------------------------
- */
-int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrtype)
-{
- char mapname[24];
- int m=0,disguise=0;
-
- nullpo_retr(0, sd);
-
- if(sd->chatID) // ƒ`ƒƒƒbƒg‚©‚ço‚é
- chat_leavechat(sd);
- if(sd->trade_partner) // Žæˆø‚ð’†?‚·‚é
- trade_tradecancel(sd);
- if(sd->state.storage_flag)
- storage_guild_storage_quit(sd,0);
- else
- storage_storage_quit(sd); // ‘qŒÉ‚ðŠJ‚¢‚Ä‚é‚È‚ç•Û‘¶‚·‚é
-
- if(sd->party_invite>0) // ƒp?ƒeƒB?—U‚ð‹‘”Û‚·‚é
- party_reply_invite(sd,sd->party_invite_account,0);
- if(sd->guild_invite>0) // ƒMƒ‹ƒh?—U‚ð‹‘”Û‚·‚é
- guild_reply_invite(sd,sd->guild_invite,0);
- if(sd->guild_alliance>0) // ƒMƒ‹ƒh“¯–¿?—U‚ð‹‘”Û‚·‚é
- guild_reply_reqalliance(sd,sd->guild_alliance_account,0);
-
- skill_castcancel(&sd->bl,0); // ‰r¥’†?
- pc_stop_walking(sd,0); // ?s’†?
- pc_stopattack(sd); // U?’†?
-
- if(pc_issit(sd)) {
- pc_setstand(sd);
- skill_gangsterparadise(sd,0);
- }
-
- if (sd->sc_count) {
- if(sd->sc_data[SC_TRICKDEAD].timer != -1)
- status_change_end(&sd->bl, SC_TRICKDEAD, -1);
- if(sd->sc_data[SC_BLADESTOP].timer!=-1)
- status_change_end(&sd->bl,SC_BLADESTOP,-1);
- if(sd->sc_data[SC_DANCING].timer!=-1) // clear dance effect when warping [Valaris]
- skill_stop_dancing(&sd->bl,0);
- if (sd->sc_data[SC_BASILICA].timer!=-1) {
- /*int i;
- for (i=0;i<MAX_SKILLUNITGROUP;i++)
- if (sd->skillunit[i].skill_id==HP_BASILICA)
- skill_delunitgroup(&sd->skillunit[i]);*/
-
- struct skill_unit_group *sg = (struct skill_unit_group *)sd->sc_data[SC_BASILICA].val4;
- if (sg && sg->src_id == sd->bl.id)
- skill_delunitgroup (sg);
- status_change_end(&sd->bl,SC_BASILICA,-1);
- }
- }
-
- if(sd->status.option&2)
- status_change_end(&sd->bl, SC_HIDING, -1);
- if(sd->status.option&4)
- status_change_end(&sd->bl, SC_CLOAKING, -1);
- if(sd->status.option&16384)
- status_change_end(&sd->bl, SC_CHASEWALK, -1);
-
- if(sd->status.pet_id > 0 && sd->pd && sd->pet.intimate > 0) {
- pet_stopattack(sd->pd);
- pet_changestate(sd->pd,MS_IDLE,0);
- }
-
- if(sd->disguise) { // clear disguises when warping [Valaris]
- clif_clearchar(&sd->bl, 9);
- disguise=sd->disguise;
- sd->disguise=0;
- }
-
- strncpy(mapname,mapname_org,sizeof(mapname));
- mapname[16]=0;
- if(strstr(mapname,".gat")==NULL && strstr(mapname,".afm")==NULL && strlen(mapname)<16){
- strcat(mapname,".gat");
- }
-
- m=map_mapname2mapid(mapname);
-
- if(m<0){
- if(sd->mapname[0]){
- int ip,port;
- if(map_mapname2ipport(mapname,&ip,&port)==0){
- skill_stop_dancing(&sd->bl,1);
- skill_unit_move(&sd->bl,gettick(),0);
- clif_clearchar_area(&sd->bl,clrtype&0xffff);
- skill_gangsterparadise(sd,0);
- map_delblock(&sd->bl);
- if(sd->status.pet_id > 0 && sd->pd) {
- if(sd->pd->bl.m != m && sd->pet.intimate <= 0) {
- pet_remove_map(sd);
- intif_delete_petdata(sd->status.pet_id);
- sd->status.pet_id = 0;
- sd->pd = NULL;
- sd->petDB = NULL;
- if(battle_config.pet_status_support)
- status_calc_pc(sd,2);
- }
- else if(sd->pet.intimate > 0) {
- pet_stopattack(sd->pd);
- pet_changestate(sd->pd,MS_IDLE,0);
- clif_clearchar_area(&sd->pd->bl,clrtype&0xffff);
- map_delblock(&sd->pd->bl);
- }
- }
- memcpy(sd->mapname,mapname,24);
- sd->bl.x=x;
- sd->bl.y=y;
- sd->state.waitingdisconnect=1;
- pc_clean_skilltree(sd);
- pc_makesavestatus(sd);
- if(sd->status.pet_id > 0 && sd->pd)
- intif_save_petdata(sd->status.account_id,&sd->pet);
- chrif_save(sd);
- storage_storage_save(sd);
- storage_delete(sd->status.account_id);
- chrif_changemapserver(sd, mapname, x, y, ip, port);
- return 0;
- }
- }
-#if 0
- clif_authfail_fd(sd->fd,0); // cancel
- clif_setwaitclose(sd->fd);
-#endif
- return 1;
- }
-
- if(x <0 || x >= map[m].xs || y <0 || y >= map[m].ys)
- x=y=0;
- if((x==0 && y==0) || map_getcell(m,x,y,CELL_CHKNOPASS)){
- if(x||y) {
- if(battle_config.error_log)
- printf("stacked (%d,%d)\n",x,y);
- }
- do {
- x=rand()%(map[m].xs-2)+1;
- y=rand()%(map[m].ys-2)+1;
- } while(map_getcell(m,x,y,CELL_CHKNOPASS));
- }
-
- if(sd->mapname[0] && sd->bl.prev != NULL){
- skill_unit_move(&sd->bl,gettick(),0);
- clif_clearchar_area(&sd->bl,clrtype&0xffff);
- skill_gangsterparadise(sd,0);
- map_delblock(&sd->bl);
- // pet
- if(sd->status.pet_id > 0 && sd->pd) {
- if(sd->pd->bl.m != m && sd->pet.intimate <= 0) {
- pet_remove_map(sd);
- intif_delete_petdata(sd->status.pet_id);
- sd->status.pet_id = 0;
- sd->pd = NULL;
- sd->petDB = NULL;
- if(battle_config.pet_status_support)
- status_calc_pc(sd,2);
- pc_clean_skilltree(sd);
- pc_makesavestatus(sd);
- chrif_save(sd);
- storage_storage_save(sd);
- }
- else if(sd->pet.intimate > 0) {
- pet_stopattack(sd->pd);
- pet_changestate(sd->pd,MS_IDLE,0);
- clif_clearchar_area(&sd->pd->bl,clrtype&0xffff);
- map_delblock(&sd->pd->bl);
- }
- }
- clif_changemap(sd,map[m].name,x,y); // [MouseJstr]
- }
-
- if(disguise) // disguise teleport fix [Valaris]
- sd->disguise=disguise;
-
- memcpy(sd->mapname,mapname,24);
- sd->bl.m = m;
- sd->to_x = x;
- sd->to_y = y;
-
- // moved and changed dance effect stopping
-
- sd->bl.x = x;
- sd->bl.y = y;
-
- if(sd->status.pet_id > 0 && sd->pd && sd->pet.intimate > 0) {
- sd->pd->bl.m = m;
- sd->pd->bl.x = sd->pd->to_x = x;
- sd->pd->bl.y = sd->pd->to_y = y;
- sd->pd->dir = sd->dir;
- }
-
-// map_addblock(&sd->bl); /// ƒuƒƒbƒN“o?‚Æspawn‚Í
-// clif_spawnpc(sd);
-
- return 0;
-}
-
-/*==========================================
- * PC‚̃‰ƒ“ƒ_ƒ€ƒ?ƒv
- *------------------------------------------
- */
-int pc_randomwarp(struct map_session_data *sd, int type) {
- int x,y,i=0;
- int m;
-
- nullpo_retr(0, sd);
-
- m=sd->bl.m;
-
- if (map[sd->bl.m].flag.noteleport) // ƒeƒŒƒ|?ƒg‹ÖŽ~
- return 0;
-
- do{
- x=rand()%(map[m].xs-2)+1;
- y=rand()%(map[m].ys-2)+1;
- }while(map_getcell(m,x,y,CELL_CHKNOPASS) && (i++)<1000 );
-
- if (i < 1000)
- pc_setpos(sd,map[m].name,x,y,type);
-
- return 0;
-}
-
-/*==========================================
- * Œ»ÝˆÊ’u‚̃ƒ‚
- *------------------------------------------
- */
-int pc_memo(struct map_session_data *sd, int i) {
- int skill;
- int j;
-
- nullpo_retr(0, sd);
-
- skill = pc_checkskill(sd, AL_WARP);
-
- if (i >= MIN_PORTAL_MEMO)
- i -= MIN_PORTAL_MEMO;
- else if (map[sd->bl.m].flag.nomemo || (map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd))) {
- clif_skill_teleportmessage(sd, 1);
- return 0;
- }
-
- if (skill < 1) {
- clif_skill_memo(sd,2);
- }
-
- if (skill < 2 || i < -1 || i > 2) {
- clif_skill_memo(sd, 1);
- return 0;
- }
-
- for(j = 0 ; j < 3; j++) {
- if (strcmp(sd->status.memo_point[j].map, map[sd->bl.m].name) == 0) {
- i = j;
- break;
- }
- }
-
- if (i == -1) {
- for(i = skill - 3; i >= 0; i--) {
- memcpy(&sd->status.memo_point[i+1],&sd->status.memo_point[i],
- sizeof(struct point));
- }
- i = 0;
- }
- memcpy(sd->status.memo_point[i].map, map[sd->bl.m].name, 24);
- sd->status.memo_point[i].x = sd->bl.x;
- sd->status.memo_point[i].y = sd->bl.y;
-
- clif_skill_memo(sd, 0);
-
- return 1;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int pc_can_reach(struct map_session_data *sd,int x,int y)
-{
- struct walkpath_data wpd;
-
- nullpo_retr(0, sd);
-
- if( sd->bl.x==x && sd->bl.y==y ) // “¯‚¶ƒ}ƒX
- return 1;
-
- // áŠQ•¨”»’è
- wpd.path_len=0;
- wpd.path_pos=0;
- wpd.path_half=0;
- return (path_search(&wpd,sd->bl.m,sd->bl.x,sd->bl.y,x,y,0)!=-1)?1:0;
-}
-
-//
-// ? s•¨
-//
-/*==========================================
- * ŽŸ‚Ì1?‚É‚©‚©‚éŽjÔ‚ðŒvŽZ
- *------------------------------------------
- */
-static int calc_next_walk_step(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- if(sd->walkpath.path_pos>=sd->walkpath.path_len)
- return -1;
- if(sd->walkpath.path[sd->walkpath.path_pos]&1)
- return sd->speed*14/10;
-
- return sd->speed;
-}
-
-/*==========================================
- * ”¼?i‚Þ(timer??)
- *------------------------------------------
- */
-static int pc_walk(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd;
- int i;
- int moveblock;
- int x,y,dx,dy;
-
- if ((sd = map_id2sd(id)) == NULL)
- return 0;
-
- if(sd->walktimer != tid){
- if(battle_config.error_log)
- printf("pc_walk %d != %d\n",sd->walktimer,tid);
- return 0;
- }
- sd->walktimer=-1;
- if(sd->walkpath.path_pos>=sd->walkpath.path_len || sd->walkpath.path_pos!=data)
- return 0;
-
- //?‚¢‚½‚Ì‚Å‘§‚̃^ƒCƒ}?‚ð‰Šú‰»
- sd->inchealspirithptick = 0;
- sd->inchealspiritsptick = 0;
-
- sd->walkpath.path_half ^= 1;
- if(sd->walkpath.path_half==0){ // ƒ}ƒX–Ú’†S‚Ö“r
- sd->walkpath.path_pos++;
-
- if(sd->state.change_walk_target){
- pc_walktoxy_sub(sd);
- return 0;
- }
- } else { // ƒ}ƒX–Ú‹«ŠE‚Ö“r
- if(sd->walkpath.path[sd->walkpath.path_pos]>=8)
- return 1;
-
- x = sd->bl.x;
- y = sd->bl.y;
- if(map_getcell(sd->bl.m,x,y,CELL_CHKNOPASS)) {
- pc_stop_walking(sd,1);
- return 0;
- }
- sd->dir=sd->head_dir=sd->walkpath.path[sd->walkpath.path_pos];
- dx = dirx[(int)sd->dir];
- dy = diry[(int)sd->dir];
- if(map_getcell(sd->bl.m,x,y,CELL_CHKNOPASS)) {
- pc_walktoxy_sub(sd);
- return 0;
- }
- if (skill_check_moonlit (&sd->bl,x+dx,y+dy)) {
- pc_stop_walking(sd,1);
- return 0;
- }
- moveblock = ( x/BLOCK_SIZE != (x+dx)/BLOCK_SIZE || y/BLOCK_SIZE != (y+dy)/BLOCK_SIZE);
-
- sd->walktimer = 1;
- map_foreachinmovearea(clif_pcoutsight,sd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,0,sd);
-
- x += dx;
- y += dy;
-
- skill_unit_move(&sd->bl,tick,0);
- if(moveblock) map_delblock(&sd->bl);
- sd->bl.x = x;
- sd->bl.y = y;
- if(moveblock) map_addblock(&sd->bl);
- skill_unit_move(&sd->bl,tick,1);
-
- map_foreachinmovearea(clif_pcinsight,sd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,0,sd);
- sd->walktimer = -1;
-
- if(sd->status.party_id>0){ // ƒp?ƒeƒB‚Ì‚g‚oî•ñ’Ê’m?¸
- struct party *p=party_search(sd->status.party_id);
- if(p!=NULL){
- int p_flag=0;
- map_foreachinmovearea(party_send_hp_check,sd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,BL_PC,sd->status.party_id,&p_flag);
- if(p_flag)
- sd->party_hp=-1;
- }
- }
- if(sd->status.option&4) // ƒNƒ?ƒLƒ“ƒO‚ÌÁ–Å?¸
- skill_check_cloaking(&sd->bl);
- /* ƒfƒBƒ{?ƒVƒ‡ƒ“?¸ */
- for(i=0;i<5;i++)
- if(sd->dev.val1[i]){
- skill_devotion3(&sd->bl,sd->dev.val1[i]);
- break;
- }
- /* ”íƒfƒBƒ{?ƒVƒ‡ƒ“?¸ */
- if(sd->sc_count) {
- if (sd->sc_data[SC_DANCING].timer!=-1)
- skill_unit_move_unit_group((struct skill_unit_group *)sd->sc_data[SC_DANCING].val2,sd->bl.m,dx,dy);
-
- if (sd->sc_data[SC_DEVOTION].val1)
- skill_devotion2(&sd->bl,sd->sc_data[SC_DEVOTION].val1);
-
- if (sd->sc_data[SC_BASILICA].timer!=-1) { // Basilica cancels if caster moves [celest]
- /*int i;
- for (i=0;i<MAX_SKILLUNITGROUP;i++)
- if (sd->skillunit[i].skill_id==HP_BASILICA*/
- struct skill_unit_group *sg = (struct skill_unit_group *)sd->sc_data[SC_BASILICA].val4;
- if (sg && sg->src_id == sd->bl.id)
- skill_delunitgroup (sg);
- status_change_end(&sd->bl,SC_BASILICA,-1);
- }
- }
-
- if(map_getcell(sd->bl.m,x,y,CELL_CHKNPC))
- npc_touch_areanpc(sd,sd->bl.m,x,y);
- else
- sd->areanpc_id=0;
- }
- if((i=calc_next_walk_step(sd))>0) {
- i = i>>1;
- if(i < 1 && sd->walkpath.path_half == 0)
- i = 1;
- sd->walktimer=add_timer(tick+i,pc_walk,id,sd->walkpath.path_pos);
- }
- if(battle_config.disp_hpmeter)
- clif_hpmeter(sd);
-
- return 0;
-}
-
-/*==========================================
- * ˆÚ“®‰Â”\‚©Šm”F‚µ‚ÄA‰Â”\‚È‚ç?sŠJŽn
- *------------------------------------------
- */
-static int pc_walktoxy_sub(struct map_session_data *sd)
-{
- struct walkpath_data wpd;
- int i;
-
- nullpo_retr(1, sd);
-
- if(path_search(&wpd,sd->bl.m,sd->bl.x,sd->bl.y,sd->to_x,sd->to_y,0))
- return 1;
- memcpy(&sd->walkpath,&wpd,sizeof(wpd));
-
- clif_walkok(sd);
- sd->state.change_walk_target=0;
-
- if((i=calc_next_walk_step(sd))>0){
- i = i>>2;
- sd->walktimer=add_timer(gettick()+i,pc_walk,sd->bl.id,0);
- }
- clif_movechar(sd);
-
- return 0;
-}
-
-/*==========================================
- * pc? s—v‹
- *------------------------------------------
- */
-int pc_walktoxy(struct map_session_data *sd,int x,int y)
-{
-
- nullpo_retr(0, sd);
-
- sd->to_x=x;
- sd->to_y=y;
- sd->idletime = tick_;
-
- if(sd->walktimer != -1 && sd->state.change_walk_target==0){
- // Œ»Ý?‚¢‚Ä‚¢‚éÅ’†‚Ì–Ú“I’n?X‚Ȃ̂Ń}ƒX–Ú‚Ì’†S‚É?‚½ŽbÉ
- // timer??‚©‚çpc_walktoxy_sub‚ðŒÄ‚Ԃ悤‚É‚·‚é
- sd->state.change_walk_target=1;
- } else {
- pc_walktoxy_sub(sd);
- }
-
- if (sd->state.gmaster_flag > 0) {
- struct guild *g = (struct guild *)sd->state.gmaster_flag;
- if (g)
- map_foreachinarea (skill_guildaura_sub, sd->bl.m,
- sd->bl.x-2, sd->bl.y-2, sd->bl.x+2, sd->bl.y+2, BL_PC,
- sd->bl.id, sd->status.guild_id, g);
- }
-
- return 0;
-}
-
-/*==========================================
- * ? s’âŽ~
- *------------------------------------------
- */
-int pc_stop_walking(struct map_session_data *sd,int type)
-{
- nullpo_retr(0, sd);
-
- if(sd->walktimer != -1) {
- delete_timer(sd->walktimer,pc_walk);
- sd->walktimer=-1;
- }
- sd->walkpath.path_len=0;
- sd->to_x = sd->bl.x;
- sd->to_y = sd->bl.y;
- if(type&0x01)
- clif_fixpos(&sd->bl);
- if(type&0x02 && battle_config.pc_damage_delay) {
- unsigned int tick = gettick();
- int delay = status_get_dmotion(&sd->bl);
- if(sd->canmove_tick < tick)
- sd->canmove_tick = tick + delay;
- }
-
- return 0;
-}
-
-/*==========================================
- * Random walk
- *------------------------------------------
- */
-int pc_randomwalk(struct map_session_data *sd,int tick)
-{
- const int retrycount = 20;
- nullpo_retr(0, sd);
-
- if(DIFF_TICK(sd->next_walktime,tick)<0){
- int i,x,y,d;
- d = rand()%7+5;
- for(i=0;i<retrycount;i++){ // Search of a movable place
- int r=rand();
- x=sd->bl.x+r%(d*2+1)-d;
- y=sd->bl.y+r/(d*2+1)%(d*2+1)-d;
- if((map_getcell(sd->bl.m,x,y,CELL_CHKPASS)) && pc_walktoxy(sd,x,y)==0)
- break;
- }
- // Working on this part later [celest]
- /*for(i=c=0;i<sd->walkpath.path_len;i++){ // The next walk start time is calculated.
- if(sd->walkpath.path[i]&1)
- c+=sd->speed*14/10;
- else
- c+=sd->speed;
- }
- sd->next_walktime = (d=tick+rand()%3000+c);
- return d;*/
- return 1;
- }
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int pc_movepos(struct map_session_data *sd,int dst_x,int dst_y)
-{
- int moveblock;
- int dx,dy;
- int tick = gettick();
-
- struct walkpath_data wpd;
-
- nullpo_retr(0, sd);
-
- if(path_search(&wpd,sd->bl.m,sd->bl.x,sd->bl.y,dst_x,dst_y,0))
- return 1;
-
- sd->dir = sd->head_dir = map_calc_dir(&sd->bl, dst_x,dst_y);
-
- dx = dst_x - sd->bl.x;
- dy = dst_y - sd->bl.y;
-
- moveblock = ( sd->bl.x/BLOCK_SIZE != dst_x/BLOCK_SIZE || sd->bl.y/BLOCK_SIZE != dst_y/BLOCK_SIZE);
-
- map_foreachinmovearea(clif_pcoutsight,sd->bl.m,sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE,sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,dx,dy,0,sd);
-
- skill_unit_move(&sd->bl,tick,0);
- if(moveblock) map_delblock(&sd->bl);
- sd->bl.x = dst_x;
- sd->bl.y = dst_y;
- if(moveblock) map_addblock(&sd->bl);
- skill_unit_move(&sd->bl,tick,1);
-
- map_foreachinmovearea(clif_pcinsight,sd->bl.m,sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE,sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,-dx,-dy,0,sd);
-
- if(sd->status.party_id>0){ // ƒp?ƒeƒB‚Ì‚g‚oî•ñ’Ê’m?¸
- struct party *p=party_search(sd->status.party_id);
- if(p!=NULL){
- int flag=0;
- map_foreachinmovearea(party_send_hp_check,sd->bl.m,sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE,sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,-dx,-dy,BL_PC,sd->status.party_id,&flag);
- if(flag)
- sd->party_hp=-1;
- }
- }
-
- if(sd->status.option&4) // ƒNƒ?ƒLƒ“ƒO‚ÌÁ–Å?¸
- skill_check_cloaking(&sd->bl);
-
- if(map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKNPC))
- npc_touch_areanpc(sd,sd->bl.m,sd->bl.x,sd->bl.y);
- else
- sd->areanpc_id=0;
- return 0;
-}
-
-//
-// •Ší??
-//
-/*==========================================
- * ƒXƒLƒ‹‚Ì?õ Š—L‚µ‚Ä‚¢‚½ê‡Lv‚ª•Ô‚é
- *------------------------------------------
- */
-int pc_checkskill(struct map_session_data *sd,int skill_id)
-{
- if(sd == NULL) return 0;
- if( skill_id>=10000 ){
- struct guild *g;
- if( sd->status.guild_id>0 && (g=guild_search(sd->status.guild_id))!=NULL)
- return guild_checkskill(g,skill_id);
- return 0;
- }
-
- if(sd->status.skill[skill_id].id == skill_id)
- return (sd->status.skill[skill_id].lv);
-
- return 0;
-}
-
-/*==========================================
- * •Ší?X‚É‚æ‚éƒXƒLƒ‹‚Ì??ƒ`ƒFƒbƒN
- * ˆø?F
- * struct map_session_data *sd ƒZƒbƒVƒ‡ƒ“ƒf?ƒ^
- * int nameid ?”õ•iID
- * •Ô‚è’lF
- * 0 ?X‚È‚µ
- * -1 ƒXƒLƒ‹‚ð‰ðœ
- *------------------------------------------
- */
-int pc_checkallowskill(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
- nullpo_retr(0, sd->sc_data);
-
- if(!(skill_get_weapontype(KN_TWOHANDQUICKEN)&(1<<sd->status.weapon)) && sd->sc_data[SC_TWOHANDQUICKEN].timer!=-1) { // 2HQ
- status_change_end(&sd->bl,SC_TWOHANDQUICKEN,-1); // 2HQ‚ð‰ðœ
- return -1;
- }
- if(!(skill_get_weapontype(LK_AURABLADE)&(1<<sd->status.weapon)) && sd->sc_data[SC_AURABLADE].timer!=-1) { /* ƒI?ƒ‰ƒuƒŒ?ƒh */
- status_change_end(&sd->bl,SC_AURABLADE,-1); /* ƒI?ƒ‰ƒuƒŒ?ƒh‚ð‰ðœ */
- return -1;
- }
- if(!(skill_get_weapontype(LK_PARRYING)&(1<<sd->status.weapon)) && sd->sc_data[SC_PARRYING].timer!=-1) { /* ƒpƒŠƒCƒ“ƒO */
- status_change_end(&sd->bl,SC_PARRYING,-1); /* ƒpƒŠƒCƒ“ƒO‚ð‰ðœ */
- return -1;
- }
- if(!(skill_get_weapontype(LK_CONCENTRATION)&(1<<sd->status.weapon)) && sd->sc_data[SC_CONCENTRATION].timer!=-1) { /* ƒRƒ“ƒZƒ“ƒgƒŒ?ƒVƒ‡ƒ“ */
- status_change_end(&sd->bl,SC_CONCENTRATION,-1); /* ƒRƒ“ƒZƒ“ƒgƒŒ?ƒVƒ‡ƒ“‚ð‰ðœ */
- return -1;
- }
- if(!(skill_get_weapontype(CR_SPEARQUICKEN)&(1<<sd->status.weapon)) && sd->sc_data[SC_SPEARSQUICKEN].timer!=-1){ // ƒXƒsƒAƒNƒBƒbƒPƒ“
- status_change_end(&sd->bl,SC_SPEARSQUICKEN,-1); // ƒXƒsƒAƒNƒCƒbƒPƒ“‚ð‰ðœ
- return -1;
- }
- if(!(skill_get_weapontype(BS_ADRENALINE)&(1<<sd->status.weapon)) && sd->sc_data[SC_ADRENALINE].timer!=-1){ // ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…
- status_change_end(&sd->bl,SC_ADRENALINE,-1); // ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…‚ð‰ðœ
- return -1;
- }
-
- if(sd->status.shield <= 0) {
- if(sd->sc_data[SC_AUTOGUARD].timer!=-1){ // ƒI?ƒgƒK?ƒh
- status_change_end(&sd->bl,SC_AUTOGUARD,-1);
- return -1;
- }
- if(sd->sc_data[SC_DEFENDER].timer!=-1){ // ƒfƒBƒtƒFƒ“ƒ_?
- status_change_end(&sd->bl,SC_DEFENDER,-1);
- return -1;
- }
- if(sd->sc_data[SC_REFLECTSHIELD].timer!=-1){ //ƒŠƒtƒŒƒNƒgƒV?ƒ‹ƒh
- status_change_end(&sd->bl,SC_REFLECTSHIELD,-1);
- return -1;
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * ? ”õ•i‚̃`ƒFƒbƒN
- *------------------------------------------
- */
-int pc_checkequip(struct map_session_data *sd,int pos)
-{
- int i;
-
- nullpo_retr(-1, sd);
-
- for(i=0;i<11;i++){
- if(pos & equip_pos[i])
- return sd->equip_index[i];
- }
-
- return -1;
-}
-
-/*==========================================
- * ?¶E‚â—{ŽqE‚ÌŒ³‚ÌE‹Æ‚ð•Ô‚·
- *------------------------------------------
- */
-struct pc_base_job pc_calc_base_job(int b_class)
-{
- struct pc_base_job bj;
- //?¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
- //if(b_class < MAX_PC_CLASS){ //’Êí
- if(b_class < 4001){
- bj.job = b_class;
- bj.upper = 0;
- }else if(b_class >= 4001 && b_class < 4023){ //?¶E
- // Athena almost never uses this... well, used this. :3
- bj.job = b_class - 4001;
- bj.upper = 1;
- //}else if(b_class == 23 + 4023 -1){ //—{ŽqƒXƒpƒmƒr
- }else if(b_class == 4045){ // super baby
- //bj.job = b_class - (4023 - 1);
- bj.job = 23;
- bj.upper = 2;
- }else{ //—{ŽqƒXƒpƒmƒrˆÈŠO‚Ì—{Žq
- bj.job = b_class - 4023;
- bj.upper = 2;
- }
-
- if(bj.job == 0){
- bj.type = 0;
- }else if(bj.job < 7){
- bj.type = 1;
- }else{
- bj.type = 2;
- }
-
- return bj;
-}
-
-/*==========================================
- * For quick calculating [Celest]
- *------------------------------------------
- */
-int pc_calc_base_job2 (int b_class)
-{
- if(b_class < 4001)
- return b_class;
- else if(b_class >= 4001 && b_class < 4023)
- return b_class - 4001;
- else if(b_class == 4045)
- return 23;
- return b_class - 4023;
-}
-
-int pc_calc_upper(int b_class)
-{
- if(b_class < 4001)
- return 0;
- else if(b_class >= 4001 && b_class < 4023)
- return 1;
- return 2;
-}
-
-/*==========================================
- * PC‚ÌU? (timer??)
- *------------------------------------------
- */
-int pc_attack_timer(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd;
- struct block_list *bl;
- struct status_change *sc_data;
- short *opt;
- int dist,skill,range;
-
- sd=map_id2sd(id);
- if(sd == NULL)
- return 0;
-
- sd->idletime = tick_;
-
- if(sd->attacktimer != tid){
- if(battle_config.error_log)
- printf("pc_attack_timer %d != %d\n",sd->attacktimer,tid);
- return 0;
- }
- sd->attacktimer=-1;
-
- if(sd->bl.prev == NULL)
- return 0;
-
- bl=map_id2bl(sd->attacktarget);
- if(bl==NULL || bl->prev == NULL)
- return 0;
-
- if(bl->type == BL_PC) {
- if (pc_isdead((struct map_session_data *)bl))
- return 0;
- else if (pc_ishiding((struct map_session_data *)bl))
- return 0;
- }
-
- // “¯‚¶map‚Å‚È‚¢‚È‚çU?‚µ‚È‚¢
- // PC‚ªŽ€‚ñ‚Å‚Ä‚àU?‚µ‚È‚¢
- if(sd->bl.m != bl->m || pc_isdead(sd))
- return 0;
-
- //if( sd->opt1>0 || sd->status.option&2 || sd->status.option&16388) // ˆÙí‚È‚Ç‚ÅU?‚Å‚«‚È‚¢
- if( sd->opt1>0 || sd->status.option&2 || sd->status.option&16384) // ˆÙí‚È‚Ç‚ÅU?‚Å‚«‚È‚¢
- return 0;
-
- if (sd->sc_count) {
- if(sd->sc_data[SC_AUTOCOUNTER].timer != -1)
- return 0;
- if(sd->sc_data[SC_BLADESTOP].timer != -1)
- return 0;
- }
-
- //if((opt = status_get_option(bl)) != NULL && *opt&0x46)
- if((opt = status_get_option(bl)) != NULL && *opt&0x42)
- return 0;
- if((sc_data = status_get_sc_data(bl)) != NULL) {
- if (sc_data[SC_TRICKDEAD].timer != -1 ||
- sc_data[SC_BASILICA].timer != -1)
- return 0;
- }
-
- if(sd->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST) <= 0)
- return 0;
-
- if(!battle_config.sdelay_attack_enable && pc_checkskill(sd,SA_FREECAST) <= 0) {
- if(DIFF_TICK(tick , sd->canact_tick) < 0) {
- clif_skill_fail(sd,1,4,0);
- return 0;
- }
- }
-
- if(sd->status.weapon == 11 && sd->equip_index[10] < 0) {
- clif_arrow_fail(sd,0);
- return 0;
- }
-
- dist = distance(sd->bl.x,sd->bl.y,bl->x,bl->y);
- range = sd->attackrange;
- if(sd->status.weapon != 11) range++;
- if( dist > range ){ // ? ‚©‚È‚¢‚̂ňړ®
- if(pc_can_reach(sd,bl->x,bl->y))
- clif_movetoattack(sd,bl);
- return 0;
- }
-
- if(dist <= range && !battle_check_range(&sd->bl,bl,range) ) {
- if(pc_can_reach(sd,bl->x,bl->y) && sd->canmove_tick < tick && (sd->sc_data[SC_ANKLE].timer == -1 || sd->sc_data[SC_SPIDERWEB].timer == -1))
- pc_walktoxy(sd,bl->x,bl->y);
- sd->attackabletime = tick + (sd->aspd<<1);
- }
- else {
- if(battle_config.pc_attack_direction_change)
- sd->dir=sd->head_dir=map_calc_dir(&sd->bl, bl->x,bl->y ); // Œü‚«Ý’è
-
- if(sd->walktimer != -1)
- pc_stop_walking(sd,1);
-
- if(sd->sc_data[SC_COMBO].timer == -1) {
- map_freeblock_lock();
- pc_stop_walking(sd,0);
- sd->attacktarget_lv = battle_weapon_attack(&sd->bl,bl,tick,0);
- // &2 = ? - Celest
- if(!(battle_config.pc_cloak_check_type&2) && sd->sc_data[SC_CLOAKING].timer != -1)
- status_change_end(&sd->bl,SC_CLOAKING,-1);
- if(sd->status.pet_id > 0 && sd->pd && sd->petDB && battle_config.pet_attack_support)
- pet_target_check(sd,bl,0);
- map_freeblock_unlock();
- if(sd->skilltimer != -1 && (skill = pc_checkskill(sd,SA_FREECAST)) > 0 ) // ƒtƒŠ?ƒLƒƒƒXƒg
- sd->attackabletime = tick + ((sd->aspd<<1)*(150 - skill*5)/100);
- else
- sd->attackabletime = tick + (sd->aspd<<1);
- }
- else if(sd->attackabletime <= tick) {
- if(sd->skilltimer != -1 && (skill = pc_checkskill(sd,SA_FREECAST)) > 0 ) // ƒtƒŠ?ƒLƒƒƒXƒg
- sd->attackabletime = tick + ((sd->aspd<<1)*(150 - skill*5)/100);
- else
- sd->attackabletime = tick + (sd->aspd<<1);
- }
- if(sd->attackabletime <= tick) sd->attackabletime = tick + (battle_config.max_aspd<<1);
- }
-
- if(sd->state.attack_continue) {
- sd->attacktimer=add_timer(sd->attackabletime,pc_attack_timer,sd->bl.id,0);
- }
-
- return 0;
-}
-
-/*==========================================
- * U?—v‹
- * type‚ª1‚È‚ç??U?
- *------------------------------------------
- */
-int pc_attack(struct map_session_data *sd,int target_id,int type)
-{
- struct block_list *bl;
- int d;
-
-
- nullpo_retr(0, sd);
-
- bl=map_id2bl(target_id);
- if(bl==NULL)
- return 1;
-
- sd->idletime = tick_;
-
- if(bl->type==BL_NPC) { // monster npcs [Valaris]
- //npc_click(sd,RFIFOL(sd->fd,2));
- npc_click(sd,target_id); // submitted by leinsirk10 [Celest]
- return 0;
- }
-
- if(battle_check_target(&sd->bl,bl,BCT_ENEMY) <= 0)
- return 1;
- if(sd->attacktimer != -1)
- pc_stopattack(sd);
- sd->attacktarget=target_id;
- sd->state.attack_continue=type;
-
- d=DIFF_TICK(sd->attackabletime,gettick());
- if(d>0 && d<2000){ // U?delay’†
- sd->attacktimer=add_timer(sd->attackabletime,pc_attack_timer,sd->bl.id,0);
- } else {
- // –{?timer??‚Ȃ̂ňø?‚ð‡‚킹‚é
- pc_attack_timer(-1,gettick(),sd->bl.id,0);
- }
-
- return 0;
-}
-
-/*==========================================
- * ??U?’âŽ~
- *------------------------------------------
- */
-int pc_stopattack(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- if(sd->attacktimer != -1) {
- delete_timer(sd->attacktimer,pc_attack_timer);
- sd->attacktimer=-1;
- }
- sd->attacktarget=0;
- sd->state.attack_continue=0;
-
- return 0;
-}
-
-int pc_follow_timer(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd, *bl;
-
- sd=map_id2sd(id);
-
- if(sd == NULL || sd->followtimer != tid || pc_isdead(sd))
- return 0;
-
- sd->followtimer=-1;
-
- do {
- if(sd->bl.prev == NULL)
- break;
-
- bl=(struct map_session_data *) map_id2bl(sd->followtarget);
-
- if(bl==NULL)
- return 0;
-
- if(bl->bl.prev == NULL)
- break;
-
- if(bl->bl.type == BL_PC && pc_isdead((struct map_session_data *)bl))
- return 0;
-
- if (sd->skilltimer == -1 && sd->attacktimer == -1 && sd->walktimer == -1) {
- if((sd->bl.m == bl->bl.m) && pc_can_reach(sd,bl->bl.x,bl->bl.y)) {
- if (distance(sd->bl.x,sd->bl.y,bl->bl.x,bl->bl.y) > 5)
- pc_walktoxy(sd,bl->bl.x,bl->bl.y);
- } else
- pc_setpos((struct map_session_data*)sd, bl->mapname, bl->bl.x, bl->bl.y, 3);
- }
- } while (0);
-
- sd->followtimer=add_timer(tick + sd->aspd,pc_follow_timer,sd->bl.id,0);
-
- return 0;
-}
-
-int pc_follow(struct map_session_data *sd,int target_id)
-{
- struct block_list *bl;
-
- bl=map_id2bl(target_id);
- if(bl==NULL)
- return 1;
- sd->followtarget=target_id;
- if(sd->followtimer != -1) {
- delete_timer(sd->followtimer,pc_follow_timer);
- sd->followtimer = -1;
- }
-
- pc_follow_timer(-1,gettick(),sd->bl.id,0);
-
- return 0;
-}
-
-int pc_checkbaselevelup(struct map_session_data *sd)
-{
- int next = pc_nextbaseexp(sd);
-
- nullpo_retr(0, sd);
-
- if(sd->status.base_exp >= next && next > 0){
- struct pc_base_job s_class = pc_calc_base_job(sd->status.class_);
-
- // base‘¤ƒŒƒxƒ‹ƒAƒbƒv?—
- sd->status.base_exp -= next;
-
- sd->status.base_level ++;
- sd->status.status_point += (sd->status.base_level+14) / 5 ;
- clif_updatestatus(sd,SP_STATUSPOINT);
- clif_updatestatus(sd,SP_BASELEVEL);
- clif_updatestatus(sd,SP_NEXTBASEEXP);
- status_calc_pc(sd,0);
- pc_heal(sd,sd->status.max_hp,sd->status.max_sp);
-
- //ƒXƒpƒmƒr‚̓LƒŠƒGAƒCƒ€ƒ|Aƒ}ƒjƒsAƒOƒAƒTƒtƒ‰Lv1‚ª‚©‚©‚é
- if(s_class.job == 23){
- status_change_start(&sd->bl,SkillStatusChangeTable[PR_KYRIE],1,0,0,0,skill_get_time(PR_KYRIE,1),0 );
- status_change_start(&sd->bl,SkillStatusChangeTable[PR_IMPOSITIO],1,0,0,0,skill_get_time(PR_IMPOSITIO,1),0 );
- status_change_start(&sd->bl,SkillStatusChangeTable[PR_MAGNIFICAT],1,0,0,0,skill_get_time(PR_MAGNIFICAT,1),0 );
- status_change_start(&sd->bl,SkillStatusChangeTable[PR_GLORIA],1,0,0,0,skill_get_time(PR_GLORIA,1),0 );
- status_change_start(&sd->bl,SkillStatusChangeTable[PR_SUFFRAGIUM],1,0,0,0,skill_get_time(PR_SUFFRAGIUM,1),0 );
- }
-
- clif_misceffect(&sd->bl,0);
- //ƒŒƒxƒ‹ƒAƒbƒv‚µ‚½‚̂Ńp?ƒeƒB?î•ñ‚ðXV‚·‚é
- //(Œö•½”Í?ƒ`ƒFƒbƒN)
- party_send_movemap(sd);
- return 1;
- }
-
- return 0;
-}
-
-int pc_checkjoblevelup(struct map_session_data *sd)
-{
- int next = pc_nextjobexp(sd);
-
- nullpo_retr(0, sd);
-
- if(sd->status.job_exp >= next && next > 0){
- // job‘¤ƒŒƒxƒ‹ƒAƒbƒv?—
- sd->status.job_exp -= next;
- sd->status.job_level ++;
- clif_updatestatus(sd,SP_JOBLEVEL);
- clif_updatestatus(sd,SP_NEXTJOBEXP);
- sd->status.skill_point ++;
- clif_updatestatus(sd,SP_SKILLPOINT);
- status_calc_pc(sd,0);
-
- clif_misceffect(&sd->bl,1);
- return 1;
- }
-
- return 0;
-}
-
-/*==========================================
- * ??’lŽæ“¾
- *------------------------------------------
- */
-int pc_gainexp(struct map_session_data *sd,int base_exp,int job_exp)
-{
- char output[256];
- float nextbp=0, nextjp=0;
- int nextb=0, nextj=0;
- nullpo_retr(0, sd);
-
- if(sd->bl.prev == NULL || pc_isdead(sd))
- return 0;
-
- if((battle_config.pvp_exp == 0) && map[sd->bl.m].flag.pvp) // [MouseJstr]
- return 0; // no exp on pvp maps
-
- if(sd->sc_data[SC_RICHMANKIM].timer != -1) { // added bounds checking [Vaalris]
- base_exp += base_exp*(25 + sd->sc_data[SC_RICHMANKIM].val1*25)/100;
- job_exp += job_exp*(25 + sd->sc_data[SC_RICHMANKIM].val1*25)/100;
- }
-
- if(sd->status.guild_id>0){ // ƒMƒ‹ƒh‚Éã”[
- base_exp-=guild_payexp(sd,base_exp);
- if(base_exp < 0)
- base_exp = 0;
- }
-
- if(!battle_config.multi_level_up && pc_nextbaseafter(sd) && sd->status.base_exp+base_exp >= pc_nextbaseafter(sd)) {
- base_exp = pc_nextbaseafter(sd) - sd->status.base_exp;
- if (base_exp < 0)
- base_exp = 0;
- }
- nextb = pc_nextbaseexp(sd);
- nextj = pc_nextjobexp(sd);
- if (nextb > 0)
- nextbp = (float) base_exp / (float) nextb;
- if (nextj > 0)
- nextjp = (float) job_exp / (float) nextj;
-
- sd->status.base_exp += base_exp;
- if(sd->status.base_exp < 0)
- sd->status.base_exp = 0;
-
- while(pc_checkbaselevelup(sd)) ;
-
- clif_updatestatus(sd,SP_BASEEXP);
- if(!battle_config.multi_level_up && pc_nextjobafter(sd) && sd->status.job_exp+job_exp >= pc_nextjobafter(sd)) {
- job_exp = pc_nextjobafter(sd) - sd->status.job_exp;
- if (job_exp < 0)
- job_exp = 0;
- }
-
- sd->status.job_exp += job_exp;
- if(sd->status.job_exp < 0)
- sd->status.job_exp = 0;
-
- while(pc_checkjoblevelup(sd)) ;
-
- clif_updatestatus(sd,SP_JOBEXP);
-
- if(battle_config.disp_experience && !sd->noexp){
- sprintf(output,
- "Experienced Gained Base:%d (%.2f%%) Job:%d (%.2f%%)",base_exp,nextbp*(float)100,job_exp,nextjp*(float)100);
- clif_disp_onlyself(sd,output,strlen(output));
- }
-
- return 0;
-}
-
-/*==========================================
- * base level‘¤•K—v??’lŒvŽZ
- *------------------------------------------
- */
-int pc_nextbaseexp(struct map_session_data *sd)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- if(sd->status.base_level>=MAX_LEVEL || sd->status.base_level<=0)
- return 0;
-
- if(sd->status.class_==0) i=0;
- else if(sd->status.class_<=6) i=1;
- else if(sd->status.class_<=22) i=2;
- else if(sd->status.class_==23) i=3;
- else if(sd->status.class_==4001) i=4;
- else if(sd->status.class_<=4007) i=5;
- else i=6;
-
- return exp_table[i][sd->status.base_level-1];
-}
-
-/*==========================================
- * job level‘¤•K—v??’lŒvŽZ
- *------------------------------------------
- */
-int pc_nextjobexp(struct map_session_data *sd)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- if(sd->status.job_level>=MAX_LEVEL || sd->status.job_level<=0)
- return 0;
-
- if(sd->status.class_==0) i=7;
- else if(sd->status.class_<=6) i=8;
- else if(sd->status.class_<=22) i=9;
- else if(sd->status.class_==23) i=10;
- else if(sd->status.class_==4001) i=11;
- else if(sd->status.class_<=4007) i=12;
- else i=13;
-
- return exp_table[i][sd->status.job_level-1];
-}
-
-/*==========================================
- * base level after next [Valaris]
- *------------------------------------------
- */
-int pc_nextbaseafter(struct map_session_data *sd)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- if(sd->status.base_level>=MAX_LEVEL || sd->status.base_level<=0)
- return 0;
-
- if(sd->status.class_==0) i=0;
- else if(sd->status.class_<=6) i=1;
- else if(sd->status.class_<=22) i=2;
- else if(sd->status.class_==23) i=3;
- else if(sd->status.class_==4001) i=4;
- else if(sd->status.class_<=4007) i=5;
- else i=6;
-
- return exp_table[i][sd->status.base_level];
-}
-
-/*==========================================
- * job level after next [Valaris]
- *------------------------------------------
- */
-int pc_nextjobafter(struct map_session_data *sd)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- if(sd->status.job_level>=MAX_LEVEL || sd->status.job_level<=0)
- return 0;
-
- if(sd->status.class_==0) i=7;
- else if(sd->status.class_<=6) i=8;
- else if(sd->status.class_<=22) i=9;
- else if(sd->status.class_==23) i=10;
- else if(sd->status.class_==4001) i=11;
- else if(sd->status.class_<=4007) i=12;
- else i=13;
-
- return exp_table[i][sd->status.job_level];
-}
-/*==========================================
-
- * •K—vƒXƒe?ƒ^ƒXƒ|ƒCƒ“ƒgŒvŽZ
- *------------------------------------------
- */
-int pc_need_status_point(struct map_session_data *sd,int type)
-{
- int val;
-
- nullpo_retr(-1, sd);
-
- if(type<SP_STR || type>SP_LUK)
- return -1;
- val =
- type==SP_STR ? sd->status.str :
- type==SP_AGI ? sd->status.agi :
- type==SP_VIT ? sd->status.vit :
- type==SP_INT ? sd->status.int_:
- type==SP_DEX ? sd->status.dex : sd->status.luk;
-
- return (val+9)/10+1;
-}
-
-/*==========================================
- * ”\—Í’l¬’·
- *------------------------------------------
- */
-int pc_statusup(struct map_session_data *sd,int type)
-{
- int max, need,val = 0;
-
- nullpo_retr(0, sd);
-
- max = (pc_calc_upper(sd->status.class_)==2) ? 80 : battle_config.max_parameter;
-
- need=pc_need_status_point(sd,type);
- if(type<SP_STR || type>SP_LUK || need<0 || need>sd->status.status_point){
- clif_statusupack(sd,type,0,0);
- return 1;
- }
- switch(type){
- case SP_STR:
- if(sd->status.str >= max) {
- clif_statusupack(sd,type,0,0);
- return 1;
- }
- val= ++sd->status.str;
- break;
- case SP_AGI:
- if(sd->status.agi >= max) {
- clif_statusupack(sd,type,0,0);
- return 1;
- }
- val= ++sd->status.agi;
- break;
- case SP_VIT:
- if(sd->status.vit >= max) {
- clif_statusupack(sd,type,0,0);
- return 1;
- }
- val= ++sd->status.vit;
- break;
- case SP_INT:
- if(sd->status.int_ >= max) {
- clif_statusupack(sd,type,0,0);
- return 1;
- }
- val= ++sd->status.int_;
- break;
- case SP_DEX:
- if(sd->status.dex >= max) {
- clif_statusupack(sd,type,0,0);
- return 1;
- }
- val= ++sd->status.dex;
- break;
- case SP_LUK:
- if(sd->status.luk >= max) {
- clif_statusupack(sd,type,0,0);
- return 1;
- }
- val= ++sd->status.luk;
- break;
- }
- sd->status.status_point-=need;
- if(need!=pc_need_status_point(sd,type)){
- clif_updatestatus(sd,type-SP_STR+SP_USTR);
- }
- clif_updatestatus(sd,SP_STATUSPOINT);
- clif_updatestatus(sd,type);
- status_calc_pc(sd,0);
- clif_statusupack(sd,type,1,val);
-
- return 0;
-}
-
-/*==========================================
- * ”\—Í’l¬’·
- *------------------------------------------
- */
-int pc_statusup2(struct map_session_data *sd,int type,int val)
-{
- nullpo_retr(0, sd);
-
- if(type<SP_STR || type>SP_LUK){
- clif_statusupack(sd,type,0,0);
- return 1;
- }
- switch(type){
- case SP_STR:
- if(sd->status.str + val >= battle_config.max_parameter)
- val = battle_config.max_parameter;
- else if(sd->status.str + val < 1)
- val = 1;
- else
- val += sd->status.str;
- sd->status.str = val;
- break;
- case SP_AGI:
- if(sd->status.agi + val >= battle_config.max_parameter)
- val = battle_config.max_parameter;
- else if(sd->status.agi + val < 1)
- val = 1;
- else
- val += sd->status.agi;
- sd->status.agi = val;
- break;
- case SP_VIT:
- if(sd->status.vit + val >= battle_config.max_parameter)
- val = battle_config.max_parameter;
- else if(sd->status.vit + val < 1)
- val = 1;
- else
- val += sd->status.vit;
- sd->status.vit = val;
- break;
- case SP_INT:
- if(sd->status.int_ + val >= battle_config.max_parameter)
- val = battle_config.max_parameter;
- else if(sd->status.int_ + val < 1)
- val = 1;
- else
- val += sd->status.int_;
- sd->status.int_ = val;
- break;
- case SP_DEX:
- if(sd->status.dex + val >= battle_config.max_parameter)
- val = battle_config.max_parameter;
- else if(sd->status.dex + val < 1)
- val = 1;
- else
- val += sd->status.dex;
- sd->status.dex = val;
- break;
- case SP_LUK:
- if(sd->status.luk + val >= battle_config.max_parameter)
- val = battle_config.max_parameter;
- else if(sd->status.luk + val < 1)
- val = 1;
- else
- val = sd->status.luk + val;
- sd->status.luk = val;
- break;
- }
- clif_updatestatus(sd,type-SP_STR+SP_USTR);
- clif_updatestatus(sd,type);
- status_calc_pc(sd,0);
- clif_statusupack(sd,type,1,val);
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ|ƒCƒ“ƒgŠ„‚èU‚è
- *------------------------------------------
- */
-int pc_skillup(struct map_session_data *sd,int skill_num)
-{
- nullpo_retr(0, sd);
-
- if( skill_num>=10000 ){
- guild_skillup(sd,skill_num,0);
- return 0;
- }
-
- if( sd->status.skill_point>0 &&
- sd->status.skill[skill_num].id!=0 &&
- //sd->status.skill[skill_num].lv < skill_get_max(skill_num) ) - celest
- sd->status.skill[skill_num].lv < skill_tree_get_max(skill_num, sd->status.class_) )
- {
- sd->status.skill[skill_num].lv++;
- sd->status.skill_point--;
- status_calc_pc(sd,0);
- clif_skillup(sd,skill_num);
- clif_updatestatus(sd,SP_SKILLPOINT);
- clif_skillinfoblock(sd);
- }
-
- return 0;
-}
-
-/*==========================================
- * /allskill
- *------------------------------------------
- */
-int pc_allskillup(struct map_session_data *sd)
-{
- int i,id;
- int c=0, s=0;
- //?¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
- struct pc_base_job s_class;
-
- nullpo_retr(0, sd);
-
- s_class = pc_calc_base_job(sd->status.class_);
- c = s_class.job;
- s = (s_class.upper==1) ? 1 : 0 ; //?¶ˆÈŠO‚Í’Êí‚̃XƒLƒ‹H
-
- for(i=0;i<MAX_SKILL;i++){
- sd->status.skill[i].id=0;
- if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){ // cardƒXƒLƒ‹‚È‚çA
- sd->status.skill[i].lv=(sd->status.skill[i].flag==1)?0:sd->status.skill[i].flag-2; // –{?‚Ìlv‚É
- sd->status.skill[i].flag=0; // flag‚Í0‚É‚µ‚Ä‚¨‚­
- }
- }
-
- if (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill){
- // ‘S‚ẴXƒLƒ‹
- for(i=1;i<158;i++)
- sd->status.skill[i].lv=skill_get_max(i);
- for(i=210;i<291;i++)
- sd->status.skill[i].lv=skill_get_max(i);
- for(i=304;i<338;i++){
- if(i==331) continue;
- sd->status.skill[i].lv=skill_get_max(i);
- }
- for(i=355;i<411;i++)
- sd->status.skill[i].lv=skill_get_max(i);
- for(i=475;i<480;i++)
- sd->status.skill[i].lv=skill_get_max(i);
- }
- else {
- for(i=0;(id=skill_tree[s][c][i].id)>0;i++){
- if(sd->status.skill[id].id==0 && (!(skill_get_inf2(id)&0x01) || battle_config.quest_skill_learn) ) {
- sd->status.skill[id].id = id; // celest
- // sd->status.skill[id].lv=skill_get_max(id);
- sd->status.skill[id].lv = skill_tree_get_max(id, sd->status.class_); // celest
- }
- }
- }
- status_calc_pc(sd,0);
-
- return 0;
-}
-
-/*==========================================
- * /resetlvl
- *------------------------------------------
- */
-int pc_resetlvl(struct map_session_data* sd,int type)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- for(i=1;i<MAX_SKILL;i++){
- sd->status.skill[i].lv = 0;
- }
-
- if(type == 1){
- sd->status.skill_point=0;
- sd->status.base_level=1;
- sd->status.job_level=1;
- sd->status.base_exp=sd->status.base_exp=0;
- sd->status.job_exp=sd->status.job_exp=0;
- if(sd->status.option !=0)
- sd->status.option = 0;
-
- sd->status.str=1;
- sd->status.agi=1;
- sd->status.vit=1;
- sd->status.int_=1;
- sd->status.dex=1;
- sd->status.luk=1;
- if(sd->status.class_ == 4001)
- sd->status.status_point=100; // not 88 [celest]
- // give platinum skills upon changing
- pc_skill(sd,142,1,0);
- pc_skill(sd,143,1,0);
- }
-
- if(type == 2){
- sd->status.skill_point=0;
- sd->status.base_level=1;
- sd->status.job_level=1;
- sd->status.base_exp=0;
- sd->status.job_exp=0;
- }
- if(type == 3){
- sd->status.base_level=1;
- sd->status.base_exp=0;
- }
- if(type == 4){
- sd->status.job_level=1;
- sd->status.job_exp=0;
- }
-
- clif_updatestatus(sd,SP_STATUSPOINT);
- clif_updatestatus(sd,SP_STR);
- clif_updatestatus(sd,SP_AGI);
- clif_updatestatus(sd,SP_VIT);
- clif_updatestatus(sd,SP_INT);
- clif_updatestatus(sd,SP_DEX);
- clif_updatestatus(sd,SP_LUK);
- clif_updatestatus(sd,SP_BASELEVEL);
- clif_updatestatus(sd,SP_JOBLEVEL);
- clif_updatestatus(sd,SP_STATUSPOINT);
- clif_updatestatus(sd,SP_NEXTBASEEXP);
- clif_updatestatus(sd,SP_NEXTJOBEXP);
- clif_updatestatus(sd,SP_SKILLPOINT);
-
- clif_updatestatus(sd,SP_USTR); // Updates needed stat points - Valaris
- clif_updatestatus(sd,SP_UAGI);
- clif_updatestatus(sd,SP_UVIT);
- clif_updatestatus(sd,SP_UINT);
- clif_updatestatus(sd,SP_UDEX);
- clif_updatestatus(sd,SP_ULUK); // End Addition
-
- for(i=0;i<11;i++) { // unequip items that can't be equipped by base 1 [Valaris]
- if(sd->equip_index[i] >= 0)
- if(!pc_isequip(sd,sd->equip_index[i]))
- pc_unequipitem(sd,sd->equip_index[i],2);
- }
-
- clif_skillinfoblock(sd);
- status_calc_pc(sd,0);
-
- return 0;
-}
-/*==========================================
- * /resetstate
- *------------------------------------------
- */
-int pc_resetstate(struct map_session_data* sd)
-{
- #define sumsp(a) ((a)*((a-2)/10+2) - 5*((a-2)/10)*((a-2)/10) - 6*((a-2)/10) -2)
-// int add=0; // Removed by Dexity
- int lv;
-
- nullpo_retr(0, sd);
- // allow it to just read the last entry [celest]
- lv = sd->status.base_level < MAX_LEVEL ? sd->status.base_level : MAX_LEVEL - 1;
-
-// New statpoint table used here - Dexity
- sd->status.status_point = statp[lv];
- if(sd->status.class_ >= 4001 && sd->status.class_ <= 4024)
- sd->status.status_point+=52; // extra 52+48=100 stat points
-// End addition
-
-// Removed by Dexity - old count
-// add += sumsp(sd->status.str);
-// add += sumsp(sd->status.agi);
-// add += sumsp(sd->status.vit);
-// add += sumsp(sd->status.int_);
-// add += sumsp(sd->status.dex);
-// add += sumsp(sd->status.luk);
-// sd->status.status_point+=add;
-
- clif_updatestatus(sd,SP_STATUSPOINT);
-
- sd->status.str=1;
- sd->status.agi=1;
- sd->status.vit=1;
- sd->status.int_=1;
- sd->status.dex=1;
- sd->status.luk=1;
-
- clif_updatestatus(sd,SP_STR);
- clif_updatestatus(sd,SP_AGI);
- clif_updatestatus(sd,SP_VIT);
- clif_updatestatus(sd,SP_INT);
- clif_updatestatus(sd,SP_DEX);
- clif_updatestatus(sd,SP_LUK);
-
- clif_updatestatus(sd,SP_USTR); // Updates needed stat points - Valaris
- clif_updatestatus(sd,SP_UAGI);
- clif_updatestatus(sd,SP_UVIT);
- clif_updatestatus(sd,SP_UINT);
- clif_updatestatus(sd,SP_UDEX);
- clif_updatestatus(sd,SP_ULUK); // End Addition
-
- status_calc_pc(sd,0);
-
- return 0;
-}
-
-/*==========================================
- * /resetskill
- *------------------------------------------
- */
-int pc_resetskill(struct map_session_data* sd)
-{
- int i,skill;
-
- nullpo_retr(0, sd);
-
- for(i=1;i<MAX_SKILL;i++){
- skill = ( i >= 10000 ) ? pc_checkskill(sd,i) : sd->status.skill[i].lv;
- if( skill > 0) {
- if(!(skill_get_inf2(i)&0x01) || battle_config.quest_skill_learn) {
- if(!sd->status.skill[i].flag)
- sd->status.skill_point += skill;
- else if(sd->status.skill[i].flag > 2 && sd->status.skill[i].flag != 13) {
- sd->status.skill_point += (sd->status.skill[i].flag - 2);
- }
- sd->status.skill[i].lv = 0;
- }
- else if(battle_config.quest_skill_reset)
- sd->status.skill[i].lv = 0;
- sd->status.skill[i].flag = 0;
- } else {
- sd->status.skill[i].lv = 0;
- }
- }
- clif_updatestatus(sd,SP_SKILLPOINT);
- clif_skillinfoblock(sd);
- status_calc_pc(sd,0);
-
- return 0;
-}
-
-/*==========================================
- * pc‚Ƀ_ƒ?ƒW‚ð?‚¦‚é
- *------------------------------------------
- */
-int pc_damage(struct block_list *src,struct map_session_data *sd,int damage)
-{
- int i=0,j=0;
- struct pc_base_job s_class;
-
- nullpo_retr(0, sd);
-
- //?¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
- s_class = pc_calc_base_job(sd->status.class_);
- // ?‚ÉŽ€‚ñ‚Å‚¢‚½‚ç–³?
- if(pc_isdead(sd))
- return 0;
- // À‚Á‚Ä‚½‚ç—§‚¿ã‚ª‚é
- if(pc_issit(sd)) {
- pc_setstand(sd);
- skill_gangsterparadise(sd,0);
- }
-
- // ? ‚¢‚Ä‚¢‚½‚ç‘«‚ðŽ~‚ß‚é
- if (sd->sc_data) {
- if (sd->sc_data[SC_BERSERK].timer != -1 ||
- sd->special_state.infinite_endure)
- ; // do nothing
- else if (sd->sc_data[SC_ENDURE].timer != -1 && (src != NULL && src->type == BL_MOB) && !map[sd->bl.m].flag.gvg) {
- if ((--sd->sc_data[SC_ENDURE].val2) < 0)
- status_change_end(&sd->bl, SC_ENDURE, -1);
- } else pc_stop_walking(sd,3);
- }
-
- // ‰‰‘t/ƒ_ƒ“ƒX‚Ì’†?
- if(damage > sd->status.max_hp>>2)
- skill_stop_dancing(&sd->bl,0);
-
- sd->status.hp-=damage;
- if(sd->status.pet_id > 0 && sd->pd && sd->petDB && battle_config.pet_damage_support)
- pet_target_check(sd,src,1);
-
- if (sd->sc_data[SC_TRICKDEAD].timer != -1)
- status_change_end(&sd->bl, SC_TRICKDEAD, -1);
- if(sd->status.option&2)
- status_change_end(&sd->bl, SC_HIDING, -1);
- if(sd->status.option&4)
- status_change_end(&sd->bl, SC_CLOAKING, -1);
- if(sd->status.option&16384)
- status_change_end(&sd->bl, SC_CHASEWALK, -1);
-
- if(sd->status.hp>0){
- // ‚Ü‚¾¶‚«‚Ä‚¢‚é‚È‚çHPXV
- clif_updatestatus(sd,SP_HP);
-
- //if(sd->status.hp<sd->status.max_hp>>2 && pc_checkskill(sd,SM_AUTOBERSERK)>0 &&
- if(sd->status.hp<sd->status.max_hp>>2 && sd->sc_data[SC_AUTOBERSERK].timer != -1 &&
- (sd->sc_data[SC_PROVOKE].timer==-1 || sd->sc_data[SC_PROVOKE].val2==0 ))
- // ƒI?ƒgƒo?ƒT?ƒN?“®
- status_change_start(&sd->bl,SC_PROVOKE,10,1,0,0,0,0);
-
- sd->canlog_tick = gettick();
-
- if(sd->status.party_id>0) { // on-the-fly party hp updates [Valaris]
- struct party *p=party_search(sd->status.party_id);
- if(p!=NULL) clif_party_hp(p,sd);
- } // end addition [Valaris]
-
- return 0;
- }
- sd->status.hp = 0;
- //pc_setdead(sd);
- if(sd->vender_id)
- vending_closevending(sd);
-
- if(sd->status.pet_id > 0 && sd->pd) {
- if(sd->petDB) {
- sd->pet.intimate -= sd->petDB->die;
- if(sd->pet.intimate < 0)
- sd->pet.intimate = 0;
- clif_send_petdata(sd,1,sd->pet.intimate);
- }
- }
-
- pc_stop_walking(sd,0);
- skill_castcancel(&sd->bl,0); // ‰r¥‚Ì’†Ž~
- clif_clearchar_area(&sd->bl,1);
- pc_setdead(sd);
- skill_unit_move(&sd->bl,gettick(),0);
- if(sd->sc_data[SC_BLADESTOP].timer!=-1)//”’n‚ÍŽ–‘O‚ɉðœ
- status_change_end(&sd->bl,SC_BLADESTOP,-1);
- pc_setglobalreg(sd,"PC_DIE_COUNTER",++sd->die_counter); //Ž€‚ɃJƒEƒ“ƒ^?‘‚«?‚Ý
- status_change_clear(&sd->bl,0); // ƒXƒe?ƒ^ƒXˆÙí‚ð‰ðœ‚·‚é
- clif_updatestatus(sd,SP_HP);
- status_calc_pc(sd,0);
-
- if (src && src->type == BL_PC) {
- struct map_session_data *ssd = (struct map_session_data *)src;
- if (ssd) {
- if (sd->state.event_death)
- pc_setglobalreg(sd,"killerrid",(ssd->status.account_id));
- if (ssd->state.event_kill) {
- if (script_config.event_script_type == 0) {
- struct npc_data *npc;
- if ((npc = npc_name2id(script_config.kill_event_name))) {
- run_script(npc->u.scr.script,0,sd->bl.id,npc->bl.id); // PCKillNPC
- sprintf (tmp_output, "Event '"CL_WHITE"%s"CL_RESET"' executed.\n", script_config.kill_event_name);
- ShowStatus(tmp_output);
- }
- } else {
- sprintf (tmp_output, "%d '"CL_WHITE"%s"CL_RESET"' events executed.\n",
- npc_event_doall_id(script_config.kill_event_name, sd->bl.id), script_config.kill_event_name);
- ShowStatus(tmp_output);
- }
- }
- }
- }
-
- if (sd->state.event_death) {
- if (script_config.event_script_type == 0) {
- struct npc_data *npc;
- if ((npc = npc_name2id(script_config.die_event_name))) {
- run_script(npc->u.scr.script,0,sd->bl.id,npc->bl.id); // PCDeathNPC
- sprintf (tmp_output, "Event '"CL_WHITE"%s"CL_RESET"' executed.\n", script_config.die_event_name);
- ShowStatus(tmp_output);
- }
- } else {
- sprintf (tmp_output, "%d '"CL_WHITE"%s"CL_RESET"' events executed.\n",
- npc_event_doall_id(script_config.die_event_name, sd->bl.id), script_config.die_event_name);
- ShowStatus(tmp_output);
- }
- }
-
- if(battle_config.bone_drop==2
- || (battle_config.bone_drop==1 && map[sd->bl.m].flag.pvp)){ // ƒhƒNƒƒhƒƒbƒv
- struct item item_tmp;
- memset(&item_tmp,0,sizeof(item_tmp));
- item_tmp.nameid=7005;
- item_tmp.identify=1;
- item_tmp.card[0]=0x00fe;
- item_tmp.card[1]=0;
- *((unsigned long *)(&item_tmp.card[2]))=sd->char_id; /* ƒLƒƒƒ‰ID */
- map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
-
- // activate Steel body if a super novice dies at 99+% exp [celest]
- if (s_class.job == 23) {
- if ((i=pc_nextbaseexp(sd))<=0)
- i=sd->status.base_exp;
- if (i>0 && (j=sd->status.base_exp*1000/i)>=990 && j<=1000)
- sd->state.snovice_flag = 4;
- }
-
- for(i=0;i<5;i++)
- if(sd->dev.val1[i]){
- status_change_end(&map_id2sd(sd->dev.val1[i])->bl,SC_DEVOTION,-1);
- sd->dev.val1[i] = sd->dev.val2[i]=0;
- }
-
- if(battle_config.death_penalty_type>0) { // changed penalty options, added death by player if pk_mode [Valaris]
- if(sd->status.class_ != 0 && !map[sd->bl.m].flag.nopenalty && !map[sd->bl.m].flag.gvg && // only novices will recieve no penalty
- !(sd->sc_count && sd->sc_data[SC_BABY].timer!=-1)) {
- if(battle_config.death_penalty_type==1 && battle_config.death_penalty_base > 0)
- sd->status.base_exp -= (int) ((double)pc_nextbaseexp(sd) * (double)battle_config.death_penalty_base/10000);
- if(battle_config.pk_mode && src && src->type==BL_PC)
- sd->status.base_exp -= (int) ((double)pc_nextbaseexp(sd) * (double)battle_config.death_penalty_base/10000);
- else if(battle_config.death_penalty_type==2 && battle_config.death_penalty_base > 0) {
- if(pc_nextbaseexp(sd) > 0)
- sd->status.base_exp -= (int) ((double)sd->status.base_exp * (double)battle_config.death_penalty_base/10000);
- if(battle_config.pk_mode && src && src->type==BL_PC)
- sd->status.base_exp -= (int) ((double)sd->status.base_exp * (double)battle_config.death_penalty_base/10000);
- }
- if(sd->status.base_exp < 0)
- sd->status.base_exp = 0;
- clif_updatestatus(sd,SP_BASEEXP);
-
- if(battle_config.death_penalty_type==1 && battle_config.death_penalty_job > 0)
- sd->status.job_exp -= (int) ((double)pc_nextjobexp(sd) * (double)battle_config.death_penalty_job/10000);
- if(battle_config.pk_mode && src && src->type==BL_PC)
- sd->status.job_exp -= (int) ((double)pc_nextjobexp(sd) * (double)battle_config.death_penalty_job/10000);
- else if(battle_config.death_penalty_type==2 && battle_config.death_penalty_job > 0) {
- if(pc_nextjobexp(sd) > 0)
- sd->status.job_exp -= (int) ((double)sd->status.job_exp * (double)battle_config.death_penalty_job/10000);
- if(battle_config.pk_mode && src && src->type==BL_PC)
- sd->status.job_exp -= (int) ((double)sd->status.job_exp * (double)battle_config.death_penalty_job/10000);
- }
- if(sd->status.job_exp < 0)
- sd->status.job_exp = 0;
- clif_updatestatus(sd,SP_JOBEXP);
- }
- }
- // monster level up [Valaris]
- if(battle_config.mobs_level_up && src && src->type==BL_MOB) {
- struct mob_data *md=(struct mob_data *)src;
- if(md && md->target_id != 0 && md->target_id==sd->bl.id) { // reset target id when player dies
- md->target_id=0;
- mob_changestate(md,MS_WALK,0);
- }
- if(md && md->state.state!=MS_DEAD && md->level < 99) {
- clif_misceffect(&md->bl,0);
- md->level++;
- md->hp+=(int) (sd->status.max_hp*.1);
- }
- }
-
- //ƒiƒCƒgƒƒAƒ‚?ƒhƒAƒCƒeƒ€ƒhƒƒbƒv
- if(map[sd->bl.m].flag.pvp_nightmaredrop){ // Moved this outside so it works when PVP isnt enabled and during pk mode [Ancyker]
- for(j=0;j<MAX_DROP_PER_MAP;j++){
- int id = map[sd->bl.m].drop_list[j].drop_id;
- int type = map[sd->bl.m].drop_list[j].drop_type;
- int per = map[sd->bl.m].drop_list[j].drop_per;
- if(id == 0)
- continue;
- if(id == -1){//ƒ‰ƒ“ƒ_ƒ€ƒhƒƒbƒv
- int eq_num=0,eq_n[MAX_INVENTORY];
- memset(eq_n,0,sizeof(eq_n));
- //悸?”õ‚µ‚Ä‚¢‚éƒAƒCƒeƒ€?‚ðƒJƒEƒ“ƒg
- for(i=0;i<MAX_INVENTORY;i++){
- int k;
- if( (type == 1 && !sd->status.inventory[i].equip)
- || (type == 2 && sd->status.inventory[i].equip)
- || type == 3){
- //InventoryIndex‚ðŠi”[
- for(k=0;k<MAX_INVENTORY;k++){
- if(eq_n[k] <= 0){
- eq_n[k]=i;
- break;
- }
- }
- eq_num++;
- }
- }
- if(eq_num > 0){
- int n = eq_n[rand()%eq_num];//ŠY?ƒAƒCƒeƒ€‚Ì’†‚©‚烉ƒ“ƒ_ƒ€
- if(rand()%10000 < per){
- if(sd->status.inventory[n].equip)
- pc_unequipitem(sd,n,3);
- pc_dropitem(sd,n,1);
- }
- }
- }
- else if(id > 0){
- for(i=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid == id//ItemID‚ªˆê’v‚µ‚Ä‚¢‚Ä
- && rand()%10000 < per//ƒhƒƒbƒv—¦”»’è‚àOK‚Å
- && ((type == 1 && !sd->status.inventory[i].equip)//ƒ^ƒCƒv”»’è‚àOK‚È‚çƒhƒƒbƒv
- || (type == 2 && sd->status.inventory[i].equip)
- || type == 3) ){
- if(sd->status.inventory[i].equip)
- pc_unequipitem(sd,i,3);
- pc_dropitem(sd,i,1);
- break;
- }
- }
- }
- }
- }
- // pvp
- if( map[sd->bl.m].flag.pvp && !battle_config.pk_mode){ // disable certain pvp functions on pk_mode [Valaris]
- //ƒ‰ƒ“ƒLƒ“ƒOŒvŽZ
- if(!map[sd->bl.m].flag.pvp_nocalcrank){
- sd->pvp_point-=5;
- if(src && src->type==BL_PC )
- ((struct map_session_data *)src)->pvp_point++;
- //} //fixed wrong '{' placement by Lupus
- pc_setdead(sd);
- }
- // ?§‘—ŠÒ
- if( sd->pvp_point < 0 ){
- sd->pvp_point=0;
- pc_setstand(sd);
- pc_setrestartvalue(sd,3);
- pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,0);
- }
- }
- //GvG
- if(map[sd->bl.m].flag.gvg){
- pc_setstand(sd);
- pc_setrestartvalue(sd,3);
- pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,0);
- }
-
- return 0;
-}
-
-//
-// script? ˜A
-//
-/*==========================================
- * script—pPCƒXƒe?ƒ^ƒX?‚Ýo‚µ
- *------------------------------------------
- */
-int pc_readparam(struct map_session_data *sd,int type)
-{
- int val=0;
- struct pc_base_job s_class;
-
- s_class = pc_calc_base_job(sd->status.class_);
-
- nullpo_retr(0, sd);
-
- switch(type){
- case SP_SKILLPOINT:
- val= sd->status.skill_point;
- break;
- case SP_STATUSPOINT:
- val= sd->status.status_point;
- break;
- case SP_ZENY:
- val= sd->status.zeny;
- break;
- case SP_BASELEVEL:
- val= sd->status.base_level;
- break;
- case SP_JOBLEVEL:
- val= sd->status.job_level;
- break;
- case SP_CLASS:
- if(val>=24 && val < 45)
- val+=3978;
- else
- val= sd->status.class_;
- break;
- case SP_BASEJOB:
- val= s_class.job;
- break;
- case SP_UPPER:
- val= s_class.upper;
- break;
- case SP_SEX:
- val= sd->sex;
- break;
- case SP_WEIGHT:
- val= sd->weight;
- break;
- case SP_MAXWEIGHT:
- val= sd->max_weight;
- break;
- case SP_BASEEXP:
- val= sd->status.base_exp;
- break;
- case SP_JOBEXP:
- val= sd->status.job_exp;
- break;
- case SP_NEXTBASEEXP:
- val= pc_nextbaseexp(sd);
- break;
- case SP_NEXTJOBEXP:
- val= pc_nextjobexp(sd);
- break;
- case SP_HP:
- val= sd->status.hp;
- break;
- case SP_MAXHP:
- val= sd->status.max_hp;
- break;
- case SP_SP:
- val= sd->status.sp;
- break;
- case SP_MAXSP:
- val= sd->status.max_sp;
- break;
- case SP_STR:
- val= sd->status.str;
- break;
- case SP_AGI:
- val= sd->status.agi;
- break;
- case SP_VIT:
- val= sd->status.vit;
- break;
- case SP_INT:
- val= sd->status.int_;
- break;
- case SP_DEX:
- val= sd->status.dex;
- break;
- case SP_LUK:
- val= sd->status.luk;
- break;
- case SP_KARMA: // celest
- val = sd->status.karma;
- break;
- case SP_MANNER:
- val = sd->status.manner;
- break;
- case SP_FAME:
- val= sd->fame;
- break;
- }
-
- return val;
-}
-
-/*==========================================
- * script—pPCƒXƒe?ƒ^ƒXÝ’è
- *------------------------------------------
- */
-int pc_setparam(struct map_session_data *sd,int type,int val)
-{
- int i = 0,up_level = 50;
- struct pc_base_job s_class;
-
- nullpo_retr(0, sd);
-
- s_class = pc_calc_base_job(sd->status.class_);
-
- switch(type){
- case SP_BASELEVEL:
- if (val > sd->status.base_level) {
- for (i = 1; i <= (val - sd->status.base_level); i++)
- sd->status.status_point += (sd->status.base_level + i + 14) / 5 ;
- }
- sd->status.base_level = val;
- sd->status.base_exp = 0;
- clif_updatestatus(sd, SP_BASELEVEL);
- clif_updatestatus(sd, SP_NEXTBASEEXP);
- clif_updatestatus(sd, SP_STATUSPOINT);
- clif_updatestatus(sd, SP_BASEEXP);
- status_calc_pc(sd, 0);
- pc_heal(sd, sd->status.max_hp, sd->status.max_sp);
- break;
- case SP_JOBLEVEL:
- if (s_class.job == 0)
- up_level -= 40;
- // super novices can go up to 99 [celest]
- else if (s_class.job == 23)
- up_level += 49;
- else if (sd->status.class_ >= 4008 && sd->status.class_ <= 4022)
- up_level += 20;
- if (val >= sd->status.job_level) {
- if (val > up_level)val = up_level;
- sd->status.skill_point += (val-sd->status.job_level);
- sd->status.job_level = val;
- sd->status.job_exp = 0;
- clif_updatestatus(sd, SP_JOBLEVEL);
- clif_updatestatus(sd, SP_NEXTJOBEXP);
- clif_updatestatus(sd, SP_JOBEXP);
- clif_updatestatus(sd, SP_SKILLPOINT);
- status_calc_pc(sd, 0);
- clif_misceffect(&sd->bl, 1);
- } else {
- sd->status.job_level = val;
- sd->status.job_exp = 0;
- clif_updatestatus(sd, SP_JOBLEVEL);
- clif_updatestatus(sd, SP_NEXTJOBEXP);
- clif_updatestatus(sd, SP_JOBEXP);
- status_calc_pc(sd, 0);
- }
- clif_updatestatus(sd,type);
- break;
- case SP_SKILLPOINT:
- sd->status.skill_point = val;
- break;
- case SP_STATUSPOINT:
- sd->status.status_point = val;
- break;
- case SP_ZENY:
- if(val <= MAX_ZENY) {
- // MAX_ZENY ˆÈ‰º‚È‚ç‘ã“ü
- sd->status.zeny = val;
- } else {
- if(sd->status.zeny > val) {
- // Zeny ‚ªŒ¸­‚µ‚Ä‚¢‚é‚È‚ç‘ã“ü
- sd->status.zeny = val;
- } else if(sd->status.zeny <= MAX_ZENY) {
- // Zeny ‚ª‘‰Á‚µ‚Ä‚¢‚ÄAŒ»Ý‚Ì’l‚ªMAX_ZENY ˆÈ‰º‚È‚çMAX_ZENY
- sd->status.zeny = MAX_ZENY;
- } else {
- // Zeny ‚ª‘‰Á‚µ‚Ä‚¢‚ÄAŒ»Ý‚Ì’l‚ªMAX_ZENY ‚æ‚艺‚Ȃ瑉Á•ª‚𖳎‹
- ;
- }
- }
- break;
- case SP_BASEEXP:
- if(pc_nextbaseexp(sd) > 0) {
- sd->status.base_exp = val;
- if(sd->status.base_exp < 0)
- sd->status.base_exp=0;
- pc_checkbaselevelup(sd);
- }
- break;
- case SP_JOBEXP:
- if(pc_nextjobexp(sd) > 0) {
- sd->status.job_exp = val;
- if(sd->status.job_exp < 0)
- sd->status.job_exp=0;
- pc_checkjoblevelup(sd);
- }
- break;
- case SP_SEX:
- sd->sex = val;
- break;
- case SP_WEIGHT:
- sd->weight = val;
- break;
- case SP_MAXWEIGHT:
- sd->max_weight = val;
- break;
- case SP_HP:
- sd->status.hp = val;
- break;
- case SP_MAXHP:
- sd->status.max_hp = val;
- break;
- case SP_SP:
- sd->status.sp = val;
- break;
- case SP_MAXSP:
- sd->status.max_sp = val;
- break;
- case SP_STR:
- sd->status.str = val;
- break;
- case SP_AGI:
- sd->status.agi = val;
- break;
- case SP_VIT:
- sd->status.vit = val;
- break;
- case SP_INT:
- sd->status.int_ = val;
- break;
- case SP_DEX:
- sd->status.dex = val;
- break;
- case SP_LUK:
- sd->status.luk = val;
- break;
- case SP_KARMA:
- sd->status.karma = val;
- break;
- case SP_MANNER:
- sd->status.manner = val;
- break;
- case SP_FAME:
- sd->fame = val;
- break;
- }
- clif_updatestatus(sd,type);
-
- return 0;
-}
-
-/*==========================================
- * HP/SP‰ñ•œ
- *------------------------------------------
- */
-int pc_heal(struct map_session_data *sd,int hp,int sp)
-{
-// if(battle_config.battle_log)
-// printf("heal %d %d\n",hp,sp);
-
- nullpo_retr(0, sd);
-
- if(pc_checkoverhp(sd)) {
- if(hp > 0)
- hp = 0;
- }
- if(pc_checkoversp(sd)) {
- if(sp > 0)
- sp = 0;
- }
-
- if(sd->sc_count && sd->sc_data[SC_BERSERK].timer!=-1) //ƒo?ƒT?ƒN’†‚͉ñ•œ‚³‚¹‚È‚¢‚炵‚¢
- return 0;
-
- if(hp+sd->status.hp>sd->status.max_hp)
- hp=sd->status.max_hp-sd->status.hp;
- if(sp+sd->status.sp>sd->status.max_sp)
- sp=sd->status.max_sp-sd->status.sp;
- sd->status.hp+=hp;
- if(sd->status.hp <= 0) {
- sd->status.hp = 0;
- pc_damage(NULL,sd,1);
- hp = 0;
- }
- sd->status.sp+=sp;
- if(sd->status.sp <= 0)
- sd->status.sp = 0;
- if(hp)
- clif_updatestatus(sd,SP_HP);
- if(sp)
- clif_updatestatus(sd,SP_SP);
-
- if(sd->status.party_id>0) { // on-the-fly party hp updates [Valaris]
- struct party *p=party_search(sd->status.party_id);
- if(p!=NULL) clif_party_hp(p,sd);
- } // end addition [Valaris]
-
- return hp + sp;
-}
-
-/*==========================================
- * HP/SP‰ñ•œ
- *------------------------------------------
- */
-int pc_itemheal(struct map_session_data *sd,int hp,int sp)
-{
- int bonus, type = 0;
-// if(battle_config.battle_log)
-// printf("heal %d %d\n",hp,sp);
-
- nullpo_retr(0, sd);
-
- if(sd->sc_count && sd->sc_data[SC_GOSPEL].timer!=-1) //ƒo?ƒT?ƒN’†‚͉ñ•œ‚³‚¹‚È‚¢‚炵‚¢
- return 0;
-
- if(sd->state.potionpitcher_flag) {
- sd->potion_hp = hp;
- sd->potion_sp = sp;
- return 0;
- }
-
- if(pc_checkoverhp(sd)) {
- if(hp > 0)
- hp = 0;
- }
- if(pc_checkoversp(sd)) {
- if(sp > 0)
- sp = 0;
- }
-
- if (sd->itemid >= 501 && sd->itemid <= 505)
- type = 1; // potions
- else if (sd->itemid >= 507 && sd->itemid <= 510)
- type = 2; // herbs
- else if (sd->itemid >= 512 && sd->itemid <= 516)
- type = 3; // fruits
- else if (sd->itemid == 517 || sd->itemid == 528)
- type = 4; // meat
- else if (sd->itemid == 529 || sd->itemid == 530)
- type = 5; // candy
- else if (sd->itemid >= 531 && sd->itemid <= 534)
- type = 6; // juice
- else if (sd->itemid == 544 || sd->itemid == 551)
- type = 7; // sashimi
-
- if(hp > 0) {
- bonus = (sd->paramc[2]<<1) + 100 + pc_checkskill(sd,SM_RECOVERY)*10
- + pc_checkskill(sd,AM_LEARNINGPOTION)*5;
- if (type > 0)
- bonus += sd->itemhealrate[type - 1];
- if(bonus != 100)
- hp = hp * bonus / 100;
- }
- if(sp > 0) {
- bonus = (sd->paramc[3]<<1) + 100 + pc_checkskill(sd,MG_SRECOVERY)*10
- + pc_checkskill(sd,AM_LEARNINGPOTION)*5;
- if(bonus != 100)
- sp = sp * bonus / 100;
- }
- if(hp+sd->status.hp>sd->status.max_hp)
- hp=sd->status.max_hp-sd->status.hp;
- if(sp+sd->status.sp>sd->status.max_sp)
- sp=sd->status.max_sp-sd->status.sp;
- sd->status.hp+=hp;
- if(sd->status.hp <= 0) {
- sd->status.hp = 0;
- pc_damage(NULL,sd,1);
- hp = 0;
- }
- sd->status.sp+=sp;
- if(sd->status.sp <= 0)
- sd->status.sp = 0;
- if(hp)
- clif_updatestatus(sd,SP_HP);
- if(sp)
- clif_updatestatus(sd,SP_SP);
-
- return 0;
-}
-
-/*==========================================
- * HP/SP‰ñ•œ
- *------------------------------------------
- */
-int pc_percentheal(struct map_session_data *sd,int hp,int sp)
-{
- nullpo_retr(0, sd);
-
- if(sd->state.potionpitcher_flag) {
- sd->potion_per_hp = hp;
- sd->potion_per_sp = sp;
- return 0;
- }
-
- if(pc_checkoverhp(sd)) {
- if(hp > 0)
- hp = 0;
- }
- if(pc_checkoversp(sd)) {
- if(sp > 0)
- sp = 0;
- }
- if(hp) {
- if(hp >= 100) {
- sd->status.hp = sd->status.max_hp;
- }
- else if(hp <= -100) {
- sd->status.hp = 0;
- pc_damage(NULL,sd,1);
- }
- else {
- sd->status.hp += sd->status.max_hp*hp/100;
- if(sd->status.hp > sd->status.max_hp)
- sd->status.hp = sd->status.max_hp;
- if(sd->status.hp <= 0) {
- sd->status.hp = 0;
- pc_damage(NULL,sd,1);
- hp = 0;
- }
- }
- }
- if(sp) {
- if(sp >= 100) {
- sd->status.sp = sd->status.max_sp;
- }
- else if(sp <= -100) {
- sd->status.sp = 0;
- }
- else {
- sd->status.sp += sd->status.max_sp*sp/100;
- if(sd->status.sp > sd->status.max_sp)
- sd->status.sp = sd->status.max_sp;
- if(sd->status.sp < 0)
- sd->status.sp = 0;
- }
- }
- if(hp)
- clif_updatestatus(sd,SP_HP);
- if(sp)
- clif_updatestatus(sd,SP_SP);
-
- return 0;
-}
-
-/*==========================================
- * E?X
- * ˆø? job E‹Æ 0`23
- * upper ’Êí 0, ?¶ 1, —{Žq 2, ‚»‚Ì‚Ü‚Ü -1
- * Rewrote to make it tidider [Celest]
- *------------------------------------------
- */
-int pc_jobchange(struct map_session_data *sd,int job, int upper)
-{
- int i;
- int b_class = 0;
- //?¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
- struct pc_base_job s_class = pc_calc_base_job(sd->status.class_);
-
- nullpo_retr(0, sd);
-
- if (upper < 0 || upper > 2) //Œ»Ý?¶‚©‚Ç‚¤‚©‚ð”»?‚·‚é
- upper = s_class.upper;
-
- b_class = job; //’ÊíE‚È‚çjob‚»‚Ì‚Ü‚ñ‚Ü
- if (job < 23) {
- if (upper == 1)
- b_class += 4001;
- else if (upper == 2) //—{Žq‚ÉŒ‹¥‚Í‚È‚¢‚¯‚Ç‚Ç‚¤‚¹ŽŸ‚ÅR‚ç‚ê‚é‚©‚ç‚¢‚¢‚â
- b_class += 4023;
- } else if (job == 23) {
- if (upper == 1) //?¶‚ɃXƒpƒmƒr‚Í‘¶Ý‚µ‚È‚¢‚Ì‚Å‚¨?‚è
- return 1;
- else if (upper == 2)
- b_class += 4022;
- } else if (job > 23 && job < 69) {
- b_class += 3977;
- } else if ((job >= 69 && job < 4001) || (job > 4045))
- return 1;
-
- job = pc_calc_base_job2 (b_class); // check base class [celest]
-
- if((sd->status.sex == 0 && job == 19) || (sd->status.sex == 1 && job == 20) ||
- // not needed [celest]
- //(sd->status.sex == 0 && job == 4020) || (sd->status.sex == 1 && job == 4021) ||
- job == 22 || sd->status.class_ == b_class) //Š‚̓o?ƒh‚É‚È‚ê‚È‚¢A‰‚̓_ƒ“ƒT?‚É‚È‚ê‚È‚¢AŒ‹¥ˆßÖ‚à‚¨?‚è
- return 1;
-
- // check if we are changing from 1st to 2nd job
- if (job >= 7 && job <= 21) {
- if (s_class.job > 0 && s_class.job < 7)
- sd->change_level = sd->status.job_level;
- else
- sd->change_level = 40;
- }
- else
- sd->change_level = 0;
-
- pc_setglobalreg (sd, "jobchange_level", sd->change_level);
-
- sd->status.class_ = sd->view_class = b_class;
-
- sd->status.job_level=1;
- sd->status.job_exp=0;
- clif_updatestatus(sd,SP_JOBLEVEL);
- clif_updatestatus(sd,SP_JOBEXP);
- clif_updatestatus(sd,SP_NEXTJOBEXP);
-
- for(i=0;i<11;i++) {
- if(sd->equip_index[i] >= 0)
- if(!pc_isequip(sd,sd->equip_index[i]))
- pc_unequipitem(sd,sd->equip_index[i],2); // ?”õŠO‚µ
- }
-
- clif_changelook(&sd->bl,LOOK_BASE,sd->view_class); // move sprite update to prevent client crashes with incompatible equipment [Valaris]
- if(sd->status.clothes_color > 0)
- clif_changelook(&sd->bl,LOOK_CLOTHES_COLOR,sd->status.clothes_color);
- if(battle_config.muting_players && sd->status.manner < 0)
- clif_changestatus(&sd->bl,SP_MANNER,sd->status.manner);
-
- status_calc_pc(sd,0);
- pc_checkallowskill(sd);
- pc_equiplookall(sd);
- clif_equiplist(sd);
-
- if(pc_isriding(sd)) { // remove peco status if changing into invalid class [Valaris]
- if(!(pc_checkskill(sd,KN_RIDING)))
- pc_setoption(sd,sd->status.option|-0x0000);
- if(pc_checkskill(sd,KN_RIDING)>0)
- pc_setriding(sd);
- }
-
- return 0;
-}
-
-/*==========================================
- * Œ©‚½–Ú?X
- *------------------------------------------
- */
-int pc_equiplookall(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
-#if PACKETVER < 4
- clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
- clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield);
-#else
- clif_changelook(&sd->bl,LOOK_WEAPON,0);
- clif_changelook(&sd->bl,LOOK_SHOES,0);
-#endif
- clif_changelook(&sd->bl,LOOK_HEAD_BOTTOM,sd->status.head_bottom);
- clif_changelook(&sd->bl,LOOK_HEAD_TOP,sd->status.head_top);
- clif_changelook(&sd->bl,LOOK_HEAD_MID,sd->status.head_mid);
-
- return 0;
-}
-
-/*==========================================
- * Œ©‚½–Ú?X
- *------------------------------------------
- */
-int pc_changelook(struct map_session_data *sd,int type,int val)
-{
- nullpo_retr(0, sd);
-
- switch(type){
- case LOOK_HAIR:
- sd->status.hair=val;
- break;
- case LOOK_WEAPON:
- sd->status.weapon=val;
- break;
- case LOOK_HEAD_BOTTOM:
- sd->status.head_bottom=val;
- break;
- case LOOK_HEAD_TOP:
- sd->status.head_top=val;
- break;
- case LOOK_HEAD_MID:
- sd->status.head_mid=val;
- break;
- case LOOK_HAIR_COLOR:
- sd->status.hair_color=val;
- break;
- case LOOK_CLOTHES_COLOR:
- sd->status.clothes_color=val;
- break;
- case LOOK_SHIELD:
- sd->status.shield=val;
- break;
- case LOOK_SHOES:
- break;
- }
- clif_changelook(&sd->bl,type,val);
-
- return 0;
-}
-
-/*==========================================
- * •t?•i(‘é,ƒyƒR,ƒJ?ƒg)Ý’è
- *------------------------------------------
- */
-int pc_setoption(struct map_session_data *sd,int type)
-{
- nullpo_retr(0, sd);
-
- sd->status.option=type;
- clif_changeoption(&sd->bl);
- status_calc_pc(sd,0);
-
- return 0;
-}
-
-/*==========================================
- * ƒJ?ƒgÝ’è
- *------------------------------------------
- */
-int pc_setcart(struct map_session_data *sd,int type)
-{
- int cart[6]={0x0000,0x0008,0x0080,0x0100,0x0200,0x0400};
-
- nullpo_retr(0, sd);
-
- if(pc_checkskill(sd,MC_PUSHCART)>0){ // ƒvƒbƒVƒ…ƒJ?ƒgƒXƒLƒ‹ŠŽ
- if(!pc_iscarton(sd)){ // ƒJ?ƒg‚ð•t‚¯‚Ä‚¢‚È‚¢
- pc_setoption(sd,cart[type]);
- clif_cart_itemlist(sd);
- clif_cart_equiplist(sd);
- clif_updatestatus(sd,SP_CARTINFO);
- clif_status_change(&sd->bl,0x0c,0);
- }
- else{
- pc_setoption(sd,cart[type]);
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * ‘éÝ’è
- *------------------------------------------
- */
-int pc_setfalcon(struct map_session_data *sd)
-{
- if(pc_checkskill(sd,HT_FALCON)>0){ // ƒtƒ@ƒ‹ƒRƒ“ƒ}ƒXƒ^ƒŠ?ƒXƒLƒ‹ŠŽ
- pc_setoption(sd,sd->status.option|0x0010);
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒyƒRƒyƒRÝ’è
- *------------------------------------------
- */
-int pc_setriding(struct map_session_data *sd)
-{
- if(sd->disguise > 0) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
- clif_displaymessage(sd->fd, "Cannot mount a Peco while in disguise.");
- return 0;
- }
-
- if((pc_checkskill(sd,KN_RIDING)>0)){ // ƒ‰ƒCƒfƒBƒ“ƒOƒXƒLƒ‹ŠŽ
- pc_setoption(sd,sd->status.option|0x0020);
-
- if(sd->status.class_==7)
- sd->status.class_=sd->view_class=13;
-
- if(sd->status.class_==14)
- sd->status.class_=sd->view_class=21;
-
- if(sd->status.class_==4008)
- sd->status.class_=sd->view_class=4014;
-
- if(sd->status.class_==4015)
- sd->status.class_=sd->view_class=4022;
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€ƒhƒƒbƒv‰Â•s‰Â”»’è
- *------------------------------------------
- */
-int pc_candrop(struct map_session_data *sd,int item_id)
-{
- int level;
- if((level=pc_isGM(sd))>0 && level < battle_config.gm_can_drop_lv) // search only once [Celest]
- return 1;
- return 0;
-}
-
-/*==========================================
- * script—p??‚Ì’l‚ð?‚Þ
- *------------------------------------------
- */
-int pc_readreg(struct map_session_data *sd,int reg)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- for(i=0;i<sd->reg_num;i++)
- if(sd->reg[i].index==reg)
- return sd->reg[i].data;
-
- return 0;
-}
-/*==========================================
- * script—p??‚Ì’l‚ðÝ’è
- *------------------------------------------
- */
-int pc_setreg(struct map_session_data *sd,int reg,int val)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- for (i = 0; i < sd->reg_num; i++) {
- if (sd->reg[i].index == reg){
- sd->reg[i].data = val;
- return 0;
- }
- }
- sd->reg_num++;
- sd->reg = (struct script_reg *) aRealloc(sd->reg, sizeof(*(sd->reg)) * sd->reg_num);
- sd->reg[i].index = reg;
- sd->reg[i].data = val;
-
- return 0;
-}
-
-/*==========================================
- * script—p•¶Žš—ñ??‚Ì’l‚ð?‚Þ
- *------------------------------------------
- */
-char *pc_readregstr(struct map_session_data *sd,int reg)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- for(i=0;i<sd->regstr_num;i++)
- if(sd->regstr[i].index==reg)
- return sd->regstr[i].data;
-
- return NULL;
-}
-/*==========================================
- * script—p•¶Žš—ñ??‚Ì’l‚ðÝ’è
- *------------------------------------------
- */
-int pc_setregstr(struct map_session_data *sd,int reg,char *str)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- if(strlen(str)+1 >= sizeof(sd->regstr[0].data)){
- printf("pc_setregstr: string too long !\n");
- return 0;
- }
-
- for(i=0;i<sd->regstr_num;i++)
- if(sd->regstr[i].index==reg){
- strcpy(sd->regstr[i].data,str);
- return 0;
- }
- sd->regstr_num++;
- sd->regstr = (struct script_regstr *) aRealloc(sd->regstr, sizeof(sd->regstr[0]) * sd->regstr_num);
- if(sd->regstr==NULL){
- printf("out of memory : pc_setreg\n");
- exit(1);
- }
-/* memset(sd->reg + (sd->reg_num - 1) * sizeof(*(sd->reg)), 0,
- sizeof(*(sd->reg)));
-*/
- sd->regstr[i].index=reg;
- strcpy(sd->regstr[i].data,str);
-
- return 0;
-}
-
-/*==========================================
- * script—pƒOƒ?ƒoƒ‹??‚Ì’l‚ð?‚Þ
- *------------------------------------------
- */
-int pc_readglobalreg(struct map_session_data *sd,char *reg)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- for(i=0;i<sd->status.global_reg_num;i++){
- if(strcmp(sd->status.global_reg[i].str,reg)==0)
- return sd->status.global_reg[i].value;
- }
-
- return 0;
-}
-
-/*==========================================
- * script—pƒOƒ?ƒoƒ‹??‚Ì’l‚ðÝ’è
- *------------------------------------------
- */
-int pc_setglobalreg(struct map_session_data *sd,char *reg,int val)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- //PC_DIE_COUNTER‚ªƒXƒNƒŠƒvƒg‚È‚Ç‚Å?X‚³‚ꂽŽbÌ?—
- if(strcmp(reg,"PC_DIE_COUNTER") == 0 && sd->die_counter != val){
- sd->die_counter = val;
- status_calc_pc(sd,0);
- } else if(strcmp(reg,script_config.die_event_name) == 0){
- sd->state.event_death = val;
- } else if(strcmp(reg,script_config.kill_event_name) == 0){
- sd->state.event_kill = val;
- } else if(strcmp(reg,script_config.logout_event_name) == 0){
- sd->state.event_disconnect = val;
- }
-
- if(val==0){
- for(i=0;i<sd->status.global_reg_num;i++){
- if(strcmp(sd->status.global_reg[i].str,reg)==0){
- sd->status.global_reg[i]=sd->status.global_reg[sd->status.global_reg_num-1];
- sd->status.global_reg_num--;
- break;
- }
- }
- return 0;
- }
- for(i=0;i<sd->status.global_reg_num;i++){
- if(strcmp(sd->status.global_reg[i].str,reg)==0){
- sd->status.global_reg[i].value=val;
- return 0;
- }
- }
- if(sd->status.global_reg_num<GLOBAL_REG_NUM){
- strcpy(sd->status.global_reg[i].str,reg);
- sd->status.global_reg[i].value=val;
- sd->status.global_reg_num++;
- return 0;
- }
- if(battle_config.error_log)
- printf("pc_setglobalreg : couldn't set %s (GLOBAL_REG_NUM = %d)\n", reg, GLOBAL_REG_NUM);
-
- return 1;
-}
-
-/*==========================================
- * script—pƒAƒJƒEƒ“ƒg??‚Ì’l‚ð?‚Þ
- *------------------------------------------
- */
-int pc_readaccountreg(struct map_session_data *sd,char *reg)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- for(i=0;i<sd->status.account_reg_num;i++){
- if(strcmp(sd->status.account_reg[i].str,reg)==0)
- return sd->status.account_reg[i].value;
- }
-
- return 0;
-}
-/*==========================================
- * script—pƒAƒJƒEƒ“ƒg??‚Ì’l‚ðÝ’è
- *------------------------------------------
- */
-int pc_setaccountreg(struct map_session_data *sd,char *reg,int val)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- if (sd->status.account_reg_num == -1) {
- if(battle_config.error_log)
- printf("pc_setaccountreg : refusing to set until vars are received\n");
- return 1;
- }
-
- if(val==0){
- for(i=0;i<sd->status.account_reg_num;i++){
- if(strcmp(sd->status.account_reg[i].str,reg)==0){
- sd->status.account_reg[i]=sd->status.account_reg[sd->status.account_reg_num-1];
- sd->status.account_reg_num--;
- break;
- }
- }
- intif_saveaccountreg(sd);
- return 0;
- }
- for(i=0;i<sd->status.account_reg_num;i++){
- if(strcmp(sd->status.account_reg[i].str,reg)==0){
- sd->status.account_reg[i].value=val;
- intif_saveaccountreg(sd);
- return 0;
- }
- }
- if(sd->status.account_reg_num<ACCOUNT_REG_NUM){
- strcpy(sd->status.account_reg[i].str,reg);
- sd->status.account_reg[i].value=val;
- sd->status.account_reg_num++;
- intif_saveaccountreg(sd);
- return 0;
- }
- if(battle_config.error_log)
- printf("pc_setaccountreg : couldn't set %s (ACCOUNT_REG_NUM = %d)\n", reg, ACCOUNT_REG_NUM);
-
- return 1;
-}
-/*==========================================
- * script—pƒAƒJƒEƒ“ƒg??2‚Ì’l‚ð?‚Þ
- *------------------------------------------
- */
-int pc_readaccountreg2(struct map_session_data *sd,char *reg)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- for(i=0;i<sd->status.account_reg2_num;i++){
- if(strcmp(sd->status.account_reg2[i].str,reg)==0)
- return sd->status.account_reg2[i].value;
- }
-
- return 0;
-}
-/*==========================================
- * script—pƒAƒJƒEƒ“ƒg??2‚Ì’l‚ðÝ’è
- *------------------------------------------
- */
-int pc_setaccountreg2(struct map_session_data *sd,char *reg,int val)
-{
- int i;
-
- nullpo_retr(1, sd);
-
- if(val==0){
- for(i=0;i<sd->status.account_reg2_num;i++){
- if(strcmp(sd->status.account_reg2[i].str,reg)==0){
- sd->status.account_reg2[i]=sd->status.account_reg2[sd->status.account_reg2_num-1];
- sd->status.account_reg2_num--;
- break;
- }
- }
- chrif_saveaccountreg2(sd);
- return 0;
- }
- for(i=0;i<sd->status.account_reg2_num;i++){
- if(strcmp(sd->status.account_reg2[i].str,reg)==0){
- sd->status.account_reg2[i].value=val;
- chrif_saveaccountreg2(sd);
- return 0;
- }
- }
- if(sd->status.account_reg2_num<ACCOUNT_REG2_NUM){
- strcpy(sd->status.account_reg2[i].str,reg);
- sd->status.account_reg2[i].value=val;
- sd->status.account_reg2_num++;
- chrif_saveaccountreg2(sd);
- return 0;
- }
- if(battle_config.error_log)
- printf("pc_setaccountreg2 : couldn't set %s (ACCOUNT_REG2_NUM = %d)\n", reg, ACCOUNT_REG2_NUM);
-
- return 1;
-}
-
-/*==========================================
- * ƒCƒxƒ“ƒgƒ^ƒCƒ}??—
- *------------------------------------------
- */
-int pc_eventtimer(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd=map_id2sd(id);
- char *p = (char *)data;
- int i;
- if(sd==NULL)
- return 0;
-
- for(i=0;i<MAX_EVENTTIMER;i++){
- if( sd->eventtimer[i]==tid ){
- sd->eventtimer[i]=-1;
- npc_event(sd,p,0);
- break;
- }
- }
- aFree(p);
- if(i==MAX_EVENTTIMER) {
- if(battle_config.error_log)
- printf("pc_eventtimer: no such event timer\n");
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒCƒxƒ“ƒgƒ^ƒCƒ}?’ljÁ
- *------------------------------------------
- */
-int pc_addeventtimer(struct map_session_data *sd,int tick,const char *name)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- for(i=0;i<MAX_EVENTTIMER;i++)
- if( sd->eventtimer[i]==-1 )
- break;
- if(i<MAX_EVENTTIMER){
- char *evname=strdup(name);
- //char *evname=(char *)aMallocA((strlen(name)+1)*sizeof(char));
- //memcpy(evname,name,(strlen(name)+1));
- sd->eventtimer[i]=add_timer(gettick()+tick,
- pc_eventtimer,sd->bl.id,(int)evname);
- sd->eventcount++;
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒCƒxƒ“ƒgƒ^ƒCƒ}?íœ
- *------------------------------------------
- */
-int pc_deleventtimer(struct map_session_data *sd,const char *name)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- if (sd->eventcount <= 0)
- return 0;
-
- for(i=0;i<MAX_EVENTTIMER;i++)
- if( sd->eventtimer[i]!=-1 ) {
- char *p = (char *)(get_timer(sd->eventtimer[i])->data);
- if(strcmp(p, name)==0) {
- delete_timer(sd->eventtimer[i],pc_eventtimer);
- sd->eventtimer[i]=-1;
- sd->eventcount--;
- aFree(p);
- break;
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒCƒxƒ“ƒgƒ^ƒCƒ}?ƒJƒEƒ“ƒg’l’ljÁ
- *------------------------------------------
- */
-int pc_addeventtimercount(struct map_session_data *sd,const char *name,int tick)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- for(i=0;i<MAX_EVENTTIMER;i++)
- if( sd->eventtimer[i]!=-1 && strcmp(
- (char *)(get_timer(sd->eventtimer[i])->data), name)==0 ){
- addtick_timer(sd->eventtimer[i],tick);
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒCƒxƒ“ƒgƒ^ƒCƒ}?‘Síœ
- *------------------------------------------
- */
-int pc_cleareventtimer(struct map_session_data *sd)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- if (sd->eventcount <= 0)
- return 0;
-
- for(i=0;i<MAX_EVENTTIMER;i++)
- if( sd->eventtimer[i]!=-1 ){
- char *p = (char *)(get_timer(sd->eventtimer[i])->data);
- delete_timer(sd->eventtimer[i],pc_eventtimer);
- sd->eventtimer[i]=-1;
- aFree(p);
- }
-
- return 0;
-}
-
-//
-// ? ”õ•¨
-//
-/*==========================================
- * ƒAƒCƒeƒ€‚ð?”õ‚·‚é
- *------------------------------------------
- */
-int pc_equipitem(struct map_session_data *sd,int n,int pos)
-{
- int i,nameid, arrow;
- struct item_data *id;
- //?¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
-
- nullpo_retr(0, sd);
-
- nameid = sd->status.inventory[n].nameid;
- id = sd->inventory_data[n];
- pos = pc_equippoint(sd,n);
- if(battle_config.battle_log)
- printf("equip %d(%d) %x:%x\n",nameid,n,id->equip,pos);
- if(!pc_isequip(sd,n) || !pos || sd->status.inventory[n].attribute==1 ) { // [Valaris]
- clif_equipitemack(sd,n,0,0); // fail
- return 0;
- }
-
-// -- moonsoul (if player is berserk then cannot equip)
-//
- if(sd->sc_count && sd->sc_data[SC_BERSERK].timer!=-1){
- clif_equipitemack(sd,n,0,0); // fail
- return 0;
- }
-
- if(pos==0x88){ // ƒAƒNƒZƒTƒŠ—p—áŠO?—
- int epor=0;
- if(sd->equip_index[0] >= 0)
- epor |= sd->status.inventory[sd->equip_index[0]].equip;
- if(sd->equip_index[1] >= 0)
- epor |= sd->status.inventory[sd->equip_index[1]].equip;
- epor &= 0x88;
- pos = epor == 0x08 ? 0x80 : 0x08;
- }
-
- // “ñ“—¬?—
- if ((pos==0x22) // ˆê?A?”õ—v‹‰ÓŠ‚ª“ñ“—¬•Ší‚©ƒ`ƒFƒbƒN‚·‚é
- && (id->equip==2) // ? Žè•Ší
- && (pc_checkskill(sd, AS_LEFT) > 0 || pc_calc_base_job2(sd->status.class_) == 12) ) // ¶ŽèC?—L
- {
- int tpos=0;
- if(sd->equip_index[8] >= 0)
- tpos |= sd->status.inventory[sd->equip_index[8]].equip;
- if(sd->equip_index[9] >= 0)
- tpos |= sd->status.inventory[sd->equip_index[9]].equip;
- tpos &= 0x02;
- pos = tpos == 0x02 ? 0x20 : 0x02;
- }
-
- arrow=pc_search_inventory(sd,pc_checkequip(sd,9)); // Added by RoVeRT
- for(i=0;i<11;i++) {
- if(sd->equip_index[i] >= 0 && sd->status.inventory[sd->equip_index[i]].equip&pos) {
- pc_unequipitem(sd,sd->equip_index[i],2);
- }
- }
- // ‹|–î?”õ
- if(pos==0x8000){
- clif_arrowequip(sd,n);
- clif_arrow_fail(sd,3); // 3=–?”õ‚Å‚«‚Ü‚µ‚½
- }
- else
- clif_equipitemack(sd,n,pos,1);
-
- for(i=0;i<11;i++) {
- if(pos & equip_pos[i])
- sd->equip_index[i] = n;
- }
- sd->status.inventory[n].equip=pos;
-
- if(sd->status.inventory[n].equip & 0x0002) {
- if(sd->inventory_data[n])
- sd->weapontype1 = sd->inventory_data[n]->look;
- else
- sd->weapontype1 = 0;
- pc_calcweapontype(sd);
- clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
- }
- if(sd->status.inventory[n].equip & 0x0020) {
- if(sd->inventory_data[n]) {
- if(sd->inventory_data[n]->type == 4) {
- sd->status.shield = 0;
- if(sd->status.inventory[n].equip == 0x0020)
- sd->weapontype2 = sd->inventory_data[n]->look;
- else
- sd->weapontype2 = 0;
- }
- else if(sd->inventory_data[n]->type == 5) {
- sd->status.shield = sd->inventory_data[n]->look;
- sd->weapontype2 = 0;
- }
- }
- else
- sd->status.shield = sd->weapontype2 = 0;
- pc_calcweapontype(sd);
- clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield);
- }
- if(sd->status.inventory[n].equip & 0x0001) {
- if(sd->inventory_data[n])
- sd->status.head_bottom = sd->inventory_data[n]->look;
- else
- sd->status.head_bottom = 0;
- clif_changelook(&sd->bl,LOOK_HEAD_BOTTOM,sd->status.head_bottom);
- }
- if(sd->status.inventory[n].equip & 0x0100) {
- if(sd->inventory_data[n])
- sd->status.head_top = sd->inventory_data[n]->look;
- else
- sd->status.head_top = 0;
- clif_changelook(&sd->bl,LOOK_HEAD_TOP,sd->status.head_top);
- }
- if(sd->status.inventory[n].equip & 0x0200) {
- if(sd->inventory_data[n])
- sd->status.head_mid = sd->inventory_data[n]->look;
- else
- sd->status.head_mid = 0;
- clif_changelook(&sd->bl,LOOK_HEAD_MID,sd->status.head_mid);
- }
- if(sd->status.inventory[n].equip & 0x0040)
- clif_changelook(&sd->bl,LOOK_SHOES,0);
-
- pc_checkallowskill(sd); // ?”õ•i‚ŃXƒLƒ‹‚©‰ðœ‚³‚ê‚é‚©ƒ`ƒFƒbƒN
- if (itemdb_look(sd->status.inventory[n].nameid) == 11 && (arrow >= 0)){ // Added by RoVeRT
- clif_arrowequip(sd,arrow);
- sd->status.inventory[arrow].equip=32768;
- }
- status_calc_pc(sd,0);
-
- if(sd->special_state.infinite_endure) {
- if(sd->sc_data[SC_ENDURE].timer == -1)
- status_change_start(&sd->bl,SC_ENDURE,10,1,0,0,0,0);
- }
- else {
- if(sd->sc_count && sd->sc_data[SC_ENDURE].timer != -1 && sd->sc_data[SC_ENDURE].val2)
- status_change_end(&sd->bl,SC_ENDURE,-1);
- }
-
- if(sd->sc_count) {
- if (sd->sc_data[SC_SIGNUMCRUCIS].timer != -1 && !battle_check_undead(7,sd->def_ele))
- status_change_end(&sd->bl,SC_SIGNUMCRUCIS,-1);
- if(sd->sc_data[SC_DANCING].timer!=-1 && (sd->status.weapon != 13 && sd->status.weapon !=14))
- skill_stop_dancing(&sd->bl,0);
- }
-
- return 0;
-}
-
-/*==========================================
- * ? ”õ‚µ‚½•¨‚ðŠO‚·
- * type:
- * 0 - only unequip
- * 1 - calculate status after unequipping
- * 2 - force unequip
- *------------------------------------------
- */
-int pc_unequipitem(struct map_session_data *sd,int n,int flag)
-{
- short hp = 0, sp = 0;
- nullpo_retr(0, sd);
-
-// -- moonsoul (if player is berserk then cannot unequip)
-//
- if(flag<2 && sd->sc_count && (sd->sc_data[SC_BLADESTOP].timer!=-1 || sd->sc_data[SC_BERSERK].timer!=-1)){
- clif_unequipitemack(sd,n,0,0);
- return 0;
- }
-
- if(battle_config.battle_log)
- printf("unequip %d %x:%x\n",n,pc_equippoint(sd,n),sd->status.inventory[n].equip);
- if(sd->status.inventory[n].equip){
- int i;
- for(i=0;i<11;i++) {
- if(sd->status.inventory[n].equip & equip_pos[i]) {
- sd->equip_index[i] = -1;
- if(sd->unequip_losehp[i] > 0) {
- hp += sd->unequip_losehp[i];
- sd->unequip_losehp[i] = 0;
- }
- if(sd->unequip_losesp[i] > 0) {
- sp += sd->unequip_losesp[i];
- sd->unequip_losesp[i] = 0;
- }
- }
- }
- if(sd->status.inventory[n].equip & 0x0002) {
- sd->weapontype1 = 0;
- sd->status.weapon = sd->weapontype2;
- pc_calcweapontype(sd);
- clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
- }
- if(sd->status.inventory[n].equip & 0x0020) {
- sd->status.shield = sd->weapontype2 = 0;
- pc_calcweapontype(sd);
- clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield);
- }
- if(sd->status.inventory[n].equip & 0x0001) {
- sd->status.head_bottom = 0;
- clif_changelook(&sd->bl,LOOK_HEAD_BOTTOM,sd->status.head_bottom);
- }
- if(sd->status.inventory[n].equip & 0x0100) {
- sd->status.head_top = 0;
- clif_changelook(&sd->bl,LOOK_HEAD_TOP,sd->status.head_top);
- }
- if(sd->status.inventory[n].equip & 0x0200) {
- sd->status.head_mid = 0;
- clif_changelook(&sd->bl,LOOK_HEAD_MID,sd->status.head_mid);
- }
- if(sd->status.inventory[n].equip & 0x0040)
- clif_changelook(&sd->bl,LOOK_SHOES,0);
-
- if(sd->sc_count) {
- if (sd->sc_data[SC_BROKNWEAPON].timer != -1 && sd->status.inventory[n].equip & 0x0002 &&
- sd->status.inventory[n].attribute == 1)
- status_change_end(&sd->bl,SC_BROKNWEAPON,-1);
- if(sd->sc_data[SC_BROKNARMOR].timer != -1 && sd->status.inventory[n].equip & 0x0010 &&
- sd->status.inventory[n].attribute == 1)
- status_change_end(&sd->bl,SC_BROKNARMOR,-1);
- }
-
- clif_unequipitemack(sd,n,sd->status.inventory[n].equip,1);
- sd->status.inventory[n].equip=0;
- if(flag&1)
- pc_checkallowskill(sd);
- if(sd->weapontype1 == 0 && sd->weapontype2 == 0)
- skill_enchant_elemental_end(&sd->bl,-1); //•ŠíŽ‚¿¾‚¦‚Í–³?Œ‚Å?«•t?‰ðœ
- } else {
- clif_unequipitemack(sd,n,0,0);
- }
-
- if(flag&1) {
- status_calc_pc(sd,0);
- if(sd->sc_count && sd->sc_data[SC_SIGNUMCRUCIS].timer != -1 && !battle_check_undead(7,sd->def_ele))
- status_change_end(&sd->bl,SC_SIGNUMCRUCIS,-1);
- }
-
- if (hp > 0 || sp > 0) {
- if (hp > sd->status.hp)
- hp = sd->status.hp;
- if (sp > sd->status.sp)
- sp = sd->status.sp;
- pc_heal(sd,-hp,-sp);
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€‚Ìindex”Ô?‚ð‹l‚ß‚½‚è
- * ? ”õ•i‚Ì?”õ‰Â”\ƒ`ƒFƒbƒN‚ðs‚È‚¤
- *------------------------------------------
- */
-int pc_checkitem(struct map_session_data *sd)
-{
- int i,j,k,id,calc_flag = 0;
- struct item_data *it=NULL;
-
- nullpo_retr(0, sd);
-
- // ŠŽ•i‹ó‚«‹l‚ß
- for(i=j=0;i<MAX_INVENTORY;i++){
- if( (id=sd->status.inventory[i].nameid)==0)
- continue;
- if( battle_config.item_check && !itemdb_available(id) ){
- if(battle_config.error_log)
- printf("illeagal item id %d in %d[%s] inventory.\n",id,sd->bl.id,sd->status.name);
- pc_delitem(sd,i,sd->status.inventory[i].amount,3);
- continue;
- }
- if(i>j){
- memcpy(&sd->status.inventory[j],&sd->status.inventory[i],sizeof(struct item));
- sd->inventory_data[j] = sd->inventory_data[i];
- }
- j++;
- }
- if(j < MAX_INVENTORY)
- memset(&sd->status.inventory[j],0,sizeof(struct item)*(MAX_INVENTORY-j));
- for(k=j;k<MAX_INVENTORY;k++)
- sd->inventory_data[k] = NULL;
-
- // ƒJ?ƒg?‹ó‚«‹l‚ß
- for(i=j=0;i<MAX_CART;i++){
- if( (id=sd->status.cart[i].nameid)==0 )
- continue;
- if( battle_config.item_check && !itemdb_available(id) ){
- if(battle_config.error_log)
- printf("illeagal item id %d in %d[%s] cart.\n",id,sd->bl.id,sd->status.name);
- pc_cart_delitem(sd,i,sd->status.cart[i].amount,1);
- continue;
- }
- if(i>j){
- memcpy(&sd->status.cart[j],&sd->status.cart[i],sizeof(struct item));
- }
- j++;
- }
- if(j < MAX_CART)
- memset(&sd->status.cart[j],0,sizeof(struct item)*(MAX_CART-j));
-
- // ? ”õˆÊ’uƒ`ƒFƒbƒN
-
- for(i=0;i<MAX_INVENTORY;i++){
-
- it=sd->inventory_data[i];
-
- if(sd->status.inventory[i].nameid==0)
- continue;
- if(sd->status.inventory[i].equip & ~pc_equippoint(sd,i)) {
- sd->status.inventory[i].equip=0;
- calc_flag = 1;
- }
- //?”õ§ŒÀƒ`ƒFƒbƒN
- if(sd->status.inventory[i].equip && map[sd->bl.m].flag.pvp && (it->flag.no_equip&1)){//PVP check for forbiden items. optimized by [Lupus]
- sd->status.inventory[i].equip=0;
- calc_flag = 1;
- }else if(sd->status.inventory[i].equip && map[sd->bl.m].flag.gvg && (it->flag.no_equip>1)){//GvG optimized by [Lupus]
- sd->status.inventory[i].equip=0;
- calc_flag = 1;
- }
- }
-
- pc_setequipindex(sd);
- if(calc_flag)
- status_calc_pc(sd,2);
-
- return 0;
-}
-
-int pc_checkoverhp(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- if(sd->status.hp == sd->status.max_hp)
- return 1;
- if(sd->status.hp > sd->status.max_hp) {
- sd->status.hp = sd->status.max_hp;
- clif_updatestatus(sd,SP_HP);
- return 2;
- }
-
- return 0;
-}
-
-int pc_checkoversp(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- if(sd->status.sp == sd->status.max_sp)
- return 1;
- if(sd->status.sp > sd->status.max_sp) {
- sd->status.sp = sd->status.max_sp;
- clif_updatestatus(sd,SP_SP);
- return 2;
- }
-
- return 0;
-}
-
-/*==========================================
- * PVP‡ˆÊŒvŽZ—p(foreachinarea)
- *------------------------------------------
- */
-int pc_calc_pvprank_sub(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd1,*sd2=NULL;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, sd1=(struct map_session_data *)bl);
- nullpo_retr(0, sd2=va_arg(ap,struct map_session_data *));
-
- if( sd1->pvp_point > sd2->pvp_point )
- sd2->pvp_rank++;
- return 0;
-}
-/*==========================================
- * PVP‡ˆÊŒvŽZ
- *------------------------------------------
- */
-int pc_calc_pvprank(struct map_session_data *sd)
-{
- int old;
- struct map_data *m;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, m=&map[sd->bl.m]);
-
- old=sd->pvp_rank;
-
- if( !(m->flag.pvp) )
- return 0;
- sd->pvp_rank=1;
- map_foreachinarea(pc_calc_pvprank_sub,sd->bl.m,0,0,m->xs,m->ys,BL_PC,sd);
- if(old!=sd->pvp_rank || sd->pvp_lastusers!=m->users)
- clif_pvpset(sd,sd->pvp_rank,sd->pvp_lastusers=m->users,0);
- return sd->pvp_rank;
-}
-/*==========================================
- * PVP‡ˆÊŒvŽZ(timer)
- *------------------------------------------
- */
-int pc_calc_pvprank_timer(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd=NULL;
- if(battle_config.pk_mode) // disable pvp ranking if pk_mode on [Valaris]
- return 0;
-
- sd=map_id2sd(id);
- if(sd==NULL)
- return 0;
- sd->pvp_timer=-1;
- if( pc_calc_pvprank(sd)>0 )
- sd->pvp_timer=add_timer(
- gettick()+PVP_CALCRANK_INTERVAL,
- pc_calc_pvprank_timer,id,data);
- return 0;
-}
-
-/*==========================================
- * sd‚ÍŒ‹¥‚µ‚Ä‚¢‚é‚©(?¥‚Ìꇂ͑Š•û‚Ìchar_id‚ð•Ô‚·)
- *------------------------------------------
- */
-int pc_ismarried(struct map_session_data *sd)
-{
- if(sd == NULL)
- return -1;
- if(sd->status.partner_id > 0)
- return sd->status.partner_id;
- else
- return 0;
-}
-/*==========================================
- * sd‚ªdstsd‚ÆŒ‹¥(dstsd¨sd‚ÌŒ‹¥?—‚à“¯ŽbÉs‚¤)
- *------------------------------------------
- */
-int pc_marriage(struct map_session_data *sd,struct map_session_data *dstsd)
-{
- if(sd == NULL || dstsd == NULL || sd->status.partner_id > 0 || dstsd->status.partner_id > 0 || pc_calc_upper(sd->status.class_)==2)
- return -1;
- sd->status.partner_id=dstsd->status.char_id;
- dstsd->status.partner_id=sd->status.char_id;
- return 0;
-}
-
-/*==========================================
- * sd‚ª—£¥(‘ŠŽè‚Ísd->status.partner_id‚Ɉ˂é)(‘ŠŽè‚à“¯ŽbÉ—£¥?Œ‹¥Žw—ÖŽ©“®?’D)
- *------------------------------------------
- */
-int pc_divorce(struct map_session_data *sd)
-{
- struct map_session_data *p_sd=NULL;
- if(sd == NULL || !pc_ismarried(sd))
- return -1;
-
- if( (p_sd=map_nick2sd(map_charid2nick(sd->status.partner_id))) !=NULL){
- int i;
- if(p_sd->status.partner_id != sd->status.char_id || sd->status.partner_id != p_sd->status.char_id){
- printf("pc_divorce: Illegal partner_id sd=%d p_sd=%d\n",sd->status.partner_id,p_sd->status.partner_id);
- return -1;
- }
- sd->status.partner_id=0;
- p_sd->status.partner_id=0;
- for(i=0;i<MAX_INVENTORY;i++)
- if(sd->status.inventory[i].nameid == WEDDING_RING_M || sd->status.inventory[i].nameid == WEDDING_RING_F)
- pc_delitem(sd,i,1,0);
- for(i=0;i<MAX_INVENTORY;i++)
- if(p_sd->status.inventory[i].nameid == WEDDING_RING_M || p_sd->status.inventory[i].nameid == WEDDING_RING_F)
- pc_delitem(p_sd,i,1,0);
-
- }else{
- printf("pc_divorce: p_sd nullpo\n");
- return -1;
- }
- return 0;
-}
-
-/*==========================================
- * sd - father dstsd - mother jasd - child
- */
-int pc_adoption(struct map_session_data *sd,struct map_session_data *dstsd, struct map_session_data *jasd)
-{
- int j;
- if(sd == NULL || dstsd == NULL || jasd == NULL || sd->status.partner_id <= 0 || dstsd->status.partner_id <= 0 || sd->status.partner_id != dstsd->status.char_id || dstsd->status.partner_id != sd->status.char_id || sd->status.child > 0 || dstsd->status.child || jasd->status.father > 0 || jasd->status.mother > 0)
- return -1;
- jasd->status.father=sd->status.char_id;
- jasd->status.mother=dstsd->status.char_id;
- sd->status.child=jasd->status.char_id;
- dstsd->status.child=jasd->status.char_id;
- for (j=0; j < MAX_INVENTORY; j++) {
- if(jasd->status.inventory[j].nameid>0 && jasd->status.inventory[j].equip!=0)
- pc_unequipitem(jasd, j, 3);
- }
- if (pc_jobchange(jasd, 4023, 0) == 0)
- clif_displaymessage(jasd->fd, msg_table[12]); // Your job has been changed.
- else {
- clif_displaymessage(jasd->fd, msg_table[155]); // Impossible to change your job.
- return -1;
- }
- return 0;
-}
-
-/*==========================================
- * sd‚Ì‘Š•û‚Ìmap_session_data‚ð•Ô‚·
- *------------------------------------------
- */
-struct map_session_data *pc_get_partner(struct map_session_data *sd)
-{
- //struct map_session_data *p_sd = NULL;
- //char *nick;
- //if(sd == NULL || !pc_ismarried(sd))
- // return NULL;
- //nick=map_charid2nick(sd->status.partner_id);
- //if (nick==NULL)
- // return NULL;
- //if((p_sd=map_nick2sd(nick)) == NULL )
- // return NULL;
-
- if (sd && pc_ismarried(sd))
- // charid2sd returns NULL if not found
- return map_charid2sd(sd->status.partner_id);
-
- return NULL;
-}
-
-struct map_session_data *pc_get_father (struct map_session_data *sd)
-{
- if (sd && pc_calc_upper(sd->status.class_) == 2 && sd->status.father > 0)
- // charid2sd returns NULL if not found
- return map_charid2sd(sd->status.father);
-
- return NULL;
-}
-
-struct map_session_data *pc_get_mother (struct map_session_data *sd)
-{
- if (sd && pc_calc_upper(sd->status.class_) == 2 && sd->status.mother > 0)
- // charid2sd returns NULL if not found
- return map_charid2sd(sd->status.mother);
-
- return NULL;
-}
-
-struct map_session_data *pc_get_child (struct map_session_data *sd)
-{
- if (sd && pc_ismarried(sd) && sd->status.child > 0)
- // charid2sd returns NULL if not found
- return map_charid2sd(sd->status.child);
-
- return NULL;
-}
-
-//
-// Ž©‘R‰ñ•œ•¨
-//
-/*==========================================
- * SP‰ñ•œ—ÊŒvŽZ
- *------------------------------------------
- */
-static int natural_heal_tick,natural_heal_prev_tick,natural_heal_diff_tick;
-static int pc_spheal(struct map_session_data *sd)
-{
- int a, skill;
- struct guild_castle *gc = NULL;
-
- nullpo_retr(0, sd);
-
- a = natural_heal_diff_tick;
- if(pc_issit(sd)) a += a;
- if (sd->sc_count) {
- if (sd->sc_data[SC_MAGNIFICAT].timer!=-1) // ƒ}ƒOƒjƒtƒBƒJ?ƒg
- a += a;
- if (sd->sc_data[SC_REGENERATION].timer != -1)
- a *= sd->sc_data[SC_REGENERATION].val1;
- }
- if((skill = pc_checkskill(sd,HP_MEDITATIO)) > 0) //Increase natural SP regen with Meditatio [DracoRPG]
- a += a*skill*3/100;
-
- gc=guild_mapname2gc(sd->mapname); // Increased guild castle regen [Valaris]
- if(gc) {
- struct guild *g;
- g=guild_search(sd->status.guild_id);
- if(g && g->guild_id == gc->guild_id)
- a += a;
- } // end addition [Valaris]
-
- return a;
-}
-
-/*==========================================
- * HP‰ñ•œ—ÊŒvŽZ
- *------------------------------------------
- */
-static int pc_hpheal(struct map_session_data *sd)
-{
- int a;
- struct guild_castle *gc;
-
- nullpo_retr(0, sd);
-
- a = natural_heal_diff_tick;
- if(pc_issit(sd)) a += a;
- if (sd->sc_count) {
- if( sd->sc_data[SC_MAGNIFICAT].timer!=-1 ) // Modified by RoVeRT
- a += a;
- if (sd->sc_data[SC_REGENERATION].timer != -1)
- a *= sd->sc_data[SC_REGENERATION].val1;
- }
- gc=guild_mapname2gc(sd->mapname); // Increased guild castle regen [Valaris]
- if(gc) {
- struct guild *g;
- g=guild_search(sd->status.guild_id);
- if(g && g->guild_id == gc->guild_id)
- a += a;
- } // end addition [Valaris]
-
- return a;
-}
-
-static int pc_natural_heal_hp(struct map_session_data *sd)
-{
- int bhp;
- int inc_num,bonus,skill,hp_flag;
-
- nullpo_retr(0, sd);
-
- if (sd->sc_count && sd->sc_data[SC_TRICKDEAD].timer != -1) // Modified by RoVeRT
- return 0;
-
- if (sd->no_regen & 1)
- return 0;
-
- if(pc_checkoverhp(sd)) {
- sd->hp_sub = sd->inchealhptick = 0;
- return 0;
- }
-
- bhp=sd->status.hp;
- hp_flag = (pc_checkskill(sd,SM_MOVINGRECOVERY) > 0 && sd->walktimer != -1);
-
- if(sd->walktimer == -1) {
- inc_num = pc_hpheal(sd);
- if(sd->sc_data[SC_TENSIONRELAX].timer!=-1 ){ // ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX
- sd->hp_sub += 2*inc_num;
- sd->inchealhptick += 3*natural_heal_diff_tick;
- } else {
- sd->hp_sub += inc_num;
- sd->inchealhptick += natural_heal_diff_tick;
- }
- }
- else if(hp_flag) {
- inc_num = pc_hpheal(sd);
- sd->hp_sub += inc_num;
- sd->inchealhptick = 0;
- }
- else {
- sd->hp_sub = sd->inchealhptick = 0;
- return 0;
- }
-
- if(sd->hp_sub >= battle_config.natural_healhp_interval) {
- bonus = sd->nhealhp;
- if(hp_flag) {
- bonus >>= 2;
- if(bonus <= 0) bonus = 1;
- }
- while(sd->hp_sub >= battle_config.natural_healhp_interval) {
- sd->hp_sub -= battle_config.natural_healhp_interval;
- if(sd->status.hp + bonus <= sd->status.max_hp)
- sd->status.hp += bonus;
- else {
- sd->status.hp = sd->status.max_hp;
- sd->hp_sub = sd->inchealhptick = 0;
- }
- }
- }
- if(bhp!=sd->status.hp)
- clif_updatestatus(sd,SP_HP);
-
- if(sd->nshealhp > 0) {
- if(sd->inchealhptick >= battle_config.natural_heal_skill_interval && sd->status.hp < sd->status.max_hp) {
- bonus = sd->nshealhp;
- while(sd->inchealhptick >= battle_config.natural_heal_skill_interval) {
- sd->inchealhptick -= battle_config.natural_heal_skill_interval;
- if(sd->status.hp + bonus <= sd->status.max_hp)
- sd->status.hp += bonus;
- else {
- bonus = sd->status.max_hp - sd->status.hp;
- sd->status.hp = sd->status.max_hp;
- sd->hp_sub = sd->inchealhptick = 0;
- }
- clif_heal(sd->fd,SP_HP,bonus);
- }
- }
- }
- else sd->inchealhptick = 0;
-
- return 0;
-
- if(sd->sc_count && sd->sc_data[SC_APPLEIDUN].timer!=-1 && sd->sc_data[SC_BERSERK].timer==-1) { // Apple of Idun
- if(sd->inchealhptick >= 6000 && sd->status.hp < sd->status.max_hp) {
- bonus = skill*20;
- while(sd->inchealhptick >= 6000) {
- sd->inchealhptick -= 6000;
- if(sd->status.hp + bonus <= sd->status.max_hp)
- sd->status.hp += bonus;
- else {
- bonus = sd->status.max_hp - sd->status.hp;
- sd->status.hp = sd->status.max_hp;
- sd->hp_sub = sd->inchealhptick = 0;
- }
- clif_heal(sd->fd,SP_HP,bonus);
- }
- }
- }
- else sd->inchealhptick = 0;
-
- return 0;
-}
-
-static int pc_natural_heal_sp(struct map_session_data *sd)
-{
- int bsp;
- int inc_num,bonus;
-
- nullpo_retr(0, sd);
-
- if (sd->sc_count && (sd->sc_data[SC_TRICKDEAD].timer != -1 || // Modified by RoVeRT
- sd->sc_data[SC_BERSERK].timer != -1 ||
- sd->sc_data[SC_BLEEDING].timer != -1))
- return 0;
-
- if (sd->no_regen & 2)
- return 0;
-
- if(pc_checkoversp(sd)) {
- sd->sp_sub = sd->inchealsptick = 0;
- return 0;
- }
-
- bsp=sd->status.sp;
-
- inc_num = pc_spheal(sd);
- if(sd->sc_data[SC_EXPLOSIONSPIRITS].timer == -1)
- sd->sp_sub += inc_num;
- if(sd->walktimer == -1)
- sd->inchealsptick += natural_heal_diff_tick;
- else sd->inchealsptick = 0;
-
- if(sd->sp_sub >= battle_config.natural_healsp_interval){
- bonus = sd->nhealsp;;
- while(sd->sp_sub >= battle_config.natural_healsp_interval){
- sd->sp_sub -= battle_config.natural_healsp_interval;
- if(sd->status.sp + bonus <= sd->status.max_sp)
- sd->status.sp += bonus;
- else {
- sd->status.sp = sd->status.max_sp;
- sd->sp_sub = sd->inchealsptick = 0;
- }
- }
- }
-
- if(bsp != sd->status.sp)
- clif_updatestatus(sd,SP_SP);
-
- if(sd->nshealsp > 0) {
- if(sd->inchealsptick >= battle_config.natural_heal_skill_interval && sd->status.sp < sd->status.max_sp) {
- struct pc_base_job s_class = pc_calc_base_job(sd->status.class_);
- if(sd->doridori_counter && s_class.job == 23)
- bonus = sd->nshealsp*2;
- else
- bonus = sd->nshealsp;
- sd->doridori_counter = 0;
- while(sd->inchealsptick >= battle_config.natural_heal_skill_interval) {
- sd->inchealsptick -= battle_config.natural_heal_skill_interval;
- if(sd->status.sp + bonus <= sd->status.max_sp)
- sd->status.sp += bonus;
- else {
- bonus = sd->status.max_sp - sd->status.sp;
- sd->status.sp = sd->status.max_sp;
- sd->sp_sub = sd->inchealsptick = 0;
- }
- clif_heal(sd->fd,SP_SP,bonus);
- }
- }
- }
- else sd->inchealsptick = 0;
-
- return 0;
-}
-
-static int pc_spirit_heal_hp(struct map_session_data *sd)
-{
- int bonus_hp,interval = battle_config.natural_heal_skill_interval;
-
- nullpo_retr(0, sd);
-
- if(pc_checkoverhp(sd)) {
- sd->inchealspirithptick = 0;
- return 0;
- }
-
- sd->inchealspirithptick += natural_heal_diff_tick;
-
- if(sd->weight*100/sd->max_weight >= battle_config.natural_heal_weight_rate)
- interval += interval;
-
- if(sd->inchealspirithptick >= interval) {
- bonus_hp = sd->nsshealhp;
- while(sd->inchealspirithptick >= interval) {
- if(pc_issit(sd)) {
- sd->inchealspirithptick -= interval;
- if(sd->status.hp < sd->status.max_hp) {
- if(sd->status.hp + bonus_hp <= sd->status.max_hp)
- sd->status.hp += bonus_hp;
- else {
- bonus_hp = sd->status.max_hp - sd->status.hp;
- sd->status.hp = sd->status.max_hp;
- }
- clif_heal(sd->fd,SP_HP,bonus_hp);
- sd->inchealspirithptick = 0;
- }
- }else{
- sd->inchealspirithptick -= natural_heal_diff_tick;
- break;
- }
- }
- }
-
- return 0;
-}
-static int pc_spirit_heal_sp(struct map_session_data *sd)
-{
- int bonus_sp,interval = battle_config.natural_heal_skill_interval;
-
- nullpo_retr(0, sd);
-
- if(pc_checkoversp(sd)) {
- sd->inchealspiritsptick = 0;
- return 0;
- }
-
- sd->inchealspiritsptick += natural_heal_diff_tick;
-
- if(sd->weight*100/sd->max_weight >= battle_config.natural_heal_weight_rate)
- interval += interval;
-
- if(sd->inchealspiritsptick >= interval) {
- bonus_sp = sd->nsshealsp;
- while(sd->inchealspiritsptick >= interval) {
- if(pc_issit(sd)) {
- sd->inchealspiritsptick -= interval;
- if(sd->status.sp < sd->status.max_sp) {
- if(sd->status.sp + bonus_sp <= sd->status.max_sp)
- sd->status.sp += bonus_sp;
- else {
- bonus_sp = sd->status.max_sp - sd->status.sp;
- sd->status.sp = sd->status.max_sp;
- }
- clif_heal(sd->fd,SP_SP,bonus_sp);
- sd->inchealspiritsptick = 0;
- }
- }else{
- sd->inchealspiritsptick -= natural_heal_diff_tick;
- break;
- }
- }
- }
-
- return 0;
-}
-
-static int pc_bleeding (struct map_session_data *sd)
-{
- int interval, hp;
-
- nullpo_retr(0, sd);
- interval = sd->hp_loss_rate;
- hp = sd->hp_loss_value;
-
- sd->hp_loss_tick += natural_heal_diff_tick;
- if(sd->hp_loss_tick >= interval) {
- while(sd->hp_loss_tick >= interval) {
- sd->hp_loss_tick -= interval;
- if (sd->status.hp < hp)
- hp = sd->status.hp;
- if (sd->hp_loss_type == 1) {
- clif_damage(&sd->bl,&sd->bl,gettick(),0,0,hp,0,0,0);
- }
- pc_heal(sd,-hp,0);
- sd->hp_loss_tick = 0;
- }
- }
- return 0;
-}
-
-/*==========================================
- * HP/SP Ž©‘R‰ñ•œ ŠeƒNƒ‰ƒCƒAƒ“ƒg
- *------------------------------------------
- */
-
-static int pc_natural_heal_sub(struct map_session_data *sd,va_list ap) {
- int skill;
- int tick;
-
- nullpo_retr(0, sd);
- tick = va_arg(ap,int);
-
-// -- moonsoul (if conditions below altered to disallow natural healing if under berserk status)
- if ((battle_config.natural_heal_weight_rate > 100 || sd->weight*100/sd->max_weight < battle_config.natural_heal_weight_rate) &&
- !pc_isdead(sd) &&
- !pc_ishiding(sd) &&
- //-- cannot regen for 5 minutes after using Berserk --- [Celest]
- DIFF_TICK (tick, sd->canregen_tick)>=0 &&
- (sd->sc_data && !(sd->sc_data[SC_POISON].timer != -1 && sd->sc_data[SC_SLOWPOISON].timer == -1) &&
- sd->sc_data[SC_BERSERK].timer == -1 )) {
- pc_natural_heal_hp(sd);
- if( sd->sc_data && sd->sc_data[SC_EXTREMITYFIST].timer == -1 && //ˆ¢C—…?‘Ô‚Å‚ÍSP‚ª‰ñ•œ‚µ‚È‚¢
- sd->sc_data[SC_DANCING].timer == -1 && //ƒ_ƒ“ƒX?‘Ô‚Å‚ÍSP‚ª‰ñ•œ‚µ‚È‚¢
- sd->sc_data[SC_BERSERK].timer == -1 ) //ƒo?ƒT?ƒN?‘Ô‚Å‚ÍSP‚ª‰ñ•œ‚µ‚È‚¢
- pc_natural_heal_sp(sd);
- sd->canregen_tick = tick;
- } else {
- sd->hp_sub = sd->inchealhptick = 0;
- sd->sp_sub = sd->inchealsptick = 0;
- }
- if((skill = pc_checkskill(sd,MO_SPIRITSRECOVERY)) > 0 && !pc_ishiding(sd) &&
- sd->sc_data[SC_POISON].timer == -1 && sd->sc_data[SC_BERSERK].timer == -1){
- pc_spirit_heal_hp(sd);
- pc_spirit_heal_sp(sd);
- }
- else {
- sd->inchealspirithptick = 0;
- sd->inchealspiritsptick = 0;
- }
- if (sd->hp_loss_value > 0)
- pc_bleeding(sd);
- else
- sd->hp_loss_tick = 0;
-
- return 0;
-}
-
-/*==========================================
- * HP/SPŽ©‘R‰ñ•œ (interval timer??)
- *------------------------------------------
- */
-int pc_natural_heal(int tid,unsigned int tick,int id,int data)
-{
- natural_heal_tick = tick;
- natural_heal_diff_tick = DIFF_TICK(natural_heal_tick,natural_heal_prev_tick);
- clif_foreachclient(pc_natural_heal_sub, tick);
-
- natural_heal_prev_tick = tick;
- return 0;
-}
-
-/*==========================================
- * ƒZ?ƒuƒ|ƒCƒ“ƒg‚Ì•Û‘¶
- *------------------------------------------
- */
-int pc_setsavepoint(struct map_session_data *sd,char *mapname,int x,int y)
-{
- nullpo_retr(0, sd);
-
- strncpy(sd->status.save_point.map,mapname,24);
- sd->status.save_point.x = x;
- sd->status.save_point.y = y;
-
- return 0;
-}
-
-/*==========================================
- * Ž©“®ƒZ?ƒu ŠeƒNƒ‰ƒCƒAƒ“ƒg
- *------------------------------------------
- */
-static int last_save_fd,save_flag;
-static int pc_autosave_sub(struct map_session_data *sd,va_list ap)
-{
- nullpo_retr(0, sd);
-
- Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
-
- if(save_flag==0 && sd->fd>last_save_fd && !sd->state.waitingdisconnect){
-
-// if(battle_config.save_log)
-// printf("autosave %d\n",sd->fd);
- // pet
- if(sd->status.pet_id > 0 && sd->pd)
- intif_save_petdata(sd->status.account_id,&sd->pet);
- pc_makesavestatus(sd);
- chrif_save(sd);
- storage_storage_save(sd);
-
- save_flag=1;
- last_save_fd = sd->fd;
- }
-
- return 0;
-}
-
-/*==========================================
- * Ž©“®ƒZ?ƒu (timer??)
- *------------------------------------------
- */
-int pc_autosave(int tid,unsigned int tick,int id,int data)
-{
- int interval;
-
- save_flag=0;
- clif_foreachclient(pc_autosave_sub);
- if(save_flag==0)
- last_save_fd=0;
-
- interval = autosave_interval/(clif_countusers()+1);
- if(interval <= 0)
- interval = 1;
- add_timer(gettick()+interval,pc_autosave,0,0);
-
- return 0;
-}
-
-int pc_read_gm_account(int fd)
-{
-#ifdef TXT_ONLY
- int i = 0;
-#endif
- if (gm_account != NULL)
- aFree(gm_account);
- GM_num = 0;
-#ifdef TXT_ONLY
- gm_account = (struct gm_account *) aCallocA(sizeof(struct gm_account) * ((RFIFOW(fd,2) - 4) / 5), 1);
- for (i = 4; i < RFIFOW(fd,2); i = i + 5) {
- gm_account[GM_num].account_id = RFIFOL(fd,i);
- gm_account[GM_num].level = (int)RFIFOB(fd,i+4);
- //printf("GM account: %d -> level %d\n", gm_account[GM_num].account_id, gm_account[GM_num].level);
- GM_num++;
- }
-#else
- sprintf (tmp_lsql, "SELECT `%s`,`%s` FROM `%s` WHERE `%s`>='%d'",gm_db_account_id,gm_db_level,gm_db,gm_db_level,lowest_gm_level);
- if(mysql_query(&lmysql_handle, tmp_lsql) ) {
- printf("DB server Error (select %s to Memory)- %s\n",login_db,mysql_error(&lmysql_handle) );
- }
- lsql_res = mysql_store_result(&lmysql_handle);
- if (lsql_res) {
- gm_account = (struct gm_account *) aCallocA(sizeof(struct gm_account) * mysql_num_rows(lsql_res), 1);
- while ((lsql_row = mysql_fetch_row(lsql_res))) {
- gm_account[GM_num].account_id = atoi(lsql_row[0]);
- gm_account[GM_num].level = atoi(lsql_row[1]);
- printf("GM account: %d -> level %d\n", gm_account[GM_num].account_id, gm_account[GM_num].level);
- GM_num++;
- }
- }
-
- mysql_free_result(lsql_res);
-#endif /* TXT_ONLY */
- return GM_num;
-}
-
-/*==========================================
- * timer to do the day
- *------------------------------------------
- */
-int map_day_timer(int tid, unsigned int tick, int id, int data) { // by [yor]
- struct map_session_data *pl_sd = NULL;
- int i;
- char tmpstr[1024];
-
- if (battle_config.day_duration > 0) { // if we want a day
- if (night_flag != 0) {
- strcpy(tmpstr, msg_txt(502)); // The day has arrived!
- night_flag = 0; // 0=day, 1=night [Yor]
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth) {
- if (battle_config.night_darkness_level > 0)
- clif_refresh (pl_sd);
- else {
- pl_sd->opt2 &= ~STATE_BLIND;
- clif_changeoption(&pl_sd->bl);
- }
- clif_wis_message(pl_sd->fd, wisp_server_name, tmpstr, strlen(tmpstr)+1);
- }
- }
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * timer to do the night
- *------------------------------------------
- */
-int map_night_timer(int tid, unsigned int tick, int id, int data) { // by [yor]
- struct map_session_data *pl_sd = NULL;
- int i;
- char tmpstr[1024];
-
- if (battle_config.night_duration > 0) { // if we want a night
- if (night_flag == 0) {
- strcpy(tmpstr, msg_txt(503)); // The night has fallen...
- night_flag = 1; // 0=day, 1=night [Yor]
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = (struct map_session_data *) session[i]->session_data) && pl_sd->state.auth && !map[pl_sd->bl.m].flag.indoors) {
- if (battle_config.night_darkness_level > 0)
- clif_specialeffect(&pl_sd->bl, 474 + battle_config.night_darkness_level, 0);
- else {
- //clif_specialeffect(&pl_sd->bl, 483, 0); // default darkness level
- pl_sd->opt2 |= STATE_BLIND;
- clif_changeoption(&pl_sd->bl);
- }
- clif_wis_message(pl_sd->fd, wisp_server_name, tmpstr, strlen(tmpstr)+1);
- }
- }
- }
- }
-
- return 0;
-}
-
-void pc_setstand(struct map_session_data *sd){
- nullpo_retv(sd);
-
- if(sd->sc_count && sd->sc_data[SC_TENSIONRELAX].timer!=-1)
- status_change_end(&sd->bl,SC_TENSIONRELAX,-1);
-
- sd->state.dead_sit = 0;
-}
-
-//
-// ‰Šú‰»•¨
-//
-/*==========================================
- * Ý’èƒtƒ@ƒCƒ‹?‚Ý?‚Þ
- * exp.txt •K—v??’l
- * job_db1.txt d—Ê,hp,sp,U?‘¬“x
- * job_db2.txt job”\—Í’lƒ{?ƒiƒX
- * skill_tree.txt ŠeE?‚̃XƒLƒ‹ƒcƒŠ?
- * attr_fix.txt ?«C³ƒe?ƒuƒ‹
- * size_fix.txt ƒTƒCƒY•â³ƒe?ƒuƒ‹
- * refine_db.txt ¸?ƒf?ƒ^ƒe?ƒuƒ‹
- *------------------------------------------
- */
-int pc_readdb(void)
-{
- int i,j,k,u;
- struct pc_base_job s_class;
- FILE *fp;
- char line[1024],*p;
-
- // •K—v??’l?‚Ý?‚Ý
- memset(exp_table,0,sizeof(exp_table));
- fp=fopen("db/exp.txt","r");
- if(fp==NULL){
- printf("can't read db/exp.txt\n");
- return 1;
- }
- i=0;
- while(fgets(line, sizeof(line)-1, fp)){
- int bn,b1,b2,b3,b4,b5,b6,jn,j1,j2,j3,j4,j5,j6;
- if(line[0]=='/' && line[1]=='/')
- continue;
- if(sscanf(line,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",&bn,&b1,&b2,&b3,&b4,&b5,&b6,&jn,&j1,&j2,&j3,&j4,&j5,&j6)!=14)
- continue;
- exp_table[0][i]=bn;
- exp_table[1][i]=b1;
- exp_table[2][i]=b2;
- exp_table[3][i]=b3;
- exp_table[4][i]=b4;
- exp_table[5][i]=b5;
- exp_table[6][i]=b6;
- exp_table[7][i]=jn;
- exp_table[8][i]=j1;
- exp_table[9][i]=j2;
- exp_table[10][i]=j3;
- exp_table[11][i]=j4;
- exp_table[12][i]=j5;
- exp_table[13][i]=j6;
- i++;
- if(i >= battle_config.maximum_level)
- break;
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/exp.txt");
- ShowStatus(tmp_output);
-
- // ƒXƒLƒ‹ƒcƒŠ?
- memset(skill_tree,0,sizeof(skill_tree));
- fp=fopen("db/skill_tree.txt","r");
- if(fp==NULL){
- printf("can't read db/skill_tree.txt\n");
- return 1;
- }
-
- while(fgets(line, sizeof(line)-1, fp)){
- char *split[50];
- int f=0, m=3;
- if(line[0]=='/' && line[1]=='/')
- continue;
- for(j=0,p=line;j<14 && p;j++){
- split[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
- if(j<13)
- continue;
- if (j == 14) {
- f=1; // MinJobLvl has been added
- m++;
- }
- s_class = pc_calc_base_job(atoi(split[0]));
- i = s_class.job;
- u = s_class.upper;
- // check for bounds [celest]
- if (i > 25 || u > 3)
- continue;
- for(j = 0; skill_tree[u][i][j].id && j < MAX_SKILL_TREE; j++);
- if (j == MAX_SKILL_TREE)
- continue;
- skill_tree[u][i][j].id=atoi(split[1]);
- skill_tree[u][i][j].max=atoi(split[2]);
- if (f) skill_tree[u][i][j].joblv=atoi(split[3]);
-
- for(k=0;k<5;k++){
- skill_tree[u][i][j].need[k].id=atoi(split[k*2+m]);
- skill_tree[u][i][j].need[k].lv=atoi(split[k*2+m+1]);
- }
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/skill_tree.txt");
- ShowStatus(tmp_output);
-
- // ?«C³ƒe?ƒuƒ‹
- for(i=0;i<4;i++)
- for(j=0;j<10;j++)
- for(k=0;k<10;k++)
- attr_fix_table[i][j][k]=100;
- fp=fopen("db/attr_fix.txt","r");
- if(fp==NULL){
- printf("can't read db/attr_fix.txt\n");
- return 1;
- }
- while(fgets(line, sizeof(line)-1, fp)){
- char *split[10];
- int lv,n;
- if(line[0]=='/' && line[1]=='/')
- continue;
- for(j=0,p=line;j<3 && p;j++){
- split[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
- lv=atoi(split[0]);
- n=atoi(split[1]);
-// printf("%d %d\n",lv,n);
-
- for(i=0;i<n;){
- if( !fgets(line, sizeof(line)-1, fp) )
- break;
- if(line[0]=='/' && line[1]=='/')
- continue;
-
- for(j=0,p=line;j<n && p;j++){
- while(*p==32 && *p>0)
- p++;
- attr_fix_table[lv-1][i][j]=atoi(p);
- if(battle_config.attr_recover == 0 && attr_fix_table[lv-1][i][j] < 0)
- attr_fix_table[lv-1][i][j] = 0;
- p=strchr(p,',');
- if(p) *p++=0;
- }
-
- i++;
- }
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/attr_fix.txt");
- ShowStatus(tmp_output);
-
- // ƒXƒLƒ‹ƒcƒŠ?
- memset(statp,0,sizeof(statp));
- i=1;
- j=45; // base points
- fp=fopen("db/statpoint.txt","r");
- if(fp == NULL){
- sprintf(tmp_output,"Can't read '"CL_WHITE"%s"CL_RESET"'... Generating DB.\n","db/statpoint.txt");
- //return 1;
- } else {
- while(fgets(line, sizeof(line)-1, fp)){
- if(line[0]=='/' && line[1]=='/')
- continue;
- if ((j=atoi(line))<0)
- j=0;
- if (i >= MAX_LEVEL)
- break;
- statp[i]=j;
- i++;
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/statpoint.txt");
- }
- // generate the remaining parts of the db if necessary
- for (; i < MAX_LEVEL; i++) {
- j += (i+15)/5;
- statp[i] = j;
- }
- ShowStatus(tmp_output);
-
- return 0;
-}
-
-/*==========================================
- * pc? ŒW‰Šú‰»
- *------------------------------------------
- */
-void do_final_pc(void) {
- if (gm_account)
- aFree(gm_account);
- return;
-}
-int do_init_pc(void) {
- pc_readdb();
-
-// gm_account_db = numdb_init();
-
- add_timer_func_list(pc_walk, "pc_walk");
- add_timer_func_list(pc_attack_timer, "pc_attack_timer");
- add_timer_func_list(pc_natural_heal, "pc_natural_heal");
- add_timer_func_list(pc_invincible_timer, "pc_invincible_timer");
- add_timer_func_list(pc_eventtimer, "pc_eventtimer");
- add_timer_func_list(pc_calc_pvprank_timer, "pc_calc_pvprank_timer");
- add_timer_func_list(pc_autosave, "pc_autosave");
- add_timer_func_list(pc_spiritball_timer, "pc_spiritball_timer");
- add_timer_interval((natural_heal_prev_tick = gettick() + NATURAL_HEAL_INTERVAL), pc_natural_heal, 0, 0, NATURAL_HEAL_INTERVAL);
- add_timer(gettick() + autosave_interval, pc_autosave, 0, 0);
-
-#ifndef TXT_ONLY
- pc_read_gm_account(0);
-#endif /* not TXT_ONLY */
-
- if (battle_config.day_duration > 0 && battle_config.night_duration > 0) {
- int day_duration = battle_config.day_duration;
- int night_duration = battle_config.night_duration;
- // add night/day timer (by [yor])
- add_timer_func_list(map_day_timer, "map_day_timer"); // by [yor]
- add_timer_func_list(map_night_timer, "map_night_timer"); // by [yor]
-
- if (battle_config.night_at_start == 0) {
- night_flag = 0; // 0=day, 1=night [Yor]
- day_timer_tid = add_timer_interval(gettick() + day_duration + night_duration, map_day_timer, 0, 0, day_duration + night_duration);
- night_timer_tid = add_timer_interval(gettick() + day_duration, map_night_timer, 0, 0, day_duration + night_duration);
- } else {
- night_flag = 1; // 0=day, 1=night [Yor]
- day_timer_tid = add_timer_interval(gettick() + night_duration, map_day_timer, 0, 0, day_duration + night_duration);
- night_timer_tid = add_timer_interval(gettick() + day_duration + night_duration, map_night_timer, 0, 0, day_duration + night_duration);
- }
- }
-
- return 0;
-}
diff --git a/src/map/pc.h b/src/map/pc.h
deleted file mode 100644
index 6aec36d38..000000000
--- a/src/map/pc.h
+++ /dev/null
@@ -1,224 +0,0 @@
-// $Id: pc.h,v 1.4 2004/09/25 05:32:18 MouseJstr Exp $
-
-#ifndef _PC_H_
-#define _PC_H_
-
-#include "map.h"
-
-#define OPTION_MASK 0xd7b8
-#define CART_MASK 0x788
-#define STATE_BLIND 0x10
-
-#define MAX_SKILL_TREE 51
-
-#define pc_setdead(sd) ((sd)->state.dead_sit = 1)
-#define pc_setsit(sd) ((sd)->state.dead_sit = 2)
-//#define pc_setstand(sd) ((sd)->state.dead_sit = 0)
-#define pc_isdead(sd) ((sd)->state.dead_sit == 1)
-#define pc_issit(sd) ((sd)->state.dead_sit == 2)
-#define pc_setdir(sd,b,h) ((sd)->dir = (b) ,(sd)->head_dir = (h) )
-#define pc_setchatid(sd,n) ((sd)->chatID = n)
-#define pc_ishiding(sd) ((sd)->status.option&0x4006)
-#define pc_iscarton(sd) ((sd)->status.option&CART_MASK)
-#define pc_isfalcon(sd) ((sd)->status.option&0x0010)
-#define pc_isriding(sd) ((sd)->status.option&0x0020)
-#define pc_isinvisible(sd) ((sd)->status.option&0x0040)
-#define pc_is50overweight(sd) (sd->weight*2 >= sd->max_weight)
-#define pc_is90overweight(sd) (sd->weight*10 >= sd->max_weight*9)
-
-int pc_isGM(struct map_session_data *sd);
-int pc_iskiller(struct map_session_data *src, struct map_session_data *target); // [MouseJstr]
-int pc_getrefinebonus(int lv,int type);
-
-int pc_counttargeted(struct map_session_data *sd,struct block_list *src,int target_lv);
-int pc_setrestartvalue(struct map_session_data *sd,int type);
-int pc_makesavestatus(struct map_session_data *);
-int pc_setnewpc(struct map_session_data*,int,int,int,int,int,int);
-int pc_authok(int, int, time_t, struct mmo_charstatus *);
-int pc_authfail(int);
-
-int pc_isequip(struct map_session_data *sd,int n);
-int pc_equippoint(struct map_session_data *sd,int n);
-
-int pc_break_equip(struct map_session_data *, unsigned short);
-#define pc_breakweapon(sd) (pc_break_equip(sd, EQP_WEAPON))
-#define pc_breakarmor(sd) (pc_break_equip(sd, EQP_ARMOR))
-#define pc_breakshield(sd) (pc_break_equip(sd, EQP_SHIELD))
-#define pc_breakhelm(sd) (pc_break_equip(sd, EQP_HELM))
-
-int pc_checkskill(struct map_session_data *sd,int skill_id);
-int pc_checkallowskill(struct map_session_data *sd);
-int pc_checkequip(struct map_session_data *sd,int pos);
-
-int pc_calc_skilltree(struct map_session_data *sd);
-int pc_calc_skilltree_normalize_job(int c, struct map_session_data *sd);
-int pc_clean_skilltree(struct map_session_data *sd);
-
-int pc_checkoverhp(struct map_session_data*);
-int pc_checkoversp(struct map_session_data*);
-
-int pc_can_reach(struct map_session_data*,int,int);
-int pc_walktoxy(struct map_session_data*,int,int);
-int pc_stop_walking(struct map_session_data*,int);
-int pc_movepos(struct map_session_data*,int,int);
-int pc_setpos(struct map_session_data*,char*,int,int,int);
-int pc_setsavepoint(struct map_session_data*,char*,int,int);
-int pc_randomwarp(struct map_session_data *sd,int type);
-int pc_memo(struct map_session_data *sd,int i);
-int pc_randomwalk(struct map_session_data*,int tick);
-int pc_remove_map(struct map_session_data *sd,int clrtype);
-
-int pc_checkadditem(struct map_session_data*,int,int);
-int pc_inventoryblank(struct map_session_data*);
-int pc_search_inventory(struct map_session_data *sd,int item_id);
-int pc_payzeny(struct map_session_data*,int);
-int pc_additem(struct map_session_data*,struct item*,int);
-int pc_getzeny(struct map_session_data*,int);
-int pc_delitem(struct map_session_data*,int,int,int);
-int pc_checkitem(struct map_session_data*);
-
-int pc_cart_additem(struct map_session_data *sd,struct item *item_data,int amount);
-int pc_cart_delitem(struct map_session_data *sd,int n,int amount,int type);
-int pc_putitemtocart(struct map_session_data *sd,int idx,int amount);
-int pc_getitemfromcart(struct map_session_data *sd,int idx,int amount);
-int pc_cartitem_amount(struct map_session_data *sd,int idx,int amount);
-
-int pc_takeitem(struct map_session_data*,struct flooritem_data*);
-int pc_dropitem(struct map_session_data*,int,int);
-
-int pc_checkweighticon(struct map_session_data *sd);
-
-int pc_bonus(struct map_session_data*,int,int);
-int pc_bonus2(struct map_session_data *sd,int,int,int);
-int pc_bonus3(struct map_session_data *sd,int,int,int,int);
-int pc_bonus4(struct map_session_data *sd,int,int,int,int,int);
-int pc_skill(struct map_session_data*,int,int,int);
-
-int pc_blockskill_start (struct map_session_data*,int,int); // [celest]
-
-int pc_insert_card(struct map_session_data *sd,int idx_card,int idx_equip);
-
-int pc_item_identify(struct map_session_data *sd,int idx);
-int pc_item_repair(struct map_session_data *sd,int idx); // [Celest]
-int pc_item_refine(struct map_session_data *sd,int idx); // [Celest]
-int pc_steal_item(struct map_session_data *sd,struct block_list *bl);
-int pc_steal_coin(struct map_session_data *sd,struct block_list *bl);
-
-int pc_modifybuyvalue(struct map_session_data*,int);
-int pc_modifysellvalue(struct map_session_data*,int);
-
-int pc_attack(struct map_session_data*,int,int);
-int pc_stopattack(struct map_session_data*);
-
-int pc_follow(struct map_session_data*, int); // [MouseJstr]
-
-int pc_checkbaselevelup(struct map_session_data *sd);
-int pc_checkjoblevelup(struct map_session_data *sd);
-int pc_gainexp(struct map_session_data*,int,int);
-int pc_nextbaseexp(struct map_session_data *);
-int pc_nextbaseafter(struct map_session_data *); // [Valaris]
-int pc_nextjobexp(struct map_session_data *);
-int pc_nextjobafter(struct map_session_data *); // [Valaris]
-int pc_need_status_point(struct map_session_data *,int);
-int pc_statusup(struct map_session_data*,int);
-int pc_statusup2(struct map_session_data*,int,int);
-int pc_skillup(struct map_session_data*,int);
-int pc_allskillup(struct map_session_data*);
-int pc_resetlvl(struct map_session_data*,int type);
-int pc_resetstate(struct map_session_data*);
-int pc_resetskill(struct map_session_data*);
-int pc_equipitem(struct map_session_data*,int,int);
-int pc_unequipitem(struct map_session_data*,int,int);
-int pc_checkitem(struct map_session_data*);
-int pc_useitem(struct map_session_data*,int);
-
-int pc_damage(struct block_list *,struct map_session_data*,int);
-int pc_heal(struct map_session_data *,int,int);
-int pc_itemheal(struct map_session_data *sd,int hp,int sp);
-int pc_percentheal(struct map_session_data *sd,int,int);
-int pc_jobchange(struct map_session_data *,int, int);
-int pc_setoption(struct map_session_data *,int);
-int pc_setcart(struct map_session_data *sd,int type);
-int pc_setfalcon(struct map_session_data *sd);
-int pc_setriding(struct map_session_data *sd);
-int pc_changelook(struct map_session_data *,int,int);
-int pc_equiplookall(struct map_session_data *sd);
-
-int pc_readparam(struct map_session_data*,int);
-int pc_setparam(struct map_session_data*,int,int);
-int pc_readreg(struct map_session_data*,int);
-int pc_setreg(struct map_session_data*,int,int);
-char *pc_readregstr(struct map_session_data *sd,int reg);
-int pc_setregstr(struct map_session_data *sd,int reg,char *str);
-int pc_readglobalreg(struct map_session_data*,char*);
-int pc_setglobalreg(struct map_session_data*,char*,int);
-int pc_readaccountreg(struct map_session_data*,char*);
-int pc_setaccountreg(struct map_session_data*,char*,int);
-int pc_readaccountreg2(struct map_session_data*,char*);
-int pc_setaccountreg2(struct map_session_data*,char*,int);
-
-int pc_addeventtimer(struct map_session_data *sd,int tick,const char *name);
-int pc_deleventtimer(struct map_session_data *sd,const char *name);
-int pc_cleareventtimer(struct map_session_data *sd);
-int pc_addeventtimercount(struct map_session_data *sd,const char *name,int tick);
-
-int pc_calc_pvprank(struct map_session_data *sd);
-int pc_calc_pvprank_timer(int tid,unsigned int tick,int id,int data);
-
-int pc_ismarried(struct map_session_data *sd);
-int pc_marriage(struct map_session_data *sd,struct map_session_data *dstsd);
-int pc_divorce(struct map_session_data *sd);
-int pc_adoption(struct map_session_data *sd,struct map_session_data *dstsd,struct map_session_data *jasd);
-struct map_session_data *pc_get_partner(struct map_session_data *sd);
-struct map_session_data *pc_get_father(struct map_session_data *sd);
-struct map_session_data *pc_get_mother(struct map_session_data *sd);
-struct map_session_data *pc_get_child(struct map_session_data *sd);
-
-int pc_set_gm_level(int account_id, int level);
-void pc_setstand(struct map_session_data *sd);
-int pc_break_equip(struct map_session_data *sd, unsigned short where);
-int pc_candrop(struct map_session_data *sd,int item_id);
-
-struct pc_base_job{
- int job; //E‹ÆA‚½‚¾‚µ“]¶E‚â—{ŽqE‚Ìꇂ͌³‚ÌE‹Æ‚ð•Ô‚·(”pƒvƒŠ¨ƒvƒŠ)
- int type; //ƒmƒr 0, ˆêŽŸE 1, “ñŽŸE 2, ƒXƒpƒmƒr 3
- int upper; //’Êí 0, “]¶ 1, —{Žq 2
-};
-
-struct pc_base_job pc_calc_base_job(int b_class);//“]¶‚â—{ŽqE‚ÌŒ³‚ÌE‹Æ‚ð•Ô‚·
-int pc_calc_base_job2(int b_class); // Celest
-int pc_calc_upper(int b_class);
-
-struct skill_tree_entry {
- short id;
- unsigned char max;
- unsigned char joblv;
- struct {
- short id;
- unsigned char lv;
- } need[5];
-}; // Celest
-extern struct skill_tree_entry skill_tree[3][25][MAX_SKILL_TREE];
-
-int pc_read_gm_account(int fd);
-int pc_setinvincibletimer(struct map_session_data *sd,int);
-int pc_delinvincibletimer(struct map_session_data *sd);
-int pc_addspiritball(struct map_session_data *sd,int,int);
-int pc_delspiritball(struct map_session_data *sd,int,int);
-
-int pc_eventtimer(int tid,unsigned int tick,int id,int data); // for npc_dequeue
-
-int pc_readdb(void);
-int do_init_pc(void);
-void do_final_pc(void);
-
-enum {ADDITEM_EXIST,ADDITEM_NEW,ADDITEM_OVERAMOUNT};
-
-// timer for night.day
-extern int day_timer_tid;
-extern int night_timer_tid;
-int map_day_timer(int,unsigned int,int,int); // by [yor]
-int map_night_timer(int,unsigned int,int,int); // by [yor]
-
-#endif
-
diff --git a/src/map/pet.c b/src/map/pet.c
deleted file mode 100644
index 6f4713d75..000000000
--- a/src/map/pet.c
+++ /dev/null
@@ -1,1694 +0,0 @@
-// $Id: pet.c,v 1.4 2004/09/25 05:32:18 MouseJstr Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "db.h"
-#include "timer.h"
-#include "socket.h"
-#include "nullpo.h"
-#include "malloc.h"
-#include "pc.h"
-#include "status.h"
-#include "map.h"
-#include "intif.h"
-#include "clif.h"
-#include "chrif.h"
-#include "pet.h"
-#include "itemdb.h"
-#include "battle.h"
-#include "mob.h"
-#include "npc.h"
-#include "script.h"
-#include "skill.h"
-#include "showmsg.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-#define MIN_PETTHINKTIME 100
-
-struct pet_db pet_db[MAX_PET_DB];
-
-static int dirx[8]={0,-1,-1,-1,0,1,1,1};
-static int diry[8]={1,1,0,-1,-1,-1,0,1};
-
-static int pet_timer(int tid,unsigned int tick,int id,int data);
-static int pet_walktoxy_sub(struct pet_data *pd);
-
-static int distance(int x0,int y0,int x1,int y1)
-{
- int dx,dy;
-
- dx=abs(x0-x1);
- dy=abs(y0-y1);
- return dx>dy ? dx : dy;
-}
-
-static int calc_next_walk_step(struct pet_data *pd)
-{
- nullpo_retr(0, pd);
-
- Assert((pd->msd == 0) || (pd->msd->pd == pd));
-
- if(pd->walkpath.path_pos>=pd->walkpath.path_len)
- return -1;
- if(pd->walkpath.path[pd->walkpath.path_pos]&1)
- return pd->speed*14/10;
- return pd->speed;
-}
-
-static int pet_performance_val(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
-
- if(sd->pet.intimate > 900)
- return (sd->petDB->s_perfor > 0)? 4:3;
- else if(sd->pet.intimate > 750)
- return 2;
- else
- return 1;
-}
-
-int pet_hungry_val(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
-
- if(sd->pet.hungry > 90)
- return 4;
- else if(sd->pet.hungry > 75)
- return 3;
- else if(sd->pet.hungry > 25)
- return 2;
- else if(sd->pet.hungry > 10)
- return 1;
- else
- return 0;
-}
-
-static int pet_can_reach(struct pet_data *pd,int x,int y)
-{
- struct walkpath_data wpd;
-
- nullpo_retr(0, pd);
-
- Assert((pd->msd == 0) || (pd->msd->pd == pd));
-
- if( pd->bl.x==x && pd->bl.y==y ) // “¯‚¶ƒ}ƒX
- return 1;
-
- // áŠQ•¨”»’è
- wpd.path_len=0;
- wpd.path_pos=0;
- wpd.path_half=0;
- return (path_search(&wpd,pd->bl.m,pd->bl.x,pd->bl.y,x,y,0)!=-1)?1:0;
-}
-
-static int pet_calc_pos(struct pet_data *pd,int tx,int ty,int dir)
-{
- int x,y,dx,dy;
- int i,j=0,k;
-
- nullpo_retr(0, pd);
-
- Assert((pd->msd == 0) || (pd->msd->pd == pd));
-
- pd->to_x = tx;
- pd->to_y = ty;
-
- if(dir >= 0 && dir < 8) {
- dx = -dirx[dir]*2;
- dy = -diry[dir]*2;
- x = tx + dx;
- y = ty + dy;
- if(!(j=pet_can_reach(pd,x,y))) {
- if(dx > 0) x--;
- else if(dx < 0) x++;
- if(dy > 0) y--;
- else if(dy < 0) y++;
- if(!(j=pet_can_reach(pd,x,y))) {
- for(i=0;i<12;i++) {
- k = rand()%8;
- dx = -dirx[k]*2;
- dy = -diry[k]*2;
- x = tx + dx;
- y = ty + dy;
- if((j=pet_can_reach(pd,x,y)))
- break;
- else {
- if(dx > 0) x--;
- else if(dx < 0) x++;
- if(dy > 0) y--;
- else if(dy < 0) y++;
- if((j=pet_can_reach(pd,x,y)))
- break;
- }
- }
- if(!j) {
- x = tx;
- y = ty;
- if(!pet_can_reach(pd,x,y))
- return 1;
- }
- }
- }
- }
- else
- return 1;
-
- pd->to_x = x;
- pd->to_y = y;
- return 0;
-}
-
-static int pet_attack(struct pet_data *pd,unsigned int tick,int data)
-{
- struct mob_data *md;
- int mode,race,range;
-
- nullpo_retr(0, pd);
-
- Assert((pd->msd == 0) || (pd->msd->pd == pd));
-
- pd->state.state=MS_IDLE;
-
- md=(struct mob_data *)map_id2bl(pd->target_id);
- if(md == NULL || md->bl.type != BL_MOB || pd->bl.m != md->bl.m || md->bl.prev == NULL ||
- distance(pd->bl.x,pd->bl.y,md->bl.x,md->bl.y) > 13 ||
- (!agit_flag && md->class_ >= 1285 && md->class_ <= 1288)) // Cannot attack Guardians outside of WoE
- {
- pd->target_id=0;
- return 0;
- }
-
- mode=mob_db[pd->class_].mode;
- race=mob_db[pd->class_].race;
- if(mob_db[pd->class_].mexp <= 0 && !(mode&0x20) && (md->option & 0x06 && race != 4 && race != 6) ) {
- pd->target_id=0;
- return 0;
- }
-
- range = mob_db[pd->class_].range + 1;
- if(distance(pd->bl.x,pd->bl.y,md->bl.x,md->bl.y) > range)
- return 0;
- if(battle_config.monster_attack_direction_change)
- pd->dir=map_calc_dir(&pd->bl, md->bl.x,md->bl.y );
-
- clif_fixpetpos(pd);
-
- pd->target_lv = battle_weapon_attack(&pd->bl,&md->bl,tick,0);
-
- pd->attackabletime = tick + status_get_adelay(&pd->bl);
-
- pd->timer=add_timer(pd->attackabletime,pet_timer,pd->bl.id,0);
- pd->state.state=MS_ATTACK;
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int pet_walk(struct pet_data *pd,unsigned int tick,int data)
-{
- int moveblock;
- int i;
- int x,y,dx,dy;
-
- nullpo_retr(0, pd);
-
- Assert((pd->msd == 0) || (pd->msd->pd == pd));
-
- pd->state.state=MS_IDLE;
- if(pd->walkpath.path_pos >= pd->walkpath.path_len || pd->walkpath.path_pos != data)
- return 0;
-
- pd->walkpath.path_half ^= 1;
- if(pd->walkpath.path_half==0){
- pd->walkpath.path_pos++;
- if(pd->state.change_walk_target){
- pet_walktoxy_sub(pd);
- return 0;
- }
- }
- else {
- if(pd->walkpath.path[pd->walkpath.path_pos] >= 8)
- return 1;
-
- x = pd->bl.x;
- y = pd->bl.y;
-/* ctype = map_getcell(pd->bl.m,x,y);
- if(ctype == 1 || ctype == 5) {
- pet_stop_walking(pd,1);
- return 0;
- }*/
- pd->dir=pd->walkpath.path[pd->walkpath.path_pos];
- dx = dirx[pd->dir];
- dy = diry[pd->dir];
-
- if(map_getcell(pd->bl.m,x+dx,y+dy,CELL_CHKNOPASS)){
- pet_walktoxy_sub(pd);
- return 0;
- }
-
- moveblock = ( x/BLOCK_SIZE != (x+dx)/BLOCK_SIZE || y/BLOCK_SIZE != (y+dy)/BLOCK_SIZE);
-
- pd->state.state=MS_WALK;
- map_foreachinmovearea(clif_petoutsight,pd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,pd);
-
- x += dx;
- y += dy;
-
- if(moveblock) map_delblock(&pd->bl);
- pd->bl.x = x;
- pd->bl.y = y;
- if(moveblock) map_addblock(&pd->bl);
-
- map_foreachinmovearea(clif_petinsight,pd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,BL_PC,pd);
- pd->state.state=MS_IDLE;
- }
- if((i=calc_next_walk_step(pd))>0){
- i = i>>1;
- if(i < 1 && pd->walkpath.path_half == 0)
- i = 1;
- pd->timer=add_timer(tick+i,pet_timer,pd->bl.id,pd->walkpath.path_pos);
- pd->state.state=MS_WALK;
-
- if(pd->walkpath.path_pos >= pd->walkpath.path_len)
- clif_fixpetpos(pd);
- }
- return 0;
-}
-
-int pet_stopattack(struct pet_data *pd)
-{
- nullpo_retr(0, pd);
-
- Assert((pd->msd == 0) || (pd->msd->pd == pd));
-
- pd->target_id=0;
- if(pd->state.state == MS_ATTACK)
- pet_changestate(pd,MS_IDLE,0);
-
- return 0;
-}
-
-int pet_target_check(struct map_session_data *sd,struct block_list *bl,int type)
-{
- struct pet_data *pd;
- struct mob_data *md;
- int rate,mode,race;
-
- nullpo_retr(0, sd);
-
- pd = sd->pd;
-
- Assert((pd->msd == 0) || (pd->msd->pd == pd));
-
- if(bl && pd && bl->type == BL_MOB && sd->pet.intimate > 900 && sd->pet.hungry > 0 && pd->class_ != status_get_class(bl)
- && pd->state.state != MS_DELAY) {
- mode=mob_db[pd->class_].mode;
- race=mob_db[pd->class_].race;
- md=(struct mob_data *)bl;
- if(md->bl.type != BL_MOB || pd->bl.m != md->bl.m || md->bl.prev == NULL ||
- distance(pd->bl.x,pd->bl.y,md->bl.x,md->bl.y) > 13)
- return 0;
- if(mob_db[pd->class_].mexp <= 0 && !(mode&0x20) && (md->option & 0x06 && race!=4 && race!=6) )
- return 0;
- if(!type) {
- rate = sd->petDB->attack_rate;
- rate = rate * (150 - (sd->pet.intimate - 1000))/100;
- if(battle_config.pet_support_rate != 100)
- rate = rate*battle_config.pet_support_rate/100;
- if(sd->petDB->attack_rate > 0 && rate <= 0)
- rate = 1;
- }
- else {
- rate = sd->petDB->defence_attack_rate;
- rate = rate * (150 - (sd->pet.intimate - 1000))/100;
- if(battle_config.pet_support_rate != 100)
- rate = rate*battle_config.pet_support_rate/100;
- if(sd->petDB->defence_attack_rate > 0 && rate <= 0)
- rate = 1;
- }
- if(rand()%10000 < rate) {
- if(pd->target_id == 0 || rand()%10000 < sd->petDB->change_target_rate)
- pd->target_id = bl->id;
- }
- }
- return 0;
-}
-
-int pet_changestate(struct pet_data *pd,int state,int type)
-{
- unsigned int tick;
- int i;
-
- nullpo_retr(0, pd);
-
- Assert((pd->msd == 0) || (pd->msd->pd == pd));
-
- if(pd->timer != -1)
- delete_timer(pd->timer,pet_timer);
- pd->timer=-1;
- pd->state.state=state;
-
- switch(state) {
- case MS_WALK:
- if((i=calc_next_walk_step(pd)) > 0){
- i = i>>2;
- pd->timer=add_timer(gettick()+i,pet_timer,pd->bl.id,0);
- } else
- pd->state.state=MS_IDLE;
- break;
- case MS_ATTACK:
- tick = gettick();
- i=DIFF_TICK(pd->attackabletime,tick);
- if(i>0 && i<2000)
- pd->timer=add_timer(pd->attackabletime,pet_timer,pd->bl.id,0);
- else
- pd->timer=add_timer(tick+1,pet_timer,pd->bl.id,0);
- break;
- case MS_DELAY:
- pd->timer=add_timer(gettick()+type,pet_timer,pd->bl.id,0);
- break;
- }
-
- return 0;
-}
-
-static int pet_timer(int tid,unsigned int tick,int id,int data)
-{
- struct pet_data *pd;
-
- pd=(struct pet_data*)map_id2bl(id);
- if(pd == NULL || pd->bl.type != BL_PET)
- return 1;
-
- Assert((pd->msd == 0) || (pd->msd->pd == pd));
-
- if(pd->timer != tid){
- if(battle_config.error_log)
- printf("pet_timer %d != %d\n",pd->timer,tid);
- return 0;
- }
- pd->timer=-1;
-
- if(pd->bl.prev == NULL)
- return 1;
-
- switch(pd->state.state){
- case MS_WALK:
- pet_walk(pd,tick,data);
- break;
- case MS_ATTACK:
- pet_attack(pd,tick,data);
- break;
- case MS_DELAY:
- pet_changestate(pd,MS_IDLE,0);
- break;
- default:
- if(battle_config.error_log)
- printf("pet_timer : %d ?\n",pd->state.state);
- break;
- }
-
- return 0;
-}
-
-static int pet_walktoxy_sub(struct pet_data *pd)
-{
- struct walkpath_data wpd;
-
- nullpo_retr(0, pd);
-
- Assert((pd->msd == 0) || (pd->msd->pd == pd));
-
- if(path_search(&wpd,pd->bl.m,pd->bl.x,pd->bl.y,pd->to_x,pd->to_y,0))
- return 1;
- memcpy(&pd->walkpath,&wpd,sizeof(wpd));
-
- pd->state.change_walk_target=0;
- pet_changestate(pd,MS_WALK,0);
- clif_movepet(pd);
-// if(battle_config.etc_log)
-// printf("walkstart\n");
-
- return 0;
-}
-
-int pet_walktoxy(struct pet_data *pd,int x,int y)
-{
- struct walkpath_data wpd;
-
- nullpo_retr(0, pd);
-
- Assert((pd->msd == 0) || (pd->msd->pd == pd));
-
- if(pd->state.state == MS_WALK && path_search(&wpd,pd->bl.m,pd->bl.x,pd->bl.y,x,y,0))
- return 1;
-
- pd->to_x=x;
- pd->to_y=y;
-
- if(pd->state.state == MS_WALK) {
- pd->state.change_walk_target=1;
- } else {
- return pet_walktoxy_sub(pd);
- }
-
- return 0;
-}
-
-int pet_stop_walking(struct pet_data *pd,int type)
-{
- nullpo_retr(0, pd);
-
- Assert((pd->msd == 0) || (pd->msd->pd == pd));
-
- if(pd->state.state == MS_WALK || pd->state.state == MS_IDLE) {
- pd->walkpath.path_len=0;
- pd->to_x=pd->bl.x;
- pd->to_y=pd->bl.y;
- }
- if(type&0x01)
- clif_fixpetpos(pd);
- if(type&~0xff)
- pet_changestate(pd,MS_DELAY,type>>8);
- else
- pet_changestate(pd,MS_IDLE,0);
-
- return 0;
-}
-
-static int pet_hungry(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd;
- int interval,t;
-
-
- sd=map_id2sd(id);
- if(sd==NULL)
- return 1;
-
- Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
-
- if(sd->pet_hungry_timer != tid){
- if(battle_config.error_log)
- printf("pet_hungry_timer %d != %d\n",sd->pet_hungry_timer,tid);
- return 0;
- }
- sd->pet_hungry_timer = -1;
- if(!sd->status.pet_id || !sd->pd || !sd->petDB)
- return 1;
-
- sd->pet.hungry--;
- t = sd->pet.intimate;
- if(sd->pet.hungry < 0) {
- if(sd->pd->target_id > 0)
- pet_stopattack(sd->pd);
- sd->pet.hungry = 0;
- sd->pet.intimate -= battle_config.pet_hungry_friendly_decrease;
- if(sd->pet.intimate <= 0) {
- sd->pet.intimate = 0;
- if(battle_config.pet_status_support && t > 0) {
- if(sd->bl.prev != NULL)
- status_calc_pc(sd,0);
- else
- status_calc_pc(sd,2);
- }
- }
- clif_send_petdata(sd,1,sd->pet.intimate);
- }
- clif_send_petdata(sd,2,sd->pet.hungry);
-
- if(battle_config.pet_hungry_delay_rate != 100)
- interval = (sd->petDB->hungry_delay*battle_config.pet_hungry_delay_rate)/100;
- else
- interval = sd->petDB->hungry_delay;
- if(interval <= 0)
- interval = 1;
- sd->pet_hungry_timer = add_timer(tick+interval,pet_hungry,sd->bl.id,0);
-
- return 0;
-}
-
-int search_petDB_index(int key,int type)
-{
- int i;
-
- for(i=0;i<MAX_PET_DB;i++) {
- if(pet_db[i].class_ <= 0)
- continue;
- switch(type) {
- case PET_CLASS:
- if(pet_db[i].class_ == key)
- return i;
- break;
- case PET_CATCH:
- if(pet_db[i].itemID == key)
- return i;
- break;
- case PET_EGG:
- if(pet_db[i].EggID == key)
- return i;
- break;
- case PET_EQUIP:
- if(pet_db[i].AcceID == key)
- return i;
- break;
- case PET_FOOD:
- if(pet_db[i].FoodID == key)
- return i;
- break;
- default:
- return -1;
- }
- }
- return -1;
-}
-
-int pet_hungry_timer_delete(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- if(sd->pet_hungry_timer != -1) {
- delete_timer(sd->pet_hungry_timer,pet_hungry);
- sd->pet_hungry_timer = -1;
- }
-
- return 0;
-}
-
-int pet_remove_map(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
-
- if(sd->status.pet_id && sd->pd) {
-
- struct pet_data *pd=sd->pd; // [Valaris]
- if(pd->skillbonustimer!=-1) pd->skillbonustimer=-1;
- pd->skilltype=0;
- pd->skillval=0;
- if(pd->skilltimer!=-1) pd->skilltimer=-1;
- pd->state.skillbonus=-1;
- pd->skillduration=0;
- pd->skillbonustype=0;
- pd->skillbonusval=0;
- if(sd->perfect_hiding==1) sd->perfect_hiding=0; // end additions
-
- pet_changestate(sd->pd,MS_IDLE,0);
- if(sd->pet_hungry_timer != -1)
- pet_hungry_timer_delete(sd);
- clif_clearchar_area(&sd->pd->bl,0);
- map_delblock(&sd->pd->bl);
- if (sd->pd->lootitem)
- aFree(sd->pd->lootitem);
- map_deliddb(&sd->pd->bl);
- }
- return 0;
-}
-struct delay_item_drop {
- int m,x,y;
- int nameid,amount;
- struct map_session_data *first_sd,*second_sd,*third_sd;
-};
-
-struct delay_item_drop2 {
- int m,x,y;
- struct item item_data;
- struct map_session_data *first_sd,*second_sd,*third_sd;
-};
-
-int pet_performance(struct map_session_data *sd)
-{
- struct pet_data *pd;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, pd=sd->pd);
-
- Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
-
- pet_stop_walking(pd,2000<<8);
- clif_pet_performance(&pd->bl,rand()%pet_performance_val(sd) + 1);
- // ƒ‹[ƒg‚µ‚½Item‚ð—Ž‚Æ‚³‚¹‚é
- pet_lootitem_drop(pd,NULL);
-
- return 0;
-}
-
-int pet_return_egg(struct map_session_data *sd)
-{
- struct item tmp_item;
- int flag;
-
- nullpo_retr(0, sd);
-
- Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
-
- if(sd->status.pet_id && sd->pd) {
- // ƒ‹[ƒg‚µ‚½Item‚ð—Ž‚Æ‚³‚¹‚é
- pet_lootitem_drop(sd->pd,sd);
- pet_remove_map(sd);
- sd->status.pet_id = 0;
- sd->pd = NULL;
-
- if(sd->petDB == NULL)
- return 1;
- sd->pet.incuvate = 1;
- memset(&tmp_item,0,sizeof(tmp_item));
- tmp_item.nameid = sd->petDB->EggID;
- tmp_item.identify = 1;
- tmp_item.card[0] = 0xff00;
- *((long *)(&tmp_item.card[1])) = sd->pet.pet_id;
- tmp_item.card[3] = sd->pet.rename_flag;
- if((flag = pc_additem(sd,&tmp_item,1))) {
- clif_additem(sd,0,0,flag);
- map_addflooritem(&tmp_item,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- if(battle_config.pet_status_support && sd->pet.intimate > 0) {
- if(sd->bl.prev != NULL)
- status_calc_pc(sd,0);
- else
- status_calc_pc(sd,2);
- }
-
- intif_save_petdata(sd->status.account_id,&sd->pet);
- pc_makesavestatus(sd);
- chrif_save(sd);
- storage_storage_save(sd);
-
- sd->petDB = NULL;
- }
-
- return 0;
-}
-
-int pet_data_init(struct map_session_data *sd)
-{
- struct pet_data *pd;
- int i=0,interval=0;
-
- nullpo_retr(1, sd);
-
- Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
-
- if(sd->status.account_id != sd->pet.account_id || sd->status.char_id != sd->pet.char_id ||
- sd->status.pet_id != sd->pet.pet_id) {
- sd->status.pet_id = 0;
- return 1;
- }
-
- i = search_petDB_index(sd->pet.class_,PET_CLASS);
- if(i < 0) {
- sd->status.pet_id = 0;
- return 1;
- }
- sd->petDB = &pet_db[i];
- sd->pd = pd = (struct pet_data *)aCalloc(1,sizeof(struct pet_data));
-
- pd->bl.m = sd->bl.m;
- pd->bl.prev = pd->bl.next = NULL;
- pd->bl.x = pd->to_x = sd->bl.x;
- pd->bl.y = pd->to_y = sd->bl.y;
- pet_calc_pos(pd,sd->bl.x,sd->bl.y,sd->dir);
- pd->bl.x = pd->to_x;
- pd->bl.y = pd->to_y;
- pd->bl.id = npc_get_new_npc_id();
- memcpy(pd->name,sd->pet.name,24);
- pd->class_ = sd->pet.class_;
- pd->equip = sd->pet.equip;
- pd->dir = sd->dir;
- pd->speed = sd->petDB->speed;
- pd->bl.subtype = MONS;
- pd->bl.type = BL_PET;
- memset(&pd->state,0,sizeof(pd->state));
- pd->state.state = MS_IDLE;
- pd->state.change_walk_target = 0;
- pd->timer = -1;
- pd->target_id = 0;
- pd->move_fail_count = 0;
- pd->next_walktime = pd->attackabletime = pd->last_thinktime = gettick();
- pd->msd = sd;
-
- map_addiddb(&pd->bl);
-
- // initialise
- pd->state.skillbonus = -1;
- run_script(pet_db[i].script,0,sd->bl.id,0);
-
- if(sd->pet_hungry_timer != -1)
- pet_hungry_timer_delete(sd);
- if(battle_config.pet_hungry_delay_rate != 100)
- interval = (sd->petDB->hungry_delay*battle_config.pet_hungry_delay_rate)/100;
- else
- interval = sd->petDB->hungry_delay;
- if(interval <= 0)
- interval = 1;
- sd->pet_hungry_timer = add_timer(gettick()+interval,pet_hungry,sd->bl.id,0);
- pd->lootitem=(struct item *)aCalloc(PETLOOT_SIZE,sizeof(struct item));
- pd->lootitem_count = 0;
- pd->lootitem_weight = 0;
- pd->lootitem_timer = gettick();
- return 0;
-}
-
-int pet_birth_process(struct map_session_data *sd)
-{
- nullpo_retr(1, sd);
-
- Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
-
- if(sd->status.pet_id && sd->pet.incuvate == 1) {
- sd->status.pet_id = 0;
- return 1;
- }
-
- sd->pet.incuvate = 0;
- sd->pet.account_id = sd->status.account_id;
- sd->pet.char_id = sd->status.char_id;
- sd->status.pet_id = sd->pet.pet_id;
- if(pet_data_init(sd)) {
- sd->status.pet_id = 0;
- sd->pet.incuvate = 1;
- sd->pet.account_id = 0;
- sd->pet.char_id = 0;
- return 1;
- }
-
- intif_save_petdata(sd->status.account_id,&sd->pet);
- pc_makesavestatus(sd);
- chrif_save(sd);
- storage_storage_save(sd);
- map_addblock(&sd->pd->bl);
- clif_spawnpet(sd->pd);
- clif_send_petdata(sd,0,0);
- clif_send_petdata(sd,5,0x14);
- clif_pet_equip(sd->pd,sd->pet.equip);
- clif_send_petstatus(sd);
-
- Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
-
- return 0;
-}
-
-int pet_recv_petdata(int account_id,struct s_pet *p,int flag)
-{
- struct map_session_data *sd;
-
- sd = map_id2sd(account_id);
- if(sd == NULL)
- return 1;
- if(flag == 1) {
- sd->status.pet_id = 0;
- return 1;
- }
- memcpy(&sd->pet,p,sizeof(struct s_pet));
- if(sd->pet.incuvate == 1)
- pet_birth_process(sd);
- else {
- pet_data_init(sd);
- if(sd->pd && sd->bl.prev != NULL) {
- map_addblock(&sd->pd->bl);
- clif_spawnpet(sd->pd);
- clif_send_petdata(sd,0,0);
- clif_send_petdata(sd,5,0x14);
-// clif_pet_equip(sd->pd,sd->pet.equip);
- clif_send_petstatus(sd);
- }
- }
- if(battle_config.pet_status_support && sd->pet.intimate > 0) {
- if(sd->bl.prev != NULL)
- status_calc_pc(sd,0);
- else
- status_calc_pc(sd,2);
- }
-
- return 0;
-}
-
-int pet_select_egg(struct map_session_data *sd,short egg_index)
-{
- nullpo_retr(0, sd);
-
- if(sd->status.inventory[egg_index].card[0] == (short)0xff00)
- intif_request_petdata(sd->status.account_id,sd->status.char_id,*((long *)&sd->status.inventory[egg_index].card[1]));
- else {
- if(battle_config.error_log)
- printf("wrong egg item inventory %d\n",egg_index);
- }
- pc_delitem(sd,egg_index,1,0);
-
- return 0;
-}
-
-int pet_catch_process1(struct map_session_data *sd,int target_class)
-{
- nullpo_retr(0, sd);
-
- sd->catch_target_class = target_class;
- clif_catch_process(sd);
-
- return 0;
-}
-
-int pet_catch_process2(struct map_session_data *sd,int target_id)
-{
- struct mob_data *md;
- int i=0,pet_catch_rate=0;
-
- nullpo_retr(1, sd);
-
- md=(struct mob_data*)map_id2bl(target_id);
- if(!md){
- clif_pet_rulet(sd,0);
- return 1;
- }
-
- i = search_petDB_index(md->class_,PET_CLASS);
- if(md == NULL || md->bl.type != BL_MOB || md->bl.prev == NULL || i < 0 || sd->catch_target_class != md->class_) {
- clif_pet_rulet(sd,0);
- return 1;
- }
-
- //target_id‚É‚æ‚é“G¨—‘”»’è
-// if(battle_config.etc_log)
-// printf("mob_id = %d, mob_class = %d\n",md->bl.id,md->class_);
- //¬Œ÷‚Ìê‡
- pet_catch_rate = (pet_db[i].capture + (sd->status.base_level - mob_db[md->class_].lv)*30 + sd->paramc[5]*20)*(200 - md->hp*100/mob_db[md->class_].max_hp)/100;
- if(pet_catch_rate < 1) pet_catch_rate = 1;
- if(battle_config.pet_catch_rate != 100)
- pet_catch_rate = (pet_catch_rate*battle_config.pet_catch_rate)/100;
-
- if(rand()%10000 < pet_catch_rate) {
- mob_remove_map(md,0);
- mob_setdelayspawn(md->bl.id);
- clif_pet_rulet(sd,1);
-// if(battle_config.etc_log)
-// printf("rulet success %d\n",target_id);
- intif_create_pet(sd->status.account_id,sd->status.char_id,pet_db[i].class_,mob_db[pet_db[i].class_].lv,
- pet_db[i].EggID,0,pet_db[i].intimate,100,0,1,pet_db[i].jname);
- }
- else
- clif_pet_rulet(sd,0);
-
- return 0;
-}
-
-int pet_get_egg(int account_id,int pet_id,int flag)
-{
- struct map_session_data *sd;
- struct item tmp_item;
- int i=0,ret=0;
-
- if(!flag) {
- sd = map_id2sd(account_id);
- if(sd == NULL)
- return 1;
-
- i = search_petDB_index(sd->catch_target_class,PET_CLASS);
- if(i >= 0) {
- memset(&tmp_item,0,sizeof(tmp_item));
- tmp_item.nameid = pet_db[i].EggID;
- tmp_item.identify = 1;
- tmp_item.card[0] = 0xff00;
- tmp_item.card[1] = pet_id;
- tmp_item.card[3] = sd->pet.rename_flag;
- if((ret = pc_additem(sd,&tmp_item,1))) {
- clif_additem(sd,0,0,ret);
- map_addflooritem(&tmp_item,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- }
- else
- intif_delete_petdata(pet_id);
- }
-
- return 0;
-}
-
-int pet_menu(struct map_session_data *sd,int menunum)
-{
- nullpo_retr(0, sd);
-
- switch(menunum) {
- case 0:
- clif_send_petstatus(sd);
- break;
- case 1:
- pet_food(sd);
- break;
- case 2:
- pet_performance(sd);
- break;
- case 3:
- pet_return_egg(sd);
- break;
- case 4:
- pet_unequipitem(sd);
- break;
- }
- return 0;
-}
-
-int pet_change_name(struct map_session_data *sd,char *name)
-{
- int i;
-
- nullpo_retr(1, sd);
-
- if((sd->pd == NULL) || (sd->pet.rename_flag == 1 && battle_config.pet_rename == 0))
- return 1;
-
- for(i=0;i<24 && name[i];i++){
- if( !(name[i]&0xe0) || name[i]==0x7f)
- return 1;
- }
-
- pet_stop_walking(sd->pd,1);
- memcpy(sd->pet.name,name,24);
- memcpy(sd->pd->name,name,24);
- clif_clearchar_area(&sd->pd->bl,0);
- clif_spawnpet(sd->pd);
- clif_send_petdata(sd,0,0);
- clif_send_petdata(sd,5,0x14);
- sd->pet.rename_flag = 1;
- clif_pet_equip(sd->pd,sd->pet.equip);
- clif_send_petstatus(sd);
-
- return 0;
-}
-
-int pet_equipitem(struct map_session_data *sd,int index)
-{
- int nameid;
-
- nullpo_retr(1, sd);
-
- nameid = sd->status.inventory[index].nameid;
- if(sd->petDB == NULL)
- return 1;
- if(sd->petDB->AcceID == 0 || nameid != sd->petDB->AcceID || sd->pet.equip != 0) {
- clif_equipitemack(sd,0,0,0);
- return 1;
- }
- else {
- pc_delitem(sd,index,1,0);
- sd->pet.equip = sd->pd->equip = nameid;
- status_calc_pc(sd,0);
- clif_pet_equip(sd->pd,nameid);
- }
-
- return 0;
-}
-
-int pet_unequipitem(struct map_session_data *sd)
-{
- struct item tmp_item;
- int nameid,flag;
-
- nullpo_retr(1, sd);
-
- if(sd->petDB == NULL)
- return 1;
- if(sd->pet.equip == 0)
- return 1;
-
- nameid = sd->pet.equip;
- sd->pet.equip = sd->pd->equip = 0;
- status_calc_pc(sd,0);
- clif_pet_equip(sd->pd,0);
- memset(&tmp_item,0,sizeof(tmp_item));
- tmp_item.nameid = nameid;
- tmp_item.identify = 1;
- if((flag = pc_additem(sd,&tmp_item,1))) {
- clif_additem(sd,0,0,flag);
- map_addflooritem(&tmp_item,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
-
- return 0;
-}
-
-int pet_food(struct map_session_data *sd)
-{
- int i,k,t;
-
- nullpo_retr(1, sd);
-
- Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
-
- if(sd->petDB == NULL)
- return 1;
- i=pc_search_inventory(sd,sd->petDB->FoodID);
- if(i < 0) {
- clif_pet_food(sd,sd->petDB->FoodID,0);
- return 1;
- }
- pc_delitem(sd,i,1,0);
- t = sd->pet.intimate;
- if(sd->pet.hungry > 90)
- sd->pet.intimate -= sd->petDB->r_full;
- else if(sd->pet.hungry > 75) {
- if(battle_config.pet_friendly_rate != 100)
- k = (sd->petDB->r_hungry * battle_config.pet_friendly_rate)/100;
- else
- k = sd->petDB->r_hungry;
- k = k >> 1;
- if(k <= 0)
- k = 1;
- sd->pet.intimate += k;
- }
- else {
- if(battle_config.pet_friendly_rate != 100)
- k = (sd->petDB->r_hungry * battle_config.pet_friendly_rate)/100;
- else
- k = sd->petDB->r_hungry;
- sd->pet.intimate += k;
- }
- if(sd->pet.intimate <= 0) {
- sd->pet.intimate = 0;
- if(battle_config.pet_status_support && t > 0) {
- if(sd->bl.prev != NULL)
- status_calc_pc(sd,0);
- else
- status_calc_pc(sd,2);
- }
- }
- else if(sd->pet.intimate > 1000)
- sd->pet.intimate = 1000;
- sd->pet.hungry += sd->petDB->fullness;
- if(sd->pet.hungry > 100)
- sd->pet.hungry = 100;
-
- clif_send_petdata(sd,2,sd->pet.hungry);
- clif_send_petdata(sd,1,sd->pet.intimate);
- clif_pet_food(sd,sd->petDB->FoodID,1);
-
- return 0;
-}
-
-static int pet_randomwalk(struct pet_data *pd,int tick)
-{
- const int retrycount=20;
- int speed;
-
- nullpo_retr(0, pd);
-
- Assert((pd->msd == 0) || (pd->msd->pd == pd));
-
- speed = status_get_speed(&pd->bl);
-
- if(DIFF_TICK(pd->next_walktime,tick) < 0){
- int i,x,y,c,d=12-pd->move_fail_count;
- if(d<5) d=5;
- for(i=0;i<retrycount;i++){
- int r=rand();
- x=pd->bl.x+r%(d*2+1)-d;
- y=pd->bl.y+r/(d*2+1)%(d*2+1)-d;
- if((map_getcell(pd->bl.m,x,y,CELL_CHKPASS))&&( pet_walktoxy(pd,x,y)==0)){
- pd->move_fail_count=0;
- break;
- }
- if(i+1>=retrycount){
- pd->move_fail_count++;
- if(pd->move_fail_count>1000){
- if(battle_config.error_log)
- printf("PET cant move. hold position %d, class = %d\n",pd->bl.id,pd->class_);
- pd->move_fail_count=0;
- pet_changestate(pd,MS_DELAY,60000);
- return 0;
- }
- }
- }
- for(i=c=0;i<pd->walkpath.path_len;i++){
- if(pd->walkpath.path[i]&1)
- c+=speed*14/10;
- else
- c+=speed;
- }
- pd->next_walktime = tick+rand()%3000+3000+c;
-
- return 1;
- }
- return 0;
-}
-
-static int pet_unlocktarget(struct pet_data *pd)
-{
- nullpo_retr(0, pd);
-
- pd->target_id=0;
-
- return 0;
-}
-
-static int pet_ai_sub_hard(struct pet_data *pd,unsigned int tick)
-{
- struct map_session_data *sd = pd->msd;
- struct mob_data *md = NULL;
- int dist,i=0,dx,dy,ret;
- int mode,race;
-
- nullpo_retr(0, pd);
-
- sd = pd->msd;
-
- Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
-
- if(pd->bl.prev == NULL || sd == NULL || sd->bl.prev == NULL)
- return 0;
-
- if(DIFF_TICK(tick,pd->last_thinktime) < MIN_PETTHINKTIME)
- return 0;
- pd->last_thinktime=tick;
-
- if(pd->state.state == MS_DELAY || pd->bl.m != sd->bl.m)
- return 0;
- // ƒyƒbƒg‚É‚æ‚郋[ƒg
- if(!pd->target_id && pd->lootitem_count < PETLOOT_SIZE && pd->lootitem_count < pd->lootmax && pd->loot==1 && DIFF_TICK(gettick(),pd->lootitem_timer)>0)
- map_foreachinarea(pet_ai_sub_hard_lootsearch,pd->bl.m,
- pd->bl.x-AREA_SIZE*2,pd->bl.y-AREA_SIZE*2,
- pd->bl.x+AREA_SIZE*2,pd->bl.y+AREA_SIZE*2,
- BL_ITEM,pd,&i);
-
- if(sd->pet.intimate > 0) {
- dist = distance(sd->bl.x,sd->bl.y,pd->bl.x,pd->bl.y);
- if(dist > 12) {
- if(pd->target_id > 0)
- pet_unlocktarget(pd);
- if(pd->timer != -1 && pd->state.state == MS_WALK && distance(pd->to_x,pd->to_y,sd->bl.x,sd->bl.y) < 3)
- return 0;
- pd->speed = (sd->speed>>1);
- if(pd->speed <= 0)
- pd->speed = 1;
- pet_calc_pos(pd,sd->bl.x,sd->bl.y,sd->dir);
- if(pet_walktoxy(pd,pd->to_x,pd->to_y))
- pet_randomwalk(pd,tick);
- }
- else if(pd->target_id - MAX_FLOORITEM > 0) {
- mode=mob_db[pd->class_].mode;
- race=mob_db[pd->class_].race;
- md=(struct mob_data *)map_id2bl(pd->target_id);
- if(md == NULL || md->bl.type != BL_MOB || pd->bl.m != md->bl.m || md->bl.prev == NULL ||
- distance(pd->bl.x,pd->bl.y,md->bl.x,md->bl.y) > 13)
- pet_unlocktarget(pd);
- else if(mob_db[pd->class_].mexp <= 0 && !(mode&0x20) && (md->option & 0x06 && race!=4 && race!=6) )
- pet_unlocktarget(pd);
- else if(!battle_check_range(&pd->bl,&md->bl,mob_db[pd->class_].range)){
- if(pd->timer != -1 && pd->state.state == MS_WALK && distance(pd->to_x,pd->to_y,md->bl.x,md->bl.y) < 2)
- return 0;
- if( !pet_can_reach(pd,md->bl.x,md->bl.y))
- pet_unlocktarget(pd);
- else {
- i=0;
- pd->speed = status_get_speed(&pd->bl);
- do {
- if(i==0) { // ʼn‚ÍAEGIS‚Æ“¯‚¶•û–@‚ÅŒŸõ
- dx=md->bl.x - pd->bl.x;
- dy=md->bl.y - pd->bl.y;
- if(dx<0) dx++;
- else if(dx>0) dx--;
- if(dy<0) dy++;
- else if(dy>0) dy--;
- }
- else { // ‚¾‚ß‚È‚çAthenaŽ®(ƒ‰ƒ“ƒ_ƒ€)
- dx=md->bl.x - pd->bl.x + rand()%3 - 1;
- dy=md->bl.y - pd->bl.y + rand()%3 - 1;
- }
- ret=pet_walktoxy(pd,pd->bl.x+dx,pd->bl.y+dy);
- i++;
- } while(ret && i<5);
-
- if(ret) { // ˆÚ“®•s‰Â”\‚ÈŠ‚©‚ç‚ÌUŒ‚‚È‚ç2•à‰º‚é
- if(dx<0) dx=2;
- else if(dx>0) dx=-2;
- if(dy<0) dy=2;
- else if(dy>0) dy=-2;
- pet_walktoxy(pd,pd->bl.x+dx,pd->bl.y+dy);
- }
- }
- }
- else {
- if(pd->state.state==MS_WALK)
- pet_stop_walking(pd,1);
- if(pd->state.state==MS_ATTACK)
- return 0;
- pet_changestate(pd,MS_ATTACK,0);
- }
- }
- else if(pd->target_id > 0){ // ƒ‹[ƒgˆ—
- struct block_list *bl_item;
- struct flooritem_data *fitem;
-
- bl_item = map_id2bl(pd->target_id);
- if(bl_item == NULL || bl_item->type != BL_ITEM ||bl_item->m != pd->bl.m ||
- (dist=distance(pd->bl.x,pd->bl.y,bl_item->x,bl_item->y))>=5){
- // ‰“‚·‚¬‚é‚©ƒAƒCƒeƒ€‚ª‚È‚­‚È‚Á‚½
- pet_unlocktarget(pd);
- }
- else if(dist){
- if(pd->timer != -1 && pd->state.state!=MS_ATTACK && (DIFF_TICK(pd->next_walktime,tick)<0 || distance(pd->to_x,pd->to_y,bl_item->x,bl_item->y) <= 0))
- return 0; // Šù‚Ɉړ®’†
-
- pd->next_walktime=tick+500;
- dx=bl_item->x - pd->bl.x;
- dy=bl_item->y - pd->bl.y;
-
- ret=pet_walktoxy(pd,pd->bl.x+dx,pd->bl.y+dy);
- }
- else{ // ƒAƒCƒeƒ€‚Ü‚Å‚½‚Ç‚è’…‚¢‚½
- fitem = (struct flooritem_data *)bl_item;
- if(pd->state.state==MS_ATTACK)
- return 0; // UŒ‚’†
- if(pd->state.state==MS_WALK){ // •às’†‚È‚ç’âŽ~
- pet_stop_walking(pd,1);
- }
- if(pd->lootitem_count < PETLOOT_SIZE && pd->lootitem_count < pd->lootmax){
- memcpy(&pd->lootitem[pd->lootitem_count++],&fitem->item_data,sizeof(pd->lootitem[0]));
- pd->lootitem_weight += itemdb_search(fitem->item_data.nameid)->weight*fitem->item_data.amount;
- }
- else if(pd->lootitem_count >= PETLOOT_SIZE || pd->lootitem_count >=pd->lootmax) {
- pet_unlocktarget(pd);
- return 0;
- }
- else {
- if(pd->lootitem[0].card[0] == (short)0xff00)
- intif_delete_petdata(*((long *)(&pd->lootitem[0].card[1])));
- for(i=0;i<PETLOOT_SIZE-1;i++)
- memcpy(&pd->lootitem[i],&pd->lootitem[i+1],sizeof(pd->lootitem[0]));
- memcpy(&pd->lootitem[PETLOOT_SIZE-1],&fitem->item_data,sizeof(pd->lootitem[0]));
- }
- map_clearflooritem(bl_item->id);
- pet_unlocktarget(pd);
- }
- }
- else {
- if(dist <= 3 || (pd->timer != -1 && pd->state.state == MS_WALK && distance(pd->to_x,pd->to_y,sd->bl.x,sd->bl.y) < 3) )
- return 0;
- pd->speed = status_get_speed(&pd->bl);
- pet_calc_pos(pd,sd->bl.x,sd->bl.y,sd->dir);
- if(pet_walktoxy(pd,pd->to_x,pd->to_y))
- pet_randomwalk(pd,tick);
- }
- }
- else {
- pd->speed = status_get_speed(&pd->bl);
- if(pd->state.state == MS_ATTACK)
- pet_stopattack(pd);
- pet_randomwalk(pd,tick);
- }
-
- return 0;
-}
-
-static int pet_ai_sub_foreachclient(struct map_session_data *sd,va_list ap)
-{
- unsigned int tick;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, ap);
-
- tick=va_arg(ap,unsigned int);
- if(sd->status.pet_id && sd->pd && sd->petDB)
- pet_ai_sub_hard(sd->pd,tick);
-
- return 0;
-}
-
-static int pet_ai_hard(int tid,unsigned int tick,int id,int data)
-{
- clif_foreachclient(pet_ai_sub_foreachclient,tick);
-
- return 0;
-}
-
-int pet_ai_sub_hard_lootsearch(struct block_list *bl,va_list ap)
-{
- struct pet_data* pd;
- int dist,*itc;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, pd=va_arg(ap,struct pet_data *));
- nullpo_retr(0, itc=va_arg(ap,int *));
-
- if(!pd->target_id){
- struct flooritem_data *fitem = (struct flooritem_data *)bl;
- struct map_session_data *sd = NULL;
- // ƒ‹[ƒgŒ –³‚µ
- if(fitem && fitem->first_get_id>0)
- sd = map_id2sd(fitem->first_get_id);
- // Removed [Valaris]
- //if((pd->lootitem_weight + (itemdb_search(fitem->item_data.))->weight * fitem->item_data.amount) > battle_config.pet_weight)
- // return 0;
-
- if(!pd->lootitem || (pd->lootitem_count >= PETLOOT_SIZE) || (pd->lootitem_count >= pd->lootmax) || (sd && sd->pd != pd))
- return 0;
- if(bl->m == pd->bl.m && (dist=distance(pd->bl.x,pd->bl.y,bl->x,bl->y))<5){
- if( pet_can_reach(pd,bl->x,bl->y) // “ž’B‰Â”\«”»’è
- && rand()%1000<1000/(++(*itc)) ){ // ”͈͓àPC‚Å“™Šm—¦‚É‚·‚é
- pd->target_id=bl->id;
- }
- }
- }
- return 0;
-}
-int pet_lootitem_drop(struct pet_data *pd,struct map_session_data *sd)
-{
- int i,flag=0;
-
- if(pd){
- if(pd->lootitem) {
- for(i=0;i<pd->lootitem_count;i++) {
- struct delay_item_drop2 *ditem;
-
- ditem=(struct delay_item_drop2 *)aCalloc(1,sizeof(struct delay_item_drop2));
- memcpy(&ditem->item_data,&pd->lootitem[i],sizeof(pd->lootitem[0]));
- ditem->m = pd->bl.m;
- ditem->x = pd->bl.x;
- ditem->y = pd->bl.y;
- ditem->first_sd = 0;
- ditem->second_sd = 0;
- ditem->third_sd = 0;
- // —Ž‚Æ‚³‚È‚¢‚Å’¼ÚPC‚ÌItem—“‚Ö
- if(sd){
- if((flag = pc_additem(sd,&ditem->item_data,ditem->item_data.amount))){
- clif_additem(sd,0,0,flag);
- map_addflooritem(&ditem->item_data,ditem->item_data.amount,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0);
- }
- aFree(ditem);
- }
- else
- add_timer(gettick()+540+i,pet_delay_item_drop2,(int)ditem,0);
- }
- memset(pd->lootitem,0,LOOTITEM_SIZE * sizeof(struct item));
- pd->lootitem_count = 0;
- pd->lootitem_weight = 0;
- pd->lootitem_timer = gettick()+10000; // 10*1000ms‚ÌŠÔE‚í‚È‚¢
- }
- }
- return 1;
-}
-
-int pet_delay_item_drop2(int tid,unsigned int tick,int id,int data)
-{
- struct delay_item_drop2 *ditem;
-
- ditem=(struct delay_item_drop2 *)id;
-
- map_addflooritem(&ditem->item_data,ditem->item_data.amount,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0);
-
- aFree(ditem);
- return 0;
-}
-
-/*==========================================
- * pet bonus giving skills [Valaris]
- *------------------------------------------
- */
-int pet_skill_bonus_timer(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd=map_id2sd(id);
- struct pet_data *pd;
- int timer = 0;
-
- if(sd==NULL)
- return 1;
-
- pd=sd->pd;
-
- if(pd==NULL || pd->bl.type!=BL_PET)
- return 1;
-
- if(pd->skillbonustimer != tid)
- return 0;
-
- // determine the time for the next timer
- if (pd->state.skillbonus == 0) {
- // pet bonuses are not active at the moment, so,
- pd->state.skillbonus = 1;
- timer = pd->skillduration; // the duration for pet bonuses to be in effect
- } else if (pd->state.skillbonus == 1) {
- // pet bonuses are already active, so,
- pd->state.skillbonus = 0;
- timer = pd->skilltimer; // the duration which pet bonuses will be reactivated again
- }
-
- if (pd->state.skillbonus == 1 && sd->petDB)
- run_script(sd->petDB->script,0,sd->bl.id,0);
-
- // add/remove our bonuses, which will be handled by sd->petbonus[]
- status_calc_pc(sd, 0);
-
- // wait for the next timer
- if (timer) pd->skillbonustimer=add_timer(gettick()+timer,pet_skill_bonus_timer,sd->bl.id,0);
-
- return 0;
-}
-
-int pet_recovery_timer(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd=(struct map_session_data*)map_id2bl(id);
- struct pet_data *pd;
-
- if(sd==NULL || sd->bl.type!=BL_PC)
- return 1;
-
- pd=sd->pd;
-
- if(pd==NULL || pd->bl.type!=BL_PET)
- return 1;
-
- if(pd->skillbonustimer != tid)
- return 0;
-
- if(sd->sc_data[pd->skilltype].timer != -1)
- status_change_end(&sd->bl,pd->skilltype,-1);
-
- pd->skillbonustimer=add_timer(gettick()+pd->skilltimer*1000,pet_recovery_timer,sd->bl.id,0);
-
- return 0;
-}
-
-int pet_heal_timer(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd=(struct map_session_data*)map_id2bl(id);
- struct pet_data *pd;
-
- if(sd==NULL || sd->bl.type!=BL_PC)
- return 1;
-
- pd=sd->pd;
-
- if(pd==NULL || pd->bl.type!=BL_PET)
- return 1;
-
- if(pd->skillbonustimer != tid)
- return 0;
-
- if(sd->status.hp < sd->status.max_hp * pd->skilltype/100) {
- clif_skill_nodamage(&pd->bl,&sd->bl,AL_HEAL,pd->skillval,1);
- pc_heal(sd,pd->skillval,0);
- }
-
- pd->skillbonustimer=add_timer(gettick()+pd->skilltimer*1000,pet_heal_timer,sd->bl.id,0);
-
- return 0;
-}
-
-int pet_mag_timer(int tid,unsigned int tick,int id,int data)
-{
- struct pet_data *pd;
- struct map_session_data *sd=(struct map_session_data*)map_id2bl(id);
-
- if(sd==NULL || sd->bl.type!=BL_PC)
- return 1;
-
- pd=sd->pd;
-
- if(pd==NULL || pd->bl.type!=BL_PET)
- return 1;
-
- if(pd->skillbonustimer != tid)
- return 0;
-
- if(sd->status.hp < sd->status.max_hp * pd->skilltype/100 && sd->status.sp < sd->status.max_sp * pd->skillduration/100) {
- clif_skill_nodamage(&pd->bl,&sd->bl,PR_MAGNIFICAT,pd->skillval,1);
- status_change_start(&sd->bl,SkillStatusChangeTable[PR_MAGNIFICAT],pd->skillval,0,0,0,skill_get_time(PR_MAGNIFICAT,pd->skillval),0 );
- }
-
- pd->skillbonustimer=add_timer(gettick()+pd->skilltimer*1000,pet_mag_timer,sd->bl.id,0);
-
- return 0;
-}
-
-int pet_skillattack_timer(int tid,unsigned int tick,int id,int data)
-{
- struct mob_data *md;
- struct map_session_data *sd=(struct map_session_data*)map_id2bl(id);
- struct pet_data *pd;
-
- if(sd==NULL || sd->bl.type!=BL_PC)
- return 1;
-
- pd=sd->pd;
-
- if(pd==NULL || pd->bl.type!=BL_PET)
- return 1;
-
- if(pd->skillbonustimer != tid)
- return 0;
-
- md=(struct mob_data *)map_id2bl(sd->attacktarget);
- if(md == NULL || md->bl.type != BL_MOB || pd->bl.m != md->bl.m || md->bl.prev == NULL ||
- distance(pd->bl.x,pd->bl.y,md->bl.x,md->bl.y) > 6) {
- pd->target_id=0;
- pd->skillbonustimer=add_timer(gettick()+100,pet_skillattack_timer,sd->bl.id,pd->skillduration);
- return 0;
- }
-
- if(md && rand()%100 < sd->pet.intimate*pd->skilltimer/100 ) {
- switch(pd->skilltype)
- {
- case SM_PROVOKE:
- //case NPC_POISON: poison is not handled there
- skill_castend_nodamage_id(&pd->bl,&md->bl,pd->skilltype,pd->skillval,tick,0);
- break;
- case BS_HAMMERFALL:
- skill_castend_pos2(&pd->bl,md->bl.x,md->bl.y,pd->skilltype,pd->skillval,tick,0);
- break;
- case WZ_HEAVENDRIVE:
- skill_castend_pos2(&pd->bl,md->bl.x,md->bl.y,pd->skilltype,pd->skillval+rand()%100,tick,0);
- break;
- default:
- skill_castend_damage_id(&pd->bl,&md->bl,pd->skilltype,pd->skillval,tick,0);
- break;
- }
- pd->skillbonustimer=add_timer(gettick()+1000,pet_skillattack_timer,sd->bl.id,0);
- return 0;
- }
-
- pd->skillbonustimer=add_timer(gettick()+100,pet_skillattack_timer,sd->bl.id,0);
-
- return 0;
-}
-
-/*==========================================
- *ƒyƒbƒgƒf[ƒ^“Ç‚Ýž‚Ý
- *------------------------------------------
- */
-int read_petdb()
-{
- FILE *fp;
- char line[1024];
- int nameid,i,k;
- int j=0;
- int lines;
- char *filename[]={"db/pet_db.txt","db/pet_db2.txt"};
- char *str[32],*p,*np;
-
- memset(pet_db,0,sizeof(pet_db));
- for(i=0;i<2;i++){
- fp=fopen(filename[i],"r");
- if(fp==NULL){
- if(i>0)
- continue;
- printf("can't read %s\n",filename[i]);
- return -1;
- }
- lines = 0;
- while(fgets(line,1020,fp)){
-
- lines++;
-
- if(line[0] == '/' && line[1] == '/')
- continue;
-
- for(k=0,p=line;k<20;k++){
- if((np=strchr(p,','))!=NULL){
- str[k]=p;
- *np=0;
- p=np+1;
- } else {
- str[k]=p;
- p+=strlen(p);
- }
- }
-
- nameid=atoi(str[0]);
- if(nameid<=0 || nameid>2000)
- continue;
-
- //MobID,Name,JName,ItemID,EggID,AcceID,FoodID,"Fullness (1‰ñ‚̉a‚Å‚Ì–ž• “x‘‰Á—¦%)","HungryDeray (/min)","R_Hungry (‹ó• Žž‰a‚â‚èe–§“x‘‰Á—¦%)","R_Full (‚Æ‚Ä‚à–ž• Žž‰a‚â‚èe–§“xŒ¸­—¦%)","Intimate (•ßŠlŽže–§“x%)","Die (Ž€–SŽže–§“xŒ¸­—¦%)","Capture (•ßŠl—¦%)",(Name)
- pet_db[j].class_ = nameid;
- memcpy(pet_db[j].name,str[1],24);
- memcpy(pet_db[j].jname,str[2],24);
- pet_db[j].itemID=atoi(str[3]);
- pet_db[j].EggID=atoi(str[4]);
- pet_db[j].AcceID=atoi(str[5]);
- pet_db[j].FoodID=atoi(str[6]);
- pet_db[j].fullness=atoi(str[7]);
- pet_db[j].hungry_delay=atoi(str[8])*1000;
- pet_db[j].r_hungry=atoi(str[9]);
- if(pet_db[j].r_hungry <= 0)
- pet_db[j].r_hungry=1;
- pet_db[j].r_full=atoi(str[10]);
- pet_db[j].intimate=atoi(str[11]);
- pet_db[j].die=atoi(str[12]);
- pet_db[j].capture=atoi(str[13]);
- pet_db[j].speed=atoi(str[14]);
- pet_db[j].s_perfor=(char)atoi(str[15]);
- pet_db[j].talk_convert_class=atoi(str[16]);
- pet_db[j].attack_rate=atoi(str[17]);
- pet_db[j].defence_attack_rate=atoi(str[18]);
- pet_db[j].change_target_rate=atoi(str[19]);
- pet_db[j].script = NULL;
- if((np=strchr(p,'{'))==NULL)
- continue;
- pet_db[j].script = parse_script((unsigned char *) np,lines);
- j++;
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%d"CL_RESET"' pets in '"CL_WHITE"%s"CL_RESET"'.\n",j,filename[i]);
- ShowStatus(tmp_output);
- }
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ŠÖŒW‰Šú‰»ˆ—
- *------------------------------------------
- */
-int do_init_pet(void)
-{
- read_petdb();
-
- add_timer_func_list(pet_timer,"pet_timer");
- add_timer_func_list(pet_hungry,"pet_hungry");
- add_timer_func_list(pet_ai_hard,"pet_ai_hard");
- add_timer_func_list(pet_skill_bonus_timer,"pet_skill_bonus_timer"); // [Valaris]
- add_timer_func_list(pet_recovery_timer,"pet_recovery_timer"); // [Valaris]
- add_timer_func_list(pet_mag_timer,"pet_mag_timer"); // [Valaris]
- add_timer_func_list(pet_heal_timer,"pet_heal_timer"); // [Valaris]
- add_timer_func_list(pet_skillattack_timer,"pet_skillattack_timer"); // [Valaris]
- add_timer_interval(gettick()+MIN_PETTHINKTIME,pet_ai_hard,0,0,MIN_PETTHINKTIME);
-
- return 0;
-}
-
-int do_final_pet(void) {
- int i;
- for(i = 0;i < MAX_PET_DB; i++) {
- if(pet_db[i].script) {
- aFree(pet_db[i].script);
- }
- }
- return 0;
-}
diff --git a/src/map/pet.h b/src/map/pet.h
deleted file mode 100644
index 4d81583b1..000000000
--- a/src/map/pet.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// $Id: pet.h,v 1.2 2004/09/25 05:32:18 MouseJstr Exp $
-#ifndef _PET_H_
-#define _PET_H_
-
-#define MAX_PET_DB 300
-#define PETLOOT_SIZE 20 // [Valaris]
-
-struct pet_db {
- int class_;
- char name[24],jname[24];
- int itemID;
- int EggID;
- int AcceID;
- int FoodID;
- int fullness;
- int hungry_delay;
- int r_hungry;
- int r_full;
- int intimate;
- int die;
- int capture;
- int speed;
- char s_perfor;
- int talk_convert_class;
- int attack_rate;
- int defence_attack_rate;
- int change_target_rate;
- char *script;
-};
-extern struct pet_db pet_db[MAX_PET_DB];
-
-enum { PET_CLASS,PET_CATCH,PET_EGG,PET_EQUIP,PET_FOOD };
-
-int pet_hungry_val(struct map_session_data *sd);
-int pet_target_check(struct map_session_data *sd,struct block_list *bl,int type);
-int pet_stopattack(struct pet_data *pd);
-int pet_changestate(struct pet_data *pd,int state,int type);
-int pet_walktoxy(struct pet_data *pd,int x,int y);
-int pet_stop_walking(struct pet_data *pd,int type);
-int search_petDB_index(int key,int type);
-int pet_hungry_timer_delete(struct map_session_data *sd);
-int pet_remove_map(struct map_session_data *sd);
-int pet_data_init(struct map_session_data *sd);
-int pet_birth_process(struct map_session_data *sd);
-int pet_recv_petdata(int account_id,struct s_pet *p,int flag);
-int pet_select_egg(struct map_session_data *sd,short egg_index);
-int pet_catch_process1(struct map_session_data *sd,int target_class);
-int pet_catch_process2(struct map_session_data *sd,int target_id);
-int pet_get_egg(int account_id,int pet_id,int flag);
-int pet_menu(struct map_session_data *sd,int menunum);
-int pet_change_name(struct map_session_data *sd,char *name);
-int pet_equipitem(struct map_session_data *sd,int index);
-int pet_unequipitem(struct map_session_data *sd);
-int pet_food(struct map_session_data *sd);
-int pet_lootitem_drop(struct pet_data *pd,struct map_session_data *sd);
-int pet_delay_item_drop2(int tid,unsigned int tick,int id,int data);
-int pet_ai_sub_hard_lootsearch(struct block_list *bl,va_list ap);
-int pet_skill_bonus_timer(int tid,unsigned int tick,int id,int data); // [Valaris]
-int pet_recovery_timer(int tid,unsigned int tick,int id,int data); // [Valaris]
-int pet_mag_timer(int tid,unsigned int tick,int id,int data); // [Valaris]
-int pet_heal_timer(int tid,unsigned int tick,int id,int data); // [Valaris]
-int pet_skillattack_timer(int tid,unsigned int tick,int id,int data); // [Valaris]
-
-int read_petdb();
-int do_init_pet(void);
-int do_final_pet(void);
-
-#endif
-
diff --git a/src/map/script.c b/src/map/script.c
deleted file mode 100644
index 9602f3505..000000000
--- a/src/map/script.c
+++ /dev/null
@@ -1,7862 +0,0 @@
-// $Id: script.c 148 2004-09-30 14:05:37Z MouseJstr $
-//#define DEBUG_FUNCIN
-//#define DEBUG_DISP
-//#define DEBUG_RUN
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-
-#ifndef _WIN32
-#include <sys/time.h>
-#endif
-
-#include <time.h>
-
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/malloc.h"
-#include "../common/lock.h"
-#include "../common/db.h"
-
-#include "map.h"
-#include "clif.h"
-#include "chrif.h"
-#include "itemdb.h"
-#include "pc.h"
-#include "status.h"
-#include "script.h"
-#include "storage.h"
-#include "mob.h"
-#include "npc.h"
-#include "pet.h"
-#include "intif.h"
-#include "skill.h"
-#include "chat.h"
-#include "battle.h"
-#include "party.h"
-#include "guild.h"
-#include "atcommand.h"
-#include "log.h"
-#include "showmsg.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-#define SCRIPT_BLOCK_SIZE 256
-
-#define FETCH(n, t) \
- if(st->end>st->start+(n)) \
- (t)=conv_num(st,&(st->stack->stack_data[st->start+(n)]));
-
-enum { LABEL_NEXTLINE=1,LABEL_START };
-static unsigned char * script_buf = NULL;
-static int script_pos,script_size;
-
-char *str_buf;
-int str_pos,str_size;
-static struct str_data_struct {
- int type;
- int str;
- int backpatch;
- int label;
- int (*func)(struct script_state *);
- int val;
- int next;
-} *str_data = NULL;
-int str_num=LABEL_START,str_data_size;
-int str_hash[16];
-
-static struct dbt *mapreg_db=NULL;
-static struct dbt *mapregstr_db=NULL;
-static int mapreg_dirty=-1;
-char mapreg_txt[256]="save/mapreg.txt";
-#define MAPREG_AUTOSAVE_INTERVAL (10*1000)
-
-static struct dbt *scriptlabel_db=NULL;
-static struct dbt *userfunc_db=NULL;
-
-struct dbt* script_get_label_db(){ return scriptlabel_db; }
-struct dbt* script_get_userfunc_db(){ if(!userfunc_db) userfunc_db=strdb_init(50); return userfunc_db; }
-
-int scriptlabel_final(void *k,void *d,va_list ap){ return 0; }
-static char pos[11][100] = {"“ª","‘Ì","¶Žè","‰EŽè","ƒ[ƒu","ŒC","ƒAƒNƒZƒTƒŠ[1","ƒAƒNƒZƒTƒŠ[2","“ª2","“ª3","‘•’…‚µ‚Ä‚¢‚È‚¢"};
-
-struct Script_Config script_config;
-
-static int parse_cmd_if=0;
-static int parse_cmd;
-
-extern int current_equip_item_index; //for New CARS Scripts. It contains Inventory Index of the EQUIP_SCRIPT caller item. [Lupus]
-
-/*==========================================
- * ƒ[ƒJƒ‹ƒvƒƒgƒ^ƒCƒv錾 (•K—v‚È•¨‚Ì‚Ý)
- *------------------------------------------
- */
-unsigned char* parse_subexpr(unsigned char *,int);
-int buildin_mes(struct script_state *st);
-int buildin_goto(struct script_state *st);
-int buildin_callsub(struct script_state *st);
-int buildin_callfunc(struct script_state *st);
-int buildin_return(struct script_state *st);
-int buildin_getarg(struct script_state *st);
-int buildin_next(struct script_state *st);
-int buildin_close(struct script_state *st);
-int buildin_close2(struct script_state *st);
-int buildin_menu(struct script_state *st);
-int buildin_rand(struct script_state *st);
-int buildin_warp(struct script_state *st);
-int buildin_areawarp(struct script_state *st);
-int buildin_heal(struct script_state *st);
-int buildin_itemheal(struct script_state *st);
-int buildin_percentheal(struct script_state *st);
-int buildin_jobchange(struct script_state *st);
-int buildin_input(struct script_state *st);
-int buildin_setlook(struct script_state *st);
-int buildin_set(struct script_state *st);
-int buildin_setarray(struct script_state *st);
-int buildin_cleararray(struct script_state *st);
-int buildin_copyarray(struct script_state *st);
-int buildin_getarraysize(struct script_state *st);
-int buildin_deletearray(struct script_state *st);
-int buildin_getelementofarray(struct script_state *st);
-int buildin_if(struct script_state *st);
-int buildin_getitem(struct script_state *st);
-int buildin_getitem2(struct script_state *st);
-int buildin_makeitem(struct script_state *st);
-int buildin_delitem(struct script_state *st);
-int buildin_viewpoint(struct script_state *st);
-int buildin_countitem(struct script_state *st);
-int buildin_checkweight(struct script_state *st);
-int buildin_readparam(struct script_state *st);
-int buildin_getcharid(struct script_state *st);
-int buildin_getpartyname(struct script_state *st);
-int buildin_getpartymember(struct script_state *st);
-int buildin_getguildname(struct script_state *st);
-int buildin_getguildmaster(struct script_state *st);
-int buildin_getguildmasterid(struct script_state *st);
-int buildin_strcharinfo(struct script_state *st);
-int buildin_getequipid(struct script_state *st);
-int buildin_getequipname(struct script_state *st);
-int buildin_getbrokenid(struct script_state *st); // [Valaris]
-int buildin_repair(struct script_state *st); // [Valaris]
-int buildin_getequipisequiped(struct script_state *st);
-int buildin_getequipisenableref(struct script_state *st);
-int buildin_getequipisidentify(struct script_state *st);
-int buildin_getequiprefinerycnt(struct script_state *st);
-int buildin_getequipweaponlv(struct script_state *st);
-int buildin_getequippercentrefinery(struct script_state *st);
-int buildin_successrefitem(struct script_state *st);
-int buildin_failedrefitem(struct script_state *st);
-int buildin_cutin(struct script_state *st);
-int buildin_cutincard(struct script_state *st);
-int buildin_statusup(struct script_state *st);
-int buildin_statusup2(struct script_state *st);
-int buildin_bonus(struct script_state *st);
-int buildin_bonus2(struct script_state *st);
-int buildin_bonus3(struct script_state *st);
-int buildin_bonus4(struct script_state *st);
-int buildin_skill(struct script_state *st);
-int buildin_addtoskill(struct script_state *st); // [Valaris]
-int buildin_guildskill(struct script_state *st);
-int buildin_getskilllv(struct script_state *st);
-int buildin_getgdskilllv(struct script_state *st);
-int buildin_basicskillcheck(struct script_state *st);
-int buildin_getgmlevel(struct script_state *st);
-int buildin_end(struct script_state *st);
-int buildin_checkoption(struct script_state *st);
-int buildin_setoption(struct script_state *st);
-int buildin_setcart(struct script_state *st);
-int buildin_checkcart(struct script_state *st); // check cart [Valaris]
-int buildin_setfalcon(struct script_state *st);
-int buildin_checkfalcon(struct script_state *st); // check falcon [Valaris]
-int buildin_setriding(struct script_state *st);
-int buildin_checkriding(struct script_state *st); // check for pecopeco [Valaris]
-int buildin_savepoint(struct script_state *st);
-int buildin_gettimetick(struct script_state *st);
-int buildin_gettime(struct script_state *st);
-int buildin_gettimestr(struct script_state *st);
-int buildin_openstorage(struct script_state *st);
-int buildin_guildopenstorage(struct script_state *st);
-int buildin_itemskill(struct script_state *st);
-int buildin_produce(struct script_state *st);
-int buildin_monster(struct script_state *st);
-int buildin_areamonster(struct script_state *st);
-int buildin_killmonster(struct script_state *st);
-int buildin_killmonsterall(struct script_state *st);
-int buildin_doevent(struct script_state *st);
-int buildin_donpcevent(struct script_state *st);
-int buildin_addtimer(struct script_state *st);
-int buildin_deltimer(struct script_state *st);
-int buildin_addtimercount(struct script_state *st);
-int buildin_initnpctimer(struct script_state *st);
-int buildin_stopnpctimer(struct script_state *st);
-int buildin_startnpctimer(struct script_state *st);
-int buildin_setnpctimer(struct script_state *st);
-int buildin_getnpctimer(struct script_state *st);
-int buildin_attachnpctimer(struct script_state *st); // [celest]
-int buildin_detachnpctimer(struct script_state *st); // [celest]
-int buildin_announce(struct script_state *st);
-int buildin_mapannounce(struct script_state *st);
-int buildin_areaannounce(struct script_state *st);
-int buildin_getusers(struct script_state *st);
-int buildin_getmapusers(struct script_state *st);
-int buildin_getareausers(struct script_state *st);
-int buildin_getareadropitem(struct script_state *st);
-int buildin_enablenpc(struct script_state *st);
-int buildin_disablenpc(struct script_state *st);
-int buildin_enablearena(struct script_state *st); // Added by RoVeRT
-int buildin_disablearena(struct script_state *st); // Added by RoVeRT
-int buildin_hideoffnpc(struct script_state *st);
-int buildin_hideonnpc(struct script_state *st);
-int buildin_sc_start(struct script_state *st);
-int buildin_sc_start2(struct script_state *st);
-int buildin_sc_end(struct script_state *st);
-int buildin_getscrate(struct script_state *st);
-int buildin_debugmes(struct script_state *st);
-int buildin_catchpet(struct script_state *st);
-int buildin_birthpet(struct script_state *st);
-int buildin_resetlvl(struct script_state *st);
-int buildin_resetstatus(struct script_state *st);
-int buildin_resetskill(struct script_state *st);
-int buildin_changebase(struct script_state *st);
-int buildin_changesex(struct script_state *st);
-int buildin_waitingroom(struct script_state *st);
-int buildin_delwaitingroom(struct script_state *st);
-int buildin_enablewaitingroomevent(struct script_state *st);
-int buildin_disablewaitingroomevent(struct script_state *st);
-int buildin_getwaitingroomstate(struct script_state *st);
-int buildin_warpwaitingpc(struct script_state *st);
-int buildin_attachrid(struct script_state *st);
-int buildin_detachrid(struct script_state *st);
-int buildin_isloggedin(struct script_state *st);
-int buildin_setmapflagnosave(struct script_state *st);
-int buildin_setmapflag(struct script_state *st);
-int buildin_removemapflag(struct script_state *st);
-int buildin_pvpon(struct script_state *st);
-int buildin_pvpoff(struct script_state *st);
-int buildin_gvgon(struct script_state *st);
-int buildin_gvgoff(struct script_state *st);
-int buildin_emotion(struct script_state *st);
-int buildin_maprespawnguildid(struct script_state *st);
-int buildin_agitstart(struct script_state *st); // <Agit>
-int buildin_agitend(struct script_state *st);
-int buildin_agitcheck(struct script_state *st); // <Agitcheck>
-int buildin_flagemblem(struct script_state *st); // Flag Emblem
-int buildin_getcastlename(struct script_state *st);
-int buildin_getcastledata(struct script_state *st);
-int buildin_setcastledata(struct script_state *st);
-int buildin_requestguildinfo(struct script_state *st);
-int buildin_getequipcardcnt(struct script_state *st);
-int buildin_successremovecards(struct script_state *st);
-int buildin_failedremovecards(struct script_state *st);
-int buildin_marriage(struct script_state *st);
-int buildin_wedding_effect(struct script_state *st);
-int buildin_divorce(struct script_state *st);
-int buildin_ispartneron(struct script_state *st); // MouseJstr
-int buildin_getpartnerid(struct script_state *st); // MouseJstr
-int buildin_warppartner(struct script_state *st); // MouseJstr
-int buildin_getitemname(struct script_state *st);
-int buildin_makepet(struct script_state *st);
-int buildin_getexp(struct script_state *st);
-int buildin_getinventorylist(struct script_state *st);
-int buildin_getskilllist(struct script_state *st);
-int buildin_clearitem(struct script_state *st);
-int buildin_classchange(struct script_state *st);
-int buildin_misceffect(struct script_state *st);
-int buildin_soundeffect(struct script_state *st);
-int buildin_soundeffectall(struct script_state *st);
-int buildin_setcastledata(struct script_state *st);
-int buildin_mapwarp(struct script_state *st);
-int buildin_inittimer(struct script_state *st);
-int buildin_stoptimer(struct script_state *st);
-int buildin_cmdothernpc(struct script_state *st);
-int buildin_mobcount(struct script_state *st);
-int buildin_strmobinfo(struct script_state *st); // Script for displaying mob info [Valaris]
-int buildin_guardian(struct script_state *st); // Script for displaying mob info [Valaris]
-int buildin_guardianinfo(struct script_state *st); // Script for displaying mob info [Valaris]
-int buildin_petskillbonus(struct script_state *st); // petskillbonus [Valaris]
-int buildin_petrecovery(struct script_state *st); // pet skill for curing status [Valaris]
-int buildin_petloot(struct script_state *st); // pet looting [Valaris]
-int buildin_petheal(struct script_state *st); // pet healing [Valaris]
-int buildin_petmag(struct script_state *st); // pet magnificat [Valaris]
-int buildin_petskillattack(struct script_state *st); // pet skill attacks [Valaris]
-int buildin_skilleffect(struct script_state *st); // skill effects [Celest]
-int buildin_npcskilleffect(struct script_state *st); // skill effects for npcs [Valaris]
-int buildin_specialeffect(struct script_state *st); // special effect script [Valaris]
-int buildin_specialeffect2(struct script_state *st); // special effect script [Valaris]
-int buildin_nude(struct script_state *st); // nude [Valaris]
-int buildin_gmcommand(struct script_state *st); // [MouseJstr]
-int buildin_movenpc(struct script_state *st); // [MouseJstr]
-int buildin_message(struct script_state *st); // [MouseJstr]
-int buildin_npctalk(struct script_state *st); // [Valaris]
-int buildin_hasitems(struct script_state *st); // [Valaris]
-int buildin_getlook(struct script_state *st); //Lorky [Lupus]
-int buildin_getsavepoint(struct script_state *st); //Lorky [Lupus]
-int buildin_npcspeed(struct script_state *st); // [Valaris]
-int buildin_npcwalkto(struct script_state *st); // [Valaris]
-int buildin_npcstop(struct script_state *st); // [Valaris]
-int buildin_getmapxy(struct script_state *st); //get map position for player/npc/pet/mob by Lorky [Lupus]
-int buildin_checkoption1(struct script_state *st); // [celest]
-int buildin_checkoption2(struct script_state *st); // [celest]
-int buildin_guildgetexp(struct script_state *st); // [celest]
-int buildin_skilluseid(struct script_state *st); // originally by Qamera [celest]
-int buildin_skillusepos(struct script_state *st); // originally by Qamera [celest]
-int buildin_logmes(struct script_state *st); // [Lupus]
-int buildin_summon(struct script_state *st); // [celest]
-int buildin_isnight(struct script_state *st); // [celest]
-int buildin_isday(struct script_state *st); // [celest]
-int buildin_isequipped(struct script_state *st); // [celest]
-int buildin_isequippedcnt(struct script_state *st); // [celest]
-int buildin_cardscnt(struct script_state *st); // [Lupus]
-int buildin_getrefine(struct script_state *st); // [celest]
-int buildin_getusersname(struct script_state *st); //jA commands added [Lupus]
-int buildin_dispbottom(struct script_state *st);
-int buildin_recovery(struct script_state *st);
-int buildin_getpetinfo(struct script_state *st);
-int buildin_checkequipedcard(struct script_state *st);
-int buildin_globalmes(struct script_state *st);
-int buildin_jump_zero(struct script_state *st);
-int buildin_select(struct script_state *st);
-int buildin_getmapmobs(struct script_state *st); //jA addition end
-
-
-void push_val(struct script_stack *stack,int type,int val);
-int run_func(struct script_state *st);
-
-int mapreg_setreg(int num,int val);
-int mapreg_setregstr(int num,const char *str);
-
-#ifdef PCRE_SUPPORT
-int buildin_defpattern(struct script_state *st); // MouseJstr
-int buildin_activatepset(struct script_state *st); // MouseJstr
-int buildin_deactivatepset(struct script_state *st); // MouseJstr
-int buildin_deletepset(struct script_state *st); // MouseJstr
-#endif
-
-struct {
- int (*func)(struct script_state *);
- char *name;
- char *arg;
-} buildin_func[]={
- {buildin_mes,"mes","s"},
- {buildin_next,"next",""},
- {buildin_close,"close",""},
- {buildin_close2,"close2",""},
- {buildin_menu,"menu","*"},
- {buildin_goto,"goto","l"},
- {buildin_callsub,"callsub","i*"},
- {buildin_callfunc,"callfunc","s*"},
- {buildin_return,"return","*"},
- {buildin_getarg,"getarg","i"},
- {buildin_jobchange,"jobchange","i*"},
- {buildin_input,"input","*"},
- {buildin_warp,"warp","sii"},
- {buildin_areawarp,"areawarp","siiiisii"},
- {buildin_setlook,"setlook","ii"},
- {buildin_set,"set","ii"},
- {buildin_setarray,"setarray","ii*"},
- {buildin_cleararray,"cleararray","iii"},
- {buildin_copyarray,"copyarray","iii"},
- {buildin_getarraysize,"getarraysize","i"},
- {buildin_deletearray,"deletearray","ii"},
- {buildin_getelementofarray,"getelementofarray","ii"},
- {buildin_if,"if","i*"},
- {buildin_getitem,"getitem","ii**"},
- {buildin_getitem2,"getitem2","iiiiiiiii*"},
- {buildin_makeitem,"makeitem","iisii"},
- {buildin_delitem,"delitem","ii"},
- {buildin_cutin,"cutin","si"},
- {buildin_cutincard,"cutincard","i"},
- {buildin_viewpoint,"viewpoint","iiiii"},
- {buildin_heal,"heal","ii"},
- {buildin_itemheal,"itemheal","ii"},
- {buildin_percentheal,"percentheal","ii"},
- {buildin_rand,"rand","i*"},
- {buildin_countitem,"countitem","i"},
- {buildin_checkweight,"checkweight","ii"},
- {buildin_readparam,"readparam","i*"},
- {buildin_getcharid,"getcharid","i*"},
- {buildin_getpartyname,"getpartyname","i"},
- {buildin_getpartymember,"getpartymember","i"},
- {buildin_getguildname,"getguildname","i"},
- {buildin_getguildmaster,"getguildmaster","i"},
- {buildin_getguildmasterid,"getguildmasterid","i"},
- {buildin_strcharinfo,"strcharinfo","i"},
- {buildin_getequipid,"getequipid","i"},
- {buildin_getequipname,"getequipname","i"},
- {buildin_getbrokenid,"getbrokenid","i"}, // [Valaris]
- {buildin_repair,"repair","i"}, // [Valaris]
- {buildin_getequipisequiped,"getequipisequiped","i"},
- {buildin_getequipisenableref,"getequipisenableref","i"},
- {buildin_getequipisidentify,"getequipisidentify","i"},
- {buildin_getequiprefinerycnt,"getequiprefinerycnt","i"},
- {buildin_getequipweaponlv,"getequipweaponlv","i"},
- {buildin_getequippercentrefinery,"getequippercentrefinery","i"},
- {buildin_successrefitem,"successrefitem","i"},
- {buildin_failedrefitem,"failedrefitem","i"},
- {buildin_statusup,"statusup","i"},
- {buildin_statusup2,"statusup2","ii"},
- {buildin_bonus,"bonus","ii"},
- {buildin_bonus2,"bonus2","iii"},
- {buildin_bonus3,"bonus3","iiii"},
- {buildin_bonus4,"bonus4","iiiii"},
- {buildin_skill,"skill","ii*"},
- {buildin_addtoskill,"addtoskill","ii*"}, // [Valaris]
- {buildin_guildskill,"guildskill","ii"},
- {buildin_getskilllv,"getskilllv","i"},
- {buildin_getgdskilllv,"getgdskilllv","ii"},
- {buildin_basicskillcheck,"basicskillcheck","*"},
- {buildin_getgmlevel,"getgmlevel","*"},
- {buildin_end,"end",""},
- {buildin_end,"break",""},
- {buildin_checkoption,"checkoption","i"},
- {buildin_setoption,"setoption","i"},
- {buildin_setcart,"setcart",""},
- {buildin_checkcart,"checkcart","*"}, //fixed by Lupus (added '*')
- {buildin_setfalcon,"setfalcon",""},
- {buildin_checkfalcon,"checkfalcon","*"}, //fixed by Lupus (fixed wrong pointer, added '*')
- {buildin_setriding,"setriding",""},
- {buildin_checkriding,"checkriding","*"}, //fixed by Lupus (fixed wrong pointer, added '*')
- {buildin_savepoint,"save","sii"},
- {buildin_savepoint,"savepoint","sii"},
- {buildin_gettimetick,"gettimetick","i"},
- {buildin_gettime,"gettime","i"},
- {buildin_gettimestr,"gettimestr","si"},
- {buildin_openstorage,"openstorage",""},
- {buildin_guildopenstorage,"guildopenstorage","*"},
- {buildin_itemskill,"itemskill","iis"},
- {buildin_produce,"produce","i"},
- {buildin_monster,"monster","siisii*"},
- {buildin_areamonster,"areamonster","siiiisii*"},
- {buildin_killmonster,"killmonster","ss"},
- {buildin_killmonsterall,"killmonsterall","s"},
- {buildin_doevent,"doevent","s"},
- {buildin_donpcevent,"donpcevent","s"},
- {buildin_addtimer,"addtimer","is"},
- {buildin_deltimer,"deltimer","s"},
- {buildin_addtimercount,"addtimercount","si"},
- {buildin_initnpctimer,"initnpctimer","*"},
- {buildin_stopnpctimer,"stopnpctimer","*"},
- {buildin_startnpctimer,"startnpctimer","*"},
- {buildin_setnpctimer,"setnpctimer","*"},
- {buildin_getnpctimer,"getnpctimer","i*"},
- {buildin_attachnpctimer,"attachnpctimer","*"}, // attached the player id to the npc timer [Celest]
- {buildin_detachnpctimer,"detachnpctimer","*"}, // detached the player id from the npc timer [Celest]
- {buildin_announce,"announce","si"},
- {buildin_mapannounce,"mapannounce","ssi"},
- {buildin_areaannounce,"areaannounce","siiiisi"},
- {buildin_getusers,"getusers","i"},
- {buildin_getmapusers,"getmapusers","s"},
- {buildin_getareausers,"getareausers","siiii"},
- {buildin_getareadropitem,"getareadropitem","siiiii"},
- {buildin_enablenpc,"enablenpc","s"},
- {buildin_disablenpc,"disablenpc","s"},
- {buildin_enablearena,"enablearena",""}, // Added by RoVeRT
- {buildin_disablearena,"disablearena",""}, // Added by RoVeRT
- {buildin_hideoffnpc,"hideoffnpc","s"},
- {buildin_hideonnpc,"hideonnpc","s"},
- {buildin_sc_start,"sc_start","iii*"},
- {buildin_sc_start2,"sc_start2","iiii*"},
- {buildin_sc_end,"sc_end","i"},
- {buildin_getscrate,"getscrate","ii*"},
- {buildin_debugmes,"debugmes","s"},
- {buildin_catchpet,"pet","i"},
- {buildin_birthpet,"bpet",""},
- {buildin_resetlvl,"resetlvl","i"},
- {buildin_resetstatus,"resetstatus",""},
- {buildin_resetskill,"resetskill",""},
- {buildin_changebase,"changebase","i"},
- {buildin_changesex,"changesex",""},
- {buildin_waitingroom,"waitingroom","si*"},
- {buildin_warpwaitingpc,"warpwaitingpc","sii"},
- {buildin_delwaitingroom,"delwaitingroom","*"},
- {buildin_enablewaitingroomevent,"enablewaitingroomevent","*"},
- {buildin_disablewaitingroomevent,"disablewaitingroomevent","*"},
- {buildin_getwaitingroomstate,"getwaitingroomstate","i*"},
- {buildin_warpwaitingpc,"warpwaitingpc","sii*"},
- {buildin_attachrid,"attachrid","i"},
- {buildin_detachrid,"detachrid",""},
- {buildin_isloggedin,"isloggedin","i"},
- {buildin_setmapflagnosave,"setmapflagnosave","ssii"},
- {buildin_setmapflag,"setmapflag","si"},
- {buildin_removemapflag,"removemapflag","si"},
- {buildin_pvpon,"pvpon","s"},
- {buildin_pvpoff,"pvpoff","s"},
- {buildin_gvgon,"gvgon","s"},
- {buildin_gvgoff,"gvgoff","s"},
- {buildin_emotion,"emotion","i"},
- {buildin_maprespawnguildid,"maprespawnguildid","sii"},
- {buildin_agitstart,"agitstart",""}, // <Agit>
- {buildin_agitend,"agitend",""},
- {buildin_agitcheck,"agitcheck","i"}, // <Agitcheck>
- {buildin_flagemblem,"flagemblem","i"}, // Flag Emblem
- {buildin_getcastlename,"getcastlename","s"},
- {buildin_getcastledata,"getcastledata","si*"},
- {buildin_setcastledata,"setcastledata","sii"},
- {buildin_requestguildinfo,"requestguildinfo","i*"},
- {buildin_getequipcardcnt,"getequipcardcnt","i"},
- {buildin_successremovecards,"successremovecards","i"},
- {buildin_failedremovecards,"failedremovecards","ii"},
- {buildin_marriage,"marriage","s"},
- {buildin_wedding_effect,"wedding",""},
- {buildin_divorce,"divorce","*"},
- {buildin_ispartneron,"ispartneron","*"},
- {buildin_getpartnerid,"getpartnerid","*"},
- {buildin_warppartner,"warppartner","sii"},
- {buildin_getitemname,"getitemname","i"},
- {buildin_makepet,"makepet","i"},
- {buildin_getexp,"getexp","ii"},
- {buildin_getinventorylist,"getinventorylist",""},
- {buildin_getskilllist,"getskilllist",""},
- {buildin_clearitem,"clearitem",""},
- {buildin_classchange,"classchange","ii"},
- {buildin_misceffect,"misceffect","i"},
- {buildin_soundeffect,"soundeffect","si"},
- {buildin_soundeffectall,"soundeffectall","si"}, // SoundEffectAll [Codemaster]
- {buildin_strmobinfo,"strmobinfo","ii"}, // display mob data [Valaris]
- {buildin_guardian,"guardian","siisii*i"}, // summon guardians
- {buildin_guardianinfo,"guardianinfo","i"}, // display guardian data [Valaris]
- {buildin_petskillbonus,"petskillbonus","iiii"}, // [Valaris]
- {buildin_petrecovery,"petrecovery","ii"}, // [Valaris]
- {buildin_petloot,"petloot","i"}, // [Valaris]
- {buildin_petheal,"petheal","iii"}, // [Valaris]
- {buildin_petmag,"petmag","iiii"}, // [Valaris]
- {buildin_petskillattack,"petskillattack","iiii"}, // [Valaris]
- {buildin_skilleffect,"skilleffect","ii"}, // skill effect [Celest]
- {buildin_npcskilleffect,"npcskilleffect","iiii"}, // npc skill effect [Valaris]
- {buildin_specialeffect,"specialeffect","i"}, // npc skill effect [Valaris]
- {buildin_specialeffect2,"specialeffect2","i"}, // skill effect on players[Valaris]
- {buildin_nude,"nude",""}, // nude command [Valaris]
- {buildin_mapwarp,"mapwarp","ssii"}, // Added by RoVeRT
- {buildin_inittimer,"inittimer",""},
- {buildin_stoptimer,"stoptimer",""},
- {buildin_cmdothernpc,"cmdothernpc","ss"},
- {buildin_gmcommand,"gmcommand","*"}, // [MouseJstr]
-// {buildin_movenpc,"movenpc","siis"}, // [MouseJstr]
- {buildin_message,"message","s*"}, // [MouseJstr]
- {buildin_npctalk,"npctalk","*"}, // [Valaris]
- {buildin_hasitems,"hasitems","*"}, // [Valaris]
- {buildin_mobcount,"mobcount","ss"},
- {buildin_getlook,"getlook","i"},
- {buildin_getsavepoint,"getsavepoint","i"},
- {buildin_npcspeed,"npcspeed","i"}, // [Valaris]
- {buildin_npcwalkto,"npcwalkto","ii"}, // [Valaris]
- {buildin_npcstop,"npcstop",""}, // [Valaris]
- {buildin_getmapxy,"getmapxy","siii*"}, //by Lorky [Lupus]
- {buildin_checkoption1,"checkoption1","i"},
- {buildin_checkoption2,"checkoption2","i"},
- {buildin_guildgetexp,"guildgetexp","i"},
- {buildin_skilluseid,"skilluseid","ii"}, // originally by Qamera [Celest]
- {buildin_skilluseid,"doskill","ii"}, // since a lot of scripts would already use 'doskill'...
- {buildin_skillusepos,"skillusepos","iiii"}, // [Celest]
- {buildin_logmes,"logmes","s"}, //this command actls as MES but prints info into LOG file either SQL/TXT [Lupus]
- {buildin_summon,"summon","si*"}, // summons a slave monster [Celest]
- {buildin_isnight,"isnight",""}, // check whether it is night time [Celest]
- {buildin_isday,"isday",""}, // check whether it is day time [Celest]
- {buildin_isequipped,"isequipped","i*"}, // check whether another item/card has been equipped [Celest]
- {buildin_isequippedcnt,"isequippedcnt","i*"}, // check how many items/cards are being equipped [Celest]
- {buildin_cardscnt,"cardscnt","i*"}, // check how many items/cards are being equipped in the same arm [Lupus]
- {buildin_getrefine,"getrefine",""}, // returns the refined number of the current item, or an item with index specified [celest]
-#ifdef PCRE_SUPPORT
- {buildin_defpattern, "defpattern", "iss"}, // Define pattern to listen for [MouseJstr]
- {buildin_activatepset, "activatepset", "i"}, // Activate a pattern set [MouseJstr]
- {buildin_deactivatepset, "deactivatepset", "i"}, // Deactive a pattern set [MouseJstr]
- {buildin_deletepset, "deletepset", "i"}, // Delete a pattern set [MouseJstr]
-#endif
- {buildin_dispbottom,"dispbottom","s"}, //added from jA [Lupus]
- {buildin_getusersname,"getusersname","*"},
- {buildin_recovery,"recovery",""},
- {buildin_getpetinfo,"getpetinfo","i"},
- {buildin_checkequipedcard,"checkequipedcard","i"},
- {buildin_jump_zero,"jump_zero","ii"}, //for future jA script compatibility
- {buildin_select,"select","*"}, //for future jA script compatibility
- {buildin_globalmes,"globalmes","s*"},
- {buildin_getmapmobs,"getmapmobs","s"}, //end jA addition
- {NULL,NULL,NULL},
-};
-
-enum {
- C_NOP,C_POS,C_INT,C_PARAM,C_FUNC,C_STR,C_CONSTSTR,C_ARG,
- C_NAME,C_EOL, C_RETINFO,
-
- C_LOR,C_LAND,C_LE,C_LT,C_GE,C_GT,C_EQ,C_NE, //operator
- C_XOR,C_OR,C_AND,C_ADD,C_SUB,C_MUL,C_DIV,C_MOD,C_NEG,C_LNOT,C_NOT,C_R_SHIFT,C_L_SHIFT
-};
-
-/*==========================================
- * •¶Žš—ñ‚̃nƒbƒVƒ…‚ðŒvŽZ
- *------------------------------------------
- */
-static int calc_hash(const unsigned char *p)
-{
- int h=0;
- while(*p){
- h=(h<<1)+(h>>3)+(h>>5)+(h>>8);
- h+=*p++;
- }
- return h&15;
-}
-
-/*==========================================
- * str_data‚Ì’†‚É–¼‘O‚ª‚ ‚é‚©ŒŸõ‚·‚é
- *------------------------------------------
- */
-// Šù‘¶‚Ì‚Å‚ ‚ê‚ΔԆA–³‚¯‚ê‚Î-1
-static int search_str(const unsigned char *p)
-{
- int i;
- i=str_hash[calc_hash(p)];
- while(i){
- if(strcmp(str_buf+str_data[i].str,(char *) p)==0){
- return i;
- }
- i=str_data[i].next;
- }
- return -1;
-}
-
-/*==========================================
- * str_data‚É–¼‘O‚ð“o˜^
- *------------------------------------------
- */
-// Šù‘¶‚Ì‚Å‚ ‚ê‚ΔԆA–³‚¯‚ê‚Γo˜^‚µ‚ÄV‹K”Ô†
-static int add_str(const unsigned char *p)
-{
- int i;
- char *lowcase;
-
- lowcase=aStrdup((char *) p);
- for(i=0;lowcase[i];i++)
- lowcase[i]=tolower(lowcase[i]);
- if((i=search_str((unsigned char *) lowcase))>=0){
- aFree(lowcase);
- return i;
- }
- aFree(lowcase);
-
- i=calc_hash(p);
- if(str_hash[i]==0){
- str_hash[i]=str_num;
- } else {
- i=str_hash[i];
- for(;;){
- if(strcmp(str_buf+str_data[i].str,(char *) p)==0){
- return i;
- }
- if(str_data[i].next==0)
- break;
- i=str_data[i].next;
- }
- str_data[i].next=str_num;
- }
- if(str_num>=str_data_size){
- str_data_size+=128;
- str_data=(struct str_data_struct *) aRealloc(str_data,sizeof(str_data[0])*str_data_size);
- memset(str_data + (str_data_size - 128), '\0', 128);
- }
- while(str_pos+(int)strlen((char *) p)+1>=str_size){
- str_size+=256;
- str_buf=(char *)aRealloc(str_buf,str_size);
- memset(str_buf + (str_size - 256), '\0', 256);
- }
- strcpy(str_buf+str_pos, (char *) p);
- str_data[str_num].type=C_NOP;
- str_data[str_num].str=str_pos;
- str_data[str_num].next=0;
- str_data[str_num].func=NULL;
- str_data[str_num].backpatch=-1;
- str_data[str_num].label=-1;
- str_pos+=strlen( (char *) p)+1;
- return str_num++;
-}
-
-
-/*==========================================
- * ƒXƒNƒŠƒvƒgƒoƒbƒtƒ@ƒTƒCƒY‚ÌŠm”F‚ÆŠg’£
- *------------------------------------------
- */
-static void check_script_buf(int size)
-{
- if(script_pos+size>=script_size){
- script_size+=SCRIPT_BLOCK_SIZE;
- script_buf=(unsigned char *)aRealloc(script_buf,script_size);
- memset(script_buf + script_size - SCRIPT_BLOCK_SIZE, '\0',
- SCRIPT_BLOCK_SIZE);
- }
-}
-
-/*==========================================
- * ƒXƒNƒŠƒvƒgƒoƒbƒtƒ@‚É‚PƒoƒCƒg‘‚«ž‚Þ
- *------------------------------------------
- */
-static void add_scriptb(int a)
-{
- check_script_buf(1);
- script_buf[script_pos++]=a;
-}
-
-/*==========================================
- * ƒXƒNƒŠƒvƒgƒoƒbƒtƒ@‚Ƀf[ƒ^ƒ^ƒCƒv‚ð‘‚«ž‚Þ
- *------------------------------------------
- */
-static void add_scriptc(int a)
-{
- while(a>=0x40){
- add_scriptb((a&0x3f)|0x40);
- a=(a-0x40)>>6;
- }
- add_scriptb(a&0x3f);
-}
-
-/*==========================================
- * ƒXƒNƒŠƒvƒgƒoƒbƒtƒ@‚É®”‚ð‘‚«ž‚Þ
- *------------------------------------------
- */
-static void add_scripti(int a)
-{
- while(a>=0x40){
- add_scriptb(a|0xc0);
- a=(a-0x40)>>6;
- }
- add_scriptb(a|0x80);
-}
-
-/*==========================================
- * ƒXƒNƒŠƒvƒgƒoƒbƒtƒ@‚Ƀ‰ƒxƒ‹/•Ï”/ŠÖ”‚ð‘‚«ž‚Þ
- *------------------------------------------
- */
-// Å‘å16M‚Ü‚Å
-static void add_scriptl(int l)
-{
- int backpatch = str_data[l].backpatch;
-
- switch(str_data[l].type){
- case C_POS:
- add_scriptc(C_POS);
- add_scriptb(str_data[l].label);
- add_scriptb(str_data[l].label>>8);
- add_scriptb(str_data[l].label>>16);
- break;
- case C_NOP:
- // ƒ‰ƒxƒ‹‚̉”\«‚ª‚ ‚é‚Ì‚Åbackpatch—pƒf[ƒ^–„‚ßž‚Ý
- add_scriptc(C_NAME);
- str_data[l].backpatch=script_pos;
- add_scriptb(backpatch);
- add_scriptb(backpatch>>8);
- add_scriptb(backpatch>>16);
- break;
- case C_INT:
- add_scripti(str_data[l].val);
- break;
- default:
- // ‚à‚¤‘¼‚Ì—p“r‚ÆŠm’肵‚Ä‚é‚Ì‚Å”Žš‚ð‚»‚Ì‚Ü‚Ü
- add_scriptc(C_NAME);
- add_scriptb(l);
- add_scriptb(l>>8);
- add_scriptb(l>>16);
- break;
- }
-}
-
-/*==========================================
- * ƒ‰ƒxƒ‹‚ð‰ðŒˆ‚·‚é
- *------------------------------------------
- */
-void set_label(int l,int pos)
-{
- int i,next;
-
- str_data[l].type=C_POS;
- str_data[l].label=pos;
- for(i=str_data[l].backpatch;i>=0 && i!=0x00ffffff;){
- next=(*(int*)(script_buf+i)) & 0x00ffffff;
- script_buf[i-1]=C_POS;
- script_buf[i]=pos;
- script_buf[i+1]=pos>>8;
- script_buf[i+2]=pos>>16;
- i=next;
- }
-}
-
-/*==========================================
- * ƒXƒy[ƒX/ƒRƒƒ“ƒg“Ç‚Ý”ò‚΂µ
- *------------------------------------------
- */
-static unsigned char *skip_space(unsigned char *p)
-{
- while(1){
- while(isspace(*p))
- p++;
- if(p[0]=='/' && p[1]=='/'){
- while(*p && *p!='\n')
- p++;
- } else if(p[0]=='/' && p[1]=='*'){
- p++;
- while(*p && (p[-1]!='*' || p[0]!='/'))
- p++;
- if(*p) p++;
- } else
- break;
- }
- return p;
-}
-
-/*==========================================
- * ‚P’PŒêƒXƒLƒbƒv
- *------------------------------------------
- */
-static unsigned char *skip_word(unsigned char *p)
-{
- // prefix
- if(*p=='$') p++; // MAPŽI“à‹¤—L•Ï”—p
- if(*p=='@') p++; // ˆêŽž“I•Ï”—p(like weiss)
- if(*p=='#') p++; // account•Ï”—p
- if(*p=='#') p++; // ƒ[ƒ‹ƒhaccount•Ï”—p
- if(*p=='l') p++; // ˆêŽž“I•Ï”—p(like weiss)
-
- while(isalnum(*p)||*p=='_'|| *p>=0x81)
- if(*p>=0x81 && p[1]){
- p+=2;
- } else
- p++;
-
- // postfix
- if(*p=='$') p++; // •¶Žš—ñ•Ï”
-
- return p;
-}
-
-static unsigned char *startptr;
-static int startline;
-
-/*==========================================
- * ƒGƒ‰[ƒƒbƒZ[ƒWo—Í
- *------------------------------------------
- */
-static void disp_error_message(const char *mes,const unsigned char *pos)
-{
- int line,c=0,i;
- unsigned char *p,*linestart,*lineend;
-
- for(line=startline,p=startptr;p && *p;line++){
- linestart=p;
- lineend=(unsigned char *) strchr((char *) p,'\n');
- if(lineend){
- c=*lineend;
- *lineend=0;
- }
- if(lineend==NULL || pos<lineend){
- if (current_file) {
- printf("%s in "CL_WHITE"\'%s\'"CL_RESET" line "CL_WHITE"\'%d\'"CL_RESET" : ", mes, current_file, line);
- } else {
- printf("%s line "CL_WHITE"\'%d\'"CL_RESET" : ", mes, line);
- }
- for(i=0;(linestart[i]!='\r') && (linestart[i]!='\n') && linestart[i];i++){
- if(linestart+i!=pos)
- printf("%c",linestart[i]);
- else
- printf("\'%c\'",linestart[i]);
- }
- printf("\a\n");
- if(lineend)
- *lineend=c;
- return;
- }
- *lineend=c;
- p=lineend+1;
- }
-}
-
-/*==========================================
- * €‚̉ðÍ
- *------------------------------------------
- */
-unsigned char* parse_simpleexpr(unsigned char *p)
-{
- int i;
- p=skip_space(p);
-
-#ifdef DEBUG_FUNCIN
- if(battle_config.etc_log)
- printf("parse_simpleexpr %s\n",p);
-#endif
- if(*p==';' || *p==','){
- disp_error_message("unexpected expr end",p);
- exit(1);
- }
- if(*p=='('){
-
- p=parse_subexpr(p+1,-1);
- p=skip_space(p);
- if((*p++)!=')'){
- disp_error_message("unmatch ')'",p);
- exit(1);
- }
- } else if(isdigit(*p) || ((*p=='-' || *p=='+') && isdigit(p[1]))){
- char *np;
- i=strtoul((char *) p,&np,0);
- add_scripti(i);
- p=(unsigned char *) np;
- } else if(*p=='"'){
- add_scriptc(C_STR);
- p++;
- while(*p && *p!='"'){
- if(p[-1]<=0x7e && *p=='\\')
- p++;
- else if(*p=='\n'){
- disp_error_message("unexpected newline @ string",p);
- exit(1);
- }
- add_scriptb(*p++);
- }
- if(!*p){
- disp_error_message("unexpected eof @ string",p);
- exit(1);
- }
- add_scriptb(0);
- p++; //'"'
- } else {
- int c,l;
- char *p2;
- // label , register , function etc
- if(skip_word(p)==p){
- disp_error_message("unexpected character",p);
- exit(1);
- }
- p2=(char *) skip_word(p);
- c=*p2; *p2=0; // –¼‘O‚ðadd_str‚·‚é
- l=add_str(p);
-
- parse_cmd=l; // warn_*_mismatch_paramnum‚Ì‚½‚ß‚É•K—v
- if(l== search_str((unsigned char *) "if")) // warn_cmd_no_comma‚Ì‚½‚ß‚É•K—v
- parse_cmd_if++;
-/*
- // ”pŽ~—\’è‚Ìl14/l15,‚¨‚æ‚уvƒŒƒtƒBƒbƒNƒX‚Œ‚ÌŒx
- if( strcmp(str_buf+str_data[l].str,"l14")==0 ||
- strcmp(str_buf+str_data[l].str,"l15")==0 ){
- disp_error_message("l14 and l15 is DEPRECATED. use @menu instead of l15.",p);
- }else if(str_buf[str_data[l].str]=='l'){
- disp_error_message("prefix 'l' is DEPRECATED. use prefix '@' instead.",p2);
- }
-*/
- *p2=c;
- p=(unsigned char *) p2;
-
- if(str_data[l].type!=C_FUNC && c=='['){
- // array(name[i] => getelementofarray(name,i) )
- add_scriptl(search_str((unsigned char *) "getelementofarray"));
- add_scriptc(C_ARG);
- add_scriptl(l);
- p=parse_subexpr(p+1,-1);
- p=skip_space(p);
- if((*p++)!=']'){
- disp_error_message("unmatch ']'",p);
- exit(1);
- }
- add_scriptc(C_FUNC);
- }else
- add_scriptl(l);
-
- }
-
-#ifdef DEBUG_FUNCIN
- if(battle_config.etc_log)
- printf("parse_simpleexpr end %s\n",p);
-#endif
- return p;
-}
-
-/*==========================================
- * Ž®‚̉ðÍ
- *------------------------------------------
- */
-unsigned char* parse_subexpr(unsigned char *p,int limit)
-{
- int op,opl,len;
- char *tmpp;
-
-#ifdef DEBUG_FUNCIN
- if(battle_config.etc_log)
- printf("parse_subexpr %s\n",p);
-#endif
- p=skip_space(p);
-
- if(*p=='-'){
- tmpp=(char *) skip_space((unsigned char *) (p+1));
- if(*tmpp==';' || *tmpp==','){
- add_scriptl(LABEL_NEXTLINE);
- p++;
- return p;
- }
- }
- tmpp=(char *) p;
- if((op=C_NEG,*p=='-') || (op=C_LNOT,*p=='!') || (op=C_NOT,*p=='~')){
- p=parse_subexpr(p+1,100);
- add_scriptc(op);
- } else
- p=parse_simpleexpr(p);
- p=skip_space(p);
- while(((op=C_ADD,opl=6,len=1,*p=='+') ||
- (op=C_SUB,opl=6,len=1,*p=='-') ||
- (op=C_MUL,opl=7,len=1,*p=='*') ||
- (op=C_DIV,opl=7,len=1,*p=='/') ||
- (op=C_MOD,opl=7,len=1,*p=='%') ||
- (op=C_FUNC,opl=8,len=1,*p=='(') ||
- (op=C_LAND,opl=1,len=2,*p=='&' && p[1]=='&') ||
- (op=C_AND,opl=5,len=1,*p=='&') ||
- (op=C_LOR,opl=0,len=2,*p=='|' && p[1]=='|') ||
- (op=C_OR,opl=4,len=1,*p=='|') ||
- (op=C_XOR,opl=3,len=1,*p=='^') ||
- (op=C_EQ,opl=2,len=2,*p=='=' && p[1]=='=') ||
- (op=C_NE,opl=2,len=2,*p=='!' && p[1]=='=') ||
- (op=C_R_SHIFT,opl=5,len=2,*p=='>' && p[1]=='>') ||
- (op=C_GE,opl=2,len=2,*p=='>' && p[1]=='=') ||
- (op=C_GT,opl=2,len=1,*p=='>') ||
- (op=C_L_SHIFT,opl=5,len=2,*p=='<' && p[1]=='<') ||
- (op=C_LE,opl=2,len=2,*p=='<' && p[1]=='=') ||
- (op=C_LT,opl=2,len=1,*p=='<')) && opl>limit){
- p+=len;
- if(op==C_FUNC){
- int i=0,func=parse_cmd;
- const char *plist[128];
-
- if( str_data[func].type!=C_FUNC ){
- disp_error_message("expect function",(unsigned char *) tmpp);
- exit(0);
- }
-
- add_scriptc(C_ARG);
- do {
- plist[i]=(char *) p;
- p=parse_subexpr(p,-1);
- p=skip_space(p);
- if(*p==',') p++;
- else if(*p!=')' && script_config.warn_func_no_comma){
- disp_error_message("expect ',' or ')' at func params",p);
- }
- p=skip_space(p);
- i++;
- } while(*p && *p!=')' && i<128);
- plist[i]=(char *) p;
- if(*(p++)!=')'){
- disp_error_message("func request '(' ')'",p);
- exit(1);
- }
-
- if( str_data[func].type==C_FUNC && script_config.warn_func_mismatch_paramnum){
- const char *arg=buildin_func[str_data[func].val].arg;
- int j=0;
- for(j=0;arg[j];j++) if(arg[j]=='*')break;
- if( (arg[j]==0 && i!=j) || (arg[j]=='*' && i<j) ){
- disp_error_message("illegal number of parameters",(unsigned char *) (plist[(i<j)?i:j]));
- }
- }
- } else {
- p=parse_subexpr(p,opl);
- }
- add_scriptc(op);
- p=skip_space(p);
- }
-#ifdef DEBUG_FUNCIN
- if(battle_config.etc_log)
- printf("parse_subexpr end %s\n",p);
-#endif
- return p; /* return first untreated operator */
-}
-
-/*==========================================
- * Ž®‚Ì•]‰¿
- *------------------------------------------
- */
-unsigned char* parse_expr(unsigned char *p)
-{
-#ifdef DEBUG_FUNCIN
- if(battle_config.etc_log)
- printf("parse_expr %s\n",p);
-#endif
- switch(*p){
- case ')': case ';': case ':': case '[': case ']':
- case '}':
- disp_error_message("unexpected char",p);
- exit(1);
- }
- p=parse_subexpr(p,-1);
-#ifdef DEBUG_FUNCIN
- if(battle_config.etc_log)
- printf("parse_expr end %s\n",p);
-#endif
- return p;
-}
-
-/*==========================================
- * s‚̉ðÍ
- *------------------------------------------
- */
-unsigned char* parse_line(unsigned char *p)
-{
- int i=0,cmd;
- const char *plist[128];
- char *p2;
-
- p=skip_space(p);
- if(*p==';')
- return p;
-
- parse_cmd_if=0; // warn_cmd_no_comma‚Ì‚½‚ß‚É•K—v
-
- // ʼn‚ÍŠÖ”–¼
- p2=(char *) p;
- p=parse_simpleexpr(p);
- p=skip_space(p);
-
- cmd=parse_cmd;
- if( str_data[cmd].type!=C_FUNC ){
- disp_error_message("expect command",(unsigned char *) p2);
-// exit(0);
- }
-
- add_scriptc(C_ARG);
- while(p && *p && *p!=';' && i<128){
- plist[i]=(char *) p;
-
- p=parse_expr(p);
- p=skip_space(p);
- // ˆø”‹æØ‚è‚Ì,ˆ—
- if(*p==',') p++;
- else if(*p!=';' && script_config.warn_cmd_no_comma && parse_cmd_if*2<=i ){
- disp_error_message("expect ',' or ';' at cmd params",p);
- }
- p=skip_space(p);
- i++;
- }
- plist[i]=(char *) p;
- if(!p || *(p++)!=';'){
- disp_error_message("need ';'",p);
- exit(1);
- }
- add_scriptc(C_FUNC);
-
- if( str_data[cmd].type==C_FUNC && script_config.warn_cmd_mismatch_paramnum){
- const char *arg=buildin_func[str_data[cmd].val].arg;
- int j=0;
- for(j=0;arg[j];j++) if(arg[j]=='*')break;
- if( (arg[j]==0 && i!=j) || (arg[j]=='*' && i<j) ){
- disp_error_message("illegal number of parameters",(unsigned char *) (plist[(i<j)?i:j]));
- }
- }
-
-
- return p;
-}
-
-/*==========================================
- * ‘g‚Ýž‚ÝŠÖ”‚̒ljÁ
- *------------------------------------------
- */
-static void add_buildin_func(void)
-{
- int i,n;
- for(i=0;buildin_func[i].func;i++){
- n=add_str((unsigned char *) buildin_func[i].name);
- str_data[n].type=C_FUNC;
- str_data[n].val=i;
- str_data[n].func=buildin_func[i].func;
- }
-}
-
-/*==========================================
- * ’蔃f[ƒ^ƒx[ƒX‚Ì“Ç‚Ýž‚Ý
- *------------------------------------------
- */
-static void read_constdb(void)
-{
- FILE *fp;
- char line[1024],name[1024];
- int val,n,i,type;
-
- fp=fopen("db/const.txt","r");
- if(fp==NULL){
- printf("can't read db/const.txt\n");
- return ;
- }
- while(fgets(line,1020,fp)){
- if(line[0]=='/' && line[1]=='/')
- continue;
- type=0;
- if(sscanf(line,"%[A-Za-z0-9_],%d,%d",name,&val,&type)>=2 ||
- sscanf(line,"%[A-Za-z0-9_] %d %d",name,&val,&type)>=2){
- for(i=0;name[i];i++)
- name[i]=tolower(name[i]);
- n=add_str((const unsigned char *) name);
- if(type==0)
- str_data[n].type=C_INT;
- else
- str_data[n].type=C_PARAM;
- str_data[n].val=val;
- }
- }
- fclose(fp);
-}
-
-/*==========================================
- * ƒXƒNƒŠƒvƒg‚̉ðÍ
- *------------------------------------------
- */
-char* parse_script(unsigned char *src,int line)
-{
- unsigned char *p,*tmpp;
- int i;
- static int first=1;
-
- if(first){
- add_buildin_func();
- read_constdb();
- }
- first=0;
- script_buf=(unsigned char *)aCallocA(SCRIPT_BLOCK_SIZE,sizeof(unsigned char));
- script_pos=0;
- script_size=SCRIPT_BLOCK_SIZE;
- str_data[LABEL_NEXTLINE].type=C_NOP;
- str_data[LABEL_NEXTLINE].backpatch=-1;
- str_data[LABEL_NEXTLINE].label=-1;
- for(i=LABEL_START;i<str_num;i++){
- if(str_data[i].type==C_POS || str_data[i].type==C_NAME){
- str_data[i].type=C_NOP;
- str_data[i].backpatch=-1;
- str_data[i].label=-1;
- }
- }
-
- // ŠO•”—plabel db‚̉Šú‰»
- if(scriptlabel_db!=NULL)
- strdb_final(scriptlabel_db,scriptlabel_final);
- scriptlabel_db=strdb_init(50);
-
- // for error message
- startptr = src;
- startline = line;
-
- p=src;
- p=skip_space(p);
- if(*p!='{'){
- disp_error_message("not found '{'",p);
- return NULL;
- }
- for(p++;p && *p && *p!='}';){
- p=skip_space(p);
- // label‚¾‚¯“ÁŽêˆ—
- tmpp=skip_space(skip_word(p));
- if(*tmpp==':'){
- int l,c;
-
- c=*skip_word(p);
- *skip_word(p)=0;
- l=add_str(p);
- if(str_data[l].label!=-1){
- *skip_word(p)=c;
- disp_error_message("dup label ",p);
- exit(1);
- }
- set_label(l,script_pos);
- strdb_insert(scriptlabel_db,p,script_pos); // ŠO•”—plabel db“o˜^
- *skip_word(p)=c;
- p=tmpp+1;
- continue;
- }
-
- // ‘¼‚Í‘S•”ˆê‚­‚½
- p=parse_line(p);
- p=skip_space(p);
- add_scriptc(C_EOL);
-
- set_label(LABEL_NEXTLINE,script_pos);
- str_data[LABEL_NEXTLINE].type=C_NOP;
- str_data[LABEL_NEXTLINE].backpatch=-1;
- str_data[LABEL_NEXTLINE].label=-1;
- }
-
- add_scriptc(C_NOP);
-
- script_size = script_pos;
- script_buf=(unsigned char *)aRealloc(script_buf,script_pos + 1);
-
- // –¢‰ðŒˆ‚̃‰ƒxƒ‹‚ð‰ðŒˆ
- for(i=LABEL_START;i<str_num;i++){
- if(str_data[i].type==C_NOP){
- int j,next;
- str_data[i].type=C_NAME;
- str_data[i].label=i;
- for(j=str_data[i].backpatch;j>=0 && j!=0x00ffffff;){
- next=(*(int*)(script_buf+j)) & 0x00ffffff;
- script_buf[j]=i;
- script_buf[j+1]=i>>8;
- script_buf[j+2]=i>>16;
- j=next;
- }
- }
- }
-
-#ifdef DEBUG_DISP
- for(i=0;i<script_pos;i++){
- if((i&15)==0) printf("%04x : ",i);
- printf("%02x ",script_buf[i]);
- if((i&15)==15) printf("\n");
- }
- printf("\n");
-#endif
-
- return (char *) script_buf;
-}
-
-//
-// ŽÀsŒn
-//
-enum {STOP=1,END,RERUNLINE,GOTO,RETFUNC};
-
-/*==========================================
- * rid‚©‚çsd‚ւ̉ðŒˆ
- *------------------------------------------
- */
-struct map_session_data *script_rid2sd(struct script_state *st)
-{
- struct map_session_data *sd=map_id2sd(st->rid);
- if(!sd){
- printf("script_rid2sd: fatal error ! player not attached!\n");
- }
- return sd;
-}
-
-
-/*==========================================
- * •Ï”‚Ì“Ç‚ÝŽæ‚è
- *------------------------------------------
- */
-int get_val(struct script_state*st,struct script_data* data)
-{
- struct map_session_data *sd=NULL;
- if(data->type==C_NAME){
- char *name=str_buf+str_data[data->u.num&0x00ffffff].str;
- char prefix=*name;
- char postfix=name[strlen(name)-1];
-
- if(prefix!='$'){
- if((sd=script_rid2sd(st))==NULL)
- printf("get_val error name?:%s\n",name);
- }
- if(postfix=='$'){
-
- data->type=C_CONSTSTR;
- if( prefix=='@' || prefix=='l' ){
- if(sd)
- data->u.str = pc_readregstr(sd,data->u.num);
- }else if(prefix=='$'){
- data->u.str = (char *)numdb_search(mapregstr_db,data->u.num);
- }else{
- printf("script: get_val: illegal scope string variable.\n");
- data->u.str = "!!ERROR!!";
- }
- if( data->u.str == NULL )
- data->u.str ="";
-
- }else{
-
- data->type=C_INT;
- if(str_data[data->u.num&0x00ffffff].type==C_INT){
- data->u.num = str_data[data->u.num&0x00ffffff].val;
- }else if(str_data[data->u.num&0x00ffffff].type==C_PARAM){
- if(sd)
- data->u.num = pc_readparam(sd,str_data[data->u.num&0x00ffffff].val);
- }else if(prefix=='@' || prefix=='l'){
- if(sd)
- data->u.num = pc_readreg(sd,data->u.num);
- }else if(prefix=='$'){
- data->u.num = (int)numdb_search(mapreg_db,data->u.num);
- }else if(prefix=='#'){
- if( name[1]=='#'){
- if(sd)
- data->u.num = pc_readaccountreg2(sd,name);
- }else{
- if(sd)
- data->u.num = pc_readaccountreg(sd,name);
- }
- }else{
- if(sd)
- data->u.num = pc_readglobalreg(sd,name);
- }
- }
- }
- return 0;
-}
-/*==========================================
- * •Ï”‚Ì“Ç‚ÝŽæ‚è2
- *------------------------------------------
- */
-void* get_val2(struct script_state*st,int num)
-{
- struct script_data dat;
- dat.type=C_NAME;
- dat.u.num=num;
- get_val(st,&dat);
- if( dat.type==C_INT ) return (void*)dat.u.num;
- else return (void*)dat.u.str;
-}
-
-/*==========================================
- * •Ï”Ý’è—p
- *------------------------------------------
- */
-static int set_reg(struct map_session_data *sd,int num,char *name,void *v)
-{
- char prefix=*name;
- char postfix=name[strlen(name)-1];
-
- if( postfix=='$' ){
- char *str=(char*)v;
- if( prefix=='@' || prefix=='l'){
- pc_setregstr(sd,num,str);
- }else if(prefix=='$') {
- mapreg_setregstr(num,str);
- }else{
- printf("script: set_reg: illegal scope string variable !");
- }
- }else{
- // ”’l
- int val = (int)v;
- if(str_data[num&0x00ffffff].type==C_PARAM){
- pc_setparam(sd,str_data[num&0x00ffffff].val,val);
- }else if(prefix=='@' || prefix=='l') {
- pc_setreg(sd,num,val);
- }else if(prefix=='$') {
- mapreg_setreg(num,val);
- }else if(prefix=='#') {
- if( name[1]=='#' )
- pc_setaccountreg2(sd,name,val);
- else
- pc_setaccountreg(sd,name,val);
- }else{
- pc_setglobalreg(sd,name,val);
- }
- }
- return 0;
-}
-
-int set_var(struct map_session_data *sd, char *name, void *val)
-{
- return set_reg(sd, add_str((unsigned char *) name), name, val);
-}
-
-/*==========================================
- * •¶Žš—ñ‚Ö‚Ì•ÏŠ·
- *------------------------------------------
- */
-char* conv_str(struct script_state *st,struct script_data *data)
-{
- get_val(st,data);
- if(data->type==C_INT){
- char *buf;
- buf=(char *)aCallocA(16,sizeof(char));
- sprintf(buf,"%d",data->u.num);
- data->type=C_STR;
- data->u.str=buf;
-#if 1
- } else if(data->type==C_NAME){
- // ƒeƒ“ƒ|ƒ‰ƒŠB–{—ˆ–³‚¢‚Í‚¸
- data->type=C_CONSTSTR;
- data->u.str=str_buf+str_data[data->u.num].str;
-#endif
- }
- return data->u.str;
-}
-
-/*==========================================
- * ”’l‚Ö•ÏŠ·
- *------------------------------------------
- */
-int conv_num(struct script_state *st,struct script_data *data)
-{
- char *p;
- get_val(st,data);
- if(data->type==C_STR || data->type==C_CONSTSTR){
- p=data->u.str;
- data->u.num = atoi(p);
- if(data->type==C_STR)
- aFree(p);
- data->type=C_INT;
- }
- return data->u.num;
-}
-
-/*==========================================
- * ƒXƒ^ƒbƒN‚Ö”’l‚ðƒvƒbƒVƒ…
- *------------------------------------------
- */
-void push_val(struct script_stack *stack,int type,int val)
-{
- if(stack->sp >= stack->sp_max){
- stack->sp_max += 64;
- stack->stack_data = (struct script_data *)aRealloc(stack->stack_data,
- sizeof(stack->stack_data[0]) * stack->sp_max);
- memset(stack->stack_data + (stack->sp_max - 64), 0,
- 64 * sizeof(*(stack->stack_data)));
- }
-// if(battle_config.etc_log)
-// printf("push (%d,%d)-> %d\n",type,val,stack->sp);
- stack->stack_data[stack->sp].type=type;
- stack->stack_data[stack->sp].u.num=val;
- stack->sp++;
-}
-
-/*==========================================
- * ƒXƒ^ƒbƒN‚Ö•¶Žš—ñ‚ðƒvƒbƒVƒ…
- *------------------------------------------
- */
-void push_str(struct script_stack *stack,int type,unsigned char *str)
-{
- if(stack->sp>=stack->sp_max){
- stack->sp_max += 64;
- stack->stack_data = (struct script_data *)aRealloc(stack->stack_data,
- sizeof(stack->stack_data[0]) * stack->sp_max);
- memset(stack->stack_data + (stack->sp_max - 64), '\0',
- 64 * sizeof(*(stack->stack_data)));
- }
-// if(battle_config.etc_log)
-// printf("push (%d,%x)-> %d\n",type,str,stack->sp);
- stack->stack_data[stack->sp].type=type;
- stack->stack_data[stack->sp].u.str=(char *) str;
- stack->sp++;
-}
-
-/*==========================================
- * ƒXƒ^ƒbƒN‚Ö•¡»‚ðƒvƒbƒVƒ…
- *------------------------------------------
- */
-void push_copy(struct script_stack *stack,int pos)
-{
- switch(stack->stack_data[pos].type){
- case C_CONSTSTR:
- push_str(stack,C_CONSTSTR,(unsigned char *) stack->stack_data[pos].u.str);
- break;
- case C_STR:
- push_str(stack,C_STR,(unsigned char *) aStrdup(stack->stack_data[pos].u.str));
- break;
- default:
- push_val(stack,stack->stack_data[pos].type,stack->stack_data[pos].u.num);
- break;
- }
-}
-
-/*==========================================
- * ƒXƒ^ƒbƒN‚©‚çƒ|ƒbƒv
- *------------------------------------------
- */
-void pop_stack(struct script_stack* stack,int start,int end)
-{
- int i;
- for(i=start;i<end;i++){
- if(stack->stack_data[i].type==C_STR){
- aFree(stack->stack_data[i].u.str);
- }
- }
- if(stack->sp>end){
- memmove(&stack->stack_data[start],&stack->stack_data[end],sizeof(stack->stack_data[0])*(stack->sp-end));
- }
- stack->sp-=end-start;
-}
-
-//
-// –„‚ßž‚ÝŠÖ”
-//
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_mes(struct script_state *st)
-{
- conv_str(st,& (st->stack->stack_data[st->start+2]));
- clif_scriptmes(script_rid2sd(st),st->oid,st->stack->stack_data[st->start+2].u.str);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_goto(struct script_state *st)
-{
- int pos;
-
- if( st->stack->stack_data[st->start+2].type!=C_POS ){
- printf("script: goto: not label!\n");
- st->state=END;
- return 0;
- }
-
- pos=conv_num(st,& (st->stack->stack_data[st->start+2]));
- st->pos=pos;
- st->state=GOTO;
- return 0;
-}
-
-/*==========================================
- * ƒ†[ƒU[’è‹`ŠÖ”‚̌ĂÑo‚µ
- *------------------------------------------
- */
-int buildin_callfunc(struct script_state *st)
-{
- char *scr;
- char *str=conv_str(st,& (st->stack->stack_data[st->start+2]));
-
- if( (scr=(char *) strdb_search(script_get_userfunc_db(),str)) ){
- int i,j;
- for(i=st->start+3,j=0;i<st->end;i++,j++)
- push_copy(st->stack,i);
-
- push_val(st->stack,C_INT,j); // ˆø”‚Ì”‚ðƒvƒbƒVƒ…
- push_val(st->stack,C_INT,st->defsp); // Œ»Ý‚̊Xƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ðƒvƒbƒVƒ…
- push_val(st->stack,C_INT,(int)st->script); // Œ»Ý‚̃XƒNƒŠƒvƒg‚ðƒvƒbƒVƒ…
- push_val(st->stack,C_RETINFO,st->pos); // Œ»Ý‚̃XƒNƒŠƒvƒgˆÊ’u‚ðƒvƒbƒVƒ…
-
- st->pos=0;
- st->script=scr;
- st->defsp=st->start+4+j;
- st->state=GOTO;
- }else{
- printf("script:callfunc: function not found! [%s]\n",str);
- st->state=END;
- }
- return 0;
-}
-/*==========================================
- * ƒTƒuƒ‹[ƒeƒBƒ“‚̌ĂÑo‚µ
- *------------------------------------------
- */
-int buildin_callsub(struct script_state *st)
-{
- int pos=conv_num(st,& (st->stack->stack_data[st->start+2]));
- int i,j;
- for(i=st->start+3,j=0;i<st->end;i++,j++)
- push_copy(st->stack,i);
-
- push_val(st->stack,C_INT,j); // ˆø”‚Ì”‚ðƒvƒbƒVƒ…
- push_val(st->stack,C_INT,st->defsp); // Œ»Ý‚̊Xƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ðƒvƒbƒVƒ…
- push_val(st->stack,C_INT,(int)st->script); // Œ»Ý‚̃XƒNƒŠƒvƒg‚ðƒvƒbƒVƒ…
- push_val(st->stack,C_RETINFO,st->pos); // Œ»Ý‚̃XƒNƒŠƒvƒgˆÊ’u‚ðƒvƒbƒVƒ…
-
- st->pos=pos;
- st->defsp=st->start+4+j;
- st->state=GOTO;
- return 0;
-}
-
-/*==========================================
- * ˆø”‚ÌŠ“¾
- *------------------------------------------
- */
-int buildin_getarg(struct script_state *st)
-{
- int num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- int max,stsp;
- if( st->defsp<4 || st->stack->stack_data[st->defsp-1].type!=C_RETINFO ){
- printf("script:getarg without callfunc or callsub!\n");
- st->state=END;
- return 0;
- }
- max=conv_num(st,& (st->stack->stack_data[st->defsp-4]));
- stsp=st->defsp - max -4;
- if( num >= max ){
- printf("script:getarg arg1(%d) out of range(%d) !\n",num,max);
- st->state=END;
- return 0;
- }
- push_copy(st->stack,stsp+num);
- return 0;
-}
-
-/*==========================================
- * ƒTƒuƒ‹[ƒ`ƒ“/ƒ†[ƒU[’è‹`ŠÖ”‚ÌI—¹
- *------------------------------------------
- */
-int buildin_return(struct script_state *st)
-{
- if(st->end>st->start+2){ // –ß‚è’l—L‚è
- push_copy(st->stack,st->start+2);
- }
- st->state=RETFUNC;
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_next(struct script_state *st)
-{
- st->state=STOP;
- clif_scriptnext(script_rid2sd(st),st->oid);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_close(struct script_state *st)
-{
- st->state=END;
- clif_scriptclose(script_rid2sd(st),st->oid);
- return 0;
-}
-int buildin_close2(struct script_state *st)
-{
- st->state=STOP;
- clif_scriptclose(script_rid2sd(st),st->oid);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_menu(struct script_state *st)
-{
- char *buf;
- int len,i;
- struct map_session_data *sd;
-
- sd=script_rid2sd(st);
-
- if(sd->state.menu_or_input==0){
- st->state=RERUNLINE;
- sd->state.menu_or_input=1;
- for(i=st->start+2,len=16;i<st->end;i+=2){
- conv_str(st,& (st->stack->stack_data[i]));
- len+=strlen(st->stack->stack_data[i].u.str)+1;
- }
- buf=(char *)aCallocA(len+1,sizeof(char));
- buf[0]=0;
- for(i=st->start+2,len=0;i<st->end;i+=2){
- strcat(buf,st->stack->stack_data[i].u.str);
- strcat(buf,":");
- }
- clif_scriptmenu(script_rid2sd(st),st->oid,buf);
- aFree(buf);
- } else if(sd->npc_menu==0xff){ // cansel
- sd->state.menu_or_input=0;
- st->state=END;
- } else { // goto“®ì
- // ragemuŒÝŠ·‚Ì‚½‚ß
- pc_setreg(sd,add_str((unsigned char *) "l15"),sd->npc_menu);
- pc_setreg(sd,add_str((unsigned char *) "@menu"),sd->npc_menu);
- sd->state.menu_or_input=0;
- if(sd->npc_menu>0 && sd->npc_menu<(st->end-st->start)/2){
- int pos;
- if( st->stack->stack_data[st->start+sd->npc_menu*2+1].type!=C_POS ){
- printf("script: menu: not label !\n");
- st->state=END;
- return 0;
- }
- pos=conv_num(st,& (st->stack->stack_data[st->start+sd->npc_menu*2+1]));
- st->pos=pos;
- st->state=GOTO;
- }
- }
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_rand(struct script_state *st)
-{
- int range;
-
- if (st->end > st->start+3){
- int min, max;
- min = conv_num(st,& (st->stack->stack_data[st->start+2]));
- max = conv_num(st,& (st->stack->stack_data[st->start+3]));
- if (max < min){
- int tmp = min;
- min = max;
- max = tmp;
- }
- range = max - min + 1;
- if (range == 0) range = 1;
- push_val(st->stack,C_INT,rand()%range+min);
- } else {
- range = conv_num(st,& (st->stack->stack_data[st->start+2]));
- if (range == 0) range = 1;
- push_val(st->stack,C_INT,rand()%range);
- }
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_warp(struct script_state *st)
-{
- int x,y;
- char *str;
- struct map_session_data *sd=script_rid2sd(st);
-
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- x=conv_num(st,& (st->stack->stack_data[st->start+3]));
- y=conv_num(st,& (st->stack->stack_data[st->start+4]));
- if(strcmp(str,"Random")==0)
- pc_randomwarp(sd,3);
- else if(strcmp(str,"SavePoint")==0){
- if(map[sd->bl.m].flag.noreturn) // ’±‹ÖŽ~
- return 0;
-
- pc_setpos(sd,sd->status.save_point.map,
- sd->status.save_point.x,sd->status.save_point.y,3);
- }else if(strcmp(str,"Save")==0){
- if(map[sd->bl.m].flag.noreturn) // ’±‹ÖŽ~
- return 0;
-
- pc_setpos(sd,sd->status.save_point.map,
- sd->status.save_point.x,sd->status.save_point.y,3);
- }else
- pc_setpos(sd,str,x,y,0);
- return 0;
-}
-/*==========================================
- * ƒGƒŠƒAŽw’èƒ[ƒv
- *------------------------------------------
- */
-int buildin_areawarp_sub(struct block_list *bl,va_list ap)
-{
- int x,y;
- char *map;
- map=va_arg(ap, char *);
- x=va_arg(ap,int);
- y=va_arg(ap,int);
- if(strcmp(map,"Random")==0)
- pc_randomwarp((struct map_session_data *)bl,3);
- else
- pc_setpos((struct map_session_data *)bl,map,x,y,0);
- return 0;
-}
-int buildin_areawarp(struct script_state *st)
-{
- int x,y,m;
- char *str;
- char *mapname;
- int x0,y0,x1,y1;
-
- mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
- x0=conv_num(st,& (st->stack->stack_data[st->start+3]));
- y0=conv_num(st,& (st->stack->stack_data[st->start+4]));
- x1=conv_num(st,& (st->stack->stack_data[st->start+5]));
- y1=conv_num(st,& (st->stack->stack_data[st->start+6]));
- str=conv_str(st,& (st->stack->stack_data[st->start+7]));
- x=conv_num(st,& (st->stack->stack_data[st->start+8]));
- y=conv_num(st,& (st->stack->stack_data[st->start+9]));
-
- if( (m=map_mapname2mapid(mapname))< 0)
- return 0;
-
- map_foreachinarea(buildin_areawarp_sub,
- m,x0,y0,x1,y1,BL_PC, str,x,y );
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_heal(struct script_state *st)
-{
- int hp,sp;
-
- hp=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sp=conv_num(st,& (st->stack->stack_data[st->start+3]));
- pc_heal(script_rid2sd(st),hp,sp);
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_itemheal(struct script_state *st)
-{
- int hp,sp;
-
- hp=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sp=conv_num(st,& (st->stack->stack_data[st->start+3]));
- pc_itemheal(script_rid2sd(st),hp,sp);
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_percentheal(struct script_state *st)
-{
- int hp,sp;
-
- hp=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sp=conv_num(st,& (st->stack->stack_data[st->start+3]));
- pc_percentheal(script_rid2sd(st),hp,sp);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_jobchange(struct script_state *st)
-{
- int job, upper=-1;
-
- job=conv_num(st,& (st->stack->stack_data[st->start+2]));
- if( st->end>st->start+3 )
- upper=conv_num(st,& (st->stack->stack_data[st->start+3]));
-
- if ((job >= 0 && job < MAX_PC_CLASS))
- pc_jobchange(script_rid2sd(st),job, upper);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_input(struct script_state *st)
-{
- struct map_session_data *sd=NULL;
- int num=(st->end>st->start+2)?st->stack->stack_data[st->start+2].u.num:0;
- char *name=(char *) ((st->end>st->start+2)?str_buf+str_data[num&0x00ffffff].str:"");
-// char prefix=*name;
- char postfix=name[strlen(name)-1];
-
- sd=script_rid2sd(st);
- if(sd->state.menu_or_input){
- sd->state.menu_or_input=0;
- if( postfix=='$' ){
- // •¶Žš—ñ
- if(st->end>st->start+2){ // ˆø”1ŒÂ
- set_reg(sd,num,name,(void*)sd->npc_str);
- }else{
- printf("buildin_input: string discarded !!\n");
- }
- }else{
-
- // commented by Lupus (check Value Number Input fix in clif.c)
- // readded by Yor: set ammount to 0 instead of cancel trade.
- // ** Fix by fritz :X keeps people from abusing old input bugs
- if (sd->npc_amount < 0) { //** If input amount is less then 0
-// clif_tradecancelled(sd); // added "Deal has been cancelled" message by Valaris
-// buildin_close(st); // ** close
- sd->npc_amount = 0;
- } else if (sd->npc_amount > battle_config.vending_max_value) // new fix by Yor
- sd->npc_amount = battle_config.vending_max_value;
-
- // ”’l
- if(st->end>st->start+2){ // ˆø”1ŒÂ
- set_reg(sd,num,name,(void*)sd->npc_amount);
- } else {
- // ragemuŒÝŠ·‚Ì‚½‚ß
- pc_setreg(sd,add_str((unsigned char *) "l14"),sd->npc_amount);
- }
- }
- } else {
- st->state=RERUNLINE;
- if(postfix=='$')clif_scriptinputstr(sd,st->oid);
- else clif_scriptinput(sd,st->oid);
- sd->state.menu_or_input=1;
- }
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_if(struct script_state *st)
-{
- int sel,i;
-
- sel=conv_num(st,& (st->stack->stack_data[st->start+2]));
- if(!sel)
- return 0;
-
- // ŠÖ”–¼‚ðƒRƒs[
- push_copy(st->stack,st->start+3);
- // ŠÔ‚Ɉø”ƒ}[ƒJ‚ð“ü‚ê‚Ä
- push_val(st->stack,C_ARG,0);
- // Žc‚è‚̈ø”‚ðƒRƒs[
- for(i=st->start+4;i<st->end;i++){
- push_copy(st->stack,i);
- }
- run_func(st);
-
- return 0;
-}
-
-
-/*==========================================
- * •Ï”Ý’è
- *------------------------------------------
- */
-int buildin_set(struct script_state *st)
-{
- struct map_session_data *sd=NULL;
- int num=st->stack->stack_data[st->start+2].u.num;
- char *name=str_buf+str_data[num&0x00ffffff].str;
- char prefix=*name;
- char postfix=name[strlen(name)-1];
-
- if( st->stack->stack_data[st->start+2].type!=C_NAME ){
- printf("script: buildin_set: not name\n");
- return 0;
- }
-
- if( prefix!='$' )
- sd=script_rid2sd(st);
-
-
- if( postfix=='$' ){
- // •¶Žš—ñ
- char *str = conv_str(st,& (st->stack->stack_data[st->start+3]));
- set_reg(sd,num,name,(void*)str);
- }else{
- // ”’l
- int val = conv_num(st,& (st->stack->stack_data[st->start+3]));
- set_reg(sd,num,name,(void*)val);
- }
-
- return 0;
-}
-/*==========================================
- * ”z—ñ•Ï”Ý’è
- *------------------------------------------
- */
-int buildin_setarray(struct script_state *st)
-{
- struct map_session_data *sd=NULL;
- int num=st->stack->stack_data[st->start+2].u.num;
- char *name=str_buf+str_data[num&0x00ffffff].str;
- char prefix=*name;
- char postfix=name[strlen(name)-1];
- int i,j;
-
- if( prefix!='$' && prefix!='@' ){
- printf("buildin_setarray: illegal scope !\n");
- return 0;
- }
- if( prefix!='$' )
- sd=script_rid2sd(st);
-
- for(j=0,i=st->start+3; i<st->end && j<128;i++,j++){
- void *v;
- if( postfix=='$' )
- v=(void*)conv_str(st,& (st->stack->stack_data[i]));
- else
- v=(void*)conv_num(st,& (st->stack->stack_data[i]));
- set_reg( sd, num+(j<<24), name, v);
- }
- return 0;
-}
-/*==========================================
- * ”z—ñ•Ï”ƒNƒŠƒA
- *------------------------------------------
- */
-int buildin_cleararray(struct script_state *st)
-{
- struct map_session_data *sd=NULL;
- int num=st->stack->stack_data[st->start+2].u.num;
- char *name=str_buf+str_data[num&0x00ffffff].str;
- char prefix=*name;
- char postfix=name[strlen(name)-1];
- int sz=conv_num(st,& (st->stack->stack_data[st->start+4]));
- int i;
- void *v;
-
- if( prefix!='$' && prefix!='@' ){
- printf("buildin_cleararray: illegal scope !\n");
- return 0;
- }
- if( prefix!='$' )
- sd=script_rid2sd(st);
-
- if( postfix=='$' )
- v=(void*)conv_str(st,& (st->stack->stack_data[st->start+3]));
- else
- v=(void*)conv_num(st,& (st->stack->stack_data[st->start+3]));
-
- for(i=0;i<sz;i++)
- set_reg(sd,num+(i<<24),name,v);
- return 0;
-}
-/*==========================================
- * ”z—ñ•Ï”ƒRƒs[
- *------------------------------------------
- */
-int buildin_copyarray(struct script_state *st)
-{
- struct map_session_data *sd=NULL;
- int num=st->stack->stack_data[st->start+2].u.num;
- char *name=str_buf+str_data[num&0x00ffffff].str;
- char prefix=*name;
- char postfix=name[strlen(name)-1];
- int num2=st->stack->stack_data[st->start+3].u.num;
- char *name2=str_buf+str_data[num2&0x00ffffff].str;
- char prefix2=*name2;
- char postfix2=name2[strlen(name2)-1];
- int sz=conv_num(st,& (st->stack->stack_data[st->start+4]));
- int i;
-
- if( prefix!='$' && prefix!='@' && prefix2!='$' && prefix2!='@' ){
- printf("buildin_copyarray: illegal scope !\n");
- return 0;
- }
- if( (postfix=='$' || postfix2=='$') && postfix!=postfix2 ){
- printf("buildin_copyarray: type mismatch !\n");
- return 0;
- }
- if( prefix!='$' || prefix2!='$' )
- sd=script_rid2sd(st);
-
-
- for(i=0;i<sz;i++)
- set_reg(sd,num+(i<<24),name, get_val2(st,num2+(i<<24)) );
- return 0;
-}
-/*==========================================
- * ”z—ñ•Ï”‚̃TƒCƒYŠ“¾
- *------------------------------------------
- */
-static int getarraysize(struct script_state *st,int num,int postfix)
-{
- int i=(num>>24),c=i;
- for(;i<128;i++){
- void *v=get_val2(st,num+(i<<24));
- if(postfix=='$' && *((char*)v) ) c=i;
- if(postfix!='$' && (int)v )c=i;
- }
- return c+1;
-}
-int buildin_getarraysize(struct script_state *st)
-{
- int num=st->stack->stack_data[st->start+2].u.num;
- char *name=str_buf+str_data[num&0x00ffffff].str;
- char prefix=*name;
- char postfix=name[strlen(name)-1];
-
- if( prefix!='$' && prefix!='@' ){
- printf("buildin_copyarray: illegal scope !\n");
- return 0;
- }
-
- push_val(st->stack,C_INT,getarraysize(st,num,postfix) );
- return 0;
-}
-/*==========================================
- * ”z—ñ•Ï”‚©‚ç—v‘fíœ
- *------------------------------------------
- */
-int buildin_deletearray(struct script_state *st)
-{
- struct map_session_data *sd=NULL;
- int num=st->stack->stack_data[st->start+2].u.num;
- char *name=str_buf+str_data[num&0x00ffffff].str;
- char prefix=*name;
- char postfix=name[strlen(name)-1];
- int count=1;
- int i,sz=getarraysize(st,num,postfix)-(num>>24)-count+1;
-
-
- if( (st->end > st->start+3) )
- count=conv_num(st,& (st->stack->stack_data[st->start+3]));
-
- if( prefix!='$' && prefix!='@' ){
- printf("buildin_deletearray: illegal scope !\n");
- return 0;
- }
- if( prefix!='$' )
- sd=script_rid2sd(st);
-
- for(i=0;i<sz;i++){
- set_reg(sd,num+(i<<24),name, get_val2(st,num+((i+count)<<24) ) );
- }
- for(;i<(128-(num>>24));i++){
- if( postfix!='$' ) set_reg(sd,num+(i<<24),name, 0);
- if( postfix=='$' ) set_reg(sd,num+(i<<24),name, (void *) "");
- }
- return 0;
-}
-
-/*==========================================
- * Žw’è—v‘f‚ð•\‚·’l(ƒL[)‚ðŠ“¾‚·‚é
- *------------------------------------------
- */
-int buildin_getelementofarray(struct script_state *st)
-{
- if( st->stack->stack_data[st->start+2].type==C_NAME ){
- int i=conv_num(st,& (st->stack->stack_data[st->start+3]));
- if(i>127 || i<0){
- printf("script: getelementofarray (operator[]): param2 illegal number %d\n",i);
- push_val(st->stack,C_INT,0);
- }else{
- push_val(st->stack,C_NAME,
- (i<<24) | st->stack->stack_data[st->start+2].u.num );
- }
- }else{
- printf("script: getelementofarray (operator[]): param1 not name !\n");
- push_val(st->stack,C_INT,0);
- }
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_setlook(struct script_state *st)
-{
- int type,val;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- val=conv_num(st,& (st->stack->stack_data[st->start+3]));
-
- pc_changelook(script_rid2sd(st),type,val);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_cutin(struct script_state *st)
-{
- int type;
-
- conv_str(st,& (st->stack->stack_data[st->start+2]));
- type=conv_num(st,& (st->stack->stack_data[st->start+3]));
-
- clif_cutin(script_rid2sd(st),st->stack->stack_data[st->start+2].u.str,type);
-
- return 0;
-}
-/*==========================================
- * ƒJ[ƒh‚̃Cƒ‰ƒXƒg‚ð•\Ž¦‚·‚é
- *------------------------------------------
- */
-int buildin_cutincard(struct script_state *st)
-{
- int itemid;
-
- itemid=conv_num(st,& (st->stack->stack_data[st->start+2]));
-
- clif_cutin(script_rid2sd(st),itemdb_search(itemid)->cardillustname,4);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_viewpoint(struct script_state *st)
-{
- int type,x,y,id,color;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- x=conv_num(st,& (st->stack->stack_data[st->start+3]));
- y=conv_num(st,& (st->stack->stack_data[st->start+4]));
- id=conv_num(st,& (st->stack->stack_data[st->start+5]));
- color=conv_num(st,& (st->stack->stack_data[st->start+6]));
-
- clif_viewpoint(script_rid2sd(st),st->oid,type,x,y,id,color);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_countitem(struct script_state *st)
-{
- int nameid=0,count=0,i;
- struct map_session_data *sd;
-
- struct script_data *data;
-
- sd = script_rid2sd(st);
-
- data=&(st->stack->stack_data[st->start+2]);
- get_val(st,data);
- if( data->type==C_STR || data->type==C_CONSTSTR ){
- const char *name=conv_str(st,data);
- struct item_data *item_data;
- if( (item_data = itemdb_searchname(name)) != NULL)
- nameid=item_data->nameid;
- }else
- nameid=conv_num(st,data);
-
- if (nameid>=500) //if no such ID then skip this iteration
- for(i=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid==nameid)
- count+=sd->status.inventory[i].amount;
- }
- else{
- if(battle_config.error_log)
- printf("wrong item ID : countitem(%i)\n",nameid);
- }
- push_val(st->stack,C_INT,count);
-
- return 0;
-}
-
-/*==========================================
- * d—ʃ`ƒFƒbƒN
- *------------------------------------------
- */
-int buildin_checkweight(struct script_state *st)
-{
- int nameid=0,amount;
- struct map_session_data *sd;
- struct script_data *data;
-
- sd = script_rid2sd(st);
-
- data=&(st->stack->stack_data[st->start+2]);
- get_val(st,data);
- if( data->type==C_STR || data->type==C_CONSTSTR ){
- const char *name=conv_str(st,data);
- struct item_data *item_data = itemdb_searchname(name);
- if( item_data )
- nameid=item_data->nameid;
- }else
- nameid=conv_num(st,data);
-
- amount=conv_num(st,& (st->stack->stack_data[st->start+3]));
- if ( amount<=0 || nameid<500 ) { //if get wrong item ID or amount<=0, don't count weight of non existing items
- push_val(st->stack,C_INT,0);
- }
-
- sd=script_rid2sd(st);
- if(itemdb_weight(nameid)*amount + sd->weight > sd->max_weight){
- push_val(st->stack,C_INT,0);
- } else {
- push_val(st->stack,C_INT,1);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_getitem(struct script_state *st)
-{
- int nameid,nameidsrc,amount,flag = 0;
- struct item item_tmp;
- struct map_session_data *sd;
- struct script_data *data;
-
- sd = script_rid2sd(st);
-
- data=&(st->stack->stack_data[st->start+2]);
- get_val(st,data);
- if( data->type==C_STR || data->type==C_CONSTSTR ){
- const char *name=conv_str(st,data);
- struct item_data *item_data = itemdb_searchname(name);
- nameid=512; //Apple item ID
- if( item_data != NULL)
- nameid=item_data->nameid;
- }else
- nameid=conv_num(st,data);
-
- if ( ( amount=conv_num(st,& (st->stack->stack_data[st->start+3])) ) <= 0) {
- return 0; //return if amount <=0, skip the useles iteration
- }
- //Violet Box, Blue Box, etc - random item pick
- if((nameidsrc = nameid)<0) { // Save real ID of the source Box [Lupus]
- nameid=itemdb_searchrandomid(-nameid);
-
- if(log_config.present > 0)
- log_present(sd, -nameidsrc, nameid); //fixed missing ID by Lupus
-
- flag = 1;
- }
-
- if(nameid > 0) {
- memset(&item_tmp,0,sizeof(item_tmp));
- item_tmp.nameid=nameid;
- if(!flag)
- item_tmp.identify=1;
- else
- item_tmp.identify=!itemdb_isequip3(nameid);
- if( st->end>st->start+5 ) //ƒAƒCƒeƒ€‚ðŽw’肵‚½ID‚É“n‚·
- sd=map_id2sd(conv_num(st,& (st->stack->stack_data[st->start+5])));
- if(sd == NULL) //ƒAƒCƒeƒ€‚ð“n‚·‘ŠŽè‚ª‚¢‚È‚©‚Á‚½‚炨‹A‚è
- return 0;
- if((flag = pc_additem(sd,&item_tmp,amount))) {
- clif_additem(sd,0,0,flag);
- if(!pc_candrop(sd,nameid))
- map_addflooritem(&item_tmp,amount,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_getitem2(struct script_state *st)
-{
- int nameid,amount,flag = 0;
- int iden,ref,attr,c1,c2,c3,c4;
- struct item_data *item_data;
- struct item item_tmp;
- struct map_session_data *sd;
- struct script_data *data;
-
- sd = script_rid2sd(st);
-
- data=&(st->stack->stack_data[st->start+2]);
- get_val(st,data);
- if( data->type==C_STR || data->type==C_CONSTSTR ){
- const char *name=conv_str(st,data);
- struct item_data *item_data = itemdb_searchname(name);
- nameid=512; //Apple item ID
- if( item_data )
- nameid=item_data->nameid;
- }else
- nameid=conv_num(st,data);
-
- amount=conv_num(st,& (st->stack->stack_data[st->start+3]));
- iden=conv_num(st,& (st->stack->stack_data[st->start+4]));
- ref=conv_num(st,& (st->stack->stack_data[st->start+5]));
- attr=conv_num(st,& (st->stack->stack_data[st->start+6]));
- c1=conv_num(st,& (st->stack->stack_data[st->start+7]));
- c2=conv_num(st,& (st->stack->stack_data[st->start+8]));
- c3=conv_num(st,& (st->stack->stack_data[st->start+9]));
- c4=conv_num(st,& (st->stack->stack_data[st->start+10]));
- if( st->end>st->start+11 ) //ƒAƒCƒeƒ€‚ðŽw’肵‚½ID‚É“n‚·
- sd=map_id2sd(conv_num(st,& (st->stack->stack_data[st->start+11])));
- if(sd == NULL) //ƒAƒCƒeƒ€‚ð“n‚·‘ŠŽè‚ª‚¢‚È‚©‚Á‚½‚炨‹A‚è
- return 0;
-
- if(nameid<0) { // ƒ‰ƒ“ƒ_ƒ€
- nameid=itemdb_searchrandomid(-nameid);
- flag = 1;
- }
-
- if(nameid > 0) {
- memset(&item_tmp,0,sizeof(item_tmp));
- item_data=itemdb_search(nameid);
- if(item_data->type==4 || item_data->type==5){
- if(ref > 10) ref = 10;
- }
- else if(item_data->type==7) {
- iden = 1;
- ref = 0;
- }
- else {
- iden = 1;
- ref = attr = 0;
- }
-
- item_tmp.nameid=nameid;
- if(!flag)
- item_tmp.identify=iden;
- else if(item_data->type==4 || item_data->type==5)
- item_tmp.identify=0;
- item_tmp.refine=ref;
- item_tmp.attribute=attr;
- item_tmp.card[0]=c1;
- item_tmp.card[1]=c2;
- item_tmp.card[2]=c3;
- item_tmp.card[3]=c4;
- if((flag = pc_additem(sd,&item_tmp,amount))) {
- clif_additem(sd,0,0,flag);
- map_addflooritem(&item_tmp,amount,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- }
-
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_makeitem(struct script_state *st)
-{
- int nameid,amount,flag = 0;
- int x,y,m;
- char *mapname;
- struct item item_tmp;
- struct map_session_data *sd;
- struct script_data *data;
-
- sd = script_rid2sd(st);
-
- data=&(st->stack->stack_data[st->start+2]);
- get_val(st,data);
- if( data->type==C_STR || data->type==C_CONSTSTR ){
- const char *name=conv_str(st,data);
- struct item_data *item_data = itemdb_searchname(name);
- nameid=512; //Apple Item ID
- if( item_data )
- nameid=item_data->nameid;
- }else
- nameid=conv_num(st,data);
-
- amount=conv_num(st,& (st->stack->stack_data[st->start+3]));
- mapname =conv_str(st,& (st->stack->stack_data[st->start+4]));
- x =conv_num(st,& (st->stack->stack_data[st->start+5]));
- y =conv_num(st,& (st->stack->stack_data[st->start+6]));
-
- if( sd && strcmp(mapname,"this")==0)
- m=sd->bl.m;
- else
- m=map_mapname2mapid(mapname);
-
- if(nameid<0) { // ƒ‰ƒ“ƒ_ƒ€
- nameid=itemdb_searchrandomid(-nameid);
- flag = 1;
- }
-
- if(nameid > 0) {
- memset(&item_tmp,0,sizeof(item_tmp));
- item_tmp.nameid=nameid;
- if(!flag)
- item_tmp.identify=1;
- else
- item_tmp.identify=!itemdb_isequip3(nameid);
-
-// clif_additem(sd,0,0,flag);
- map_addflooritem(&item_tmp,amount,m,x,y,NULL,NULL,NULL,0);
- }
-
- return 0;
-}
-/*==========================================
- * script DELITEM command (fixed 2 bugs by Lupus, added deletion priority by Lupus)
- *------------------------------------------
- */
-int buildin_delitem(struct script_state *st)
-{
- int nameid=0,amount,i,important_item=0;
- struct map_session_data *sd;
- struct script_data *data;
-
- sd = script_rid2sd(st);
-
- data=&(st->stack->stack_data[st->start+2]);
- get_val(st,data);
- if( data->type==C_STR || data->type==C_CONSTSTR ){
- const char *name=conv_str(st,data);
- struct item_data *item_data = itemdb_searchname(name);
- //nameid=512;
- if( item_data )
- nameid=item_data->nameid;
- }else
- nameid=conv_num(st,data);
-
- amount=conv_num(st,& (st->stack->stack_data[st->start+3]));
-
- if (nameid<500 || amount<=0 ) {//by Lupus. Don't run FOR if u got wrong item ID or amount<=0
- //printf("wrong item ID or amount<=0 : delitem %i,\n",nameid,amount);
- return 0;
- }
- sd=script_rid2sd(st);
- //1st pass
- //here we won't delete items with CARDS, named items but we count them
- for(i=0;i<MAX_INVENTORY;i++){
- //we don't delete wrong item or equipped item
- if(sd->status.inventory[i].nameid<=0 || sd->inventory_data[i] == NULL ||
- sd->status.inventory[i].amount<=0 || sd->status.inventory[i].nameid!=nameid )
- continue;
- //1 egg uses 1 cell in the inventory. so it's ok to delete 1 pet / per cycle
- if(sd->inventory_data[i]->type==7 && sd->status.inventory[i].card[0] == (short)0xff00 && search_petDB_index(nameid, PET_EGG) >= 0 ){
- intif_delete_petdata(*((long *)(&sd->status.inventory[i].card[1])));
- //clear egg flag. so it won't be put in IMPORTANT items (eggs look like item with 2 cards ^_^)
- sd->status.inventory[i].card[1] = sd->status.inventory[i].card[0] = 0;
- //now this egg'll be deleted as a common unimportant item
- }
- //is this item important? does it have cards? or Player's name? or Refined/Upgraded
- if( sd->status.inventory[i].card[0] || sd->status.inventory[i].card[1] ||
- sd->status.inventory[i].card[2] || sd->status.inventory[i].card[3] || sd->status.inventory[i].refine) {
- //this is important item, count it
- important_item++;
- continue;
- }
-
- if(sd->status.inventory[i].amount>=amount){
- pc_delitem(sd,i,amount,0);
- return 0; //we deleted exact amount of items. now exit
- } else {
- amount-=sd->status.inventory[i].amount;
- pc_delitem(sd,i,sd->status.inventory[i].amount,0);
- }
- }
- //2nd pass
- //now if there WERE items with CARDs/REFINED/NAMED... and if we still have to delete some items. we'll delete them finally
- if (important_item>0 && amount>0)
- for(i=0;i<MAX_INVENTORY;i++){
- //we don't delete wrong item
- if(sd->status.inventory[i].nameid<=0 || sd->inventory_data[i] == NULL ||
- sd->status.inventory[i].amount<=0 || sd->status.inventory[i].nameid!=nameid )
- continue;
-
- if(sd->status.inventory[i].amount>=amount){
- pc_delitem(sd,i,amount,0);
- return 0; //we deleted exact amount of items. now exit
- } else {
- amount-=sd->status.inventory[i].amount;
- pc_delitem(sd,i,sd->status.inventory[i].amount,0);
- }
- }
-
- return 0;
-}
-
-/*==========================================
- *ƒLƒƒƒ‰ŠÖŒW‚̃pƒ‰ƒ[ƒ^Žæ“¾
- *------------------------------------------
- */
-int buildin_readparam(struct script_state *st)
-{
- int type;
- struct map_session_data *sd;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- if( st->end>st->start+3 )
- sd=map_nick2sd(conv_str(st,& (st->stack->stack_data[st->start+3])));
- else
- sd=script_rid2sd(st);
-
- if(sd==NULL){
- push_val(st->stack,C_INT,-1);
- return 0;
- }
-
- push_val(st->stack,C_INT,pc_readparam(sd,type));
-
- return 0;
-}
-/*==========================================
- *ƒLƒƒƒ‰ŠÖŒW‚ÌIDŽæ“¾
- *------------------------------------------
- */
-int buildin_getcharid(struct script_state *st)
-{
- int num;
- struct map_session_data *sd;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- if( st->end>st->start+3 )
- sd=map_nick2sd(conv_str(st,& (st->stack->stack_data[st->start+3])));
- else
- sd=script_rid2sd(st);
- if(sd==NULL){
- push_val(st->stack,C_INT,-1);
- return 0;
- }
- if(num==0)
- push_val(st->stack,C_INT,sd->status.char_id);
- if(num==1)
- push_val(st->stack,C_INT,sd->status.party_id);
- if(num==2)
- push_val(st->stack,C_INT,sd->status.guild_id);
- if(num==3)
- push_val(st->stack,C_INT,sd->status.account_id);
- return 0;
-}
-/*==========================================
- *Žw’èID‚ÌPT–¼Žæ“¾
- *------------------------------------------
- */
-char *buildin_getpartyname_sub(int party_id)
-{
- struct party *p;
-
- p=NULL;
- p=party_search(party_id);
-
- if(p!=NULL){
- char *buf;
- buf=(char *)aCallocA(24,sizeof(char));
- strcpy(buf,p->name);
- return buf;
- }
-
- return 0;
-}
-int buildin_getpartyname(struct script_state *st)
-{
- char *name;
- int party_id;
-
- party_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- name=buildin_getpartyname_sub(party_id);
- if(name!=0)
- push_str(st->stack,C_STR,(unsigned char *)name);
- else
- push_str(st->stack,C_CONSTSTR, (unsigned char *) "null");
-
- return 0;
-}
-/*==========================================
- *Žw’èID‚ÌPTl”‚ƃƒ“ƒo[IDŽæ“¾
- *------------------------------------------
- */
-int buildin_getpartymember(struct script_state *st)
-{
- struct party *p;
- int i,j=0;
-
- p=NULL;
- p=party_search(conv_num(st,& (st->stack->stack_data[st->start+2])));
-
- if(p!=NULL){
- for(i=0;i<MAX_PARTY;i++){
- if(p->member[i].account_id){
-// printf("name:%s %d\n",p->member[i].name,i);
- mapreg_setregstr(add_str((unsigned char *) "$@partymembername$")+(i<<24),p->member[i].name);
- j++;
- }
- }
- }
- mapreg_setreg(add_str((unsigned char *) "$@partymembercount"),j);
-
- return 0;
-}
-/*==========================================
- *Žw’èID‚̃Mƒ‹ƒh–¼Žæ“¾
- *------------------------------------------
- */
-char *buildin_getguildname_sub(int guild_id)
-{
- struct guild *g=NULL;
- g=guild_search(guild_id);
-
- if(g!=NULL){
- char *buf;
- buf=(char *)aCallocA(24,sizeof(char));
- strcpy(buf,g->name);
- return buf;
- }
- return 0;
-}
-int buildin_getguildname(struct script_state *st)
-{
- char *name;
- int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- name=buildin_getguildname_sub(guild_id);
- if(name!=0)
- push_str(st->stack,C_STR,(unsigned char *) name);
- else
- push_str(st->stack,C_CONSTSTR,(unsigned char *) "null");
- return 0;
-}
-
-/*==========================================
- *Žw’èID‚ÌGuildMaster–¼Žæ“¾
- *------------------------------------------
- */
-char *buildin_getguildmaster_sub(int guild_id)
-{
- struct guild *g=NULL;
- g=guild_search(guild_id);
-
- if(g!=NULL){
- char *buf;
- buf=(char *)aCallocA(24,sizeof(char));
- strncpy(buf,g->master, 23);
- return buf;
- }
-
- return 0;
-}
-int buildin_getguildmaster(struct script_state *st)
-{
- char *master;
- int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- master=buildin_getguildmaster_sub(guild_id);
- if(master!=0)
- push_str(st->stack,C_STR,(unsigned char *) master);
- else
- push_str(st->stack,C_CONSTSTR,(unsigned char *) "null");
- return 0;
-}
-
-int buildin_getguildmasterid(struct script_state *st)
-{
- char *master;
- struct map_session_data *sd=NULL;
- int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- master=buildin_getguildmaster_sub(guild_id);
- if(master!=0){
- if((sd=map_nick2sd(master)) == NULL){
- push_val(st->stack,C_INT,0);
- return 0;
- }
- push_val(st->stack,C_INT,sd->status.char_id);
- }else{
- push_val(st->stack,C_INT,0);
- }
- return 0;
-}
-
-/*==========================================
- * ƒLƒƒƒ‰ƒNƒ^‚Ì–¼‘O
- *------------------------------------------
- */
-int buildin_strcharinfo(struct script_state *st)
-{
- struct map_session_data *sd;
- int num;
-
- sd=script_rid2sd(st);
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- if(num==0){
- char *buf;
- buf=(char *)aCallocA(24,sizeof(char));
- strncpy(buf,sd->status.name, 23);
- push_str(st->stack,C_STR,(unsigned char *) buf);
- }
- if(num==1){
- char *buf;
- buf=buildin_getpartyname_sub(sd->status.party_id);
- if(buf!=0)
- push_str(st->stack,C_STR,(unsigned char *) buf);
- else
- push_str(st->stack,C_CONSTSTR,(unsigned char *) "");
- }
- if(num==2){
- char *buf;
- buf=buildin_getguildname_sub(sd->status.guild_id);
- if(buf!=0)
- push_str(st->stack,C_STR,(unsigned char *) buf);
- else
- push_str(st->stack,C_CONSTSTR,(unsigned char *) "");
- }
-
- return 0;
-}
-
-unsigned int equip[10]={0x0100,0x0010,0x0020,0x0002,0x0004,0x0040,0x0008,0x0080,0x0200,0x0001};
-
-/*==========================================
- * GetEquipID(Pos); Pos: 1-10
- *------------------------------------------
- */
-int buildin_getequipid(struct script_state *st)
-{
- int i,num;
- struct map_session_data *sd;
- struct item_data* item;
-
- sd=script_rid2sd(st);
- if(sd == NULL)
- {
- printf("getequipid: sd == NULL\n");
- return 0;
- }
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- i=pc_checkequip(sd,equip[num-1]);
- if(i >= 0){
- item=sd->inventory_data[i];
- if(item)
- push_val(st->stack,C_INT,item->nameid);
- else
- push_val(st->stack,C_INT,0);
- }else{
- push_val(st->stack,C_INT,-1);
- }
- return 0;
-}
-
-/*==========================================
- * ‘•”õ–¼•¶Žš—ñi¸˜Bƒƒjƒ…[—pj
- *------------------------------------------
- */
-int buildin_getequipname(struct script_state *st)
-{
- int i,num;
- struct map_session_data *sd;
- struct item_data* item;
- char *buf;
-
- buf=(char *)aCallocA(64,sizeof(char));
- sd=script_rid2sd(st);
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- i=pc_checkequip(sd,equip[num-1]);
- if(i >= 0){
- item=sd->inventory_data[i];
- if(item)
- sprintf(buf,"%s-[%s]",pos[num-1],item->jname);
- else
- sprintf(buf,"%s-[%s]",pos[num-1],pos[10]);
- }else{
- sprintf(buf,"%s-[%s]",pos[num-1],pos[10]);
- }
- push_str(st->stack,C_STR,(unsigned char *) buf);
-
- return 0;
-}
-
-/*==========================================
- * getbrokenid [Valaris]
- *------------------------------------------
- */
-int buildin_getbrokenid(struct script_state *st)
-{
- int i,num,id=0,brokencounter=0;
- struct map_session_data *sd;
-
- sd=script_rid2sd(st);
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- for(i=0; i<MAX_INVENTORY; i++) {
- if(sd->status.inventory[i].attribute==1){
- brokencounter++;
- if(num==brokencounter){
- id=sd->status.inventory[i].nameid;
- break;
- }
- }
- }
-
- push_val(st->stack,C_INT,id);
-
- return 0;
-}
-
-/*==========================================
- * repair [Valaris]
- *------------------------------------------
- */
-int buildin_repair(struct script_state *st)
-{
- int i,num;
- int repaircounter=0;
- struct map_session_data *sd;
-
-
- sd=script_rid2sd(st);
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- for(i=0; i<MAX_INVENTORY; i++) {
- if(sd->status.inventory[i].attribute==1){
- repaircounter++;
- if(num==repaircounter){
- sd->status.inventory[i].attribute=0;
- clif_equiplist(sd);
- clif_produceeffect(sd, 0, sd->status.inventory[i].nameid);
- clif_misceffect(&sd->bl, 3);
- clif_displaymessage(sd->fd,"Item has been repaired.");
- break;
- }
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * ‘•”õƒ`ƒFƒbƒN
- *------------------------------------------
- */
-int buildin_getequipisequiped(struct script_state *st)
-{
- int i,num;
- struct map_session_data *sd;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
- if(i >= 0){
- push_val(st->stack,C_INT,1);
- }else{
- push_val(st->stack,C_INT,0);
- }
-
- return 0;
-}
-
-/*==========================================
- * ‘•”õ•i¸˜B‰Â”\ƒ`ƒFƒbƒN
- *------------------------------------------
- */
-int buildin_getequipisenableref(struct script_state *st)
-{
- int i,num;
- struct map_session_data *sd;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
- if(i >= 0 && num<7 && sd->inventory_data[i] && !sd->inventory_data[i]->flag.no_refine)
- // replaced by Celest
- /*(num!=1
- || sd->inventory_data[i]->def > 1
- || (sd->inventory_data[i]->def==1 && sd->inventory_data[i]->equip_script==NULL)
- || (sd->inventory_data[i]->def<=0 && sd->inventory_data[i]->equip_script!=NULL)))*/
-
- {
- push_val(st->stack,C_INT,1);
- } else {
- push_val(st->stack,C_INT,0);
- }
-
- return 0;
-}
-
-/*==========================================
- * ‘•”õ•iŠÓ’èƒ`ƒFƒbƒN
- *------------------------------------------
- */
-int buildin_getequipisidentify(struct script_state *st)
-{
- int i,num;
- struct map_session_data *sd;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
- if(i >= 0)
- push_val(st->stack,C_INT,sd->status.inventory[i].identify);
- else
- push_val(st->stack,C_INT,0);
-
- return 0;
-}
-
-/*==========================================
- * ‘•”õ•i¸˜B“x
- *------------------------------------------
- */
-int buildin_getequiprefinerycnt(struct script_state *st)
-{
- int i,num;
- struct map_session_data *sd;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
- if(i >= 0)
- push_val(st->stack,C_INT,sd->status.inventory[i].refine);
- else
- push_val(st->stack,C_INT,0);
-
- return 0;
-}
-
-/*==========================================
- * ‘•”õ•i•ŠíLV
- *------------------------------------------
- */
-int buildin_getequipweaponlv(struct script_state *st)
-{
- int i,num;
- struct map_session_data *sd;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
- if(i >= 0 && sd->inventory_data[i])
- push_val(st->stack,C_INT,sd->inventory_data[i]->wlv);
- else
- push_val(st->stack,C_INT,0);
-
- return 0;
-}
-
-/*==========================================
- * ‘•”õ•i¸˜B¬Œ÷—¦
- *------------------------------------------
- */
-int buildin_getequippercentrefinery(struct script_state *st)
-{
- int i,num;
- struct map_session_data *sd;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
- if(i >= 0)
- push_val(st->stack,C_INT,status_percentrefinery(sd,&sd->status.inventory[i]));
- else
- push_val(st->stack,C_INT,0);
-
- return 0;
-}
-
-/*==========================================
- * ¸˜B¬Œ÷
- *------------------------------------------
- */
-int buildin_successrefitem(struct script_state *st)
-{
- int i,num,ep;
- struct map_session_data *sd;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
- if(i >= 0) {
- ep=sd->status.inventory[i].equip;
-
- if(log_config.refine > 0)
- log_refine(sd, i, 1);
-
- sd->status.inventory[i].refine++;
- pc_unequipitem(sd,i,2);
- clif_refine(sd->fd,sd,0,i,sd->status.inventory[i].refine);
- clif_delitem(sd,i,1);
- clif_additem(sd,i,1,0);
- pc_equipitem(sd,i,ep);
- clif_misceffect(&sd->bl,3);
- }
-
- return 0;
-}
-
-/*==========================================
- * ¸˜BŽ¸”s
- *------------------------------------------
- */
-int buildin_failedrefitem(struct script_state *st)
-{
- int i,num;
- struct map_session_data *sd;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
- if(i >= 0) {
- if(log_config.refine > 0)
- log_refine(sd, i, 0);
-
- sd->status.inventory[i].refine = 0;
- pc_unequipitem(sd,i,3);
- // ¸˜BŽ¸”sƒGƒtƒFƒNƒg‚̃pƒPƒbƒg
- clif_refine(sd->fd,sd,1,i,sd->status.inventory[i].refine);
- pc_delitem(sd,i,1,0);
- // ‘¼‚Ìl‚É‚àŽ¸”s‚ð’Ê’m
- clif_misceffect(&sd->bl,2);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_statusup(struct script_state *st)
-{
- int type;
- struct map_session_data *sd;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- pc_statusup(sd,type);
-
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_statusup2(struct script_state *st)
-{
- int type,val;
- struct map_session_data *sd;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- val=conv_num(st,& (st->stack->stack_data[st->start+3]));
- sd=script_rid2sd(st);
- pc_statusup2(sd,type,val);
-
- return 0;
-}
-/*==========================================
- * ‘•”õ•i‚É‚æ‚é”\—Í’lƒ{[ƒiƒX
- *------------------------------------------
- */
-int buildin_bonus(struct script_state *st)
-{
- int type,val;
- struct map_session_data *sd;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- val=conv_num(st,& (st->stack->stack_data[st->start+3]));
- sd=script_rid2sd(st);
- pc_bonus(sd,type,val);
-
- return 0;
-}
-/*==========================================
- * ‘•”õ•i‚É‚æ‚é”\—Í’lƒ{[ƒiƒX
- *------------------------------------------
- */
-int buildin_bonus2(struct script_state *st)
-{
- int type,type2,val;
- struct map_session_data *sd;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- type2=conv_num(st,& (st->stack->stack_data[st->start+3]));
- val=conv_num(st,& (st->stack->stack_data[st->start+4]));
- sd=script_rid2sd(st);
- pc_bonus2(sd,type,type2,val);
-
- return 0;
-}
-/*==========================================
- * ‘•”õ•i‚É‚æ‚é”\—Í’lƒ{[ƒiƒX
- *------------------------------------------
- */
-int buildin_bonus3(struct script_state *st)
-{
- int type,type2,type3,val;
- struct map_session_data *sd;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- type2=conv_num(st,& (st->stack->stack_data[st->start+3]));
- type3=conv_num(st,& (st->stack->stack_data[st->start+4]));
- val=conv_num(st,& (st->stack->stack_data[st->start+5]));
- sd=script_rid2sd(st);
- pc_bonus3(sd,type,type2,type3,val);
-
- return 0;
-}
-
-int buildin_bonus4(struct script_state *st)
-{
- int type,type2,type3,type4,val;
- struct map_session_data *sd;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- type2=conv_num(st,& (st->stack->stack_data[st->start+3]));
- type3=conv_num(st,& (st->stack->stack_data[st->start+4]));
- type4=conv_num(st,& (st->stack->stack_data[st->start+5]));
- val=conv_num(st,& (st->stack->stack_data[st->start+6]));
- sd=script_rid2sd(st);
- pc_bonus4(sd,type,type2,type3,type4,val);
-
- return 0;
-}
-/*==========================================
- * ƒXƒLƒ‹Š“¾
- *------------------------------------------
- */
-int buildin_skill(struct script_state *st)
-{
- int id,level,flag=1;
- struct map_session_data *sd;
-
- id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- level=conv_num(st,& (st->stack->stack_data[st->start+3]));
- if( st->end>st->start+4 )
- flag=conv_num(st,&(st->stack->stack_data[st->start+4]) );
- sd=script_rid2sd(st);
- pc_skill(sd,id,level,flag);
-
- return 0;
-}
-
-// add x levels of skill (stackable) [Valaris]
-int buildin_addtoskill(struct script_state *st)
-{
- int id,level,flag=2;
- struct map_session_data *sd;
-
- id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- level=conv_num(st,& (st->stack->stack_data[st->start+3]));
- if( st->end>st->start+4 )
- flag=conv_num(st,&(st->stack->stack_data[st->start+4]) );
- sd=script_rid2sd(st);
- pc_skill(sd,id,level,flag);
-
- return 0;
-}
-
-/*==========================================
- * ƒMƒ‹ƒhƒXƒLƒ‹Žæ“¾
- *------------------------------------------
- */
-int buildin_guildskill(struct script_state *st)
-{
- int id,level,flag=0;
- struct map_session_data *sd;
- int i=0;
-
- id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- level=conv_num(st,& (st->stack->stack_data[st->start+3]));
- if( st->end>st->start+4 )
- flag=conv_num(st,&(st->stack->stack_data[st->start+4]) );
- sd=script_rid2sd(st);
- for(i=0;i<level;i++)
- guild_skillup(sd,id,flag);
-
- return 0;
-}
-/*==========================================
- * ƒXƒLƒ‹ƒŒƒxƒ‹Š“¾
- *------------------------------------------
- */
-int buildin_getskilllv(struct script_state *st)
-{
- int id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- push_val(st->stack,C_INT, pc_checkskill( script_rid2sd(st) ,id) );
- return 0;
-}
-/*==========================================
- * getgdskilllv(Guild_ID, Skill_ID);
- * skill_id = 10000 : GD_APPROVAL
- * 10001 : GD_KAFRACONTACT
- * 10002 : GD_GUARDIANRESEARCH
- * 10003 : GD_GUARDUP
- * 10004 : GD_EXTENSION
- *------------------------------------------
- */
-int buildin_getgdskilllv(struct script_state *st)
-{
- int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- int skill_id=conv_num(st,& (st->stack->stack_data[st->start+3]));
- struct guild *g=guild_search(guild_id);
- push_val(st->stack,C_INT, (g==NULL)?-1:guild_checkskill(g,skill_id) );
- return 0;
-/*
- struct map_session_data *sd=NULL;
- struct guild *g=NULL;
- int skill_id;
-
- skill_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- if(sd && sd->status.guild_id > 0) g=guild_search(sd->status.guild_id);
- if(sd && g) {
- push_val(st->stack,C_INT, guild_checkskill(g,skill_id+9999) );
- } else {
- push_val(st->stack,C_INT,-1);
- }
- return 0;
-*/
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_basicskillcheck(struct script_state *st)
-{
- push_val(st->stack,C_INT, battle_config.basic_skill_check);
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_getgmlevel(struct script_state *st)
-{
- push_val(st->stack,C_INT, pc_isGM(script_rid2sd(st)));
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_end(struct script_state *st)
-{
- st->state = END;
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_checkoption(struct script_state *st)
-{
- int type;
- struct map_session_data *sd;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
-
- if(sd->status.option & type){
- push_val(st->stack,C_INT,1);
- } else {
- push_val(st->stack,C_INT,0);
- }
-
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_checkoption1(struct script_state *st)
-{
- int type;
- struct map_session_data *sd;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
-
- if(sd->opt1 & type){
- push_val(st->stack,C_INT,1);
- } else {
- push_val(st->stack,C_INT,0);
- }
-
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_checkoption2(struct script_state *st)
-{
- int type;
- struct map_session_data *sd;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
-
- if(sd->opt2 & type){
- push_val(st->stack,C_INT,1);
- } else {
- push_val(st->stack,C_INT,0);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_setoption(struct script_state *st)
-{
- int type;
- struct map_session_data *sd;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- pc_setoption(sd,type);
-
- return 0;
-}
-
-/*==========================================
- * Checkcart [Valaris]
- *------------------------------------------
- */
-
-int buildin_checkcart(struct script_state *st)
-{
- struct map_session_data *sd;
-
- sd=script_rid2sd(st);
-
- if(pc_iscarton(sd)){
- push_val(st->stack,C_INT,1);
- } else {
- push_val(st->stack,C_INT,0);
- }
- return 0;
-}
-
-/*==========================================
- * ƒJ[ƒg‚ð•t‚¯‚é
- *------------------------------------------
- */
-int buildin_setcart(struct script_state *st)
-{
- struct map_session_data *sd;
-
- sd=script_rid2sd(st);
- pc_setcart(sd,1);
-
- return 0;
-}
-
-/*==========================================
- * checkfalcon [Valaris]
- *------------------------------------------
- */
-
-int buildin_checkfalcon(struct script_state *st)
-{
- struct map_session_data *sd;
-
- sd=script_rid2sd(st);
-
- if(pc_isfalcon(sd)){
- push_val(st->stack,C_INT,1);
- } else {
- push_val(st->stack,C_INT,0);
- }
-
- return 0;
-}
-
-
-/*==========================================
- * ‘é‚ð•t‚¯‚é
- *------------------------------------------
- */
-int buildin_setfalcon(struct script_state *st)
-{
- struct map_session_data *sd;
-
- sd=script_rid2sd(st);
- pc_setfalcon(sd);
-
- return 0;
-}
-
-/*==========================================
- * Checkcart [Valaris]
- *------------------------------------------
- */
-
-int buildin_checkriding(struct script_state *st)
-{
- struct map_session_data *sd;
-
- sd=script_rid2sd(st);
-
- if(pc_isriding(sd)){
- push_val(st->stack,C_INT,1);
- } else {
- push_val(st->stack,C_INT,0);
- }
-
- return 0;
-}
-
-
-/*==========================================
- * ƒyƒRƒyƒRæ‚è
- *------------------------------------------
- */
-int buildin_setriding(struct script_state *st)
-{
- struct map_session_data *sd;
-
- sd=script_rid2sd(st);
- pc_setriding(sd);
-
- return 0;
-}
-
-/*==========================================
- * ƒZ[ƒuƒ|ƒCƒ“ƒg‚Ì•Û‘¶
- *------------------------------------------
- */
-int buildin_savepoint(struct script_state *st)
-{
- int x,y;
- char *str;
-
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- x=conv_num(st,& (st->stack->stack_data[st->start+3]));
- y=conv_num(st,& (st->stack->stack_data[st->start+4]));
- pc_setsavepoint(script_rid2sd(st),str,x,y);
- return 0;
-}
-
-/*==========================================
- * GetTimeTick(0: System Tick, 1: Time Second Tick)
- *------------------------------------------
- */
-int buildin_gettimetick(struct script_state *st) /* Asgard Version */
-{
- int type;
- time_t timer;
- struct tm *t;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
-
- switch(type){
- case 1:
- //type 1:(Second Ticks: 0-86399, 00:00:00-23:59:59)
- time(&timer);
- t=localtime(&timer);
- push_val(st->stack,C_INT,((t->tm_hour)*3600+(t->tm_min)*60+t->tm_sec));
- break;
- case 0:
- default:
- //type 0:(System Ticks)
- push_val(st->stack,C_INT,gettick());
- break;
- }
- return 0;
-}
-
-/*==========================================
- * GetTime(Type);
- * 1: Sec 2: Min 3: Hour
- * 4: WeekDay 5: MonthDay 6: Month
- * 7: Year
- *------------------------------------------
- */
-int buildin_gettime(struct script_state *st) /* Asgard Version */
-{
- int type;
- time_t timer;
- struct tm *t;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
-
- time(&timer);
- t=localtime(&timer);
-
- switch(type){
- case 1://Sec(0~59)
- push_val(st->stack,C_INT,t->tm_sec);
- break;
- case 2://Min(0~59)
- push_val(st->stack,C_INT,t->tm_min);
- break;
- case 3://Hour(0~23)
- push_val(st->stack,C_INT,t->tm_hour);
- break;
- case 4://WeekDay(0~6)
- push_val(st->stack,C_INT,t->tm_wday);
- break;
- case 5://MonthDay(01~31)
- push_val(st->stack,C_INT,t->tm_mday);
- break;
- case 6://Month(01~12)
- push_val(st->stack,C_INT,t->tm_mon+1);
- break;
- case 7://Year(20xx)
- push_val(st->stack,C_INT,t->tm_year+1900);
- break;
- default://(format error)
- push_val(st->stack,C_INT,-1);
- break;
- }
- return 0;
-}
-
-/*==========================================
- * GetTimeStr("TimeFMT", Length);
- *------------------------------------------
- */
-int buildin_gettimestr(struct script_state *st)
-{
- char *tmpstr;
- char *fmtstr;
- int maxlen;
- time_t now = time(NULL);
-
- fmtstr=conv_str(st,& (st->stack->stack_data[st->start+2]));
- maxlen=conv_num(st,& (st->stack->stack_data[st->start+3]));
-
- tmpstr=(char *)aCallocA(maxlen+1,sizeof(char));
- strftime(tmpstr,maxlen,fmtstr,localtime(&now));
- tmpstr[maxlen]='\0';
-
- push_str(st->stack,C_STR,(unsigned char *) tmpstr);
- return 0;
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚ðŠJ‚­
- *------------------------------------------
- */
-int buildin_openstorage(struct script_state *st)
-{
- storage_storageopen(script_rid2sd(st));
- return 0;
-}
-
-int buildin_guildopenstorage(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
- int ret;
- ret = storage_guild_storageopen(sd);
- push_val(st->stack,C_INT,ret);
- return 0;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€‚É‚æ‚éƒXƒLƒ‹”­“®
- *------------------------------------------
- */
-int buildin_itemskill(struct script_state *st)
-{
- int id,lv;
- char *str;
- struct map_session_data *sd=script_rid2sd(st);
-
- id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- lv=conv_num(st,& (st->stack->stack_data[st->start+3]));
- str=conv_str(st,& (st->stack->stack_data[st->start+4]));
-
- // ‰r¥’†‚ɃXƒLƒ‹ƒAƒCƒeƒ€‚ÍŽg—p‚Å‚«‚È‚¢
- if(sd->skilltimer != -1)
- return 0;
-
- sd->skillitem=id;
- sd->skillitemlv=lv;
- clif_item_skill(sd,id,lv,str);
- return 0;
-}
-/*==========================================
- * ƒAƒCƒeƒ€ì¬
- *------------------------------------------
- */
-int buildin_produce(struct script_state *st)
-{
- int trigger;
- struct map_session_data *sd=script_rid2sd(st);
-
- if( sd->state.produce_flag == 1) return 0;
- trigger=conv_num(st,& (st->stack->stack_data[st->start+2]));
- clif_skill_produce_mix_list(sd,trigger);
- return 0;
-}
-/*==========================================
- * NPC‚Ńyƒbƒgì‚é
- *------------------------------------------
- */
-int buildin_makepet(struct script_state *st)
-{
- struct map_session_data *sd = script_rid2sd(st);
- struct script_data *data;
- int id,pet_id;
-
- data=&(st->stack->stack_data[st->start+2]);
- get_val(st,data);
-
- id=conv_num(st,data);
-
- pet_id = search_petDB_index(id, PET_CLASS);
-
- if (pet_id < 0)
- pet_id = search_petDB_index(id, PET_EGG);
- if (pet_id >= 0 && sd) {
- sd->catch_target_class = pet_db[pet_id].class_;
- intif_create_pet(
- sd->status.account_id, sd->status.char_id,
- (short)pet_db[pet_id].class_, (short)mob_db[pet_db[pet_id].class_].lv,
- (short)pet_db[pet_id].EggID, 0, (short)pet_db[pet_id].intimate,
- 100, 0, 1, pet_db[pet_id].jname);
- }
-
- return 0;
-}
-/*==========================================
- * NPC‚ÅŒoŒ±’lã‚°‚é
- *------------------------------------------
- */
-int buildin_getexp(struct script_state *st)
-{
- struct map_session_data *sd = script_rid2sd(st);
- int base=0,job=0;
-
- base=conv_num(st,& (st->stack->stack_data[st->start+2]));
- job =conv_num(st,& (st->stack->stack_data[st->start+3]));
- if(base<0 || job<0)
- return 0;
- if(sd)
- pc_gainexp(sd,base,job);
-
- return 0;
-}
-
-/*==========================================
- * Gain guild exp [Celest]
- *------------------------------------------
- */
-int buildin_guildgetexp(struct script_state *st)
-{
- struct map_session_data *sd = script_rid2sd(st);
- int exp;
-
- exp = conv_num(st,& (st->stack->stack_data[st->start+2]));
- if(exp < 0)
- return 0;
- if(sd && sd->status.guild_id > 0)
- guild_getexp (sd, exp);
-
- return 0;
-}
-
-/*==========================================
- * ƒ‚ƒ“ƒXƒ^[”­¶
- *------------------------------------------
- */
-int buildin_monster(struct script_state *st)
-{
- int class_,amount,x,y;
- char *str,*map,*event="";
-
- map =conv_str(st,& (st->stack->stack_data[st->start+2]));
- x =conv_num(st,& (st->stack->stack_data[st->start+3]));
- y =conv_num(st,& (st->stack->stack_data[st->start+4]));
- str =conv_str(st,& (st->stack->stack_data[st->start+5]));
- class_=conv_num(st,& (st->stack->stack_data[st->start+6]));
- amount=conv_num(st,& (st->stack->stack_data[st->start+7]));
- if( st->end>st->start+8 )
- event=conv_str(st,& (st->stack->stack_data[st->start+8]));
-
- mob_once_spawn(map_id2sd(st->rid),map,x,y,str,class_,amount,event);
- return 0;
-}
-/*==========================================
- * ƒ‚ƒ“ƒXƒ^[”­¶
- *------------------------------------------
- */
-int buildin_areamonster(struct script_state *st)
-{
- int class_,amount,x0,y0,x1,y1;
- char *str,*map,*event="";
-
- map =conv_str(st,& (st->stack->stack_data[st->start+2]));
- x0 =conv_num(st,& (st->stack->stack_data[st->start+3]));
- y0 =conv_num(st,& (st->stack->stack_data[st->start+4]));
- x1 =conv_num(st,& (st->stack->stack_data[st->start+5]));
- y1 =conv_num(st,& (st->stack->stack_data[st->start+6]));
- str =conv_str(st,& (st->stack->stack_data[st->start+7]));
- class_=conv_num(st,& (st->stack->stack_data[st->start+8]));
- amount=conv_num(st,& (st->stack->stack_data[st->start+9]));
- if( st->end>st->start+10 )
- event=conv_str(st,& (st->stack->stack_data[st->start+10]));
-
- mob_once_spawn_area(map_id2sd(st->rid),map,x0,y0,x1,y1,str,class_,amount,event);
- return 0;
-}
-/*==========================================
- * ƒ‚ƒ“ƒXƒ^[íœ
- *------------------------------------------
- */
-int buildin_killmonster_sub(struct block_list *bl,va_list ap)
-{
- char *event=va_arg(ap,char *);
- int allflag=va_arg(ap,int);
-
- if(!allflag){
- if(strcmp(event,((struct mob_data *)bl)->npc_event)==0)
- mob_delete((struct mob_data *)bl);
- return 0;
- }else if(allflag){
- if(((struct mob_data *)bl)->spawndelay1==-1 && ((struct mob_data *)bl)->spawndelay2==-1)
- mob_delete((struct mob_data *)bl);
- return 0;
- }
- return 0;
-}
-int buildin_killmonster(struct script_state *st)
-{
- char *mapname,*event;
- int m,allflag=0;
- mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
- event=conv_str(st,& (st->stack->stack_data[st->start+3]));
- if(strcmp(event,"All")==0)
- allflag = 1;
-
- if( (m=map_mapname2mapid(mapname))<0 )
- return 0;
- map_foreachinarea(buildin_killmonster_sub,
- m,0,0,map[m].xs,map[m].ys,BL_MOB, event ,allflag);
- return 0;
-}
-
-int buildin_killmonsterall_sub(struct block_list *bl,va_list ap)
-{
- mob_delete((struct mob_data *)bl);
- return 0;
-}
-int buildin_killmonsterall(struct script_state *st)
-{
- char *mapname;
- int m;
- mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
-
- if( (m=map_mapname2mapid(mapname))<0 )
- return 0;
- map_foreachinarea(buildin_killmonsterall_sub,
- m,0,0,map[m].xs,map[m].ys,BL_MOB);
- return 0;
-}
-
-/*==========================================
- * ƒCƒxƒ“ƒgŽÀs
- *------------------------------------------
- */
-int buildin_doevent(struct script_state *st)
-{
- char *event;
- event=conv_str(st,& (st->stack->stack_data[st->start+2]));
- npc_event(map_id2sd(st->rid),event,0);
- return 0;
-}
-/*==========================================
- * NPCŽå‘̃Cƒxƒ“ƒgŽÀs
- *------------------------------------------
- */
-int buildin_donpcevent(struct script_state *st)
-{
- char *event;
- event=conv_str(st,& (st->stack->stack_data[st->start+2]));
- npc_event_do(event);
- return 0;
-}
-/*==========================================
- * ƒCƒxƒ“ƒgƒ^ƒCƒ}[’ljÁ
- *------------------------------------------
- */
-int buildin_addtimer(struct script_state *st)
-{
- char *event;
- int tick;
- tick=conv_num(st,& (st->stack->stack_data[st->start+2]));
- event=conv_str(st,& (st->stack->stack_data[st->start+3]));
- pc_addeventtimer(script_rid2sd(st),tick,event);
- return 0;
-}
-/*==========================================
- * ƒCƒxƒ“ƒgƒ^ƒCƒ}[íœ
- *------------------------------------------
- */
-int buildin_deltimer(struct script_state *st)
-{
- char *event;
- event=conv_str(st,& (st->stack->stack_data[st->start+2]));
- pc_deleventtimer(script_rid2sd(st),event);
- return 0;
-}
-/*==========================================
- * ƒCƒxƒ“ƒgƒ^ƒCƒ}[‚̃JƒEƒ“ƒg’l’ljÁ
- *------------------------------------------
- */
-int buildin_addtimercount(struct script_state *st)
-{
- char *event;
- int tick;
- event=conv_str(st,& (st->stack->stack_data[st->start+2]));
- tick=conv_num(st,& (st->stack->stack_data[st->start+3]));
- pc_addeventtimercount(script_rid2sd(st),event,tick);
- return 0;
-}
-
-/*==========================================
- * NPCƒ^ƒCƒ}[‰Šú‰»
- *------------------------------------------
- */
-int buildin_initnpctimer(struct script_state *st)
-{
- struct npc_data *nd;
- if( st->end > st->start+2 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
-
- npc_settimerevent_tick(nd,0);
- npc_timerevent_start(nd, st->rid);
- return 0;
-}
-/*==========================================
- * NPCƒ^ƒCƒ}[ŠJŽn
- *------------------------------------------
- */
-int buildin_startnpctimer(struct script_state *st)
-{
- struct npc_data *nd;
- if( st->end > st->start+2 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
-
- npc_timerevent_start(nd, st->rid);
- return 0;
-}
-/*==========================================
- * NPCƒ^ƒCƒ}[’âŽ~
- *------------------------------------------
- */
-int buildin_stopnpctimer(struct script_state *st)
-{
- struct npc_data *nd;
- if( st->end > st->start+2 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
-
- npc_timerevent_stop(nd);
- return 0;
-}
-/*==========================================
- * NPCƒ^ƒCƒ}[î•ñŠ“¾
- *------------------------------------------
- */
-int buildin_getnpctimer(struct script_state *st)
-{
- struct npc_data *nd;
- int type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- int val=0;
- if( st->end > st->start+3 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+3])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
-
- switch(type){
- case 0: val=npc_gettimerevent_tick(nd); break;
- case 1: val= (nd->u.scr.nexttimer>=0); break;
- case 2: val= nd->u.scr.timeramount; break;
- }
- push_val(st->stack,C_INT,val);
- return 0;
-}
-/*==========================================
- * NPCƒ^ƒCƒ}[’lÝ’è
- *------------------------------------------
- */
-int buildin_setnpctimer(struct script_state *st)
-{
- int tick;
- struct npc_data *nd;
- tick=conv_num(st,& (st->stack->stack_data[st->start+2]));
- if( st->end > st->start+3 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+3])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
-
- npc_settimerevent_tick(nd,tick);
- return 0;
-}
-
-/*==========================================
- * attaches the player rid to the timer [Celest]
- *------------------------------------------
- */
-int buildin_attachnpctimer(struct script_state *st)
-{
- struct map_session_data *sd;
- struct npc_data *nd;
-
- nd=(struct npc_data *)map_id2bl(st->oid);
- if( st->end > st->start+2 ) {
- char *name = conv_str(st,& (st->stack->stack_data[st->start+2]));
- sd=map_nick2sd(name);
- } else {
- sd = script_rid2sd(st);
- }
-
- if (sd==NULL)
- return 0;
-
- nd->u.scr.rid = sd->bl.id;
- return 0;
-}
-
-/*==========================================
- * detaches a player rid from the timer [Celest]
- *------------------------------------------
- */
-int buildin_detachnpctimer(struct script_state *st)
-{
- struct npc_data *nd;
- if( st->end > st->start+2 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
-
- nd->u.scr.rid = 0;
- return 0;
-}
-
-/*==========================================
- * “V‚̺ƒAƒiƒEƒ“ƒX
- *------------------------------------------
- */
-int buildin_announce(struct script_state *st)
-{
- char *str;
- int flag;
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- flag=conv_num(st,& (st->stack->stack_data[st->start+3]));
-
- if(flag&0x0f){
- struct block_list *bl=(flag&0x08)? map_id2bl(st->oid) :
- (struct block_list *)script_rid2sd(st);
- clif_GMmessage(bl,str,strlen(str)+1,flag);
- }else
- intif_GMmessage(str,strlen(str)+1,flag);
- return 0;
-}
-/*==========================================
- * “V‚̺ƒAƒiƒEƒ“ƒXi“Á’èƒ}ƒbƒvj
- *------------------------------------------
- */
-int buildin_mapannounce_sub(struct block_list *bl,va_list ap)
-{
- char *str;
- int len,flag;
- str=va_arg(ap,char *);
- len=va_arg(ap,int);
- flag=va_arg(ap,int);
- clif_GMmessage(bl,str,len,flag|3);
- return 0;
-}
-int buildin_mapannounce(struct script_state *st)
-{
- char *mapname,*str;
- int flag,m;
-
- mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
- str=conv_str(st,& (st->stack->stack_data[st->start+3]));
- flag=conv_num(st,& (st->stack->stack_data[st->start+4]));
-
- if( (m=map_mapname2mapid(mapname))<0 )
- return 0;
- map_foreachinarea(buildin_mapannounce_sub,
- m,0,0,map[m].xs,map[m].ys,BL_PC, str,strlen(str)+1,flag&0x10);
- return 0;
-}
-/*==========================================
- * “V‚̺ƒAƒiƒEƒ“ƒXi“Á’èƒGƒŠƒAj
- *------------------------------------------
- */
-int buildin_areaannounce(struct script_state *st)
-{
- char *map,*str;
- int flag,m;
- int x0,y0,x1,y1;
-
- map=conv_str(st,& (st->stack->stack_data[st->start+2]));
- x0=conv_num(st,& (st->stack->stack_data[st->start+3]));
- y0=conv_num(st,& (st->stack->stack_data[st->start+4]));
- x1=conv_num(st,& (st->stack->stack_data[st->start+5]));
- y1=conv_num(st,& (st->stack->stack_data[st->start+6]));
- str=conv_str(st,& (st->stack->stack_data[st->start+7]));
- flag=conv_num(st,& (st->stack->stack_data[st->start+8]));
-
- if( (m=map_mapname2mapid(map))<0 )
- return 0;
-
- map_foreachinarea(buildin_mapannounce_sub,
- m,x0,y0,x1,y1,BL_PC, str,strlen(str)+1,flag&0x10 );
- return 0;
-}
-/*==========================================
- * ƒ†[ƒU[”Š“¾
- *------------------------------------------
- */
-int buildin_getusers(struct script_state *st)
-{
- int flag=conv_num(st,& (st->stack->stack_data[st->start+2]));
- struct block_list *bl=map_id2bl((flag&0x08)?st->oid:st->rid);
- int val=0;
- switch(flag&0x07){
- case 0: val=map[bl->m].users; break;
- case 1: val=map_getusers(); break;
- }
- push_val(st->stack,C_INT,val);
- return 0;
-}
-/*==========================================
- * Works like @WHO - displays all online users names in window
- *------------------------------------------
- */
-int buildin_getusersname(struct script_state *st)
-{
- struct map_session_data *pl_sd = NULL;
- int i=0,disp_num=1;
-
- for (i=0;i<fd_max;i++)
- if(session[i] && (pl_sd=(struct map_session_data *) session[i]->session_data) && pl_sd->state.auth){
- if( !(battle_config.hide_GM_session && pc_isGM(pl_sd)) ){
- if((disp_num++)%10==0)
- clif_scriptnext(script_rid2sd(st),st->oid);
- clif_scriptmes(script_rid2sd(st),st->oid,pl_sd->status.name);
- }
- }
- return 0;
-}
-/*==========================================
- * ƒ}ƒbƒvŽw’胆[ƒU[”Š“¾
- *------------------------------------------
- */
-int buildin_getmapusers(struct script_state *st)
-{
- char *str;
- int m;
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- if( (m=map_mapname2mapid(str))< 0){
- push_val(st->stack,C_INT,-1);
- return 0;
- }
- push_val(st->stack,C_INT,map[m].users);
- return 0;
-}
-/*==========================================
- * ƒGƒŠƒAŽw’胆[ƒU[”Š“¾
- *------------------------------------------
- */
-int buildin_getareausers_sub(struct block_list *bl,va_list ap)
-{
- int *users=va_arg(ap,int *);
- (*users)++;
- return 0;
-}
-int buildin_getareausers(struct script_state *st)
-{
- char *str;
- int m,x0,y0,x1,y1,users=0;
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- x0=conv_num(st,& (st->stack->stack_data[st->start+3]));
- y0=conv_num(st,& (st->stack->stack_data[st->start+4]));
- x1=conv_num(st,& (st->stack->stack_data[st->start+5]));
- y1=conv_num(st,& (st->stack->stack_data[st->start+6]));
- if( (m=map_mapname2mapid(str))< 0){
- push_val(st->stack,C_INT,-1);
- return 0;
- }
- map_foreachinarea(buildin_getareausers_sub,
- m,x0,y0,x1,y1,BL_PC,&users);
- push_val(st->stack,C_INT,users);
- return 0;
-}
-
-/*==========================================
- * ƒGƒŠƒAŽw’èƒhƒƒbƒvƒAƒCƒeƒ€”Š“¾
- *------------------------------------------
- */
-int buildin_getareadropitem_sub(struct block_list *bl,va_list ap)
-{
- int item=va_arg(ap,int);
- int *amount=va_arg(ap,int *);
- struct flooritem_data *drop=(struct flooritem_data *)bl;
-
- if(drop->item_data.nameid==item)
- (*amount)+=drop->item_data.amount;
-
- return 0;
-}
-int buildin_getareadropitem(struct script_state *st)
-{
- char *str;
- int m,x0,y0,x1,y1,item,amount=0;
- struct script_data *data;
-
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- x0=conv_num(st,& (st->stack->stack_data[st->start+3]));
- y0=conv_num(st,& (st->stack->stack_data[st->start+4]));
- x1=conv_num(st,& (st->stack->stack_data[st->start+5]));
- y1=conv_num(st,& (st->stack->stack_data[st->start+6]));
-
- data=&(st->stack->stack_data[st->start+7]);
- get_val(st,data);
- if( data->type==C_STR || data->type==C_CONSTSTR ){
- const char *name=conv_str(st,data);
- struct item_data *item_data = itemdb_searchname(name);
- item=512;
- if( item_data )
- item=item_data->nameid;
- }else
- item=conv_num(st,data);
-
- if( (m=map_mapname2mapid(str))< 0){
- push_val(st->stack,C_INT,-1);
- return 0;
- }
- map_foreachinarea(buildin_getareadropitem_sub,
- m,x0,y0,x1,y1,BL_ITEM,item,&amount);
- push_val(st->stack,C_INT,amount);
- return 0;
-}
-/*==========================================
- * NPC‚Ì—LŒø‰»
- *------------------------------------------
- */
-int buildin_enablenpc(struct script_state *st)
-{
- char *str;
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- npc_enable(str,1);
- return 0;
-}
-/*==========================================
- * NPC‚Ì–³Œø‰»
- *------------------------------------------
- */
-int buildin_disablenpc(struct script_state *st)
-{
- char *str;
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- npc_enable(str,0);
- return 0;
-}
-
-int buildin_enablearena(struct script_state *st) // Added by RoVeRT
-{
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
- struct chat_data *cd;
-
-
- if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL)
- return 0;
-
- npc_enable(nd->name,1);
- nd->arenaflag=1;
-
- if(cd->users>=cd->trigger && cd->npc_event[0])
- npc_timer_event(cd->npc_event);
-
- return 0;
-}
-int buildin_disablearena(struct script_state *st) // Added by RoVeRT
-{
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
- nd->arenaflag=0;
-
- return 0;
-}
-/*==========================================
- * ‰B‚ê‚Ä‚¢‚éNPC‚Ì•\Ž¦
- *------------------------------------------
- */
-int buildin_hideoffnpc(struct script_state *st)
-{
- char *str;
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- npc_enable(str,2);
- return 0;
-}
-/*==========================================
- * NPC‚ðƒnƒCƒfƒBƒ“ƒO
- *------------------------------------------
- */
-int buildin_hideonnpc(struct script_state *st)
-{
- char *str;
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- npc_enable(str,4);
- return 0;
-}
-/*==========================================
- * ó‘ÔˆÙí‚É‚©‚©‚é
- *------------------------------------------
- */
-int buildin_sc_start(struct script_state *st)
-{
- struct block_list *bl;
- int type,tick,val1;
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- tick=conv_num(st,& (st->stack->stack_data[st->start+3]));
- val1=conv_num(st,& (st->stack->stack_data[st->start+4]));
- if( st->end>st->start+5 ) //Žw’肵‚½ƒLƒƒƒ‰‚ðó‘ÔˆÙí‚É‚·‚é
- bl = map_id2bl(conv_num(st,& (st->stack->stack_data[st->start+5])));
- else
- bl = map_id2bl(st->rid);
-
- if (bl != 0) {
- if(bl->type == BL_PC && ((struct map_session_data *)bl)->state.potionpitcher_flag)
- bl = map_id2bl(((struct map_session_data *)bl)->skilltarget);
- status_change_start(bl,type,val1,0,0,0,tick,0);
- }
- return 0;
-}
-
-/*==========================================
- * ó‘ÔˆÙí‚É‚©‚©‚é(Šm—¦Žw’è)
- *------------------------------------------
- */
-int buildin_sc_start2(struct script_state *st)
-{
- struct block_list *bl;
- int type,tick,val1,per;
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- tick=conv_num(st,& (st->stack->stack_data[st->start+3]));
- val1=conv_num(st,& (st->stack->stack_data[st->start+4]));
- per=conv_num(st,& (st->stack->stack_data[st->start+5]));
- if( st->end>st->start+6 ) //Žw’肵‚½ƒLƒƒƒ‰‚ðó‘ÔˆÙí‚É‚·‚é
- bl = map_id2bl(conv_num(st,& (st->stack->stack_data[st->start+6])));
- else
- bl = map_id2bl(st->rid);
- if(bl->type == BL_PC && ((struct map_session_data *)bl)->state.potionpitcher_flag)
- bl = map_id2bl(((struct map_session_data *)bl)->skilltarget);
- if(rand()%10000 < per)
- status_change_start(bl,type,val1,0,0,0,tick,0);
- return 0;
-}
-
-/*==========================================
- * ó‘ÔˆÙ킪’¼‚é
- *------------------------------------------
- */
-int buildin_sc_end(struct script_state *st)
-{
- struct block_list *bl;
- int type;
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- bl = map_id2bl(st->rid);
- if(bl->type == BL_PC && ((struct map_session_data *)bl)->state.potionpitcher_flag)
- bl = map_id2bl(((struct map_session_data *)bl)->skilltarget);
- status_change_end(bl,type,-1);
-// if(battle_config.etc_log)
-// printf("sc_end : %d %d\n",st->rid,type);
- return 0;
-}
-/*==========================================
- * ó‘ÔˆÙí‘Ï«‚ðŒvŽZ‚µ‚½Šm—¦‚ð•Ô‚·
- *------------------------------------------
- */
-int buildin_getscrate(struct script_state *st)
-{
- struct block_list *bl;
- int sc_def,type,rate;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- rate=conv_num(st,& (st->stack->stack_data[st->start+3]));
- if( st->end>st->start+4 ) //Žw’肵‚½ƒLƒƒƒ‰‚Ì‘Ï«‚ðŒvŽZ‚·‚é
- bl = map_id2bl(conv_num(st,& (st->stack->stack_data[st->start+6])));
- else
- bl = map_id2bl(st->rid);
-
- sc_def = status_get_sc_def(bl,type);
-
- rate = rate * sc_def / 100;
- push_val(st->stack,C_INT,rate);
-
- return 0;
-
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_debugmes(struct script_state *st)
-{
- conv_str(st,& (st->stack->stack_data[st->start+2]));
- printf("script debug : %d %d : %s\n",st->rid,st->oid,st->stack->stack_data[st->start+2].u.str);
- return 0;
-}
-
-/*==========================================
- *•ßŠlƒAƒCƒeƒ€Žg—p
- *------------------------------------------
- */
-int buildin_catchpet(struct script_state *st)
-{
- int pet_id;
- struct map_session_data *sd;
- pet_id= conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- pet_catch_process1(sd,pet_id);
- return 0;
-}
-
-/*==========================================
- *Œg‘Ñ—‘›z‰»‹@Žg—p
- *------------------------------------------
- */
-int buildin_birthpet(struct script_state *st)
-{
- struct map_session_data *sd;
- sd=script_rid2sd(st);
- clif_sendegg(sd);
- return 0;
-}
-
-/*==========================================
- * Added - AppleGirl For Advanced Classes, (Updated for Cleaner Script Purposes)
- *------------------------------------------
- */
-int buildin_resetlvl(struct script_state *st)
-{
- struct map_session_data *sd;
-
- int type=conv_num(st,& (st->stack->stack_data[st->start+2]));
-
- sd=script_rid2sd(st);
- pc_resetlvl(sd,type);
- return 0;
-}
-/*==========================================
- * ƒXƒe[ƒ^ƒXƒŠƒZƒbƒg
- *------------------------------------------
- */
-int buildin_resetstatus(struct script_state *st)
-{
- struct map_session_data *sd;
- sd=script_rid2sd(st);
- pc_resetstate(sd);
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒŠƒZƒbƒg
- *------------------------------------------
- */
-int buildin_resetskill(struct script_state *st)
-{
- struct map_session_data *sd;
- sd=script_rid2sd(st);
- pc_resetskill(sd);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_changebase(struct script_state *st)
-{
- struct map_session_data *sd=NULL;
- int vclass;
-
- if( st->end>st->start+3 )
- sd=map_id2sd(conv_num(st,& (st->stack->stack_data[st->start+3])));
- else
- sd=script_rid2sd(st);
-
- if(sd == NULL)
- return 0;
-
- vclass = conv_num(st,& (st->stack->stack_data[st->start+2]));
- if(vclass == 22 && !battle_config.wedding_modifydisplay)
- return 0;
-
-// if(vclass==22) {
-// pc_unequipitem(sd,sd->equip_index[9],0); // ‘•”õŠO
-// }
-
- sd->view_class = vclass;
-
- return 0;
-}
-
-/*==========================================
- * «•Ê•ÏŠ·
- *------------------------------------------
- */
-int buildin_changesex(struct script_state *st) {
- struct map_session_data *sd = NULL;
- sd = script_rid2sd(st);
-
- if (sd->status.sex == 0) {
- sd->status.sex = 1;
- sd->sex = 1;
- if (sd->status.class_ == 20 || sd->status.class_ == 4021)
- sd->status.class_ -= 1;
- } else if (sd->status.sex == 1) {
- sd->status.sex = 0;
- sd->sex = 0;
- if(sd->status.class_ == 19 || sd->status.class_ == 4020)
- sd->status.class_ += 1;
- }
- chrif_char_ask_name(-1, sd->status.name, 5, 0, 0, 0, 0, 0, 0); // type: 5 - changesex
- chrif_save(sd);
- return 0;
-}
-
-/*==========================================
- * npcƒ`ƒƒƒbƒgì¬
- *------------------------------------------
- */
-int buildin_waitingroom(struct script_state *st)
-{
- char *name,*ev="";
- int limit, trigger = 0,pub=1;
- name=conv_str(st,& (st->stack->stack_data[st->start+2]));
- limit= conv_num(st,& (st->stack->stack_data[st->start+3]));
- if(limit==0)
- pub=3;
-
- if( (st->end > st->start+5) ){
- struct script_data* data=&(st->stack->stack_data[st->start+5]);
- get_val(st,data);
- if(data->type==C_INT){
- // VAthenaŽd—l(‹ŒAthenaŽd—l‚ƌ݊·«‚ ‚è)
- ev=conv_str(st,& (st->stack->stack_data[st->start+4]));
- trigger=conv_num(st,& (st->stack->stack_data[st->start+5]));
- }else{
- // eathenaŽd—l
- trigger=conv_num(st,& (st->stack->stack_data[st->start+4]));
- ev=conv_str(st,& (st->stack->stack_data[st->start+5]));
- }
- }else{
- // ‹ŒAthenaŽd—l
- if( st->end > st->start+4 )
- ev=conv_str(st,& (st->stack->stack_data[st->start+4]));
- }
- chat_createnpcchat( (struct npc_data *)map_id2bl(st->oid),
- limit,pub,trigger,name,strlen(name)+1,ev);
- return 0;
-}
-/*==========================================
- * Works like 'announce' but outputs in the common chat window
- *------------------------------------------
- */
-int buildin_globalmes(struct script_state *st)
-{
- struct block_list *bl = map_id2bl(st->oid);
- struct npc_data *nd = (struct npc_data *)bl;
- char *name=NULL,*mes;
-
- mes=conv_str(st,& (st->stack->stack_data[st->start+2])); // ƒƒbƒZ[ƒW‚̎擾
- if(mes==NULL) return 0;
-
- if(st->end>st->start+3){ // NPC–¼‚̎擾(123#456)
- name=conv_str(st,& (st->stack->stack_data[st->start+3]));
- } else {
- name=nd->name;
- }
-
- npc_globalmessage(name,mes); // ƒOƒ[ƒoƒ‹ƒƒbƒZ[ƒW‘—M
-
- return 0;
-}
-/*==========================================
- * npcƒ`ƒƒƒbƒgíœ
- *------------------------------------------
- */
-int buildin_delwaitingroom(struct script_state *st)
-{
- struct npc_data *nd;
- if( st->end > st->start+2 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
- chat_deletenpcchat(nd);
- return 0;
-}
-/*==========================================
- * npcƒ`ƒƒƒbƒg‘SˆõR‚èo‚·
- *------------------------------------------
- */
-int buildin_waitingroomkickall(struct script_state *st)
-{
- struct npc_data *nd;
- struct chat_data *cd;
-
- if( st->end > st->start+2 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
-
- if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL )
- return 0;
- chat_npckickall(cd);
- return 0;
-}
-
-/*==========================================
- * npcƒ`ƒƒƒbƒgƒCƒxƒ“ƒg—LŒø‰»
- *------------------------------------------
- */
-int buildin_enablewaitingroomevent(struct script_state *st)
-{
- struct npc_data *nd;
- struct chat_data *cd;
-
- if( st->end > st->start+2 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
-
- if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL )
- return 0;
- chat_enableevent(cd);
- return 0;
-}
-
-/*==========================================
- * npcƒ`ƒƒƒbƒgƒCƒxƒ“ƒg–³Œø‰»
- *------------------------------------------
- */
-int buildin_disablewaitingroomevent(struct script_state *st)
-{
- struct npc_data *nd;
- struct chat_data *cd;
-
- if( st->end > st->start+2 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
-
- if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL )
- return 0;
- chat_disableevent(cd);
- return 0;
-}
-/*==========================================
- * npcƒ`ƒƒƒbƒgó‘ÔŠ“¾
- *------------------------------------------
- */
-int buildin_getwaitingroomstate(struct script_state *st)
-{
- struct npc_data *nd;
- struct chat_data *cd;
- int val=0,type;
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- if( st->end > st->start+3 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+3])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
-
- if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL ){
- push_val(st->stack,C_INT,-1);
- return 0;
- }
-
- switch(type){
- case 0: val=cd->users; break;
- case 1: val=cd->limit; break;
- case 2: val=cd->trigger&0x7f; break;
- case 3: val=((cd->trigger&0x80)>0); break;
- case 32: val=(cd->users >= cd->limit); break;
- case 33: val=(cd->users >= cd->trigger); break;
-
- case 4:
- push_str(st->stack,C_CONSTSTR,(unsigned char *) cd->title);
- return 0;
- case 5:
- push_str(st->stack,C_CONSTSTR,(unsigned char *) cd->pass);
- return 0;
- case 16:
- push_str(st->stack,C_CONSTSTR,(unsigned char *) cd->npc_event);
- return 0;
- }
- push_val(st->stack,C_INT,val);
- return 0;
-}
-
-/*==========================================
- * ƒ`ƒƒƒbƒgƒƒ“ƒo[(‹K’èl”)ƒ[ƒv
- *------------------------------------------
- */
-int buildin_warpwaitingpc(struct script_state *st)
-{
- int x,y,i,n;
- char *str;
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
- struct chat_data *cd;
-
- if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL )
- return 0;
-
- n=cd->trigger&0x7f;
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- x=conv_num(st,& (st->stack->stack_data[st->start+3]));
- y=conv_num(st,& (st->stack->stack_data[st->start+4]));
-
- if( st->end > st->start+5 )
- n=conv_num(st,& (st->stack->stack_data[st->start+5]));
-
- for(i=0;i<n;i++){
- struct map_session_data *sd=cd->usersd[0]; // ƒŠƒXƒg擪‚ÌPC‚ðŽŸX‚ÉB
-
- mapreg_setreg(add_str((unsigned char *) "$@warpwaitingpc")+(i<<24),sd->bl.id);
-
- if(strcmp(str,"Random")==0)
- pc_randomwarp(sd,3);
- else if(strcmp(str,"SavePoint")==0){
- if(map[sd->bl.m].flag.noteleport) // ƒeƒŒƒ|‹ÖŽ~
- return 0;
-
- pc_setpos(sd,sd->status.save_point.map,
- sd->status.save_point.x,sd->status.save_point.y,3);
- }else
- pc_setpos(sd,str,x,y,0);
- }
- mapreg_setreg(add_str((unsigned char *) "$@warpwaitingpcnum"),n);
- return 0;
-}
-/*==========================================
- * RID‚̃Aƒ^ƒbƒ`
- *------------------------------------------
- */
-int buildin_attachrid(struct script_state *st)
-{
- st->rid=conv_num(st,& (st->stack->stack_data[st->start+2]));
- push_val(st->stack,C_INT, (map_id2sd(st->rid)!=NULL));
- return 0;
-}
-/*==========================================
- * RID‚̃fƒ^ƒbƒ`
- *------------------------------------------
- */
-int buildin_detachrid(struct script_state *st)
-{
- st->rid=0;
- return 0;
-}
-/*==========================================
- * ‘¶Ýƒ`ƒFƒbƒN
- *------------------------------------------
- */
-int buildin_isloggedin(struct script_state *st)
-{
- push_val(st->stack,C_INT, map_id2sd(
- conv_num(st,& (st->stack->stack_data[st->start+2])) )!=NULL );
- return 0;
-}
-
-
-/*==========================================
- *
- *------------------------------------------
- */
-enum { MF_NOMEMO,MF_NOTELEPORT,MF_NOSAVE,MF_NOBRANCH,MF_NOPENALTY,MF_NOZENYPENALTY,
- MF_PVP,MF_PVP_NOPARTY,MF_PVP_NOGUILD,MF_GVG,MF_GVG_NOPARTY,MF_NOTRADE,MF_NOSKILL,
- MF_NOWARP,MF_NOPVP,MF_NOICEWALL,MF_SNOW,MF_FOG,MF_SAKURA,MF_LEAVES,MF_RAIN,MF_INDOORS,MF_NOGO };
-
-int buildin_setmapflagnosave(struct script_state *st)
-{
- int m,x,y;
- char *str,*str2;
-
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- str2=conv_str(st,& (st->stack->stack_data[st->start+3]));
- x=conv_num(st,& (st->stack->stack_data[st->start+4]));
- y=conv_num(st,& (st->stack->stack_data[st->start+5]));
- m = map_mapname2mapid(str);
- if(m >= 0) {
- map[m].flag.nosave=1;
- memcpy(map[m].save.map,str2,16);
- map[m].save.x=x;
- map[m].save.y=y;
- }
-
- return 0;
-}
-
-int buildin_setmapflag(struct script_state *st)
-{
- int m,i;
- char *str;
-
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- i=conv_num(st,& (st->stack->stack_data[st->start+3]));
- m = map_mapname2mapid(str);
- if(m >= 0) {
- switch(i) {
- case MF_NOMEMO:
- map[m].flag.nomemo=1;
- break;
- case MF_NOTELEPORT:
- map[m].flag.noteleport=1;
- break;
- case MF_NOBRANCH:
- map[m].flag.nobranch=1;
- break;
- case MF_NOPENALTY:
- map[m].flag.nopenalty=1;
- break;
- case MF_NOZENYPENALTY:
- map[m].flag.nozenypenalty=1;
- break;
- case MF_PVP:
- map[m].flag.pvp=1;
- break;
- case MF_PVP_NOPARTY:
- map[m].flag.pvp_noparty=1;
- break;
- case MF_PVP_NOGUILD:
- map[m].flag.pvp_noguild=1;
- break;
- case MF_GVG:
- map[m].flag.gvg=1;
- break;
- case MF_GVG_NOPARTY:
- map[m].flag.gvg_noparty=1;
- break;
- case MF_NOTRADE:
- map[m].flag.notrade=1;
- break;
- case MF_NOSKILL:
- map[m].flag.noskill=1;
- break;
- case MF_NOWARP:
- map[m].flag.nowarp=1;
- break;
- case MF_NOPVP:
- map[m].flag.nopvp=1;
- break;
- case MF_NOICEWALL: // [Valaris]
- map[m].flag.noicewall=1;
- break;
- case MF_SNOW: // [Valaris]
- map[m].flag.snow=1;
- break;
- case MF_FOG: // [Valaris]
- map[m].flag.fog=1;
- break;
- case MF_SAKURA: // [Valaris]
- map[m].flag.sakura=1;
- break;
- case MF_LEAVES: // [Valaris]
- map[m].flag.leaves=1;
- break;
- case MF_RAIN: // [Valaris]
- map[m].flag.rain=1;
- break;
- case MF_INDOORS: // celest
- map[m].flag.indoors=1;
- break;
- case MF_NOGO: // celest
- map[m].flag.nogo=1;
- break;
-
- }
- }
-
- return 0;
-}
-
-int buildin_removemapflag(struct script_state *st)
-{
- int m,i;
- char *str;
-
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- i=conv_num(st,& (st->stack->stack_data[st->start+3]));
- m = map_mapname2mapid(str);
- if(m >= 0) {
- switch(i) {
- case MF_NOMEMO:
- map[m].flag.nomemo=0;
- break;
- case MF_NOTELEPORT:
- map[m].flag.noteleport=0;
- break;
- case MF_NOSAVE:
- map[m].flag.nosave=0;
- break;
- case MF_NOBRANCH:
- map[m].flag.nobranch=0;
- break;
- case MF_NOPENALTY:
- map[m].flag.nopenalty=0;
- break;
- case MF_PVP:
- map[m].flag.pvp=0;
- break;
- case MF_PVP_NOPARTY:
- map[m].flag.pvp_noparty=0;
- break;
- case MF_PVP_NOGUILD:
- map[m].flag.pvp_noguild=0;
- break;
- case MF_GVG:
- map[m].flag.gvg=0;
- break;
- case MF_GVG_NOPARTY:
- map[m].flag.gvg_noparty=0;
- break;
- case MF_NOZENYPENALTY:
- map[m].flag.nozenypenalty=0;
- break;
- case MF_NOSKILL:
- map[m].flag.noskill=0;
- break;
- case MF_NOWARP:
- map[m].flag.nowarp=0;
- break;
- case MF_NOPVP:
- map[m].flag.nopvp=0;
- break;
- case MF_NOICEWALL: // [Valaris]
- map[m].flag.noicewall=0;
- break;
- case MF_SNOW: // [Valaris]
- map[m].flag.snow=0;
- break;
- case MF_FOG: // [Valaris]
- map[m].flag.fog=0;
- break;
- case MF_SAKURA: // [Valaris]
- map[m].flag.sakura=0;
- break;
- case MF_LEAVES: // [Valaris]
- map[m].flag.leaves=0;
- break;
- case MF_RAIN: // [Valaris]
- map[m].flag.rain=0;
- break;
- case MF_INDOORS: // celest
- map[m].flag.indoors=0;
- break;
- case MF_NOGO: // celest
- map[m].flag.nogo=0;
- break;
- }
- }
-
- return 0;
-}
-
-int buildin_pvpon(struct script_state *st)
-{
- int m,i;
- char *str;
- struct map_session_data *pl_sd=NULL;
-
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- m = map_mapname2mapid(str);
- if(m >= 0 && !map[m].flag.pvp && !map[m].flag.nopvp) {
- map[m].flag.pvp = 1;
- clif_send0199(m,1);
-
- if(battle_config.pk_mode) // disable ranking functions if pk_mode is on [Valaris]
- return 0;
-
- for(i=0;i<fd_max;i++){ //l”•ªƒ‹[ƒv
- if(session[i] && (pl_sd=(struct map_session_data *) session[i]->session_data) && pl_sd->state.auth){
- if(m == pl_sd->bl.m && pl_sd->pvp_timer == -1) {
- pl_sd->pvp_timer=add_timer(gettick()+200,pc_calc_pvprank_timer,pl_sd->bl.id,0);
- pl_sd->pvp_rank=0;
- pl_sd->pvp_lastusers=0;
- pl_sd->pvp_point=5;
- }
- }
- }
- }
-
- return 0;
-}
-
-int buildin_pvpoff(struct script_state *st)
-{
- int m,i;
- char *str;
- struct map_session_data *pl_sd=NULL;
-
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- m = map_mapname2mapid(str);
- if(m >= 0 && map[m].flag.pvp && map[m].flag.nopvp) {
- map[m].flag.pvp = 0;
- clif_send0199(m,0);
-
- if(battle_config.pk_mode) // disable ranking options if pk_mode is on [Valaris]
- return 0;
-
- for(i=0;i<fd_max;i++){ //l”•ªƒ‹[ƒv
- if(session[i] && (pl_sd=(struct map_session_data *) session[i]->session_data) && pl_sd->state.auth){
- if(m == pl_sd->bl.m) {
- clif_pvpset(pl_sd,0,0,2);
- if(pl_sd->pvp_timer != -1) {
- delete_timer(pl_sd->pvp_timer,pc_calc_pvprank_timer);
- pl_sd->pvp_timer = -1;
- }
- }
- }
- }
- }
-
- return 0;
-}
-
-int buildin_gvgon(struct script_state *st)
-{
- int m;
- char *str;
-
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- m = map_mapname2mapid(str);
- if(m >= 0 && !map[m].flag.gvg) {
- map[m].flag.gvg = 1;
- clif_send0199(m,3);
- }
-
- return 0;
-}
-int buildin_gvgoff(struct script_state *st)
-{
- int m;
- char *str;
-
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- m = map_mapname2mapid(str);
- if(m >= 0 && map[m].flag.gvg) {
- map[m].flag.gvg = 0;
- clif_send0199(m,0);
- }
-
- return 0;
-}
-/*==========================================
- * NPCƒGƒ‚[ƒVƒ‡ƒ“
- *------------------------------------------
- */
-
-int buildin_emotion(struct script_state *st)
-{
- int type;
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- if(type < 0 || type > 100)
- return 0;
- clif_emotion(map_id2bl(st->oid),type);
- return 0;
-}
-
-int buildin_maprespawnguildid_sub(struct block_list *bl,va_list ap)
-{
- int g_id=va_arg(ap,int);
- int flag=va_arg(ap,int);
- struct map_session_data *sd=NULL;
- struct mob_data *md=NULL;
-
- if(bl->type == BL_PC)
- sd=(struct map_session_data*)bl;
- if(bl->type == BL_MOB)
- md=(struct mob_data *)bl;
-
- if(sd){
- if((sd->status.guild_id == g_id) && (flag&1))
- pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,3);
- else if((sd->status.guild_id != g_id) && (flag&2))
- pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,3);
- else if (sd->status.guild_id == 0) // Warp out players not in guild [Valaris]
- pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,3); // end addition [Valaris]
- }
- if(md && flag&4){
- if(md->class_ < 1285 || md->class_ > 1288)
- mob_delete(md);
- }
- return 0;
-}
-int buildin_maprespawnguildid(struct script_state *st)
-{
- char *mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
- int g_id=conv_num(st,& (st->stack->stack_data[st->start+3]));
- int flag=conv_num(st,& (st->stack->stack_data[st->start+4]));
-
- int m=map_mapname2mapid(mapname);
-
- if(m) map_foreachinarea(buildin_maprespawnguildid_sub,m,0,0,map[m].xs-1,map[m].ys-1,BL_NUL,g_id,flag);
- return 0;
-}
-
-int buildin_agitstart(struct script_state *st)
-{
- if(agit_flag==1) return 1; // Agit already Start.
- agit_flag=1;
- guild_agit_start();
- return 0;
-}
-
-int buildin_agitend(struct script_state *st)
-{
- if(agit_flag==0) return 1; // Agit already End.
- agit_flag=0;
- guild_agit_end();
- return 0;
-}
-/*==========================================
- * agitcheck 1; // choice script
- * if(@agit_flag == 1) goto agit;
- * if(agitcheck(0) == 1) goto agit;
- *------------------------------------------
- */
-int buildin_agitcheck(struct script_state *st)
-{
- struct map_session_data *sd;
- int cond;
-
- cond=conv_num(st,& (st->stack->stack_data[st->start+2]));
-
- if(cond == 0) {
- if (agit_flag==1) push_val(st->stack,C_INT,1);
- if (agit_flag==0) push_val(st->stack,C_INT,0);
- } else {
- sd=script_rid2sd(st);
- if (agit_flag==1) pc_setreg(sd,add_str((unsigned char *) "@agit_flag"),1);
- if (agit_flag==0) pc_setreg(sd,add_str((unsigned char *) "@agit_flag"),0);
- }
- return 0;
-}
-int buildin_flagemblem(struct script_state *st)
-{
- int g_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
-
- if(g_id < 0) return 0;
-
-// printf("Script.c: [FlagEmblem] GuildID=%d, Emblem=%d.\n", g->guild_id, g->emblem_id);
- ((struct npc_data *)map_id2bl(st->oid))->u.scr.guild_id = g_id;
- return 1;
-}
-
-int buildin_getcastlename(struct script_state *st)
-{
- char *mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
- struct guild_castle *gc;
- int i;
- char *buf=NULL;
- for(i=0;i<MAX_GUILDCASTLE;i++){
- if( (gc=guild_castle_search(i)) != NULL ){
- if(strcmp(mapname,gc->map_name)==0){
- buf=(char *)aCallocA(24,sizeof(char));
- strncpy(buf,gc->castle_name,24);
- break;
- }
- }
- }
- if(buf)
- push_str(st->stack,C_STR,(unsigned char *) buf);
- else
- push_str(st->stack,C_CONSTSTR,(unsigned char *) "");
- return 0;
-}
-
-int buildin_getcastledata(struct script_state *st)
-{
- char *mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
- int index=conv_num(st,& (st->stack->stack_data[st->start+3]));
- char *event=NULL;
- struct guild_castle *gc;
- int i,j;
-
- if( st->end>st->start+4 && index==0){
- for(i=0,j=-1;i<MAX_GUILDCASTLE;i++)
- if( (gc=guild_castle_search(i)) != NULL &&
- strcmp(mapname,gc->map_name)==0 )
- j=i;
- if(j>=0){
- event=conv_str(st,& (st->stack->stack_data[st->start+4]));
- guild_addcastleinfoevent(j,17,event);
- }
- }
-
- for(i=0;i<MAX_GUILDCASTLE;i++){
- if( (gc=guild_castle_search(i)) != NULL ){
- if(strcmp(mapname,gc->map_name)==0){
- switch(index){
- case 0: for(j=1;j<26;j++) guild_castledataload(gc->castle_id,j); break; // Initialize[AgitInit]
- case 1: push_val(st->stack,C_INT,gc->guild_id); break;
- case 2: push_val(st->stack,C_INT,gc->economy); break;
- case 3: push_val(st->stack,C_INT,gc->defense); break;
- case 4: push_val(st->stack,C_INT,gc->triggerE); break;
- case 5: push_val(st->stack,C_INT,gc->triggerD); break;
- case 6: push_val(st->stack,C_INT,gc->nextTime); break;
- case 7: push_val(st->stack,C_INT,gc->payTime); break;
- case 8: push_val(st->stack,C_INT,gc->createTime); break;
- case 9: push_val(st->stack,C_INT,gc->visibleC); break;
- case 10: push_val(st->stack,C_INT,gc->visibleG0); break;
- case 11: push_val(st->stack,C_INT,gc->visibleG1); break;
- case 12: push_val(st->stack,C_INT,gc->visibleG2); break;
- case 13: push_val(st->stack,C_INT,gc->visibleG3); break;
- case 14: push_val(st->stack,C_INT,gc->visibleG4); break;
- case 15: push_val(st->stack,C_INT,gc->visibleG5); break;
- case 16: push_val(st->stack,C_INT,gc->visibleG6); break;
- case 17: push_val(st->stack,C_INT,gc->visibleG7); break;
- case 18: push_val(st->stack,C_INT,gc->Ghp0); break;
- case 19: push_val(st->stack,C_INT,gc->Ghp1); break;
- case 20: push_val(st->stack,C_INT,gc->Ghp2); break;
- case 21: push_val(st->stack,C_INT,gc->Ghp3); break;
- case 22: push_val(st->stack,C_INT,gc->Ghp4); break;
- case 23: push_val(st->stack,C_INT,gc->Ghp5); break;
- case 24: push_val(st->stack,C_INT,gc->Ghp6); break;
- case 25: push_val(st->stack,C_INT,gc->Ghp7); break;
- default:
- push_val(st->stack,C_INT,0); break;
- }
- return 0;
- }
- }
- }
- push_val(st->stack,C_INT,0);
- return 0;
-}
-
-int buildin_setcastledata(struct script_state *st)
-{
- char *mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
- int index=conv_num(st,& (st->stack->stack_data[st->start+3]));
- int value=conv_num(st,& (st->stack->stack_data[st->start+4]));
- struct guild_castle *gc;
- int i;
-
- for(i=0;i<MAX_GUILDCASTLE;i++){
- if( (gc=guild_castle_search(i)) != NULL ){
- if(strcmp(mapname,gc->map_name)==0){
- // Save Data byself First
- switch(index){
- case 1: gc->guild_id = value; break;
- case 2: gc->economy = value; break;
- case 3: gc->defense = value; break;
- case 4: gc->triggerE = value; break;
- case 5: gc->triggerD = value; break;
- case 6: gc->nextTime = value; break;
- case 7: gc->payTime = value; break;
- case 8: gc->createTime = value; break;
- case 9: gc->visibleC = value; break;
- case 10: gc->visibleG0 = value; break;
- case 11: gc->visibleG1 = value; break;
- case 12: gc->visibleG2 = value; break;
- case 13: gc->visibleG3 = value; break;
- case 14: gc->visibleG4 = value; break;
- case 15: gc->visibleG5 = value; break;
- case 16: gc->visibleG6 = value; break;
- case 17: gc->visibleG7 = value; break;
- case 18: gc->Ghp0 = value; break;
- case 19: gc->Ghp1 = value; break;
- case 20: gc->Ghp2 = value; break;
- case 21: gc->Ghp3 = value; break;
- case 22: gc->Ghp4 = value; break;
- case 23: gc->Ghp5 = value; break;
- case 24: gc->Ghp6 = value; break;
- case 25: gc->Ghp7 = value; break;
- default: return 0;
- }
- guild_castledatasave(gc->castle_id,index,value);
- return 0;
- }
- }
- }
- return 0;
-}
-
-/* =====================================================================
- * ƒMƒ‹ƒhî•ñ‚ð—v‹‚·‚é
- * ---------------------------------------------------------------------
- */
-int buildin_requestguildinfo(struct script_state *st)
-{
- int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- char *event=NULL;
-
- if( st->end>st->start+3 )
- event=conv_str(st,& (st->stack->stack_data[st->start+3]));
-
- if(guild_id>0)
- guild_npc_request_info(guild_id,event);
- return 0;
-}
-
-/* =====================================================================
- * ƒJ[ƒh‚Ì”‚𓾂é
- * ---------------------------------------------------------------------
- */
-int buildin_getequipcardcnt(struct script_state *st)
-{
- int i,num;
- struct map_session_data *sd;
- int c=4;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
- if(sd->status.inventory[i].card[0] == 0x00ff){ // »‘¢•Ší‚̓J[ƒh‚È‚µ
- push_val(st->stack,C_INT,0);
- return 0;
- }
- do{
- if( (sd->status.inventory[i].card[c-1] > 4000 &&
- sd->status.inventory[i].card[c-1] < 5000) ||
- itemdb_type(sd->status.inventory[i].card[c-1]) == 6){ // [Celest]
- push_val(st->stack,C_INT,(c));
- return 0;
- }
- }while(c--);
- push_val(st->stack,C_INT,0);
- return 0;
-}
-
-/* ================================================================
- * ƒJ[ƒhŽæ‚èŠO‚µ¬Œ÷
- * ----------------------------------------------------------------
- */
-int buildin_successremovecards(struct script_state *st)
-{
- int i,num,cardflag=0,flag;
- struct map_session_data *sd;
- struct item item_tmp;
- int c=4;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
- if(sd->status.inventory[i].card[0]==0x00ff){ // »‘¢•Ší‚͈—‚µ‚È‚¢
- return 0;
- }
- do{
- if( (sd->status.inventory[i].card[c-1] > 4000 &&
- sd->status.inventory[i].card[c-1] < 5000) ||
- itemdb_type(sd->status.inventory[i].card[c-1]) == 6){ // [Celest]
-
- cardflag = 1;
- item_tmp.id=0,item_tmp.nameid=sd->status.inventory[i].card[c-1];
- item_tmp.equip=0,item_tmp.identify=1,item_tmp.refine=0;
- item_tmp.attribute=0;
- item_tmp.card[0]=0,item_tmp.card[1]=0,item_tmp.card[2]=0,item_tmp.card[3]=0;
-
- if((flag=pc_additem(sd,&item_tmp,1))){ // Ž‚Ä‚È‚¢‚È‚çƒhƒƒbƒv
- clif_additem(sd,0,0,flag);
- map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- }
- }while(c--);
-
- if(cardflag == 1){ // ƒJ[ƒh‚ðŽæ‚蜂¢‚½ƒAƒCƒeƒ€Š“¾
- flag=0;
- item_tmp.id=0,item_tmp.nameid=sd->status.inventory[i].nameid;
- item_tmp.equip=0,item_tmp.identify=1,item_tmp.refine=sd->status.inventory[i].refine;
- item_tmp.attribute=sd->status.inventory[i].attribute;
- item_tmp.card[0]=0,item_tmp.card[1]=0,item_tmp.card[2]=0,item_tmp.card[3]=0;
- pc_delitem(sd,i,1,0);
- if((flag=pc_additem(sd,&item_tmp,1))){ // ‚à‚Ä‚È‚¢‚È‚çƒhƒƒbƒv
- clif_additem(sd,0,0,flag);
- map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- clif_misceffect(&sd->bl,3);
- return 0;
- }
- return 0;
-}
-
-/* ================================================================
- * ƒJ[ƒhŽæ‚èŠO‚µŽ¸”s slot,type
- * type=0: —¼•û‘¹Ž¸A1:ƒJ[ƒh‘¹Ž¸A2:•‹ï‘¹Ž¸A3:‘¹Ž¸–³‚µ
- * ----------------------------------------------------------------
- */
-int buildin_failedremovecards(struct script_state *st)
-{
- int i,num,cardflag=0,flag,typefail;
- struct map_session_data *sd;
- struct item item_tmp;
- int c=4;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- typefail=conv_num(st,& (st->stack->stack_data[st->start+3]));
- sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
- if(sd->status.inventory[i].card[0]==0x00ff){ // »‘¢•Ší‚͈—‚µ‚È‚¢
- return 0;
- }
- do{
- if( (sd->status.inventory[i].card[c-1] > 4000 &&
- sd->status.inventory[i].card[c-1] < 5000) ||
- itemdb_type(sd->status.inventory[i].card[c-1]) == 6){ // [Celest]
-
- cardflag = 1;
-
- if(typefail == 2){ // •‹ï‚Ì‚Ý‘¹Ž¸‚È‚çAƒJ[ƒh‚͎󂯎æ‚点‚é
- item_tmp.id=0,item_tmp.nameid=sd->status.inventory[i].card[c-1];
- item_tmp.equip=0,item_tmp.identify=1,item_tmp.refine=0;
- item_tmp.attribute=0;
- item_tmp.card[0]=0,item_tmp.card[1]=0,item_tmp.card[2]=0,item_tmp.card[3]=0;
- if((flag=pc_additem(sd,&item_tmp,1))){
- clif_additem(sd,0,0,flag);
- map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- }
- }
- }while(c--);
-
- if(cardflag == 1){
-
- if(typefail == 0 || typefail == 2){ // •‹ï‘¹Ž¸
- pc_delitem(sd,i,1,0);
- clif_misceffect(&sd->bl,2);
- return 0;
- }
- if(typefail == 1){ // ƒJ[ƒh‚Ì‚Ý‘¹Ž¸i•‹ï‚ð•Ô‚·j
- flag=0;
- item_tmp.id=0,item_tmp.nameid=sd->status.inventory[i].nameid;
- item_tmp.equip=0,item_tmp.identify=1,item_tmp.refine=sd->status.inventory[i].refine;
- item_tmp.attribute=sd->status.inventory[i].attribute;
- item_tmp.card[0]=0,item_tmp.card[1]=0,item_tmp.card[2]=0,item_tmp.card[3]=0;
- pc_delitem(sd,i,1,0);
- if((flag=pc_additem(sd,&item_tmp,1))){
- clif_additem(sd,0,0,flag);
- map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- }
- clif_misceffect(&sd->bl,2);
- return 0;
- }
- return 0;
-}
-
-int buildin_mapwarp(struct script_state *st) // Added by RoVeRT
-{
- int x,y,m;
- char *str;
- char *mapname;
- int x0,y0,x1,y1;
-
- mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
- x0=0;
- y0=0;
- x1=map[map_mapname2mapid(mapname)].xs;
- y1=map[map_mapname2mapid(mapname)].ys;
- str=conv_str(st,& (st->stack->stack_data[st->start+3]));
- x=conv_num(st,& (st->stack->stack_data[st->start+4]));
- y=conv_num(st,& (st->stack->stack_data[st->start+5]));
-
- if( (m=map_mapname2mapid(mapname))< 0)
- return 0;
-
- map_foreachinarea(buildin_areawarp_sub,
- m,x0,y0,x1,y1,BL_PC, str,x,y );
- return 0;
-}
-
-int buildin_cmdothernpc(struct script_state *st) // Added by RoVeRT
-{
- char *npc,*command;
-
- npc=conv_str(st,& (st->stack->stack_data[st->start+2]));
- command=conv_str(st,& (st->stack->stack_data[st->start+3]));
-
- npc_command(map_id2sd(st->rid),npc,command);
- return 0;
-}
-
-int buildin_inittimer(struct script_state *st) // Added by RoVeRT
-{
-// struct npc_data *nd=(struct npc_data*)map_id2bl(st->oid);
-// nd->lastaction=nd->timer=gettick();
-
- npc_do_ontimer(st->oid, 1);
-
- return 0;
-}
-
-int buildin_stoptimer(struct script_state *st) // Added by RoVeRT
-{
-// struct npc_data *nd=(struct npc_data*)map_id2bl(st->oid);
-// nd->lastaction=nd->timer=-1;
-
- npc_do_ontimer(st->oid, 0);
-
- return 0;
-}
-
-int buildin_mobcount_sub(struct block_list *bl,va_list ap) // Added by RoVeRT
-{
- char *event=va_arg(ap,char *);
- int *c=va_arg(ap,int *);
-
- if(strcmp(event,((struct mob_data *)bl)->npc_event)==0)
- (*c)++;
- return 0;
-}
-
-int buildin_mobcount(struct script_state *st) // Added by RoVeRT
-{
- char *mapname,*event;
- int m,c=0;
- mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
- event=conv_str(st,& (st->stack->stack_data[st->start+3]));
-
- if( (m=map_mapname2mapid(mapname))<0 ) {
- push_val(st->stack,C_INT,-1);
- return 0;
- }
- map_foreachinarea(buildin_mobcount_sub,
- m,0,0,map[m].xs,map[m].ys,BL_MOB, event,&c );
-
- push_val(st->stack,C_INT, (c - 1));
-
- return 0;
-}
-int buildin_marriage(struct script_state *st)
-{
- char *partner=conv_str(st,& (st->stack->stack_data[st->start+2]));
- struct map_session_data *sd=script_rid2sd(st);
- struct map_session_data *p_sd=map_nick2sd(partner);
-
- if(sd==NULL || p_sd==NULL || pc_marriage(sd,p_sd) < 0){
- push_val(st->stack,C_INT,0);
- return 0;
- }
- push_val(st->stack,C_INT,1);
- return 0;
-}
-int buildin_wedding_effect(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
- struct block_list *bl;
-
- if(sd==NULL) {
- bl=map_id2bl(st->oid);
- } else
- bl=&sd->bl;
- clif_wedding_effect(bl);
- return 0;
-}
-int buildin_divorce(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
- if(sd==NULL || pc_divorce(sd) < 0){
- push_val(st->stack,C_INT,0);
- return 0;
- }
- push_val(st->stack,C_INT,1);
- return 0;
-}
-
-int buildin_ispartneron(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
- struct map_session_data *p_sd=NULL;
-
- if(sd==NULL || !pc_ismarried(sd) ||
- ((p_sd=map_nick2sd(map_charid2nick(sd->status.partner_id))) == NULL)) {
- push_val(st->stack,C_INT,0);
- return 0;
- }
-
- push_val(st->stack,C_INT,1);
- return 0;
-}
-
-int buildin_getpartnerid(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
- if (sd == NULL) {
- push_val(st->stack,C_INT,0);
- return 0;
- }
-
- push_val(st->stack,C_INT,sd->status.partner_id);
- return 0;
-}
-
-int buildin_warppartner(struct script_state *st)
-{
- int x,y;
- char *str;
- struct map_session_data *sd=script_rid2sd(st);
- struct map_session_data *p_sd=NULL;
-
- if(sd==NULL || !pc_ismarried(sd) ||
- ((p_sd=map_nick2sd(map_charid2nick(sd->status.partner_id))) == NULL)) {
- push_val(st->stack,C_INT,0);
- return 0;
- }
-
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- x=conv_num(st,& (st->stack->stack_data[st->start+3]));
- y=conv_num(st,& (st->stack->stack_data[st->start+4]));
-
- pc_setpos(p_sd,str,x,y,0);
-
- push_val(st->stack,C_INT,1);
- return 0;
-}
-
-/*================================================
- * Script for Displaying MOB Information [Valaris]
- *------------------------------------------------
- */
-int buildin_strmobinfo(struct script_state *st)
-{
-
- int num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- int class_=conv_num(st,& (st->stack->stack_data[st->start+3]));
-
- if((class_>=0 && class_<=1000) || class_ >2000)
- return 0;
-
- switch (num) {
- case 1:
- {
- char *buf;
- buf=(char *) aCallocA(24, 1);
-// buf=mob_db[class_].name;
-// for string assignments you would need to go for c++ [Shinomori]
- strcpy(buf,mob_db[class_].name);
- push_str(st->stack,C_STR,(unsigned char *) buf);
- break;
- }
- case 2:
- {
- char *buf;
- buf=(char *) aCallocA(24, 1);
-// buf=mob_db[class_].jname;
-// for string assignments you would need to go for c++ [Shinomori]
- strcpy(buf,mob_db[class_].jname);
- push_str(st->stack,C_STR,(unsigned char *) buf);
- break;
- }
- case 3:
- push_val(st->stack,C_INT,mob_db[class_].lv);
- break;
- case 4:
- push_val(st->stack,C_INT,mob_db[class_].max_hp);
- break;
- case 5:
- push_val(st->stack,C_INT,mob_db[class_].max_sp);
- break;
- case 6:
- push_val(st->stack,C_INT,mob_db[class_].base_exp);
- break;
- case 7:
- push_val(st->stack,C_INT,mob_db[class_].job_exp);
- break;
- }
- return 0;
-}
-
-/*==========================================
- * Summon guardians [Valaris]
- *------------------------------------------
- */
-int buildin_guardian(struct script_state *st)
-{
- int class_=0,amount=1,x=0,y=0,guardian=0;
- char *str,*map,*event="";
-
- map =conv_str(st,& (st->stack->stack_data[st->start+2]));
- x =conv_num(st,& (st->stack->stack_data[st->start+3]));
- y =conv_num(st,& (st->stack->stack_data[st->start+4]));
- str =conv_str(st,& (st->stack->stack_data[st->start+5]));
- class_=conv_num(st,& (st->stack->stack_data[st->start+6]));
- amount=conv_num(st,& (st->stack->stack_data[st->start+7]));
- event=conv_str(st,& (st->stack->stack_data[st->start+8]));
- if( st->end>st->start+9 )
- guardian=conv_num(st,& (st->stack->stack_data[st->start+9]));
-
- mob_spawn_guardian(map_id2sd(st->rid),map,x,y,str,class_,amount,event,guardian);
-
- return 0;
-}
-
-/*================================================
- * Script for Displaying Guardian Info [Valaris]
- *------------------------------------------------
- */
-int buildin_guardianinfo(struct script_state *st)
-{
- int guardian=conv_num(st,& (st->stack->stack_data[st->start+2]));
- struct map_session_data *sd=script_rid2sd(st);
- struct guild_castle *gc=guild_mapname2gc(map[sd->bl.m].name);
-
- if(guardian==0 && gc->visibleG0 == 1) push_val(st->stack,C_INT,gc->Ghp0);
- if(guardian==1 && gc->visibleG1 == 1) push_val(st->stack,C_INT,gc->Ghp1);
- if(guardian==2 && gc->visibleG2 == 1) push_val(st->stack,C_INT,gc->Ghp2);
- if(guardian==3 && gc->visibleG3 == 1) push_val(st->stack,C_INT,gc->Ghp3);
- if(guardian==4 && gc->visibleG4 == 1) push_val(st->stack,C_INT,gc->Ghp4);
- if(guardian==5 && gc->visibleG5 == 1) push_val(st->stack,C_INT,gc->Ghp5);
- if(guardian==6 && gc->visibleG6 == 1) push_val(st->stack,C_INT,gc->Ghp6);
- if(guardian==7 && gc->visibleG7 == 1) push_val(st->stack,C_INT,gc->Ghp7);
- else push_val(st->stack,C_INT,-1);
-
- return 0;
-}
-/*==========================================
- * ID‚©‚çItem–¼
- *------------------------------------------
- */
-int buildin_getitemname(struct script_state *st)
-{
- int item_id;
- struct item_data *i_data;
- char *item_name;
-
- item_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
-
- i_data = NULL;
- i_data = itemdb_search(item_id);
- item_name=(char *)aCallocA(24,sizeof(char));
-
- strncpy(item_name,i_data->jname,23);
- push_str(st->stack,C_STR,(unsigned char *) item_name);
- return 0;
-}
-
-/*==========================================
- * petskillbonus [Valaris]
- *------------------------------------------
- */
-
-int buildin_petskillbonus(struct script_state *st)
-{
- int type,val,duration,timer;
- struct pet_data *pd;
-
- struct map_session_data *sd=script_rid2sd(st);
-
- if(sd==NULL || sd->pd==NULL)
- return 0;
-
- pd=sd->pd;
-
- if(pd==NULL)
- return 0;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- val=conv_num(st,& (st->stack->stack_data[st->start+3]));
- duration=conv_num(st,& (st->stack->stack_data[st->start+4]));
- timer=conv_num(st,& (st->stack->stack_data[st->start+5]));
-
- // initialise bonuses
- pd->skillbonustype=type;
- pd->skillbonusval=val;
- pd->skillduration=duration*1000;
- pd->skilltimer=timer*1000;
-
- if (pd->state.skillbonus == -1)
- pd->state.skillbonus=0; // waiting state
-
- // wait for timer to start
- pd->skillbonustimer=add_timer(gettick()+pd->skilltimer,pet_skill_bonus_timer,sd->bl.id,0);
-
- return 0;
-}
-
-/*==========================================
- * pet looting [Valaris]
- *------------------------------------------
- */
-int buildin_petloot(struct script_state *st)
-{
- int max;
- struct pet_data *pd;
-
- struct map_session_data *sd=script_rid2sd(st);
- if(sd==NULL || sd->pd==NULL)
- return 0;
-
- pd=sd->pd;
-
- if(pd==NULL)
- return 0;
-
- max=conv_num(st,& (st->stack->stack_data[st->start+2]));
-
- if(!max)
- return 0;
-
- pd->loot=1;
- pd->lootmax=max;
-
- return 0;
-}
-/*==========================================
- * PC‚ÌŠŽ•iî•ñ“Ç‚ÝŽæ‚è
- *------------------------------------------
- */
-int buildin_getinventorylist(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
- int i,j=0;
- if(!sd) return 0;
- for(i=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid > 0 && sd->status.inventory[i].amount > 0){
- pc_setreg(sd,add_str((unsigned char *) "@inventorylist_id")+(j<<24),sd->status.inventory[i].nameid);
- pc_setreg(sd,add_str((unsigned char *) "@inventorylist_amount")+(j<<24),sd->status.inventory[i].amount);
- pc_setreg(sd,add_str((unsigned char *) "@inventorylist_equip")+(j<<24),sd->status.inventory[i].equip);
- pc_setreg(sd,add_str((unsigned char *) "@inventorylist_refine")+(j<<24),sd->status.inventory[i].refine);
- pc_setreg(sd,add_str((unsigned char *) "@inventorylist_identify")+(j<<24),sd->status.inventory[i].identify);
- pc_setreg(sd,add_str((unsigned char *) "@inventorylist_attribute")+(j<<24),sd->status.inventory[i].attribute);
- pc_setreg(sd,add_str((unsigned char *) "@inventorylist_card1")+(j<<24),sd->status.inventory[i].card[0]);
- pc_setreg(sd,add_str((unsigned char *) "@inventorylist_card2")+(j<<24),sd->status.inventory[i].card[1]);
- pc_setreg(sd,add_str((unsigned char *) "@inventorylist_card3")+(j<<24),sd->status.inventory[i].card[2]);
- pc_setreg(sd,add_str((unsigned char *) "@inventorylist_card4")+(j<<24),sd->status.inventory[i].card[3]);
- j++;
- }
- }
- pc_setreg(sd,add_str((unsigned char *) "@inventorylist_count"),j);
- return 0;
-}
-
-int buildin_getskilllist(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
- int i,j=0;
- if(!sd) return 0;
- for(i=0;i<MAX_SKILL;i++){
- if(sd->status.skill[i].id > 0 && sd->status.skill[i].lv > 0){
- pc_setreg(sd,add_str((unsigned char *) "@skilllist_id")+(j<<24),sd->status.skill[i].id);
- pc_setreg(sd,add_str((unsigned char *)"@skilllist_lv")+(j<<24),sd->status.skill[i].lv);
- pc_setreg(sd,add_str((unsigned char *)"@skilllist_flag")+(j<<24),sd->status.skill[i].flag);
- j++;
- }
- }
- pc_setreg(sd,add_str((unsigned char *) "@skilllist_count"),j);
- return 0;
-}
-
-int buildin_clearitem(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
- int i;
- if(sd==NULL) return 0;
- for (i=0; i<MAX_INVENTORY; i++) {
- if (sd->status.inventory[i].amount)
- pc_delitem(sd, i, sd->status.inventory[i].amount, 0);
- }
- return 0;
-}
-
-/*==========================================
- * NPCƒNƒ‰ƒXƒ`ƒFƒ“ƒW
- * class‚Í•Ï‚í‚肽‚¢class
- * type‚Í’Êí0‚È‚Ì‚©‚ÈH
- *------------------------------------------
- */
-int buildin_classchange(struct script_state *st)
-{
- int _class,type;
- struct block_list *bl=map_id2bl(st->oid);
-
- if(bl==NULL) return 0;
-
- _class=conv_num(st,& (st->stack->stack_data[st->start+2]));
- type=conv_num(st,& (st->stack->stack_data[st->start+3]));
- clif_class_change(bl,_class,type);
- return 0;
-}
-
-/*==========================================
- * NPC‚©‚ç”­¶‚·‚éƒGƒtƒFƒNƒg
- *------------------------------------------
- */
-int buildin_misceffect(struct script_state *st)
-{
- int type;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- if(st->oid)
- clif_misceffect2(map_id2bl(st->oid),type);
- else{
- struct map_session_data *sd=script_rid2sd(st);
- if(sd)
- clif_misceffect2(&sd->bl,type);
- }
- return 0;
-}
-/*==========================================
- * ƒTƒEƒ“ƒhƒGƒtƒFƒNƒg
- *------------------------------------------
- */
-int buildin_soundeffect(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
- char *name;
- int type=0;
-
-
- name=conv_str(st,& (st->stack->stack_data[st->start+2]));
- type=conv_num(st,& (st->stack->stack_data[st->start+3]));
- if(sd){
- if(st->oid)
- clif_soundeffect(sd,map_id2bl(st->oid),name,type);
- else{
- clif_soundeffect(sd,&sd->bl,name,type);
- }
- }
- return 0;
-}
-
-int buildin_soundeffectall(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
- char *name;
- int type=0;
-
- name=conv_str(st,& (st->stack->stack_data[st->start+2]));
- type=conv_num(st,& (st->stack->stack_data[st->start+3]));
- if(sd)
- {
- if(st->oid)
- clif_soundeffectall(map_id2bl(st->oid),name,type);
- else
- clif_soundeffectall(&sd->bl,name,type);
- }
- return 0;
-}
-/*==========================================
- * pet status recovery [Valaris]
- *------------------------------------------
- */
-int buildin_petrecovery(struct script_state *st)
-{
- struct pet_data *pd;
-
- struct map_session_data *sd=script_rid2sd(st);
-
- if(sd==NULL || sd->pd==NULL)
- return 0;
-
- pd=sd->pd;
-
- if(pd==NULL)
- return 0;
-
- pd->skilltype=conv_num(st,& (st->stack->stack_data[st->start+2]));
- pd->skilltimer=conv_num(st,& (st->stack->stack_data[st->start+3]));
-
- pd->skillbonustimer=add_timer(gettick()+pd->skilltimer*1000,pet_recovery_timer,sd->bl.id,0);
-
- return 0;
-}
-
-/*==========================================
- * pet healing [Valaris]
- *------------------------------------------
- */
-int buildin_petheal(struct script_state *st)
-
-{
- struct pet_data *pd;
- struct map_session_data *sd=script_rid2sd(st);
-
- if(sd==NULL || sd->pd==NULL)
- return 0;
-
- pd=sd->pd;
-
- if(pd==NULL)
- return 0;
-
- pd->skilltype=conv_num(st,& (st->stack->stack_data[st->start+2]));
- pd->skillval=conv_num(st,& (st->stack->stack_data[st->start+3]));
- pd->skilltimer=conv_num(st,& (st->stack->stack_data[st->start+4]));
-
- pd->skillbonustimer=add_timer(gettick()+pd->skilltimer*1000,pet_heal_timer,sd->bl.id,0);
-
- return 0;
-}
-
-/*==========================================
- * pet magnificat [Valaris]
- *------------------------------------------
- */
-int buildin_petmag(struct script_state *st)
-{
- struct pet_data *pd;
- struct map_session_data *sd=script_rid2sd(st);
-
- if(sd==NULL || sd->pd==NULL)
- return 0;
-
- pd=sd->pd;
-
- if(pd==NULL)
- return 0;
-
- pd->skilltype=conv_num(st,& (st->stack->stack_data[st->start+2]));
- pd->skillduration=conv_num(st,& (st->stack->stack_data[st->start+3]));
- pd->skillval=conv_num(st,& (st->stack->stack_data[st->start+4]));
- pd->skilltimer=conv_num(st,& (st->stack->stack_data[st->start+5]));
-
- pd->skillbonustimer=add_timer(gettick()+pd->skilltimer*1000,pet_mag_timer,sd->bl.id,0);
-
- return 0;
-}
-
-/*==========================================
- * pet attack skills [Valaris]
- *------------------------------------------
- */
-int buildin_petskillattack(struct script_state *st)
-{
- struct pet_data *pd;
- struct map_session_data *sd=script_rid2sd(st);
-
- if(sd==NULL || sd->pd==NULL)
- return 0;
-
- pd=sd->pd;
-
- if(pd==NULL)
- return 0;
-
- pd->skilltype=conv_num(st,& (st->stack->stack_data[st->start+2]));
- pd->skillval=conv_num(st,& (st->stack->stack_data[st->start+3]));
- pd->skillduration=conv_num(st,& (st->stack->stack_data[st->start+4]));
- pd->skilltimer=conv_num(st,& (st->stack->stack_data[st->start+5]));
-
- pd->skillbonustimer=add_timer(gettick()+100,pet_skillattack_timer,sd->bl.id,0);
-
- return 0;
-}
-
-/*==========================================
- * Scripted skill effects [Celest]
- *------------------------------------------
- */
-int buildin_skilleffect(struct script_state *st)
-{
- struct map_session_data *sd;
-
- int skillid=conv_num(st,& (st->stack->stack_data[st->start+2]));
- int skilllv=conv_num(st,& (st->stack->stack_data[st->start+3]));
- sd=script_rid2sd(st);
-
- clif_skill_nodamage(&sd->bl,&sd->bl,skillid,skilllv,1);
-
- return 0;
-}
-
-/*==========================================
- * NPC skill effects [Valaris]
- *------------------------------------------
- */
-int buildin_npcskilleffect(struct script_state *st)
-{
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
-
- int skillid=conv_num(st,& (st->stack->stack_data[st->start+2]));
- int skilllv=conv_num(st,& (st->stack->stack_data[st->start+3]));
- int x=conv_num(st,& (st->stack->stack_data[st->start+4]));
- int y=conv_num(st,& (st->stack->stack_data[st->start+5]));
-
- clif_skill_poseffect(&nd->bl,skillid,skilllv,x,y,gettick());
-
- return 0;
-}
-
-/*==========================================
- * Special effects [Valaris]
- *------------------------------------------
- */
-int buildin_specialeffect(struct script_state *st)
-{
- struct block_list *bl=map_id2bl(st->oid);
-
- if(bl==NULL)
- return 0;
-
- clif_specialeffect(bl,conv_num(st,& (st->stack->stack_data[st->start+2])), 0);
-
- return 0;
-}
-
-int buildin_specialeffect2(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
-
- if(sd==NULL)
- return 0;
-
- clif_specialeffect(&sd->bl,conv_num(st,& (st->stack->stack_data[st->start+2])), 0);
-
- return 0;
-}
-
-/*==========================================
- * Nude [Valaris]
- *------------------------------------------
- */
-
-int buildin_nude(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
- int i;
-
- if(sd==NULL)
- return 0;
-
- for(i=0;i<11;i++)
- if(sd->equip_index[i] >= 0)
- pc_unequipitem(sd,sd->equip_index[i],2);
-
- return 0;
-}
-
-/*==========================================
- * gmcommand [MouseJstr]
- *
- * suggested on the forums...
- *------------------------------------------
- */
-
-int buildin_gmcommand(struct script_state *st)
-{
- struct map_session_data *sd;
- char *cmd;
-
- sd = script_rid2sd(st);
- cmd = conv_str(st,& (st->stack->stack_data[st->start+2]));
-
- is_atcommand(sd->fd, sd, cmd, 99);
-
- return 0;
-}
-
-/*==========================================
- * Displays a message for the player only (like system messages like "you got an apple" )
- *------------------------------------------
- */
-int buildin_dispbottom(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
- char *message;
- message=conv_str(st,& (st->stack->stack_data[st->start+2]));
- if(sd)
- clif_disp_onlyself(sd,message,strlen(message));
- return 0;
-}
-
-/*==========================================
- * All The Players Full Recovery
- (HP/SP full restore and resurrect if need)
- *------------------------------------------
- */
-int buildin_recovery(struct script_state *st)
-{
- int i = 0;
- for (i = 0; i < fd_max; i++) {
- if (session[i]){
- struct map_session_data *sd = (struct map_session_data *) session[i]->session_data;
- if (sd && sd->state.auth) {
- sd->status.hp = sd->status.max_hp;
- sd->status.sp = sd->status.max_sp;
- clif_updatestatus(sd, SP_HP);
- clif_updatestatus(sd, SP_SP);
- if(pc_isdead(sd)){
- pc_setstand(sd);
- clif_resurrection(&sd->bl, 1);
- }
- clif_displaymessage(sd->fd,"You have been recovered!");
- }
- }
- }
- return 0;
-}
-/*==========================================
- * Get your pet info: getpetinfo(n)
- * n -> 0:pet_id 1:pet_class 2:pet_name
- 3:friendly 4:hungry
- *------------------------------------------
- */
-int buildin_getpetinfo(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
- int type=conv_num(st,& (st->stack->stack_data[st->start+2]));
-
- if(sd && sd->status.pet_id){
- switch(type){
- case 0:
- push_val(st->stack,C_INT,sd->status.pet_id);
- break;
- case 1:
- if(sd->pet.class_)
- push_val(st->stack,C_INT,sd->pet.class_);
- else
- push_val(st->stack,C_INT,0);
- break;
- case 2:
- if(sd->pet.name)
- push_str(st->stack,C_STR,(unsigned char *) sd->pet.name);
- else
- push_val(st->stack,C_INT,0);
- break;
- case 3:
- //if(sd->pet.intimate)
- push_val(st->stack,C_INT,sd->pet.intimate);
- break;
- case 4:
- //if(sd->pet.hungry)
- push_val(st->stack,C_INT,sd->pet.hungry);
- break;
- default:
- push_val(st->stack,C_INT,0);
- break;
- }
- }else{
- push_val(st->stack,C_INT,0);
- }
- return 0;
-}
-/*==========================================
- * Shows wether your inventory(and equips) contain
- selected card or not.
- checkequipedcard(4001);
- *------------------------------------------
- */
-int buildin_checkequipedcard(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
- int n,i,c=0;
- c=conv_num(st,& (st->stack->stack_data[st->start+2]));
-
- if(sd){
- for(i=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid > 0 && sd->status.inventory[i].amount){
- for(n=0;n<4;n++){
- if(sd->status.inventory[i].card[n]==c){
- push_val(st->stack,C_INT,1);
- return 0;
- }
- }
- }
- }
- }
- push_val(st->stack,C_INT,0);
- return 0;
-}
-
-int buildin_jump_zero(struct script_state *st) {
- int sel;
- sel=conv_num(st,& (st->stack->stack_data[st->start+2]));
- if(!sel) {
- int pos;
- if( st->stack->stack_data[st->start+3].type!=C_POS ){
- printf("script: jump_zero: not label !\n");
- st->state=END;
- return 0;
- }
-
- pos=conv_num(st,& (st->stack->stack_data[st->start+3]));
- st->pos=pos;
- st->state=GOTO;
- // printf("script: jump_zero: jumpto : %d\n",pos);
- } else {
- // printf("script: jump_zero: fail\n");
- }
- return 0;
-}
-
-int buildin_select(struct script_state *st)
-{
- char *buf;
- int len,i;
- struct map_session_data *sd;
-
- sd=script_rid2sd(st);
-
- if(sd->state.menu_or_input==0){
- st->state=RERUNLINE;
- sd->state.menu_or_input=1;
- for(i=st->start+2,len=16;i<st->end;i++){
- conv_str(st,& (st->stack->stack_data[i]));
- len+=strlen(st->stack->stack_data[i].u.str)+1;
- }
- buf=(char *)aCalloc(len+1,sizeof(char));
- buf[0]=0;
- for(i=st->start+2,len=0;i<st->end;i++){
- strcat(buf,st->stack->stack_data[i].u.str);
- strcat(buf,":");
- }
- clif_scriptmenu(script_rid2sd(st),st->oid,buf);
- aFree(buf);
- } else if(sd->npc_menu==0xff){ // cansel
- sd->state.menu_or_input=0;
- st->state=END;
- } else {
- pc_setreg(sd,add_str((unsigned char *) "l15"),sd->npc_menu);
- pc_setreg(sd,add_str((unsigned char *) "@menu"),sd->npc_menu);
- sd->state.menu_or_input=0;
- push_val(st->stack,C_INT,sd->npc_menu);
- }
- return 0;
-}
-
-/*==========================================
- * GetMapMobs
- returns mob counts on a set map:
- e.g. GetMapMobs("prontera.gat")
- use "this" - for player's map
- *------------------------------------------
- */
-int buildin_getmapmobs(struct script_state *st)
-{
- char *str=NULL;
- int m=-1,bx,by,i;
- int count=0,c;
- struct block_list *bl;
-
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
-
- if(strcmp(str,"this")==0){
- struct map_session_data *sd=script_rid2sd(st);
- if(sd)
- m=sd->bl.m;
- else{
- push_val(st->stack,C_INT,-1);
- return 0;
- }
- }else
- m=map_mapname2mapid(str);
-
- if(m < 0){
- push_val(st->stack,C_INT,-1);
- return 0;
- }
-
- for(by=0;by<=(map[m].ys-1)/BLOCK_SIZE;by++){
- for(bx=0;bx<=(map[m].xs-1)/BLOCK_SIZE;bx++){
- bl = map[m].block_mob[bx+by*map[m].bxs];
- c = map[m].block_mob_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next){
- if(bl->x>=0 && bl->x<=map[m].xs-1 && bl->y>=0 && bl->y<=map[m].ys-1)
- count++;
- }
- }
- }
- push_val(st->stack,C_INT,count);
- return 0;
-}
-
-/*==========================================
- * movenpc [MouseJstr]
- *------------------------------------------
- */
-
-int buildin_movenpc(struct script_state *st)
-{
- struct map_session_data *sd;
- char *map,*npc;
- int x,y;
-
- sd = script_rid2sd(st);
-
- map = conv_str(st,& (st->stack->stack_data[st->start+2]));
- x = conv_num(st,& (st->stack->stack_data[st->start+3]));
- y = conv_num(st,& (st->stack->stack_data[st->start+4]));
- npc = conv_str(st,& (st->stack->stack_data[st->start+5]));
-
- return 0;
-}
-
-/*==========================================
- * message [MouseJstr]
- *------------------------------------------
- */
-
-int buildin_message(struct script_state *st)
-{
- struct map_session_data *sd;
- char *msg,*player;
- struct map_session_data *pl_sd = NULL;
-
- sd = script_rid2sd(st);
-
- player = conv_str(st,& (st->stack->stack_data[st->start+2]));
- msg = conv_str(st,& (st->stack->stack_data[st->start+3]));
-
- if((pl_sd=map_nick2sd((char *) player)) == NULL)
- return 1;
- clif_displaymessage(pl_sd->fd, msg);
-
- return 0;
-}
-
-/*==========================================
- * npctalk (sends message to surrounding
- * area) [Valaris]
- *------------------------------------------
- */
-
-int buildin_npctalk(struct script_state *st)
-{
- char *str;
- char message[255];
-
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
-
- if(nd) {
- memcpy(message,nd->name,24);
- strcat(message," : ");
- strcat(message,str);
- clif_message(&(nd->bl), message);
- }
-
- return 0;
-}
-
-/*==========================================
- * hasitems (checks to see if player has any
- * items on them, if so will return a 1)
- * [Valaris]
- *------------------------------------------
- */
-
-int buildin_hasitems(struct script_state *st)
-{
- int i;
- struct map_session_data *sd;
-
- sd=script_rid2sd(st);
-
- for(i=0; i<MAX_INVENTORY; i++) {
- if(sd->status.inventory[i].amount) {
- push_val(st->stack,C_INT,1);
- return 0;
- }
- }
-
- push_val(st->stack,C_INT,0);
-
- return 0;
-}
-// change npc walkspeed [Valaris]
-int buildin_npcspeed(struct script_state *st)
-{
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
- int x=0;
-
- x=conv_num(st,& (st->stack->stack_data[st->start+2]));
-
- if(nd) {
- nd->speed=x;
- }
-
- return 0;
-}
-// make an npc walk to a position [Valaris]
-int buildin_npcwalkto(struct script_state *st)
-{
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
- int x=0,y=0;
-
- x=conv_num(st,& (st->stack->stack_data[st->start+2]));
- y=conv_num(st,& (st->stack->stack_data[st->start+3]));
-
- if(nd) {
- npc_walktoxy(nd,x,y,0);
- }
-
- return 0;
-}
-// stop an npc's movement [Valaris]
-int buildin_npcstop(struct script_state *st)
-{
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
-
- if(nd) {
- if(nd->state.state==MS_WALK)
- npc_stop_walking(nd,1);
- }
-
- return 0;
-}
-
-
-/*==========================================
- * getlook char info. getlook(arg)
- *------------------------------------------
- */
-int buildin_getlook(struct script_state *st){
- int type,val;
- struct map_session_data *sd;
- sd=script_rid2sd(st);
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- val=-1;
- switch(type){
- case LOOK_HAIR: //1
- val=sd->status.hair;
- break;
- case LOOK_WEAPON: //2
- val=sd->status.weapon;
- break;
- case LOOK_HEAD_BOTTOM: //3
- val=sd->status.head_bottom;
- break;
- case LOOK_HEAD_TOP: //4
- val=sd->status.head_top;
- break;
- case LOOK_HEAD_MID: //5
- val=sd->status.head_mid;
- break;
- case LOOK_HAIR_COLOR: //6
- val=sd->status.hair_color;
- break;
- case LOOK_CLOTHES_COLOR: //7
- val=sd->status.clothes_color;
- break;
- case LOOK_SHIELD: //8
- val=sd->status.shield;
- break;
- case LOOK_SHOES: //9
- break;
- }
-
- push_val(st->stack,C_INT,val);
- return 0;
-}
-
-/*==========================================
- * get char save point. argument: 0- map name, 1- x, 2- y
- *------------------------------------------
-*/
-int buildin_getsavepoint(struct script_state *st)
-{
- int x,y,type;
- char *mapname;
- struct map_session_data *sd;
-
- sd=script_rid2sd(st);
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- mapname=(char *) aCallocA(24, 1);
-
- x=sd->status.save_point.x;
- y=sd->status.save_point.y;
- strncpy(mapname,sd->status.save_point.map,24);
- switch(type){
- case 0:
- push_str(st->stack,C_STR,(unsigned char *) mapname);
- break;
- case 1:
- push_val(st->stack,C_INT,x);
- break;
- case 2:
- push_val(st->stack,C_INT,y);
- break;
- }
- return 0;
-}
-
-/*==========================================
- * Get position for char/npc/pet/mob objects. Added by Lorky
- *
- * int getMapXY(MapName$,MaxX,MapY,type,[CharName$]);
- * where type:
- * MapName$ - String variable for output map name
- * MapX - Integer variable for output coord X
- * MapY - Integer variable for output coord Y
- * type - type of object
- * 0 - Character coord
- * 1 - NPC coord
- * 2 - Pet coord
- * 3 - Mob coord (not released)
- * CharName$ - Name object. If miss or "this" the current object
- *
- * Return:
- * 0 - success
- * -1 - some error, MapName$,MapX,MapY contains unknown value.
- *------------------------------------------
-*/
-int buildin_getmapxy(struct script_state *st){
- struct map_session_data *sd=NULL;
- struct npc_data *nd;
- struct pet_data *pd;
-
- int num;
- char *name;
- char prefix;
-
- int x,y,type;
- char *mapname;
-
- if( st->stack->stack_data[st->start+2].type!=C_NAME ){
- printf("script: buildin_getmapxy: not mapname variable\n");
- push_val(st->stack,C_INT,-1);
- return 0;
- }
- if( st->stack->stack_data[st->start+3].type!=C_NAME ){
- printf("script: buildin_getmapxy: not mapx variable\n");
- push_val(st->stack,C_INT,-1);
- return 0;
- }
- if( st->stack->stack_data[st->start+4].type!=C_NAME ){
- printf("script: buildin_getmapxy: not mapy variable\n");
- push_val(st->stack,C_INT,-1);
- return 0;
- }
-
-//??????????? >>> Possible needly check function parameters on C_STR,C_INT,C_INT <<< ???????????//
- type=conv_num(st,& (st->stack->stack_data[st->start+5]));
- mapname=(char *) aCallocA(24, 1);
-
- switch (type){
- case 0: //Get Character Position
- if( st->end>st->start+6 )
- sd=map_nick2sd(conv_str(st,& (st->stack->stack_data[st->start+6])));
- else
- sd=script_rid2sd(st);
-
- if ( sd==NULL ) { //wrong char name or char offline
- push_val(st->stack,C_INT,-1);
- return 0;
- }
-
-
- x=sd->bl.x;
- y=sd->bl.y;
- strncpy(mapname,sd->mapname,24);
- printf(">>>>%s %d %d\n",mapname,x,y);
- break;
- case 1: //Get NPC Position
- if( st->end > st->start+6 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+6])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
-
- if ( nd==NULL ) { //wrong npc name or char offline
- push_val(st->stack,C_INT,-1);
- return 0;
- }
-
- x=nd->bl.x;
- y=nd->bl.y;
- strncpy(mapname,map[nd->bl.m].name,24);
- printf(">>>>%s %d %d\n",mapname,x,y);
- break;
- case 2: //Get Pet Position
- if( st->end>st->start+6 )
- sd=map_nick2sd(conv_str(st,& (st->stack->stack_data[st->start+6])));
- else
- sd=script_rid2sd(st);
-
- if ( sd==NULL ) { //wrong char name or char offline
- push_val(st->stack,C_INT,-1);
- return 0;
- }
-
- pd=sd->pd;
-
- if(pd==NULL){ //ped data not found
- push_val(st->stack,C_INT,-1);
- return 0;
- }
- x=pd->bl.x;
- y=pd->bl.y;
- strncpy(mapname,map[pd->bl.m].name,24);
-
- printf(">>>>%s %d %d\n",mapname,x,y);
- break;
-
- case 3: //Get Mob Position
- push_val(st->stack,C_INT,-1);
- return 0;
- default: //Wrong type parameter
- push_val(st->stack,C_INT,-1);
- return 0;
- }
-
- //Set MapName$
- num=st->stack->stack_data[st->start+2].u.num;
- name=(char *)(str_buf+str_data[num&0x00ffffff].str);
- prefix=*name;
-
- if( prefix!='$' )
- sd=script_rid2sd(st);
- else
- sd=NULL;
-
- set_reg(sd,num,name,(void*)mapname);
-
- //Set MapX
- num=st->stack->stack_data[st->start+3].u.num;
- name=(char *)(str_buf+str_data[num&0x00ffffff].str);
- prefix=*name;
-
- if( prefix!='$' )
- sd=script_rid2sd(st);
- else
- sd=NULL;
- set_reg(sd,num,name,(void*)x);
-
-
- //Set MapY
- num=st->stack->stack_data[st->start+4].u.num;
- name=(char *)(str_buf+str_data[num&0x00ffffff].str);
- prefix=*name;
-
- if( prefix!='$' )
- sd=script_rid2sd(st);
- else
- sd=NULL;
-
- set_reg(sd,num,name,(void*)y);
-
- //Return Success value
- push_val(st->stack,C_INT,0);
- return 0;
-}
-
-/*=====================================================
- * Allows players to use a skill - by Qamera
- *-----------------------------------------------------
- */
-int buildin_skilluseid (struct script_state *st)
-{
- int skid,sklv;
- struct map_session_data *sd;
-
- skid=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sklv=conv_num(st,& (st->stack->stack_data[st->start+3]));
- sd=script_rid2sd(st);
- skill_use_id(sd,sd->status.account_id,skid,sklv);
-
- return 0;
-}
-
-/*=====================================================
- * Allows players to use a skill on a position [Celest]
- *-----------------------------------------------------
- */
-int buildin_skillusepos(struct script_state *st)
-{
- int skid,sklv,x,y;
- struct map_session_data *sd;
-
- skid=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sklv=conv_num(st,& (st->stack->stack_data[st->start+3]));
- x=conv_num(st,& (st->stack->stack_data[st->start+4]));
- y=conv_num(st,& (st->stack->stack_data[st->start+5]));
-
- sd=script_rid2sd(st);
- skill_use_pos(sd,x,y,skid,sklv);
-
- return 0;
-}
-
-/*==========================================
- * Allows player to write NPC logs (i.e. Bank NPC, etc) [Lupus]
- *------------------------------------------
- */
-int buildin_logmes(struct script_state *st)
-{
- if (log_config.npc <= 0 ) return 0;
- conv_str(st,& (st->stack->stack_data[st->start+2]));
- log_npc(script_rid2sd(st),st->stack->stack_data[st->start+2].u.str);
- return 0;
-}
-
-int buildin_summon(struct script_state *st)
-{
- int _class, id;
- char *str,*event="";
- struct map_session_data *sd;
- struct mob_data *md;
-
- sd=script_rid2sd(st);
- if (sd) {
- int tick = gettick();
- str =conv_str(st,& (st->stack->stack_data[st->start+2]));
- _class=conv_num(st,& (st->stack->stack_data[st->start+3]));
- if( st->end>st->start+4 )
- event=conv_str(st,& (st->stack->stack_data[st->start+4]));
-
- id=mob_once_spawn(sd, "this", 0, 0, str,_class,1,event);
- if((md=(struct mob_data *)map_id2bl(id))){
- md->master_id=sd->bl.id;
- md->state.special_mob_ai=1;
- md->mode=mob_db[md->class_].mode|0x04;
- md->deletetimer=add_timer(tick+60000,mob_timer_delete,id,0);
- clif_misceffect2(&md->bl,344);
- }
- clif_skill_poseffect(&sd->bl,AM_CALLHOMUN,1,sd->bl.x,sd->bl.y,tick);
- }
-
- return 0;
-}
-
-int buildin_isnight(struct script_state *st)
-{
- push_val(st->stack,C_INT, (night_flag == 1));
- return 0;
-}
-
-int buildin_isday(struct script_state *st)
-{
- push_val(st->stack,C_INT, (night_flag == 0));
- return 0;
-}
-
-/*================================================
- * Check whether another item/card has been
- * equipped - used for 2/15's cards patch [celest]
- *------------------------------------------------
- */
-int buildin_isequipped(struct script_state *st)
-{
- struct map_session_data *sd;
- int i, j, k, id = 1;
- int ret = -1;
-
- sd = script_rid2sd(st);
-
- for (i=0; id!=0; i++) {
- int flag = 0;
-
- FETCH (i+2, id) else id = 0;
- if (id <= 0)
- continue;
-
- for (j=0; j<10; j++) {
- int index, type;
- index = sd->equip_index[j];
- if(index < 0) continue;
- if(j == 9 && sd->equip_index[8] == index) continue;
- if(j == 5 && sd->equip_index[4] == index) continue;
- if(j == 6 && (sd->equip_index[5] == index || sd->equip_index[4] == index)) continue;
- type = itemdb_type(id);
-
- if(sd->inventory_data[index]) {
- if (type == 4 || type == 5) {
- if (sd->inventory_data[index]->nameid == id)
- flag = 1;
- } else if (type == 6) {
- for(k=0; k<sd->inventory_data[index]->slot; k++) {
- if (sd->status.inventory[index].card[0]!=0x00ff &&
- sd->status.inventory[index].card[0]!=0x00fe &&
- sd->status.inventory[index].card[0]!=(short)0xff00 &&
- sd->status.inventory[index].card[k] == id) {
- flag = 1;
- break;
- }
- }
- }
- if (flag) break;
- }
- }
- if (ret == -1)
- ret = flag;
- else
- ret &= flag;
- if (!ret) break;
- }
-
- push_val(st->stack,C_INT,ret);
- return 0;
-}
-
-/*================================================
- * Check how many items/cards in the list are
- * equipped - used for 2/15's cards patch [celest]
- *------------------------------------------------
- */
-int buildin_isequippedcnt(struct script_state *st)
-{
- struct map_session_data *sd;
- int i, j, k, id = 1;
- int ret = 0;
-
- sd = script_rid2sd(st);
-
- for (i=0; id!=0; i++) {
- FETCH (i+2, id) else id = 0;
- if (id <= 0)
- continue;
-
- for (j=0; j<10; j++) {
- int index, type;
- index = sd->equip_index[j];
- if(index < 0) continue;
- if(j == 9 && sd->equip_index[8] == index) continue;
- if(j == 5 && sd->equip_index[4] == index) continue;
- if(j == 6 && (sd->equip_index[5] == index || sd->equip_index[4] == index)) continue;
- type = itemdb_type(id);
-
- if(sd->inventory_data[index]) {
- if (type == 4 || type == 5) {
- if (sd->inventory_data[index]->nameid == id)
- ret++; //[Lupus]
- } else if (type == 6) {
- for(k=0; k<sd->inventory_data[index]->slot; k++) {
- if (sd->status.inventory[index].card[0]!=0x00ff &&
- sd->status.inventory[index].card[0]!=0x00fe &&
- sd->status.inventory[index].card[0]!=(short)0xff00 &&
- sd->status.inventory[index].card[k] == id) {
- ret++; //[Lupus]
- }
- }
- }
- }
- }
- }
-
- push_val(st->stack,C_INT,ret);
- return 0;
-}
-
-/*================================================
- * Check how many given inserted cards in the CURRENT
- * weapon - used for 2/15's cards patch [Lupus]
- *------------------------------------------------
- */
-int buildin_cardscnt(struct script_state *st)
-{
- struct map_session_data *sd;
- int i, k, id = 1;
- int ret = 0;
- int index, type;
-
- sd = script_rid2sd(st);
-
- for (i=0; id!=0; i++) {
- FETCH (i+2, id) else id = 0;
- if (id <= 0)
- continue;
-
- index = current_equip_item_index; //we get CURRENT WEAPON inventory index from status.c [Lupus]
- if(index < 0) continue;
-
- type = itemdb_type(id);
-
- if(sd->inventory_data[index]) {
- if (type == 4 || type == 5) {
- if (sd->inventory_data[index]->nameid == id)
- ret++;
- } else if (type == 6) {
- for(k=0; k<sd->inventory_data[index]->slot; k++) {
- if (sd->status.inventory[index].card[0]!=0x00ff &&
- sd->status.inventory[index].card[0]!=0x00fe &&
- sd->status.inventory[index].card[0]!=(short)0xff00 &&
- sd->status.inventory[index].card[k] == id) {
- ret++;
- }
- }
- }
- }
- }
- push_val(st->stack,C_INT,ret);
-// push_val(st->stack,C_INT,current_equip_item_index);
- return 0;
-}
-
-/*=======================================================
- * Returns the refined number of the current item, or an
- * item with inventory index specified
- *-------------------------------------------------------
- */
-int buildin_getrefine(struct script_state *st)
-{
- struct map_session_data *sd;
- if ((sd = script_rid2sd(st))!= NULL)
- push_val(st->stack, C_INT, sd->status.inventory[current_equip_item_index].refine);
- return 0;
-}
-
-//
-// ŽÀs•”main
-//
-/*==========================================
- * ƒRƒ}ƒ“ƒh‚Ì“Ç‚ÝŽæ‚è
- *------------------------------------------
- */
-static int unget_com_data=-1;
-int get_com(unsigned char *script,int *pos)
-{
- int i,j;
- if(unget_com_data>=0){
- i=unget_com_data;
- unget_com_data=-1;
- return i;
- }
- if(script[*pos]>=0x80){
- return C_INT;
- }
- i=0; j=0;
- while(script[*pos]>=0x40){
- i=script[(*pos)++]<<j;
- j+=6;
- }
- return i+(script[(*pos)++]<<j);
-}
-
-/*==========================================
- * ƒRƒ}ƒ“ƒh‚̃vƒbƒVƒ…ƒoƒbƒN
- *------------------------------------------
- */
-void unget_com(int c)
-{
- if(unget_com_data!=-1){
- if(battle_config.error_log)
- printf("unget_com can back only 1 data\n");
- }
- unget_com_data=c;
-}
-
-/*==========================================
- * ”’l‚ÌŠ“¾
- *------------------------------------------
- */
-int get_num(unsigned char *script,int *pos)
-{
- int i,j;
- i=0; j=0;
- while(script[*pos]>=0xc0){
- i+=(script[(*pos)++]&0x7f)<<j;
- j+=6;
- }
- return i+((script[(*pos)++]&0x7f)<<j);
-}
-
-/*==========================================
- * ƒXƒ^ƒbƒN‚©‚ç’l‚ðŽæ‚èo‚·
- *------------------------------------------
- */
-int pop_val(struct script_state* st)
-{
- if(st->stack->sp<=0)
- return 0;
- st->stack->sp--;
- get_val(st,&(st->stack->stack_data[st->stack->sp]));
- if(st->stack->stack_data[st->stack->sp].type==C_INT)
- return st->stack->stack_data[st->stack->sp].u.num;
- return 0;
-}
-
-#define isstr(c) ((c).type==C_STR || (c).type==C_CONSTSTR)
-
-/*==========================================
- * ‰ÁŽZ‰‰ŽZŽq
- *------------------------------------------
- */
-void op_add(struct script_state* st)
-{
- st->stack->sp--;
- get_val(st,&(st->stack->stack_data[st->stack->sp]));
- get_val(st,&(st->stack->stack_data[st->stack->sp-1]));
-
- if(isstr(st->stack->stack_data[st->stack->sp]) || isstr(st->stack->stack_data[st->stack->sp-1])){
- conv_str(st,&(st->stack->stack_data[st->stack->sp]));
- conv_str(st,&(st->stack->stack_data[st->stack->sp-1]));
- }
- if(st->stack->stack_data[st->stack->sp].type==C_INT){ // ii
- st->stack->stack_data[st->stack->sp-1].u.num += st->stack->stack_data[st->stack->sp].u.num;
- } else { // ss‚Ì—\’è
- char *buf;
- buf=(char *)aCallocA(strlen(st->stack->stack_data[st->stack->sp-1].u.str)+
- strlen(st->stack->stack_data[st->stack->sp].u.str)+1,sizeof(char));
- strcpy(buf,st->stack->stack_data[st->stack->sp-1].u.str);
- strcat(buf,st->stack->stack_data[st->stack->sp].u.str);
- if(st->stack->stack_data[st->stack->sp-1].type==C_STR)
- aFree(st->stack->stack_data[st->stack->sp-1].u.str);
- if(st->stack->stack_data[st->stack->sp].type==C_STR)
- aFree(st->stack->stack_data[st->stack->sp].u.str);
- st->stack->stack_data[st->stack->sp-1].type=C_STR;
- st->stack->stack_data[st->stack->sp-1].u.str=buf;
- }
-}
-
-/*==========================================
- * “ñ€‰‰ŽZŽq(•¶Žš—ñ)
- *------------------------------------------
- */
-void op_2str(struct script_state *st,int op,int sp1,int sp2)
-{
- char *s1=st->stack->stack_data[sp1].u.str,
- *s2=st->stack->stack_data[sp2].u.str;
- int a=0;
-
- switch(op){
- case C_EQ:
- a= (strcmp(s1,s2)==0);
- break;
- case C_NE:
- a= (strcmp(s1,s2)!=0);
- break;
- case C_GT:
- a= (strcmp(s1,s2)> 0);
- break;
- case C_GE:
- a= (strcmp(s1,s2)>=0);
- break;
- case C_LT:
- a= (strcmp(s1,s2)< 0);
- break;
- case C_LE:
- a= (strcmp(s1,s2)<=0);
- break;
- default:
- printf("illegal string operater\n");
- break;
- }
-
- push_val(st->stack,C_INT,a);
-
- if(st->stack->stack_data[sp1].type==C_STR) aFree(s1);
- if(st->stack->stack_data[sp2].type==C_STR) aFree(s2);
-}
-/*==========================================
- * “ñ€‰‰ŽZŽq(”’l)
- *------------------------------------------
- */
-void op_2num(struct script_state *st,int op,int i1,int i2)
-{
- switch(op){
- case C_SUB:
- i1-=i2;
- break;
- case C_MUL:
- {
- #ifndef _MSC_VER
- long long res = i1 * i2;
- #else
- __int64 res = i1 * i2;
- #endif
- if (res > 2147483647 )
- i1 = 2147483647;
- else
- i1*=i2;
- }
- break;
- case C_DIV:
- i1/=i2;
- break;
- case C_MOD:
- i1%=i2;
- break;
- case C_AND:
- i1&=i2;
- break;
- case C_OR:
- i1|=i2;
- break;
- case C_XOR:
- i1^=i2;
- break;
- case C_LAND:
- i1=i1&&i2;
- break;
- case C_LOR:
- i1=i1||i2;
- break;
- case C_EQ:
- i1=i1==i2;
- break;
- case C_NE:
- i1=i1!=i2;
- break;
- case C_GT:
- i1=i1>i2;
- break;
- case C_GE:
- i1=i1>=i2;
- break;
- case C_LT:
- i1=i1<i2;
- break;
- case C_LE:
- i1=i1<=i2;
- break;
- case C_R_SHIFT:
- i1=i1>>i2;
- break;
- case C_L_SHIFT:
- i1=i1<<i2;
- break;
- }
- push_val(st->stack,C_INT,i1);
-}
-/*==========================================
- * “ñ€‰‰ŽZŽq
- *------------------------------------------
- */
-void op_2(struct script_state *st,int op)
-{
- int i1,i2;
- char *s1=NULL,*s2=NULL;
-
- i2=pop_val(st);
- if( isstr(st->stack->stack_data[st->stack->sp]) )
- s2=st->stack->stack_data[st->stack->sp].u.str;
-
- i1=pop_val(st);
- if( isstr(st->stack->stack_data[st->stack->sp]) )
- s1=st->stack->stack_data[st->stack->sp].u.str;
-
- if( s1!=NULL && s2!=NULL ){
- // ss => op_2str
- op_2str(st,op,st->stack->sp,st->stack->sp+1);
- }else if( s1==NULL && s2==NULL ){
- // ii => op_2num
- op_2num(st,op,i1,i2);
- }else{
- // si,is => error
- printf("script: op_2: int&str, str&int not allow.");
- push_val(st->stack,C_INT,0);
- }
-}
-
-/*==========================================
- * ’P€‰‰ŽZŽq
- *------------------------------------------
- */
-void op_1num(struct script_state *st,int op)
-{
- int i1;
- i1=pop_val(st);
- switch(op){
- case C_NEG:
- i1=-i1;
- break;
- case C_NOT:
- i1=~i1;
- break;
- case C_LNOT:
- i1=!i1;
- break;
- }
- push_val(st->stack,C_INT,i1);
-}
-
-
-/*==========================================
- * ŠÖ”‚ÌŽÀs
- *------------------------------------------
- */
-int run_func(struct script_state *st)
-{
- int i,start_sp,end_sp,func;
-
- end_sp=st->stack->sp;
- for(i=end_sp-1;i>=0 && st->stack->stack_data[i].type!=C_ARG;i--);
- if(i==0){
- if(battle_config.error_log)
- printf("function not found\n");
-// st->stack->sp=0;
- st->state=END;
- return 0;
- }
- start_sp=i-1;
- st->start=i-1;
- st->end=end_sp;
-
- func=st->stack->stack_data[st->start].u.num;
- if( st->stack->stack_data[st->start].type!=C_NAME || str_data[func].type!=C_FUNC ){
- printf("run_func: not function and command! \n");
-// st->stack->sp=0;
- st->state=END;
- return 0;
- }
-#ifdef DEBUG_RUN
- if(battle_config.etc_log) {
- printf("run_func : %s? (%d(%d))\n",str_buf+str_data[func].str,func,str_data[func].type);
- printf("stack dump :");
- for(i=0;i<end_sp;i++){
- switch(st->stack->stack_data[i].type){
- case C_INT:
- printf(" int(%d)",st->stack->stack_data[i].u.num);
- break;
- case C_NAME:
- printf(" name(%s)",str_buf+str_data[st->stack->stack_data[i].u.num].str);
- break;
- case C_ARG:
- printf(" arg");
- break;
- case C_POS:
- printf(" pos(%d)",st->stack->stack_data[i].u.num);
- break;
- default:
- printf(" %d,%d",st->stack->stack_data[i].type,st->stack->stack_data[i].u.num);
- }
- }
- printf("\n");
- }
-#endif
- if(str_data[func].func){
- str_data[func].func(st);
- } else {
- if(battle_config.error_log)
- printf("run_func : %s? (%d(%d))\n",str_buf+str_data[func].str,func,str_data[func].type);
- push_val(st->stack,C_INT,0);
- }
-
- pop_stack(st->stack,start_sp,end_sp);
-
- if(st->state==RETFUNC){
- // ƒ†[ƒU[’è‹`ŠÖ”‚©‚ç‚Ì•œ‹A
- int olddefsp=st->defsp;
- int i;
-
- pop_stack(st->stack,st->defsp,start_sp); // •œ‹A‚Ɏז‚‚ȃXƒ^ƒbƒNíœ
- if(st->defsp<4 || st->stack->stack_data[st->defsp-1].type!=C_RETINFO){
- printf("script:run_func(return) return without callfunc or callsub!\n");
- st->state=END;
- return 0;
- }
- i = conv_num(st,& (st->stack->stack_data[st->defsp-4])); // ˆø”‚Ì”Š“¾
- st->pos=conv_num(st,& (st->stack->stack_data[st->defsp-1])); // ƒXƒNƒŠƒvƒgˆÊ’u‚Ì•œŒ³
- st->script=(char*)conv_num(st,& (st->stack->stack_data[st->defsp-2])); // ƒXƒNƒŠƒvƒg‚𕜌³
- st->defsp=conv_num(st,& (st->stack->stack_data[st->defsp-3])); // Šî€ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚𕜌³
-
- pop_stack(st->stack,olddefsp-4-i,olddefsp); // —v‚ç‚È‚­‚È‚Á‚½ƒXƒ^ƒbƒN(ˆø”‚Æ•œ‹A—pƒf[ƒ^)íœ
-
- st->state=GOTO;
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒNƒŠƒvƒg‚ÌŽÀsƒƒCƒ“•”•ª
- *------------------------------------------
- */
-int run_script_main(char *script,int pos,int rid,int oid,struct script_state *st,char *rootscript)
-{
- int c,rerun_pos;
- int cmdcount=script_config.check_cmdcount;
- int gotocount=script_config.check_gotocount;
- struct script_stack *stack=st->stack;
-
- st->defsp=stack->sp;
- st->script=script;
-
- rerun_pos=st->pos;
- for(st->state=0;st->state==0;){
- switch(c= get_com((unsigned char *) script,&st->pos)){
- case C_EOL:
- if(stack->sp!=st->defsp){
- if(battle_config.error_log)
- printf("stack.sp(%d) != default(%d)\n",stack->sp,st->defsp);
- stack->sp=st->defsp;
- }
- rerun_pos=st->pos;
- break;
- case C_INT:
- push_val(stack,C_INT,get_num((unsigned char *) script,&st->pos));
- break;
- case C_POS:
- case C_NAME:
- push_val(stack,c,(*(int*)(script+st->pos))&0xffffff);
- st->pos+=3;
- break;
- case C_ARG:
- push_val(stack,c,0);
- break;
- case C_STR:
- push_str(stack,C_CONSTSTR,(unsigned char *) (script+st->pos));
- while(script[st->pos++]);
- break;
- case C_FUNC:
- run_func(st);
- if(st->state==GOTO){
- rerun_pos=st->pos;
- script=st->script;
- st->state=0;
- if( gotocount>0 && (--gotocount)<=0 ){
- printf("run_script: infinity loop !\n");
- st->state=END;
- }
- }
- break;
-
- case C_ADD:
- op_add(st);
- break;
-
- case C_SUB:
- case C_MUL:
- case C_DIV:
- case C_MOD:
- case C_EQ:
- case C_NE:
- case C_GT:
- case C_GE:
- case C_LT:
- case C_LE:
- case C_AND:
- case C_OR:
- case C_XOR:
- case C_LAND:
- case C_LOR:
- case C_R_SHIFT:
- case C_L_SHIFT:
- op_2(st,c);
- break;
-
- case C_NEG:
- case C_NOT:
- case C_LNOT:
- op_1num(st,c);
- break;
-
- case C_NOP:
- st->state=END;
- break;
-
- default:
- if(battle_config.error_log)
- printf("unknown command : %d @ %d\n",c,pos);
- st->state=END;
- break;
- }
- if( cmdcount>0 && (--cmdcount)<=0 ){
- printf("run_script: infinity loop !\n");
- st->state=END;
- }
- }
- switch(st->state){
- case STOP:
- break;
- case END:
- {
- struct map_session_data *sd=map_id2sd(st->rid);
- st->pos=-1;
- if(sd && sd->npc_id==st->oid)
- npc_event_dequeue(sd);
- }
- break;
- case RERUNLINE:
- {
- st->pos=rerun_pos;
- }
- break;
- }
-
- if( st->state!=END){
- // ÄŠJ‚·‚邽‚߂ɃXƒ^ƒbƒNî•ñ‚ð•Û‘¶
- struct map_session_data *sd=map_id2sd(st->rid);
- if(sd/* && sd->npc_stackbuf==NULL*/){
- if( sd->npc_stackbuf )
- aFree( sd->npc_stackbuf );
- sd->npc_stackbuf = (char *)aCalloc(sizeof(stack->stack_data[0])*stack->sp_max,sizeof(char));
- memcpy(sd->npc_stackbuf, stack->stack_data, sizeof(stack->stack_data[0]) * stack->sp_max);
- sd->npc_stack = stack->sp;
- sd->npc_stackmax = stack->sp_max;
- sd->npc_script=script;
- sd->npc_scriptroot=rootscript;
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒNƒŠƒvƒg‚ÌŽÀs
- *------------------------------------------
- */
-int run_script(char *script,int pos,int rid,int oid)
-{
- struct script_stack stack;
- struct script_state st;
- struct map_session_data *sd=map_id2sd(rid);
- char *rootscript=script;
-
- if(script==NULL || pos<0)
- return -1;
-
- if(sd && sd->npc_stackbuf && sd->npc_scriptroot==rootscript){
- // ‘O‰ñ‚̃Xƒ^ƒbƒN‚𕜋A
- script=sd->npc_script;
- stack.sp=sd->npc_stack;
- stack.sp_max=sd->npc_stackmax;
- stack.stack_data=(struct script_data *)aCalloc(stack.sp_max,sizeof(stack.stack_data[0]));
- memcpy(stack.stack_data,sd->npc_stackbuf,sizeof(stack.stack_data[0])*stack.sp_max);
- aFree(sd->npc_stackbuf);
- sd->npc_stackbuf=NULL;
- }else{
- // ƒXƒ^ƒbƒN‰Šú‰»
- stack.sp=0;
- stack.sp_max=64;
- stack.stack_data=(struct script_data *)aCalloc(stack.sp_max,sizeof(stack.stack_data[0]));
- }
- st.stack=&stack;
- st.pos=pos;
- st.rid=rid;
- st.oid=oid;
- run_script_main(script,pos,rid,oid,&st,rootscript);
-
- aFree(stack.stack_data);
- stack.stack_data=NULL;
- return st.pos;
-}
-
-
-/*==========================================
- * ƒ}ƒbƒv•Ï”‚Ì•ÏX
- *------------------------------------------
- */
-int mapreg_setreg(int num,int val)
-{
- if(val!=0)
- numdb_insert(mapreg_db,num,val);
- else
- numdb_erase(mapreg_db,num);
-
- mapreg_dirty=1;
- return 0;
-}
-/*==========================================
- * •¶Žš—ñŒ^ƒ}ƒbƒv•Ï”‚Ì•ÏX
- *------------------------------------------
- */
-int mapreg_setregstr(int num,const char *str)
-{
- char *p;
-
- if( (p=(char *) numdb_search(mapregstr_db,num))!=NULL )
- aFree(p);
-
- if( str==NULL || *str==0 ){
- numdb_erase(mapregstr_db,num);
- mapreg_dirty=1;
- return 0;
- }
- p=(char *)aCallocA(strlen(str)+1, sizeof(char));
- strcpy(p,str);
- numdb_insert(mapregstr_db,num,p);
- mapreg_dirty=1;
- return 0;
-}
-
-/*==========================================
- * ‰i‘±“Iƒ}ƒbƒv•Ï”‚Ì“Ç‚Ýž‚Ý
- *------------------------------------------
- */
-static int script_load_mapreg()
-{
- FILE *fp;
- char line[1024];
-
- if( (fp=fopen(mapreg_txt,"rt"))==NULL )
- return -1;
-
- while(fgets(line,sizeof(line),fp)){
- char buf1[256],buf2[1024],*p;
- int n,v,s,i;
- if( sscanf(line,"%255[^,],%d\t%n",buf1,&i,&n)!=2 &&
- (i=0,sscanf(line,"%[^\t]\t%n",buf1,&n)!=1) )
- continue;
- if( buf1[strlen(buf1)-1]=='$' ){
- if( sscanf(line+n,"%[^\n\r]",buf2)!=1 ){
- printf("%s: %s broken data !\n",mapreg_txt,buf1);
- continue;
- }
- p=(char *)aCallocA(strlen(buf2) + 1,sizeof(char));
- strcpy(p,buf2);
- s= add_str((unsigned char *) buf1);
- numdb_insert(mapregstr_db,(i<<24)|s,p);
- }else{
- if( sscanf(line+n,"%d",&v)!=1 ){
- printf("%s: %s broken data !\n",mapreg_txt,buf1);
- continue;
- }
- s= add_str((unsigned char *) buf1);
- numdb_insert(mapreg_db,(i<<24)|s,v);
- }
- }
- fclose(fp);
- mapreg_dirty=0;
- return 0;
-}
-/*==========================================
- * ‰i‘±“Iƒ}ƒbƒv•Ï”‚Ì‘‚«ž‚Ý
- *------------------------------------------
- */
-static int script_save_mapreg_intsub(void *key,void *data,va_list ap)
-{
- FILE *fp=va_arg(ap,FILE*);
- int num=((int)key)&0x00ffffff, i=((int)key)>>24;
- char *name=str_buf+str_data[num].str;
- if( name[1]!='@' ){
- if(i==0)
- fprintf(fp,"%s\t%d\n", name, (int)data);
- else
- fprintf(fp,"%s,%d\t%d\n", name, i, (int)data);
- }
- return 0;
-}
-static int script_save_mapreg_strsub(void *key,void *data,va_list ap)
-{
- FILE *fp=va_arg(ap,FILE*);
- int num=((int)key)&0x00ffffff, i=((int)key)>>24;
- char *name=str_buf+str_data[num].str;
- if( name[1]!='@' ){
- if(i==0)
- fprintf(fp,"%s\t%s\n", name, (char *)data);
- else
- fprintf(fp,"%s,%d\t%s\n", name, i, (char *)data);
- }
- return 0;
-}
-static int script_save_mapreg()
-{
- FILE *fp;
- int lock;
-
- if( (fp=lock_fopen(mapreg_txt,&lock))==NULL )
- return -1;
- numdb_foreach(mapreg_db,script_save_mapreg_intsub,fp);
- numdb_foreach(mapregstr_db,script_save_mapreg_strsub,fp);
- lock_fclose(fp,mapreg_txt,&lock);
- mapreg_dirty=0;
- return 0;
-}
-static int script_autosave_mapreg(int tid,unsigned int tick,int id,int data)
-{
- if(mapreg_dirty)
- script_save_mapreg();
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int set_posword(char *p)
-{
- char* np,* str[15];
- int i=0;
- for(i=0;i<11;i++) {
- if((np=strchr(p,','))!=NULL) {
- str[i]=p;
- *np=0;
- p=np+1;
- } else {
- str[i]=p;
- p+=strlen(p);
- }
- if(str[i])
- strcpy(pos[i],str[i]);
- }
- return 0;
-}
-
-int script_config_read(char *cfgName)
-{
- int i;
- char line[1024],w1[1024],w2[1024];
- FILE *fp;
-
- script_config.warn_func_no_comma=1;
- script_config.warn_cmd_no_comma=1;
- script_config.warn_func_mismatch_paramnum=1;
- script_config.warn_cmd_mismatch_paramnum=1;
- script_config.check_cmdcount=65535;
- script_config.check_gotocount=2048;
-
- script_config.die_event_name = (char *)aCallocA(24,sizeof(char));
- script_config.kill_event_name = (char *)aCallocA(24,sizeof(char));
- script_config.login_event_name = (char *)aCallocA(24,sizeof(char));
- script_config.logout_event_name = (char *)aCallocA(24,sizeof(char));
-
- script_config.event_script_type = 0;
- script_config.event_requires_trigger = 1;
-
- fp=fopen(cfgName,"r");
- if(fp==NULL){
- printf("file not found: %s\n",cfgName);
- return 1;
- }
- while(fgets(line,1020,fp)){
- if(line[0] == '/' && line[1] == '/')
- continue;
- i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
- if(i!=2)
- continue;
- if(strcmpi(w1,"refine_posword")==0) {
- set_posword(w2);
- }
- else if(strcmpi(w1,"warn_func_no_comma")==0) {
- script_config.warn_func_no_comma = battle_config_switch(w2);
- }
- else if(strcmpi(w1,"warn_cmd_no_comma")==0) {
- script_config.warn_cmd_no_comma = battle_config_switch(w2);
- }
- else if(strcmpi(w1,"warn_func_mismatch_paramnum")==0) {
- script_config.warn_func_mismatch_paramnum = battle_config_switch(w2);
- }
- else if(strcmpi(w1,"warn_cmd_mismatch_paramnum")==0) {
- script_config.warn_cmd_mismatch_paramnum = battle_config_switch(w2);
- }
- else if(strcmpi(w1,"check_cmdcount")==0) {
- script_config.check_cmdcount = battle_config_switch(w2);
- }
- else if(strcmpi(w1,"check_gotocount")==0) {
- script_config.check_gotocount = battle_config_switch(w2);
- }
- else if(strcmpi(w1,"event_script_type")==0) {
- script_config.event_script_type = battle_config_switch(w2);
- }
- else if(strcmpi(w1,"die_event_name")==0) {
- strcpy(script_config.die_event_name, w2);
- }
- else if(strcmpi(w1,"kill_event_name")==0) {
- strcpy(script_config.kill_event_name, w2);
- }
- else if(strcmpi(w1,"login_event_name")==0) {
- strcpy(script_config.login_event_name, w2);
- }
- else if(strcmpi(w1,"logout_event_name")==0) {
- strcpy(script_config.logout_event_name, w2);
- }
- else if(strcmpi(w1,"require_set_trigger")==0) {
- script_config.event_requires_trigger = battle_config_switch(w2);
- }
- else if(strcmpi(w1,"import")==0){
- script_config_read(w2);
- }
- }
- fclose(fp);
-
- return 0;
-}
-
-/*==========================================
- * I—¹
- *------------------------------------------
- */
-static int mapreg_db_final(void *key,void *data,va_list ap)
-{
- return 0;
-}
-static int mapregstr_db_final(void *key,void *data,va_list ap)
-{
- aFree(data);
- return 0;
-}
-static int scriptlabel_db_final(void *key,void *data,va_list ap)
-{
- return 0;
-}
-static int userfunc_db_final(void *key,void *data,va_list ap)
-{
- aFree(key);
- aFree(data);
- return 0;
-}
-int do_final_script()
-{
- if(mapreg_dirty>=0)
- script_save_mapreg();
-// if(script_buf)
-// aFree(script_buf);
-
- if(mapreg_db)
- numdb_final(mapreg_db,mapreg_db_final);
- if(mapregstr_db)
- strdb_final(mapregstr_db,mapregstr_db_final);
- if(scriptlabel_db)
- strdb_final(scriptlabel_db,scriptlabel_db_final);
- if(userfunc_db)
- strdb_final(userfunc_db,userfunc_db_final);
-
- if (str_data)
- aFree(str_data);
- if (str_buf)
- aFree(str_buf);
-
- if (script_config.die_event_name)
- aFree(script_config.die_event_name);
- if (script_config.kill_event_name)
- aFree(script_config.kill_event_name);
- if (script_config.login_event_name)
- aFree(script_config.login_event_name);
- if (script_config.logout_event_name)
- aFree(script_config.logout_event_name);
-
- return 0;
-}
-/*==========================================
- * ‰Šú‰»
- *------------------------------------------
- */
-int do_init_script()
-{
- mapreg_db=numdb_init();
- mapregstr_db=numdb_init();
- script_load_mapreg();
-
- add_timer_func_list(script_autosave_mapreg,"script_autosave_mapreg");
- add_timer_interval(gettick()+MAPREG_AUTOSAVE_INTERVAL,
- script_autosave_mapreg,0,0,MAPREG_AUTOSAVE_INTERVAL);
-
- scriptlabel_db=strdb_init(50);
- return 0;
-}
diff --git a/src/map/script.h b/src/map/script.h
deleted file mode 100644
index b30201a67..000000000
--- a/src/map/script.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// $Id: script.h,v 1.2 2004/09/25 05:32:19 MouseJstr Exp $
-#ifndef _SCRIPT_H_
-#define _SCRIPT_H_
-
-extern struct Script_Config {
- int warn_func_no_comma;
- int warn_cmd_no_comma;
- int warn_func_mismatch_paramnum;
- int warn_cmd_mismatch_paramnum;
- int check_cmdcount;
- int check_gotocount;
-
- int event_script_type;
- char* die_event_name;
- char* kill_event_name;
- char* login_event_name;
- char* logout_event_name;
- int event_requires_trigger;
-} script_config;
-
-struct script_data {
- int type;
- union {
- int num;
- char *str;
- } u;
-};
-
-struct script_stack {
- int sp,sp_max;
- struct script_data *stack_data;
-};
-struct script_state {
- struct script_stack *stack;
- int start,end;
- int pos,state;
- int rid,oid;
- char *script,*new_script;
- int defsp,new_pos,new_defsp;
-};
-
-char * parse_script(unsigned char *,int);
-int run_script(char *,int,int,int);
-
-int set_var(struct map_session_data *sd, char *name, void *val);
-int conv_num(struct script_state *st,struct script_data *data);
-char* conv_str(struct script_state *st,struct script_data *data);
-
-struct dbt* script_get_label_db();
-struct dbt* script_get_userfunc_db();
-
-int script_config_read(char *cfgName);
-int do_init_script();
-int do_final_script();
-
-extern char mapreg_txt[];
-
-#endif
-
diff --git a/src/map/skill.c b/src/map/skill.c
deleted file mode 100644
index c53a7a9d6..000000000
--- a/src/map/skill.c
+++ /dev/null
@@ -1,9690 +0,0 @@
-// $Id: skill.c,v 1.8 2004/02/27 5:34:51 PM Celestia $
-/* ƒXƒLƒ‹?ŒW */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-#include "timer.h"
-#include "nullpo.h"
-#include "malloc.h"
-
-#include "skill.h"
-#include "map.h"
-#include "clif.h"
-#include "pc.h"
-#include "status.h"
-#include "pet.h"
-#include "mob.h"
-#include "battle.h"
-#include "party.h"
-#include "itemdb.h"
-#include "script.h"
-#include "intif.h"
-#include "log.h"
-#include "chrif.h"
-#include "guild.h"
-#include "showmsg.h"
-#include "grfio.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-#define SKILLUNITTIMER_INVERVAL 100
-#define STATE_BLIND 0x10
-#define swap(x,y) { int t; t = x; x = y; y = t; }
-
-const struct skill_name_db skill_names[] = {
- { AC_CHARGEARROW, "CHARGEARROW", "Charge_Arrow" } ,
- { AC_CONCENTRATION, "CONCENTRATION", "Improve_Concentration" } ,
- { AC_DOUBLE, "DOUBLE", "Double_Strafe" } ,
- { AC_MAKINGARROW, "MAKINGARROW", "Arrow_Creation" } ,
- { AC_OWL, "OWL", "Owl's_Eye" } ,
- { AC_SHOWER, "SHOWER", "Arrow_Shower" } ,
- { AC_VULTURE, "VULTURE", "Vulture's_Eye" } ,
- { ALL_RESURRECTION, "RESURRECTION", "Resurrection" } ,
- { AL_ANGELUS, "ANGELUS", "Angelus" } ,
- { AL_BLESSING, "BLESSING", "Blessing" } ,
- { AL_CRUCIS, "CRUCIS", "Signum_Crusis" } ,
- { AL_CURE, "CURE", "Cure" } ,
- { AL_DECAGI, "DECAGI", "Decrease_AGI" } ,
- { AL_DEMONBANE, "DEMONBANE", "Demon_Bane" } ,
- { AL_DP, "DP", "Divine_Protection" } ,
- { AL_HEAL, "HEAL", "Heal" } ,
- { AL_HOLYLIGHT, "HOLYLIGHT", "Holy_Light" } ,
- { AL_HOLYWATER, "HOLYWATER", "Aqua_Benedicta" } ,
- { AL_INCAGI, "INCAGI", "Increase_AGI" } ,
- { AL_PNEUMA, "PNEUMA", "Pneuma" } ,
- { AL_RUWACH, "RUWACH", "Ruwach" } ,
- { AL_TELEPORT, "TELEPORT", "Teleport" } ,
- { AL_WARP, "WARP", "Warp_Portal" } ,
- { AM_ACIDTERROR, "ACIDTERROR", "Acid_Terror" } ,
- { AM_AXEMASTERY, "AXEMASTERY", "Axe_Mastery" } ,
- { AM_BERSERKPITCHER, "BERSERKPITCHER", "Berserk Pitcher" } ,
- { AM_BIOETHICS, "BIOETHICS", "Bioethics" } ,
- { AM_BIOTECHNOLOGY, "BIOTECHNOLOGY", "Biotechnology" } ,
- { AM_CALLHOMUN, "CALLHOMUN", "Call_Homunculus" } ,
- { AM_CANNIBALIZE, "CANNIBALIZE", "Bio_Cannibalize" } ,
- { AM_CP_ARMOR, "ARMOR", "Chemical_Protection_Armor" } ,
- { AM_CP_HELM, "HELM", "Chemical_Protection_Helm" } ,
- { AM_CP_SHIELD, "SHIELD", "Chemical_Protection_Shield" } ,
- { AM_CP_WEAPON, "WEAPON", "Chemical_Protection_Weapon" } ,
- { AM_CREATECREATURE, "CREATECREATURE", "Life_Creation" } ,
- { AM_CULTIVATION, "CULTIVATION", "Cultivation" } ,
- { AM_DEMONSTRATION, "DEMONSTRATION", "Demonstration" } ,
- { AM_DRILLMASTER, "DRILLMASTER", "Drillmaster" } ,
- { AM_FLAMECONTROL, "FLAMECONTROL", "Flame_Control" } ,
- { AM_HEALHOMUN, "HEALHOMUN", "Heal_Homunculus" } ,
- { AM_LEARNINGPOTION, "LEARNINGPOTION", "AM_LEARNINGPOTION" } ,
- { AM_PHARMACY, "PHARMACY", "Pharmacy" } ,
- { AM_POTIONPITCHER, "POTIONPITCHER", "Potion_Pitcher" } ,
- { AM_REST, "REST", "Sabbath" } ,
- { AM_RESURRECTHOMUN, "RESURRECTHOMUN", "Ressurect_Homunculus" } ,
- { AM_SPHEREMINE, "SPHEREMINE", "Sphere_Mine" } ,
- { ASC_BREAKER, "BREAKER", "Breaker" } ,
- { ASC_CDP, "CDP", "Create_Deadly_Poison" } ,
- { ASC_EDP, "EDP", "Deadly_Poison_Enchantment" } ,
- { ASC_HALLUCINATION, "HALLUCINATION", "Hallucination_Walk" } ,
- { ASC_KATAR, "KATAR", "Advanced_Katar_Mastery" } ,
- { ASC_METEORASSAULT, "METEORASSAULT", "Meteor_Assault" } ,
- { AS_CLOAKING, "CLOAKING", "Cloaking" } ,
- { AS_ENCHANTPOISON, "ENCHANTPOISON", "Enchant_Poison" } ,
- { AS_GRIMTOOTH, "GRIMTOOTH", "Grimtooth" } ,
- { AS_KATAR, "KATAR", "Katar_Mastery" } ,
- { AS_LEFT, "LEFT", "Lefthand_Mastery" } ,
- { AS_POISONREACT, "POISONREACT", "Poison_React" } ,
- { AS_RIGHT, "RIGHT", "Righthand_Mastery" } ,
- { AS_SONICBLOW, "SONICBLOW", "Sonic_Blow" } ,
- { AS_SPLASHER, "SPLASHER", "Venom_Splasher" } ,
- { AS_VENOMDUST, "VENOMDUST", "Venom_Dust" } ,
- { BA_APPLEIDUN, "APPLEIDUN", "Apple_of_Idun" } ,
- { BA_ASSASSINCROSS, "ASSASSINCROSS", "Assassin_Cross" } ,
- { BA_DISSONANCE, "DISSONANCE", "Dissonance" } ,
- { BA_FROSTJOKE, "FROSTJOKE", "Dumb_Joke" } ,
- { BA_MUSICALLESSON, "MUSICALLESSON", "Musical_Lesson" } ,
- { BA_MUSICALSTRIKE, "MUSICALSTRIKE", "Musical_Strike" } ,
- { BA_POEMBRAGI, "POEMBRAGI", "Poem_of_Bragi" } ,
- { BA_WHISTLE, "WHISTLE", "Whistle" } ,
- { BD_ADAPTATION, "ADAPTATION", "Adaption" } ,
- { BD_DRUMBATTLEFIELD, "DRUMBATTLEFIELD", "Drumb_BattleField" } ,
- { BD_ENCORE, "ENCORE", "Encore" } ,
- { BD_ETERNALCHAOS, "ETERNALCHAOS", "Eternal_Chaos" } ,
- { BD_INTOABYSS, "INTOABYSS", "Into_the_Abyss" } ,
- { BD_LULLABY, "LULLABY", "Lullaby" } ,
- { BD_RAGNAROK, "RAGNAROK", "Ragnarok" } ,
- { BD_RICHMANKIM, "RICHMANKIM", "Rich_Mankim" } ,
- { BD_RINGNIBELUNGEN, "RINGNIBELUNGEN", "Ring_of_Nibelugen" } ,
- { BD_ROKISWEIL, "ROKISWEIL", "Loki's_Wail" } ,
- { BD_SIEGFRIED, "SIEGFRIED", "Invulnerable_Siegfried" } ,
- { BS_ADRENALINE, "ADRENALINE", "Adrenaline_Rush" } ,
- { BS_ADRENALINE2, "ADRENALINE2", "Adrenaline Rush 2" } ,
- { BS_AXE, "AXE", "Smith_Axe" } ,
- { BS_DAGGER, "DAGGER", "Smith_Dagger" } ,
- { BS_ENCHANTEDSTONE, "ENCHANTEDSTONE", "Enchantedstone_Craft" } ,
- { BS_FINDINGORE, "FINDINGORE", "Ore_Discovery" } ,
- { BS_HAMMERFALL, "HAMMERFALL", "Hammer_Fall" } ,
- { BS_HILTBINDING, "HILTBINDING", "Hilt_Binding" } ,
- { BS_IRON, "IRON", "Iron_Tempering" } ,
- { BS_KNUCKLE, "KNUCKLE", "Smith_Knucklebrace" } ,
- { BS_MACE, "MACE", "Smith_Mace" } ,
- { BS_MAXIMIZE, "MAXIMIZE", "Power_Maximize" } ,
- { BS_ORIDEOCON, "ORIDEOCON", "Orideocon_Research" } ,
- { BS_OVERTHRUST, "OVERTHRUST", "Power-Thrust" } ,
- { BS_REPAIRWEAPON, "REPAIRWEAPON", "Weapon_Repair" } ,
- { BS_SKINTEMPER, "SKINTEMPER", "Skin_Tempering" } ,
- { BS_SPEAR, "SPEAR", "Smith_Spear" } ,
- { BS_STEEL, "STEEL", "Steel_Tempering" } ,
- { BS_SWORD, "SWORD", "Smith_Sword" } ,
- { BS_TWOHANDSWORD, "TWOHANDSWORD", "Smith_Two-handed_Sword" } ,
- { BS_WEAPONPERFECT, "WEAPONPERFECT", "Weapon_Perfection" } ,
- { BS_WEAPONRESEARCH, "WEAPONRESEARCH", "Weaponry_Research" } ,
- { CG_ARROWVULCAN, "ARROWVULCAN", "Vulcan_Arrow" } ,
- { CG_MARIONETTE, "MARIONETTE", "Marionette_Control" } ,
- { CG_MOONLIT, "MOONLIT", "Moonlight_Petals" } ,
- { CH_CHAINCRUSH, "CHAINCRUSH", "Chain_Crush_Combo" } ,
- { CH_PALMSTRIKE, "PALMSTRIKE", "Palm_Push_Strike" } ,
- { CH_SOULCOLLECT, "SOULCOLLECT", "Collect_Soul" } ,
- { CH_TIGERFIST, "TIGERFIST", "Tiger_Knuckle_Fist" } ,
- { CR_ALCHEMY, "ALCHEMY", "Alchemy" } ,
- { CR_SLIMPITCHER, "SLIMPITCHER", "Slim_Pitcher" } ,
- { CR_FULLPROTECTION, "FULLPROTECTION", "Full_Chemical_Protection" } ,
- { CR_AUTOGUARD, "AUTOGUARD", "Guard" } ,
- { CR_DEFENDER, "DEFENDER", "Defender" } ,
- { CR_DEVOTION, "DEVOTION", "Sacrifice" } ,
- { CR_GRANDCROSS, "GRANDCROSS", "Grand_Cross" } ,
- { CR_HOLYCROSS, "HOLYCROSS", "Holy_Cross" } ,
- { CR_PROVIDENCE, "PROVIDENCE", "Providence" } ,
- { CR_REFLECTSHIELD, "REFLECTSHIELD", "Shield_Reflect" } ,
- { CR_SHIELDBOOMERANG, "SHIELDBOOMERANG", "Shield_Boomerang" } ,
- { CR_SHIELDCHARGE, "SHIELDCHARGE", "Shield_Charge" } ,
- { CR_SPEARQUICKEN, "SPEARQUICKEN", "Spear_Quicken" } ,
- { CR_SYNTHESISPOTION, "SYNTHESISPOTION", "Potion_Synthesis" } ,
- { CR_TRUST, "TRUST", "Faith" } ,
- { DC_DANCINGLESSON, "DANCINGLESSON", "Dancing_Lesson" } ,
- { DC_DONTFORGETME, "DONTFORGETME", "Don't_Forget_Me" } ,
- { DC_FORTUNEKISS, "FORTUNEKISS", "Fortune_Kiss" } ,
- { DC_HUMMING, "HUMMING", "Humming" } ,
- { DC_SCREAM, "SCREAM", "Scream" } ,
- { DC_SERVICEFORYOU, "SERVICEFORYOU", "Prostitute" } ,
- { DC_THROWARROW, "THROWARROW", "Throw_Arrow" } ,
- { DC_UGLYDANCE, "UGLYDANCE", "Ugly_Dance" } ,
- { GD_BATTLEORDER, "BATTLEORDER", "Battle_Orders" } ,
- { GD_REGENERATION, "REGENERATION", "Regeneration" } ,
- { GD_RESTORE, "RESTORE", "Restore" } ,
- { GD_EMERGENCYCALL, "EMERGENCYCALL", "Emergency_Call" } ,
- { HP_ASSUMPTIO, "ASSUMPTIO", "Assumptio" } ,
- { HP_BASILICA, "BASILICA", "Basilica" } ,
- { HP_MEDITATIO, "MEDITATIO", "Meditation" } ,
- { HT_ANKLESNARE, "ANKLESNARE", "Ankle_Snare" } ,
- { HT_BEASTBANE, "BEASTBANE", "Beast_Bane" } ,
- { HT_BLASTMINE, "BLASTMINE", "Blast_Mine" } ,
- { HT_BLITZBEAT, "BLITZBEAT", "Blitz_Beat" } ,
- { HT_CLAYMORETRAP, "CLAYMORETRAP", "Claymore_Trap" } ,
- { HT_DETECTING, "DETECTING", "Detect" } ,
- { HT_FALCON, "FALCON", "Falconry_Mastery" } ,
- { HT_FLASHER, "FLASHER", "Flasher" } ,
- { HT_FREEZINGTRAP, "FREEZINGTRAP", "Freezing_Trap" } ,
- { HT_LANDMINE, "LANDMINE", "Land_Mine" } ,
- { HT_REMOVETRAP, "REMOVETRAP", "Remove_Trap" } ,
- { HT_SANDMAN, "SANDMAN", "Sandman" } ,
- { HT_SHOCKWAVE, "SHOCKWAVE", "Shockwave_Trap" } ,
- { HT_SKIDTRAP, "SKIDTRAP", "Skid_Trap" } ,
- { HT_SPRINGTRAP, "SPRINGTRAP", "Spring_Trap" } ,
- { HT_STEELCROW, "STEELCROW", "Steel_Crow" } ,
- { HT_TALKIEBOX, "TALKIEBOX", "Talkie_Box" } ,
- { HW_MAGICCRASHER, "MAGICCRASHER", "Magic_Crasher" } ,
- { HW_MAGICPOWER, "MAGICPOWER", "Magic_Power" } ,
- { HW_NAPALMVULCAN, "NAPALMVULCAN", "Napalm_Vulcan" } ,
- { HW_SOULDRAIN, "SOULDRAIN", "Soul_Drain" } ,
- { ITM_TOMAHAWK, "TOMAHAWK", "Throw_Tomahawk" } ,
- { KN_AUTOCOUNTER, "AUTOCOUNTER", "Counter_Attack" } ,
- { KN_BOWLINGBASH, "BOWLINGBASH", "Bowling_Bash" } ,
- { KN_BRANDISHSPEAR, "BRANDISHSPEAR", "Brandish_Spear" } ,
- { KN_CAVALIERMASTERY, "CAVALIERMASTERY", "Cavalier_Mastery" } ,
- { KN_PIERCE, "PIERCE", "Pierce" } ,
- { KN_RIDING, "RIDING", "Peco_Peco_Ride" } ,
- { KN_SPEARBOOMERANG, "SPEARBOOMERANG", "Spear_Boomerang" } ,
- { KN_SPEARMASTERY, "SPEARMASTERY", "Spear_Mastery" } ,
- { KN_SPEARSTAB, "SPEARSTAB", "Spear_Stab" } ,
- { KN_TWOHANDQUICKEN, "TWOHANDQUICKEN", "Twohand_Quicken" } ,
- { LK_AURABLADE, "AURABLADE", "Aura_Blade" } ,
- { LK_BERSERK, "BERSERK", "Berserk" } ,
- { LK_CONCENTRATION, "CONCENTRATION", "Concentration" } ,
- { LK_FURY, "FURY", "LK_FURY" } ,
- { LK_HEADCRUSH, "HEADCRUSH", "Head_Crusher" } ,
- { LK_JOINTBEAT, "JOINTBEAT", "Joint_Beat" } ,
- { LK_PARRYING, "PARRYING", "Parrying" } ,
- { LK_SPIRALPIERCE, "SPIRALPIERCE", "Spiral_Pierce" } ,
- { LK_TENSIONRELAX, "TENSIONRELAX", "Tension_Relax" } ,
- { MC_CARTREVOLUTION, "CARTREVOLUTION", "Cart_Revolution" } ,
- { MC_CHANGECART, "CHANGECART", "Change_Cart" } ,
- { MC_DISCOUNT, "DISCOUNT", "Discount" } ,
- { MC_IDENTIFY, "IDENTIFY", "Item_Appraisal" } ,
- { MC_INCCARRY, "INCCARRY", "Enlarge_Weight_Limit" } ,
- { MC_LOUD, "LOUD", "Lord_Exclamation" } ,
- { MC_MAMMONITE, "MAMMONITE", "Mammonite" } ,
- { MC_OVERCHARGE, "OVERCHARGE", "Overcharge" } ,
- { MC_PUSHCART, "PUSHCART", "Pushcart" } ,
- { MC_VENDING, "VENDING", "Vending" } ,
- { MG_COLDBOLT, "COLDBOLT", "Cold_Bolt" } ,
- { MG_ENERGYCOAT, "ENERGYCOAT", "Energy_Coat" } ,
- { MG_FIREBALL, "FIREBALL", "Fire_Ball" } ,
- { MG_FIREBOLT, "FIREBOLT", "Fire_Bolt" } ,
- { MG_FIREWALL, "FIREWALL", "Fire_Wall" } ,
- { MG_FROSTDIVER, "FROSTDIVER", "Frost_Diver" } ,
- { MG_LIGHTNINGBOLT, "LIGHTNINGBOLT", "Lightening_Bolt" } ,
- { MG_NAPALMBEAT, "NAPALMBEAT", "Napalm_Beat" } ,
- { MG_SAFETYWALL, "SAFETYWALL", "Safety_Wall" } ,
- { MG_SIGHT, "SIGHT", "Sight" } ,
- { MG_SOULSTRIKE, "SOULSTRIKE", "Soul_Strike" } ,
- { MG_SRECOVERY, "SRECOVERY", "Increase_SP_Recovery" } ,
- { MG_STONECURSE, "STONECURSE", "Stone_Curse" } ,
- { MG_THUNDERSTORM, "THUNDERSTORM", "Thunderstorm" } ,
- { MO_ABSORBSPIRITS, "ABSORBSPIRITS", "Absorb_Spirits" } ,
- { MO_BLADESTOP, "BLADESTOP", "Blade_Stop" } ,
- { MO_BODYRELOCATION, "BODYRELOCATION", "Body_Relocation" } ,
- { MO_CALLSPIRITS, "CALLSPIRITS", "Call_Spirits" } ,
- { MO_CHAINCOMBO, "CHAINCOMBO", "Chain_Combo" } ,
- { MO_COMBOFINISH, "COMBOFINISH", "Combo_Finish" } ,
- { MO_DODGE, "DODGE", "Dodge" } ,
- { MO_EXPLOSIONSPIRITS, "EXPLOSIONSPIRITS", "Explosion_Spirits" } ,
- { MO_EXTREMITYFIST, "EXTREMITYFIST", "Extremity_Fist" } ,
- { MO_FINGEROFFENSIVE, "FINGEROFFENSIVE", "Finger_Offensive" } ,
- { MO_INVESTIGATE, "INVESTIGATE", "Investigate" } ,
- { MO_IRONHAND, "IRONHAND", "Iron_Hand" } ,
- { MO_SPIRITSRECOVERY, "SPIRITSRECOVERY", "Spirit_Recovery" } ,
- { MO_STEELBODY, "STEELBODY", "Steel_Body" } ,
- { MO_TRIPLEATTACK, "TRIPLEATTACK", "Triple_Blows" } ,
- { NPC_ATTRICHANGE, "ATTRICHANGE", "NPC_ATTRICHANGE" } ,
- { NPC_BARRIER, "BARRIER", "NPC_BARRIER" } ,
- { NPC_BLINDATTACK, "BLINDATTACK", "NPC_BLINDATTACK" } ,
- { NPC_BLOODDRAIN, "BLOODDRAIN", "NPC_BLOODDRAIN" } ,
- { NPC_CHANGEDARKNESS, "CHANGEDARKNESS", "NPC_CHANGEDARKNESS" } ,
- { NPC_CHANGEFIRE, "CHANGEFIRE", "NPC_CHANGEFIRE" } ,
- { NPC_CHANGEGROUND, "CHANGEGROUND", "NPC_CHANGEGROUND" } ,
- { NPC_CHANGEHOLY, "CHANGEHOLY", "NPC_CHANGEHOLY" } ,
- { NPC_CHANGEPOISON, "CHANGEPOISON", "NPC_CHANGEPOISON" } ,
- { NPC_CHANGETELEKINESIS, "CHANGETELEKINESIS", "NPC_CHANGETELEKINESIS" } ,
- { NPC_CHANGEWATER, "CHANGEWATER", "NPC_CHANGEWATER" } ,
- { NPC_CHANGEWIND, "CHANGEWIND", "NPC_CHANGEWIND" } ,
- { NPC_COMBOATTACK, "COMBOATTACK", "NPC_COMBOATTACK" } ,
- { NPC_CRITICALSLASH, "CRITICALSLASH", "NPC_CRITICALSLASH" } ,
- { NPC_CURSEATTACK, "CURSEATTACK", "NPC_CURSEATTACK" } ,
- { NPC_DARKBLESSING, "DARKBLESSING", "NPC_DARKBLESSING" } ,
- { NPC_DARKBREATH, "DARKBREATH", "NPC_DARKBREATH" } ,
- { NPC_DARKCROSS, "DARKCROSS", "NPC_DARKCROSS" } ,
- { NPC_DARKNESSATTACK, "DARKNESSATTACK", "NPC_DARKNESSATTACK" } ,
- { NPC_DEFENDER, "DEFENDER", "NPC_DEFENDER" } ,
- { NPC_EMOTION, "EMOTION", "NPC_EMOTION" } ,
- { NPC_ENERGYDRAIN, "ENERGYDRAIN", "NPC_ENERGYDRAIN" } ,
- { NPC_FIREATTACK, "FIREATTACK", "NPC_FIREATTACK" } ,
- { NPC_GROUNDATTACK, "GROUNDATTACK", "NPC_GROUNDATTACK" } ,
- { NPC_GUIDEDATTACK, "GUIDEDATTACK", "NPC_GUIDEDATTACK" } ,
- { NPC_HALLUCINATION, "HALLUCINATION", "NPC_HALLUCINATION" } ,
- { NPC_HOLYATTACK, "HOLYATTACK", "NPC_HOLYATTACK" } ,
- { NPC_KEEPING, "KEEPING", "NPC_KEEPING" } ,
- { NPC_LICK, "LICK", "NPC_LICK" } ,
- { NPC_MAGICALATTACK, "MAGICALATTACK", "NPC_MAGICALATTACK" } ,
- { NPC_MENTALBREAKER, "MENTALBREAKER", "NPC_MENTALBREAKER" } ,
- { NPC_METAMORPHOSIS, "METAMORPHOSIS", "NPC_METAMORPHOSIS" } ,
- { NPC_PETRIFYATTACK, "PETRIFYATTACK", "NPC_PETRIFYATTACK" } ,
- { NPC_PIERCINGATT, "PIERCINGATT", "NPC_PIERCINGATT" } ,
- { NPC_POISON, "POISON", "NPC_POISON" } ,
- { NPC_POISONATTACK, "POISONATTACK", "NPC_POISONATTACK" } ,
- { NPC_PROVOCATION, "PROVOCATION", "NPC_PROVOCATION" } ,
- { NPC_RANDOMATTACK, "RANDOMATTACK", "NPC_RANDOMATTACK" } ,
- { NPC_RANGEATTACK, "RANGEATTACK", "NPC_RANGEATTACK" } ,
- { NPC_REBIRTH, "REBIRTH", "NPC_REBIRTH" } ,
- { NPC_SELFDESTRUCTION, "SELFDESTRUCTION", "Kabooooom!" } ,
- { NPC_SELFDESTRUCTION2, "SELFDESTRUCTION2", "NPC_SELFDESTRUCTION2" } ,
- { NPC_SILENCEATTACK, "SILENCEATTACK", "NPC_SILENCEATTACK" } ,
- { NPC_SLEEPATTACK, "SLEEPATTACK", "NPC_SLEEPATTACK" } ,
- { NPC_SMOKING, "SMOKING", "NPC_SMOKING" } ,
- { NPC_SPLASHATTACK, "SPLASHATTACK", "NPC_SPLASHATTACK" } ,
- { NPC_STUNATTACK, "STUNATTACK", "NPC_STUNATTACK" } ,
- { NPC_SUICIDE, "SUICIDE", "NPC_SUICIDE" } ,
- { NPC_SUMMONMONSTER, "SUMMONMONSTER", "NPC_SUMMONMONSTER" } ,
- { NPC_SUMMONSLAVE, "SUMMONSLAVE", "NPC_SUMMONSLAVE" } ,
- { NPC_TELEKINESISATTACK, "TELEKINESISATTACK", "NPC_TELEKINESISATTACK" } ,
- { NPC_TRANSFORMATION, "TRANSFORMATION", "NPC_TRANSFORMATION" } ,
- { NPC_WATERATTACK, "WATERATTACK", "NPC_WATERATTACK" } ,
- { NPC_WINDATTACK, "WINDATTACK", "NPC_WINDATTACK" } ,
- { NV_BASIC, "BASIC", "Basic_Skill" } ,
- { NV_FIRSTAID, "FIRSTAID", "First Aid" } ,
- { NV_TRICKDEAD, "TRICKDEAD", "Play_Dead" } ,
- { PA_GOSPEL, "GOSPEL", "Gospel" } ,
- { PA_PRESSURE, "PRESSURE", "Pressure" } ,
- { PA_SACRIFICE, "SACRIFICE", "Sacrificial_Ritual" } ,
- { PF_FOGWALL, "FOGWALL", "Wall_of_Fog" } ,
- { PF_HPCONVERSION, "HPCONVERSION", "Health_Conversion" } ,
- { PF_MEMORIZE, "MEMORIZE", "Memorize" } ,
- { PF_MINDBREAKER, "MINDBREAKER", "Mind_Breaker" } ,
- { PF_SOULBURN, "SOULBURN", "Soul_Burn" } ,
- { PF_SOULCHANGE, "SOULCHANGE", "Soul_Change" } ,
- { PF_SPIDERWEB, "SPIDERWEB", "Spider_Web" } ,
- { PR_ASPERSIO, "ASPERSIO", "Aspersio" } ,
- { PR_BENEDICTIO, "BENEDICTIO", "B.S_Sacramenti" } ,
- { PR_GLORIA, "GLORIA", "Gloria" } ,
- { PR_IMPOSITIO, "IMPOSITIO", "Impositio_Manus" } ,
- { PR_KYRIE, "KYRIE", "Kyrie_Eleison" } ,
- { PR_LEXAETERNA, "LEXAETERNA", "Lex_Aeterna" } ,
- { PR_LEXDIVINA, "LEXDIVINA", "Lex_Divina" } ,
- { PR_MACEMASTERY, "MACEMASTERY", "Mace_Mastery" } ,
- { PR_MAGNIFICAT, "MAGNIFICAT", "Magnificat" } ,
- { PR_MAGNUS, "MAGNUS", "Magnus_Exorcismus" } ,
- { PR_SANCTUARY, "SANCTUARY", "Santuary" } ,
- { PR_SLOWPOISON, "SLOWPOISON", "Slow_Poison" } ,
- { PR_STRECOVERY, "STRECOVERY", "Status_Recovery" } ,
- { PR_SUFFRAGIUM, "SUFFRAGIUM", "Suffragium" } ,
- { PR_TURNUNDEAD, "TURNUNDEAD", "Turn_Undead" } ,
- { RG_BACKSTAP, "BACKSTAP", "Back_Stab" } ,
- { RG_CLEANER, "CLEANER", "Remover" } ,
- { RG_COMPULSION, "COMPULSION", "Compulsion_Discount" } ,
- { RG_FLAGGRAFFITI, "FLAGGRAFFITI", "Flag_Graffity" } ,
- { RG_GANGSTER, "GANGSTER", "Gangster's_Paradise" } ,
- { RG_GRAFFITI, "GRAFFITI", "Graffiti" } ,
- { RG_INTIMIDATE, "INTIMIDATE", "Intimidate" } ,
- { RG_PLAGIARISM, "PLAGIARISM", "Plagiarism" } ,
- { RG_RAID, "RAID", "Raid" } ,
- { RG_SNATCHER, "SNATCHER", "Snatcher" } ,
- { RG_STEALCOIN, "STEALCOIN", "Steal_Coin" } ,
- { RG_STRIPARMOR, "STRIPARMOR", "Strip_Armor" } ,
- { RG_STRIPHELM, "STRIPHELM", "Strip_Helm" } ,
- { RG_STRIPSHIELD, "STRIPSHIELD", "Strip_Shield" } ,
- { RG_STRIPWEAPON, "STRIPWEAPON", "Strip_Weapon" } ,
- { RG_TUNNELDRIVE, "TUNNELDRIVE", "Tunnel_Drive" } ,
- { SA_ABRACADABRA, "ABRACADABRA", "Hocus-pocus" } ,
- { SA_ADVANCEDBOOK, "ADVANCEDBOOK", "Advanced_Book" } ,
- { SA_AUTOSPELL, "AUTOSPELL", "Auto_Cast" } ,
- { SA_CASTCANCEL, "CASTCANCEL", "Cast_Cancel" } ,
- { SA_CLASSCHANGE, "CLASSCHANGE", "Class_Change" } ,
- { SA_COMA, "COMA", "Coma" } ,
- { SA_DEATH, "DEATH", "Death" } ,
- { SA_DELUGE, "DELUGE", "Deluge" } ,
- { SA_DISPELL, "DISPELL", "Dispel" } ,
- { SA_DRAGONOLOGY, "DRAGONOLOGY", "Dragonology" } ,
- { SA_FLAMELAUNCHER, "FLAMELAUNCHER", "Flame_Launcher" } ,
- { SA_FORTUNE, "FORTUNE", "Fortune" } ,
- { SA_FREECAST, "FREECAST", "Cast_Freedom" } ,
- { SA_FROSTWEAPON, "FROSTWEAPON", "Frost_Weapon" } ,
- { SA_FULLRECOVERY, "FULLRECOVERY", "Full_Recovery" } ,
- { SA_GRAVITY, "GRAVITY", "Gravity" } ,
- { SA_INSTANTDEATH, "INSTANTDEATH", "Instant_Death" } ,
- { SA_LANDPROTECTOR, "LANDPROTECTOR", "Land_Protector" } ,
- { SA_LEVELUP, "LEVELUP", "Level_Up" } ,
- { SA_LIGHTNINGLOADER, "LIGHTNINGLOADER", "Lightning_Loader" } ,
- { SA_MAGICROD, "MAGICROD", "Magic_Rod" } ,
- { SA_MONOCELL, "MONOCELL", "Monocell" } ,
- { SA_QUESTION, "QUESTION", "Question?" } ,
- { SA_REVERSEORCISH, "REVERSEORCISH", "Reverse_Orcish" } ,
- { SA_SEISMICWEAPON, "SEISMICWEAPON", "Seismic_Weapon" } ,
- { SA_SPELLBREAKER, "SPELLBREAKER", "Break_Spell" } ,
- { SA_SUMMONMONSTER, "SUMMONMONSTER", "Summon_Monster" } ,
- { SA_TAMINGMONSTER, "TAMINGMONSTER", "Taming_Monster" } ,
- { SA_VIOLENTGALE, "VIOLENTGALE", "Violent_Gale" } ,
- { SA_VOLCANO, "VOLCANO", "Volcano" } ,
- { SG_DEVIL, "DEVIL", "Devil" } ,
- { SG_FEEL, "FEEL", "Feel" } ,
- { SG_FRIEND, "FRIEND", "Friend" } ,
- { SG_FUSION, "FUSION", "Fusion" } ,
- { SG_HATE, "HATE", "Hate" } ,
- { SG_KNOWLEDGE, "KNOWLEDGE", "Knowledge" } ,
- { SG_MOON_ANGER, "ANGER", "Moon Anger" } ,
- { SG_MOON_BLESS, "BLESS", "Moon Bless" } ,
- { SG_MOON_COMFORT, "COMFORT", "Moon Comfort" } ,
- { SG_MOON_WARM, "WARM", "Moon Warm" } ,
- { SG_STAR_ANGER, "ANGER", "Star Anger" } ,
- { SG_STAR_BLESS, "BLESS", "Star Bless" } ,
- { SG_STAR_COMFORT, "COMFORT", "Star Comfort" } ,
- { SG_STAR_WARM, "WARM", "Star Warm" } ,
- { SG_SUN_ANGER, "ANGER", "Sun Anger" } ,
- { SG_SUN_BLESS, "BLESS", "Sun Bless" } ,
- { SG_SUN_COMFORT, "COMFORT", "Sun Comfort" } ,
- { SG_SUN_WARM, "WARM", "Sun Warm" } ,
- { SL_ALCHEMIST, "ALCHEMIST", "Alchemist" } ,
- { SL_ASSASIN, "ASSASIN", "Assasin" } ,
- { SL_BARDDANCER, "BARDDANCER", "Bard Dancer" } ,
- { SL_BLACKSMITH, "BLACKSMITH", "Black Smith" } ,
- { SL_CRUSADER, "CRUSADER", "Crusader" } ,
- { SL_HUNTER, "HUNTER", "Hunter" } ,
- { SL_KAAHI, "KAAHI", "Kaahi" } ,
- { SL_KAINA, "KAINA", "Kaina" } ,
- { SL_KAITE, "KAITE", "Kaite" } ,
- { SL_KAIZEL, "KAIZEL", "Kaizel" } ,
- { SL_KAUPE, "KAUPE", "Kaupe" } ,
- { SL_KNIGHT, "KNIGHT", "Knight" } ,
- { SL_MONK, "MONK", "Monk" } ,
- { SL_PRIEST, "PRIEST", "Priest" } ,
- { SL_ROGUE, "ROGUE", "Rogue" } ,
- { SL_SAGE, "SAGE", "Sage" } ,
- { SL_SKA, "SKA", "SKA" } ,
- { SL_SKE, "SKE", "SKE" } ,
- { SL_SMA, "SMA", "SMA" } ,
- { SL_SOULLINKER, "SOULLINKER", "Soul Linker" } ,
- { SL_STAR, "STAR", "Star" } ,
- { SL_STIN, "STIN", "Stin" } ,
- { SL_STUN, "STUN", "Stun" } ,
- { SL_SUPERNOVICE, "SUPERNOVICE", "Super Novice" } ,
- { SL_SWOO, "SWOO", "Swoo" } ,
- { SL_WIZARD, "WIZARD", "Wizard" } ,
- { SM_AUTOBERSERK, "AUTOBERSERK", "Auto_Berserk" } ,
- { SM_BASH, "BASH", "Bash" } ,
- { SM_ENDURE, "ENDURE", "Endure" } ,
- { SM_FATALBLOW, "FATALBLOW", "Attack_Weak_Point" } ,
- { SM_MAGNUM, "MAGNUM", "Magnum_Break" } ,
- { SM_MOVINGRECOVERY, "MOVINGRECOVERY", "Moving_HP_Recovery" } ,
- { SM_PROVOKE, "PROVOKE", "Provoke" } ,
- { SM_RECOVERY, "RECOVERY", "Increase_HP_Recovery" } ,
- { SM_SWORD, "SWORD", "Sword_Mastery" } ,
- { SM_TWOHAND, "TWOHAND", "Two-Handed_Sword_Mastery" } ,
- { SN_FALCONASSAULT, "FALCONASSAULT", "Falcon_Assault" } ,
- { SN_SHARPSHOOTING, "SHARPSHOOTING", "Sharpshooting" } ,
- { SN_SIGHT, "SIGHT", "True_Sight" } ,
- { SN_WINDWALK, "WINDWALK", "Wind_Walk" } ,
- { ST_CHASEWALK, "CHASEWALK", "Chase_Walk" } ,
- { ST_REJECTSWORD, "REJECTSWORD", "Reject_Sword" } ,
- { ST_STEALBACKPACK, "STEALBACKPACK", "Steal_Backpack" } ,
- { ST_PRESERVE, "PRESERVE", "Preserve" } ,
- { ST_FULLSTRIP, "FULLSTRIP", "Full_Strip" } ,
- { TF_BACKSLIDING, "BACKSLIDING", "Back_Sliding" } ,
- { TF_DETOXIFY, "DETOXIFY", "Detoxify" } ,
- { TF_DOUBLE, "DOUBLE", "Double_Attack" } ,
- { TF_HIDING, "HIDING", "Hiding" } ,
- { TF_MISS, "MISS", "Improve_Dodge" } ,
- { TF_PICKSTONE, "PICKSTONE", "Take_Stone" } ,
- { TF_POISON, "POISON", "Envenom" } ,
- { TF_SPRINKLESAND, "SPRINKLESAND", "Throw_Sand" } ,
- { TF_STEAL, "STEAL", "Steal" } ,
- { TF_THROWSTONE, "THROWSTONE", "Throw_Stone" } ,
- { TK_COUNTER, "COUNTER", "Counter" } ,
- { TK_DODGE, "DODGE", "Dodge" } ,
- { TK_DOWNKICK, "DOWNKICK", "Down Kick" } ,
- { TK_HIGHJUMP, "HIGHJUMP", "High Jump" } ,
- { TK_HPTIME, "HPTIME", "HP Time" } ,
- { TK_JUMPKICK, "JUMPKICK", "Jump Kick" } ,
- { TK_POWER, "POWER", "Power" } ,
- { TK_READYCOUNTER, "READYCOUNTER", "Ready Counter" } ,
- { TK_READYDOWN, "READYDOWN", "Ready Down" } ,
- { TK_READYSTORM, "READYSTORM", "Ready Storm" } ,
- { TK_READYTURN, "READYTURN", "Ready Turn" } ,
- { TK_RUN, "RUN", "TK_RUN" } ,
- { TK_SEVENWIND, "SEVENWIND", "Seven Wind" } ,
- { TK_SPTIME, "SPTIME", "SP Time" } ,
- { TK_STORMKICK, "STORMKICK", "Storm Kick" } ,
- { TK_TURNKICK, "TURNKICK", "Turn Kick" } ,
- { WE_BABY, "BABY", "I Love Mama and Fafa" } ,
- { WE_CALLBABY, "CALLBABY", "Come With Me, Baby" } ,
- { WE_CALLPARENT, "CALLPARENT", "I Miss My Parents" } ,
- { WE_CALLPARTNER, "CALLPARTNER", "I Want to See You" } ,
- { WE_FEMALE, "FEMALE", "I Only Look Up to You" } ,
- { WE_MALE, "MALE", "I Will Protect You" } ,
- { WS_CARTBOOST, "CARTBOOST", "Cart_Boost" } ,
- { WS_CREATECOIN, "CREATECOIN", "Create_Coins" } ,
- { WS_CREATENUGGET, "CREATENUGGET", "Create_Nuggets" } ,
- { WS_MELTDOWN, "MELTDOWN", "Meltdown" } ,
- { WS_SYSTEMCREATE, "SYSTEMCREATE", "Create_System_tower" } ,
- { WS_WEAPONREFINE, "WEAPONREFINE", "Weapon_Refine" } ,
- { WZ_EARTHSPIKE, "EARTHSPIKE", "Earth_Spike" } ,
- { WZ_ESTIMATION, "ESTIMATION", "Sense" } ,
- { WZ_FIREIVY, "FIREIVY", "Fire_Ivy" } ,
- { WZ_FIREPILLAR, "FIREPILLAR", "Fire_Pillar" } ,
- { WZ_FROSTNOVA, "FROSTNOVA", "Frost_Nova" } ,
- { WZ_HEAVENDRIVE, "HEAVENDRIVE", "Heaven's_Drive" } ,
- { WZ_ICEWALL, "ICEWALL", "Ice_Wall" } ,
- { WZ_JUPITEL, "JUPITEL", "Jupitel_Thunder" } ,
- { WZ_METEOR, "METEOR", "Meteor_Storm" } ,
- { WZ_QUAGMIRE, "QUAGMIRE", "Quagmire" } ,
- { WZ_SIGHTRASHER, "SIGHTRASHER", "Sightrasher" } ,
- { WZ_STORMGUST, "STORMGUST", "Storm_Gust" } ,
- { WZ_VERMILION, "VERMILION", "Lord_of_Vermilion" } ,
- { WZ_WATERBALL, "WATERBALL", "Water_Ball" } ,
- { 0, 0, 0 }
-};
-
-static const int dirx[8]={0,-1,-1,-1,0,1,1,1};
-static const int diry[8]={1,1,0,-1,-1,-1,0,1};
-
-static int rdamage;
-
-/* ƒXƒLƒ‹ƒf?ƒ^ƒx?ƒX */
-struct skill_db skill_db[MAX_SKILL_DB];
-
-/* ƒAƒCƒeƒ€ì¬ƒf?ƒ^ƒx?ƒX */
-struct skill_produce_db skill_produce_db[MAX_SKILL_PRODUCE_DB];
-
-/* –î쬃XƒLƒ‹ƒf?ƒ^ƒx?ƒX */
-struct skill_arrow_db skill_arrow_db[MAX_SKILL_ARROW_DB];
-
-/* ƒAƒuƒ‰ƒJƒ_ƒuƒ‰?“®ƒXƒLƒ‹ƒf?ƒ^ƒx?ƒX */
-struct skill_abra_db skill_abra_db[MAX_SKILL_ABRA_DB];
-
-// macros to check for out of bounds errors [celest]
-// i: Skill ID, l: Skill Level, var: Value to return after checking
-// for values that don't require level just put a one (putting 0 will trigger return 0; instead
-// for values that might need to use a different function just skill_chk would suffice.
-#define skill_chk(i, l) \
- if (i >= 10000 && i < 10015) {i -= 9500;} \
- if (i < 1 || i > MAX_SKILL_DB) {return 0;} \
- if (l <= 0 || l > MAX_SKILL_LEVEL) {return 0;}
-#define skill_get(var, i, l) \
- { skill_chk(i, l); return var; }
-
-// Skill DB
-int skill_get_hit( int id ){ skill_get (skill_db[id].hit, id, 1); }
-int skill_get_inf( int id ){ skill_chk (id, 1); return (id < 500) ? skill_db[id].inf : guild_skill_get_inf(id); }
-int skill_get_pl( int id ){ skill_get (skill_db[id].pl, id, 1); }
-int skill_get_nk( int id ){ skill_get (skill_db[id].nk, id, 1); }
-int skill_get_max( int id ){ skill_chk (id, 1); return (id < 500) ? skill_db[id].max : guild_skill_get_max(id); }
-int skill_get_range( int id , int lv ){ skill_chk (id, lv); return (id < 500) ? skill_db[id].range[lv-1] : guild_skill_get_range(id); }
-int skill_get_hp( int id ,int lv ){ skill_get (skill_db[id].hp[lv-1], id, lv); }
-int skill_get_sp( int id ,int lv ){ skill_get (skill_db[id].sp[lv-1], id, lv); }
-int skill_get_zeny( int id ,int lv ){ skill_get (skill_db[id].zeny[lv-1], id, lv); }
-int skill_get_num( int id ,int lv ){ skill_get (skill_db[id].num[lv-1], id, lv); }
-int skill_get_cast( int id ,int lv ){ skill_get (skill_db[id].cast[lv-1], id, lv); }
-int skill_get_delay( int id ,int lv ){ skill_get (skill_db[id].delay[lv-1], id, lv); }
-int skill_get_time( int id ,int lv ){ skill_get (skill_db[id].upkeep_time[lv-1], id, lv); }
-int skill_get_time2( int id ,int lv ){ skill_get (skill_db[id].upkeep_time2[lv-1], id, lv); }
-int skill_get_castdef( int id ){ skill_get (skill_db[id].cast_def_rate, id, 1); }
-int skill_get_weapontype( int id ){ skill_get (skill_db[id].weapon, id, 1); }
-int skill_get_inf2( int id ){ skill_get (skill_db[id].inf2, id, 1); }
-int skill_get_castcancel( int id ){ skill_get (skill_db[id].castcancel, id, 1); }
-int skill_get_maxcount( int id ){ skill_get (skill_db[id].maxcount, id, 1); }
-int skill_get_blewcount( int id ,int lv ){ skill_get (skill_db[id].blewcount[lv-1], id, lv); }
-int skill_get_mhp( int id ,int lv ){ skill_get (skill_db[id].mhp[lv-1], id, lv); }
-int skill_get_castnodex( int id ,int lv ){ skill_get (skill_db[id].castnodex[lv-1], id, lv); }
-int skill_get_delaynodex( int id ,int lv ){ skill_get (skill_db[id].delaynodex[lv-1], id, lv); }
-int skill_get_nocast ( int id ){ skill_get (skill_db[id].nocast, id, 1); }
-int skill_get_unit_id ( int id, int flag ){ skill_get (skill_db[id].unit_id[flag], id, 1); }
-int skill_get_unit_layout_type( int id ,int lv ){ skill_get (skill_db[id].unit_layout_type[lv-1], id, lv); }
-int skill_get_unit_interval( int id ){ skill_get (skill_db[id].unit_interval, id, 1); }
-int skill_get_unit_range( int id ){ skill_get (skill_db[id].unit_range, id, 1); }
-int skill_get_unit_target( int id ){ skill_get (skill_db[id].unit_target, id, 1); }
-int skill_get_unit_flag( int id ){ skill_get (skill_db[id].unit_flag, id, 1); }
-
-int skill_tree_get_max(int id, int b_class){
- struct pc_base_job s_class = pc_calc_base_job(b_class);
- int i, skillid;
- for(i=0;(skillid=skill_tree[s_class.upper][s_class.job][i].id)>0;i++)
- if (id == skillid) return skill_tree[s_class.upper][s_class.job][i].max;
- return skill_get_max (id);
-}
-
-/* ƒvƒƒgƒ^ƒCƒv */
-//struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,int skilllv,int x,int y,int flag);
-int skill_check_condition( struct map_session_data *sd,int type);
-int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag );
-int skill_frostjoke_scream(struct block_list *bl,va_list ap);
-int status_change_timer_sub(struct block_list *bl, va_list ap );
-int skill_attack_area(struct block_list *bl,va_list ap);
-int skill_clear_element_field(struct block_list *bl);
-int skill_landprotector(struct block_list *bl, va_list ap );
-int skill_trap_splash(struct block_list *bl, va_list ap );
-int skill_count_target(struct block_list *bl, va_list ap );
-struct skill_unit_group_tickset *skill_unitgrouptickset_search(struct block_list *bl,struct skill_unit_group *sg,int tick);
-int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int tick);
-int skill_unit_effect(struct block_list *bl,va_list ap);
-
-int enchant_eff[5] = { 10, 14, 17, 19, 20 };
-int deluge_eff[5] = { 5, 9, 12, 14, 15 };
-
-// [MouseJstr] - skill ok to cast? and when?
-int skillnotok(int skillid, struct map_session_data *sd)
-{
- nullpo_retr (1, sd);
- //if (sd == 0)
- //return 0;
- //return 1;
- // I think it was meant to be "no skills allowed when not a valid sd"
-
- if (!(skillid >= 10000 && skillid < 10015))
- if ((skillid > MAX_SKILL) || (skillid < 0))
- return 1;
-
- {
- int i = skillid;
- if (i >= 10000 && i < 10015)
- i -= 9500;
- if (sd->blockskill[i] > 0)
- return 1;
- }
-
- if (pc_isGM(sd) >= 20)
- return 0; // gm's can do anything damn thing they want
-
- // Check skill restrictions [Celest]
- if(!map[sd->bl.m].flag.pvp && !map[sd->bl.m].flag.gvg && skill_get_nocast (skillid) & 1)
- return 1;
- if(map[sd->bl.m].flag.pvp && skill_get_nocast (skillid) & 2)
- return 1;
- if(map[sd->bl.m].flag.gvg && skill_get_nocast (skillid) & 4)
- return 1;
- if (agit_flag && skill_get_nocast (skillid) & 8)
- return 1;
- if (battle_config.pk_mode && !map[sd->bl.m].flag.nopvp && skill_get_nocast (skillid) & 16)
- return 1;
-
- switch (skillid) {
- case AL_WARP:
- case AL_TELEPORT:
- case MC_VENDING:
- case MC_IDENTIFY:
- return 0; // always allowed
- default:
- return (map[sd->bl.m].flag.noskill);
- }
-}
-
-
-static int distance(int x0,int y0,int x1,int y1)
-{
- int dx,dy;
-
- dx = abs(x0 - x1);
- dy = abs(y0 - y1);
- return dx > dy ? dx : dy;
-}
-
-/* ƒXƒLƒ‹ƒ†ƒjƒbƒg‚Ì”z’uî•ñ‚ð•Ô‚· */
-struct skill_unit_layout skill_unit_layout[MAX_SKILL_UNIT_LAYOUT];
-int firewall_unit_pos;
-int icewall_unit_pos;
-
-struct skill_unit_layout *skill_get_unit_layout (int skillid, int skilllv, struct block_list *src, int x, int y)
-{
- int pos = skill_get_unit_layout_type(skillid,skilllv);
- int dir;
-
- if (pos != -1)
- return &skill_unit_layout[pos];
-
- if (src->x == x && src->y == y)
- dir = 2;
- else
- dir = map_calc_dir(src,x,y);
-
- if (skillid == MG_FIREWALL)
- return &skill_unit_layout [firewall_unit_pos + dir];
- else if (skillid == WZ_ICEWALL)
- return &skill_unit_layout [icewall_unit_pos + dir];
-
- printf("Unknown unit layout for skill %d, %d\n",skillid,skilllv);
- return &skill_unit_layout[0];
-}
-
-// 0x89,0x8a,0x8b •\Ž¦–³‚µ
-// 0x9a ‰Š?«‚̉r¥‚Ý‚½‚¢‚ȃGƒtƒFƒNƒg
-// 0x9b …?«‚̉r¥‚Ý‚½‚¢‚ȃGƒtƒFƒNƒg
-// 0x9c •—?«‚̉r¥‚Ý‚½‚¢‚ȃGƒtƒFƒNƒg
-// 0x9d ”’‚¢¬‚³‚ȃGƒtƒFƒNƒg
-// 0xb1 Alchemist Demonstration
-// 0xb2 = Pink Warp Portal
-// 0xb3 = Gospel For Paladin
-// 0xb4 = Basilica
-// 0xb5 = Empty
-// 0xb6 = Fog Wall for Professor
-// 0xb7 = Spider Web for Professor
-// 0xb8 = Empty
-// 0xb9 =
-
-/*==========================================
- * ƒXƒLƒ‹’ljÁ?‰Ê
- *------------------------------------------
- */
-int skill_additional_effect (struct block_list* src, struct block_list *bl, int skillid, int skilllv, int attack_type, unsigned int tick)
-{
- /* MOB’ljÁ?‰ÊƒXƒLƒ‹—p */
- const int sc[]={
- SC_POISON, SC_BLIND, SC_SILENCE, SC_STAN,
- SC_STONE, SC_CURSE, SC_SLEEP
- };
- const int sc2[]={
- MG_STONECURSE,MG_FROSTDIVER,NPC_STUNATTACK,
- NPC_SLEEPATTACK,TF_POISON,NPC_CURSEATTACK,
- NPC_SILENCEATTACK,0,NPC_BLINDATTACK
- };
-
- struct map_session_data *sd=NULL;
- struct map_session_data *dstsd=NULL;
- struct mob_data *md=NULL;
- struct mob_data *dstmd=NULL;
- struct pet_data *pd=NULL;
-
- int skill,skill2;
- int rate;
-
- int sc_def_mdef,sc_def_vit,sc_def_int,sc_def_luk;
- int sc_def_mdef2,sc_def_vit2,sc_def_int2,sc_def_luk2;
-
- nullpo_retr(0, src);
- nullpo_retr(0, bl);
-
- if(skillid < 0)
- { // remove the debug print when this case is finished
- printf("skill_additional_effect: skillid=%i\ncall: %p %p %i %i %i %i",skillid,
- src, bl,skillid,skilllv,attack_type,tick);
- return 0;
- }
- if(skillid > 0 && skilllv <= 0) return 0; // don't forget auto attacks! - celest
-
- if (src->type == BL_PC){
- nullpo_retr(0, sd = (struct map_session_data *)src);
- } else if (src->type == BL_MOB){
- nullpo_retr(0, md = (struct mob_data *)src); //–¢Žg—pH
- } else if (src->type == BL_PET){
- nullpo_retr(0, pd = (struct pet_data *)src); // [Valaris]
- }
-
- if(bl->type == BL_PC) {
- nullpo_retr(0, dstsd=(struct map_session_data *)bl);
- } else if(bl->type == BL_MOB) {
- nullpo_retr(0, dstmd=(struct mob_data *)bl); //–¢Žg—pH
- }
-
- //?Û‚Ì‘Ï«
- sc_def_mdef = status_get_sc_def_mdef(bl);
- sc_def_vit = status_get_sc_def_vit(bl);
- sc_def_int = status_get_sc_def_int(bl);
- sc_def_luk = status_get_sc_def_luk(bl);
-
- //Ž©•ª‚Ì‘Ï«
- sc_def_mdef2 = status_get_sc_def_mdef(src);
- sc_def_vit2 = status_get_sc_def_vit(src);
- sc_def_int2 = status_get_sc_def_int(src);
- sc_def_luk2 = status_get_sc_def_luk(src);
-
- switch(skillid){
- case 0: /* ’ÊíU? */
- /* Ž©“®‘é */
- if(sd) {
- struct status_change *sc_data = status_get_sc_data(bl);
- if (pc_isfalcon(sd) && sd->status.weapon == 11 && (skill=pc_checkskill(sd,HT_BLITZBEAT))>0 &&
- rand()%1000 <= sd->paramc[5]*10/3+1 ) {
- int lv=(sd->status.job_level+9)/10;
- skill_castend_damage_id(src,bl,HT_BLITZBEAT,(skill<lv)?skill:lv,tick,0xf00000);
- }
- // ƒXƒiƒbƒ`ƒƒ?
- if(sd->status.weapon != 11 && (skill=pc_checkskill(sd,RG_SNATCHER)) > 0 &&
- (skill*15 + 55) + (skill2 = pc_checkskill(sd,TF_STEAL))*10 > rand()%1000) {
- if(pc_steal_item(sd,bl))
- clif_skill_nodamage(src,bl,TF_STEAL,skill2,1);
- else if (battle_config.display_snatcher_skill_fail)
- clif_skill_fail(sd,skillid,0,0);
- }
- // enchant poison has a chance of poisoning enemy
- if (sd->sc_data[SC_ENCPOISON].timer != -1 && sc_data && sc_data[SC_POISON].timer == -1 &&
- rand() % 100 < sd->sc_data[SC_ENCPOISON].val1 * sc_def_vit / 100) {
- status_change_start(bl,SC_POISON,sd->sc_data[SC_ENCPOISON].val1,
- 0,0,0,skill_get_time2(AS_ENCHANTPOISON,sd->sc_data[SC_ENCPOISON].val1),0);
- }
- // ƒGƒ“ƒ`ƒƒƒ“ƒgƒfƒbƒgƒŠ?ƒ|ƒCƒYƒ“(–Ò“Å?‰Ê)
- if (sd->sc_data[SC_EDP].timer != -1 && sc_data && sc_data[SC_DPOISON].timer == -1 &&
- rand() % 100 < sd->sc_data[SC_EDP].val2 * sc_def_vit / 100)
- status_change_start(bl,SC_DPOISON,sd->sc_data[SC_EDP].val1,
- 0,0,0,skill_get_time2(ASC_EDP,sd->sc_data[SC_EDP].val1),0);
- }
- break;
-
- case SM_BASH: /* ƒoƒbƒVƒ…i‹}ŠU?j */
- if( sd && (skill=pc_checkskill(sd,SM_FATALBLOW))>0 ){
- if( rand()%100 < 6*(skilllv-5)*sc_def_vit/100 )
- status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(SM_FATALBLOW,skilllv),0);
- }
- break;
-
- case TF_POISON: /* ƒCƒ“ƒxƒiƒ€ */
- case AS_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ? */
- if(rand()%100< (2*skilllv+10)*sc_def_vit/100 )
- status_change_start(bl,SC_POISON,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- else{
- if(sd && skillid==TF_POISON)
- clif_skill_fail(sd,skillid,0,0);
- }
- break;
-
- case AS_SONICBLOW: /* ƒ\ƒjƒbƒNƒuƒ? */
- if( rand()%100 < (2*skilllv+10)*sc_def_vit/100 )
- status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case AS_GRIMTOOTH:
- if (bl->type == BL_MOB) {
- struct status_change *sc_data = status_get_sc_data(bl);
- if (sc_data && sc_data[SC_SLOWDOWN].timer == -1)
- status_change_start(bl,SC_SLOWDOWN,0,0,0,0,1000,0);
- }
- break;
-
- case HT_FREEZINGTRAP: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
- rate=skilllv*3+35;
- if(rand()%100 < rate*sc_def_mdef/100)
- status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case MG_FROSTDIVER: /* ƒtƒƒXƒgƒ_ƒCƒo? */
- case WZ_FROSTNOVA: /* ƒtƒƒXƒgƒmƒ”ƒ@ */
- {
- struct status_change *sc_data = status_get_sc_data(bl);
- rate = (skilllv*3+35)*sc_def_mdef/100-(status_get_int(bl)+status_get_luk(bl))/15;
- if (rate <= 5)
- rate = 5;
- if(sc_data && sc_data[SC_FREEZE].timer == -1 && rand()%100 < rate)
- status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv)*(1-sc_def_mdef/100),0);
- else if (sd && skillid == MG_FROSTDIVER)
- clif_skill_fail(sd,skillid,0,0);
- }
- break;
-
- case WZ_STORMGUST: /* ƒXƒg?ƒ€ƒKƒXƒg */
- {
- struct status_change *sc_data = status_get_sc_data(bl);
- if(sc_data) {
- sc_data[SC_FREEZE].val3++;
- if(sc_data[SC_FREEZE].val3 >= 3)
- status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- }
- }
- break;
-
- case HT_LANDMINE: /* ƒ‰ƒ“ƒhƒ}ƒCƒ“ */
- if( rand()%100 < (5*skilllv+30)*sc_def_vit/100 )
- status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case HT_SHOCKWAVE: /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
- if(map[bl->m].flag.pvp && dstsd){
- dstsd->status.sp -= dstsd->status.sp*(5+15*skilllv)/100;
- status_calc_pc(dstsd,0);
- }
- break;
- case HT_SANDMAN: /* ƒTƒ“ƒhƒ}ƒ“ */
- if( rand()%100 < (5*skilllv+30)*sc_def_int/100 )
- status_change_start(bl,SC_SLEEP,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
- case TF_SPRINKLESAND: /* »‚Ü‚« */
- if( rand()%100 < 20*sc_def_int/100 )
- status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case TF_THROWSTONE: /* ΓŠ‚° */
- if( rand()%100 < 7*sc_def_vit/100 )
- status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case CR_HOLYCROSS: /* ƒz?ƒŠ?ƒNƒƒX */
- if( rand()%100 < 3*skilllv*sc_def_int/100 )
- status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case CR_GRANDCROSS: /* ƒOƒ‰ƒ“ƒhƒNƒƒX */
- case NPC_DARKGRANDCROSS: /*ˆÅƒOƒ‰ƒ“ƒhƒNƒƒX*/
- {
- int race = status_get_race(bl);
- if( (battle_check_undead(race,status_get_elem_type(bl)) || race == 6) && rand()%100 < 100000*sc_def_int/100) //?§•t?‚¾‚ªŠ®‘S‘Ï«‚É‚Í–³?
- status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- }
- break;
-
- case AM_ACIDTERROR:
- if( rand()%100 < (skilllv*3)*sc_def_vit/100 )
- status_change_start(bl,SC_BLEEDING,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case CR_SHIELDCHARGE: /* ƒV?ƒ‹ƒhƒ`ƒƒ?ƒW */
- if( rand()%100 < (15 + skilllv*5)*sc_def_vit/100 )
- status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case RG_RAID: /* ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN */
- if( rand()%100 < (10+3*skilllv)*sc_def_vit/100 )
- status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- if( rand()%100 < (10+3*skilllv)*sc_def_int/100 )
- status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
- case BA_FROSTJOKE:
- if(rand()%100 < (15+5*skilllv)*sc_def_mdef/100)
- status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case DC_SCREAM:
- if( rand()%100 < (25+5*skilllv)*sc_def_vit/100 )
- status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case BD_LULLABY: /* ŽqŽç‰S */
- if( rand()%100 < 15*sc_def_int/100 )
- status_change_start(bl,SC_SLEEP,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- /* MOB‚̒ljÁ?‰Ê•t‚«ƒXƒLƒ‹ */
-
- case NPC_PETRIFYATTACK:
- if(rand()%100 < sc_def_mdef)
- status_change_start(bl,sc[skillid-NPC_POISON],skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
- case NPC_POISON:
- case NPC_SILENCEATTACK:
- case NPC_STUNATTACK:
- if(rand()%100 < sc_def_vit && src->type!=BL_PET)
- status_change_start(bl,sc[skillid-NPC_POISON],skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- if(src->type==BL_PET)
- status_change_start(bl,sc[skillid-NPC_POISON],skilllv,0,0,0,skilllv*1000,0);
- break;
- case NPC_CURSEATTACK:
- if(rand()%100 < sc_def_luk)
- status_change_start(bl,sc[skillid-NPC_POISON],skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
- case NPC_SLEEPATTACK:
- case NPC_BLINDATTACK:
- if(rand()%100 < sc_def_int)
- status_change_start(bl,sc[skillid-NPC_POISON],skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
- case NPC_MENTALBREAKER:
- if(dstsd) {
- int sp = dstsd->status.max_sp*(10+skilllv)/100;
- if(sp < 1) sp = 1;
- pc_heal(dstsd,0,-sp);
- }
- break;
-
-// -- moonsoul (adding status effect chance given to wizard aoe skills meteor and vermillion)
-//
- case WZ_METEOR:
- if(rand()%100 < sc_def_vit)
- status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
- case WZ_VERMILION:
- if(rand()%100 < sc_def_int)
- status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
-// -- moonsoul (stun ability of new champion skill tigerfist)
-//
- case CH_TIGERFIST:
- if (rand()%100 < (10 + skilllv*10)*sc_def_vit/100) {
- int sec = skill_get_time2 (skillid,skilllv) - status_get_agi(bl)/10;
- if (dstsd) {
- dstsd->canmove_tick += sec;
- dstsd->canact_tick += sec;
- } else if (dstmd)
- dstmd->canmove_tick += sec;
- }
- break;
-
- case LK_SPIRALPIERCE:
- if( rand()%100 < (15 + skilllv*5)*sc_def_vit/100 )
- status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
- case ST_REJECTSWORD: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
- if( rand()%100 < (skilllv*15) )
- status_change_start(bl,SC_AUTOCOUNTER,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
- case PF_FOGWALL: /* ƒz?ƒŠ?ƒNƒƒX */
- if (src != bl) {
- struct status_change *sc_data = status_get_sc_data(bl);
- if (sc_data && sc_data[SC_DELUGE].timer == -1)
- status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- }
- break;
- case LK_HEADCRUSH: /* ƒwƒbƒhƒNƒ‰ƒbƒVƒ… */
- {//?Œ‚ª—Ç‚­•ª‚©‚ç‚È‚¢‚Ì‚Å“K?‚É
- int race=status_get_race(bl);
- if( !(battle_check_undead(race,status_get_elem_type(bl)) || race == 6) && rand()%100 < (2*skilllv+10)*sc_def_vit/100 )
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- }
- break;
- case LK_JOINTBEAT: /* ƒWƒ‡ƒCƒ“ƒgƒr?ƒg */
- //?Œ‚ª—Ç‚­•ª‚©‚ç‚È‚¢‚Ì‚Å“K?‚É
- if( rand()%100 < (5*skilllv+5)*sc_def_vit/100 )
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
- case PF_SPIDERWEB: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
- {
- int sec = skill_get_time2(skillid,skilllv);
- if(map[src->m].flag.pvp) //PvP‚Å‚ÍS‘©ŽžŠÔ”¼Œ¸H
- sec = sec/2;
- battle_stopwalking(bl,1);
- status_change_start(bl,SC_SPIDERWEB,skilllv,0,0,0,sec,0);
- }
- break;
- case ASC_METEORASSAULT: /* ƒƒeƒIƒAƒTƒ‹ƒg */
- if( rand()%100 < (15 + skilllv*5)*sc_def_vit/100 ) //?‘ÔˆÙí‚ÍÚׂª•ª‚©‚ç‚È‚¢‚Ì‚Å“K?‚É
- status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- if( rand()%100 < (10+3*skilllv)*sc_def_int/100 )
- status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
- case MO_EXTREMITYFIST: /* ˆ¢C—…”e™€Œ */
- //ˆ¢C—…‚ðŽg‚¤‚Æ5•ªŠÔŽ©‘R‰ñ•œ‚µ‚È‚¢‚悤‚É‚È‚é
- status_change_start(src,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time2(skillid,skilllv),0 );
- break;
- case HW_NAPALMVULCAN: /* ƒiƒp?ƒ€ƒoƒ‹ƒJƒ“ */
- // skilllv*5%‚ÌŠm—¦‚ÅŽô‚¢
- if (rand()%10000 < 5*skilllv*sc_def_luk)
- status_change_start(bl,SC_CURSE,7,0,0,0,skill_get_time2(NPC_CURSEATTACK,7),0);
- break;
- }
-
- if((sd||dstsd) && skillid != MC_CARTREVOLUTION && attack_type&BF_WEAPON){ /* ƒJ?ƒh‚É‚æ‚é’ljÁ?‰Ê */
- int i, type;
- int sc_def_card=100;
-
- for(i=SC_STONE;i<=SC_BLIND;i++){
- type=i-SC_STONE;
- //?Û‚É?‘ÔˆÙí
- switch (i) {
- case SC_STONE:
- case SC_FREEZE:
- sc_def_card=sc_def_mdef;
- break;
- case SC_STAN:
- case SC_POISON:
- case SC_SILENCE:
- sc_def_card=sc_def_vit;
- break;
- case SC_SLEEP:
- case SC_CONFUSION:
- case SC_BLIND:
- sc_def_card=sc_def_int;
- break;
- case SC_CURSE:
- sc_def_card=sc_def_luk;
- }
-
- if (sd) {
- if(!sd->state.arrow_atk) {
- if(rand()%10000 < (sd->addeff[type])*sc_def_card/100 ){
- if(battle_config.battle_log)
- printf("PC %d skill_addeff: card‚É‚æ‚éˆÙí?“® %d %d\n",sd->bl.id,i,sd->addeff[type]);
- status_change_start(bl,i,7,0,0,0,(i==SC_CONFUSION)? 10000+7000:skill_get_time2(sc2[type],7),0);
- }
- }
- else {
- if(rand()%10000 < (sd->addeff[type]+sd->arrow_addeff[type])*sc_def_card/100 ){
- if(battle_config.battle_log)
- printf("PC %d skill_addeff: card‚É‚æ‚éˆÙí?“® %d %d\n",sd->bl.id,i,sd->addeff[type]);
- status_change_start(bl,i,7,0,0,0,(i==SC_CONFUSION)? 10000+7000:skill_get_time2(sc2[type],7),0);
- }
- }
- }
- //Ž©•ª‚É?‘ÔˆÙí
- switch (i) {
- case SC_STONE:
- case SC_FREEZE:
- sc_def_card=sc_def_mdef2;
- break;
- case SC_STAN:
- case SC_POISON:
- case SC_SILENCE:
- sc_def_card=sc_def_vit2;
- break;
- case SC_SLEEP:
- case SC_CONFUSION:
- case SC_BLIND:
- sc_def_card=sc_def_int2;
- break;
- case SC_CURSE:
- sc_def_card=sc_def_luk2;
- }
-
- if (sd) {
- if(!sd->state.arrow_atk) {
- if(rand()%10000 < (sd->addeff2[type])*sc_def_card/100 ){
- if(battle_config.battle_log)
- printf("PC %d skill_addeff: card‚É‚æ‚éˆÙí?“® %d %d\n",src->id,i,sd->addeff2[type]);
- status_change_start(src,i,7,0,0,0,(i==SC_CONFUSION)? 10000+7000:skill_get_time2(sc2[type],7),0);
- }
- }
- else {
- if(rand()%10000 < (sd->addeff2[type]+sd->arrow_addeff2[type])*sc_def_card/100 ){
- if(battle_config.battle_log)
- printf("PC %d skill_addeff: card‚É‚æ‚éˆÙí?“® %d %d\n",src->id,i,sd->addeff2[type]);
- status_change_start(src,i,7,0,0,0,(i==SC_CONFUSION)? 10000+7000:skill_get_time2(sc2[type],7),0);
- }
- }
- }
- if (dstsd && rand()%10000 < dstsd->addeff3[type]*sc_def_card/100){
- if (dstsd->addeff3_type[type] != 1 && ((sd && !sd->state.arrow_atk) || (status_get_range(src)<=2)))
- continue;
- if(battle_config.battle_log)
- printf("PC %d skill_addeff: card‚É‚æ‚éˆÙí?“® %d %d\n",src->id,i,dstsd->addeff3[type]);
- status_change_start(src,i,7,0,0,0,(i==SC_CONFUSION)? 10000+7000:skill_get_time2(sc2[type],7),0);
- }
- }
- }
- return 0;
-}
-
-/*=========================================================================
- ƒXƒLƒ‹U?‚«”ò‚΂µ?—
--------------------------------------------------------------------------*/
-int skill_blown( struct block_list *src, struct block_list *target,int count)
-{
- int dx=0,dy=0,nx,ny;
- int x=target->x,y=target->y;
- int dir,ret,prev_state=MS_IDLE;
- int moveblock;
- struct map_session_data *sd=NULL;
- struct mob_data *md=NULL;
- struct pet_data *pd=NULL;
- struct skill_unit *su=NULL;
-
- nullpo_retr(0, src);
- nullpo_retr(0, target);
-
- if(target->type==BL_PC){
- sd=(struct map_session_data *)target;
- }else if(target->type==BL_MOB){
- md=(struct mob_data *)target;
- }else if(target->type==BL_PET){
- pd=(struct pet_data *)target;
- }else if(target->type==BL_SKILL){
- su=(struct skill_unit *)target;
- }else return 0;
-
- if (count&0xf00000)
- dir = (count>>20)&0xf;
- else if (count&0x10000 || (target->x==src->x && target->y==src->y))
- dir = status_get_dir(target);
- else
- dir = map_calc_dir(target,src->x,src->y);
- if (dir>=0 && dir<8){
- dx = -dirx[dir];
- dy = -diry[dir];
- }
-
- ret=path_blownpos(target->m,x,y,dx,dy,count&0xffff);
- nx=ret>>16;
- ny=ret&0xffff;
- moveblock=( x/BLOCK_SIZE != nx/BLOCK_SIZE || y/BLOCK_SIZE != ny/BLOCK_SIZE);
-
- if(count&0x20000) {
- battle_stopwalking(target,1);
- if(sd){
- sd->to_x=nx;
- sd->to_y=ny;
- sd->walktimer = 1;
- clif_walkok(sd);
- clif_movechar(sd);
- }
- else if(md) {
- md->to_x=nx;
- md->to_y=ny;
- prev_state = md->state.state;
- md->state.state = MS_WALK;
- clif_fixmobpos(md);
- }
- else if(pd) {
- pd->to_x=nx;
- pd->to_y=ny;
- prev_state = pd->state.state;
- pd->state.state = MS_WALK;
- clif_fixpetpos(pd);
- }
- }
- else
- battle_stopwalking(target,2);
-
- dx = nx - x;
- dy = ny - y;
-
- if(sd) /* ?–ÊŠO‚Éo‚½‚Ì‚ÅÁ‹Ž */
- map_foreachinmovearea(clif_pcoutsight,target->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,0,sd);
- else if(md)
- map_foreachinmovearea(clif_moboutsight,target->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,md);
- else if(pd)
- map_foreachinmovearea(clif_petoutsight,target->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,pd);
-
- if(su){
- skill_unit_move_unit_group(su->group,target->m,dx,dy);
- }else{
- int tick = gettick();
- skill_unit_move(target,tick,0);
- if(moveblock) map_delblock(target);
- target->x=nx;
- target->y=ny;
- if(moveblock) map_addblock(target);
- skill_unit_move(target,tick,1);
- }
-
- if(sd) { /* ?–Ê?‚É“ü‚Á‚Ä‚«‚½‚Ì‚Å•\Ž¦ */
- map_foreachinmovearea(clif_pcinsight,target->m,nx-AREA_SIZE,ny-AREA_SIZE,nx+AREA_SIZE,ny+AREA_SIZE,-dx,-dy,0,sd);
- if(count&0x20000)
- sd->walktimer = -1;
- }
- else if(md) {
- map_foreachinmovearea(clif_mobinsight,target->m,nx-AREA_SIZE,ny-AREA_SIZE,nx+AREA_SIZE,ny+AREA_SIZE,-dx,-dy,BL_PC,md);
- if(count&0x20000)
- md->state.state = prev_state;
- }
- else if(pd) {
- map_foreachinmovearea(clif_petinsight,target->m,nx-AREA_SIZE,ny-AREA_SIZE,nx+AREA_SIZE,ny+AREA_SIZE,-dx,-dy,BL_PC,pd);
- if(count&0x20000)
- pd->state.state = prev_state;
- }
-
- return 0;
-}
-
-
-/*
- * =========================================================================
- * ƒXƒLƒ‹U??‰Ê?—‚Ü‚Æ‚ß
- * flag‚Ì?–¾B16i?
- * 00XRTTff
- * ff = magic‚ÅŒvŽZ‚É“n‚³‚ê‚éj
- * TT = ƒpƒPƒbƒg‚Ìtype•”•ª(0‚ŃfƒtƒHƒ‹ƒgj
- * X = ƒpƒPƒbƒg‚̃XƒLƒ‹Lv
- * R = —\–ñiskill_area_sub‚ÅŽg—p‚·‚éj
- *-------------------------------------------------------------------------
- */
-
-int skill_attack( int attack_type, struct block_list* src, struct block_list *dsrc,
- struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag )
-{
- struct Damage dmg;
- struct status_change *sc_data;
- int type,lv,damage;
- static int tmpdmg = 0;
-
- if(skillid > 0 && skilllv <= 0) return 0;
-
- rdamage = 0;
- nullpo_retr(0, src);
- nullpo_retr(0, dsrc);
- nullpo_retr(0, bl);
-
- sc_data = status_get_sc_data(bl);
-
-//‰½‚à‚µ‚È‚¢”»’肱‚±‚©‚ç
- if(dsrc->m != bl->m) //?Û‚ª“¯‚¶ƒ}ƒbƒv‚É‚¢‚È‚¯‚ê‚Ή½‚à‚µ‚È‚¢
- return 0;
- if(src->prev == NULL || dsrc->prev == NULL || bl->prev == NULL) //prev‚æ‚­‚í‚©‚ç‚È‚¢¦
- return 0;
- if(src->type == BL_PC && pc_isdead((struct map_session_data *)src)) //pŽÒH‚ªPC‚Å‚·‚Å‚ÉŽ€‚ñ‚Å‚¢‚½‚牽‚à‚µ‚È‚¢
- return 0;
- if(src != dsrc && dsrc->type == BL_PC && pc_isdead((struct map_session_data *)dsrc)) //pŽÒH‚ªPC‚Å‚·‚Å‚ÉŽ€‚ñ‚Å‚¢‚½‚牽‚à‚µ‚È‚¢
- return 0;
- if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl)) //?Û‚ªPC‚Å‚·‚Å‚ÉŽ€‚ñ‚Å‚¢‚½‚牽‚à‚µ‚È‚¢
- return 0;
- if(bl->type == BL_PC && skillnotok(skillid, (struct map_session_data *)bl))
- return 0; // [MouseJstr]
- if(sc_data && sc_data[SC_HIDING].timer != -1) { //ƒnƒCƒfƒBƒ“ƒO?‘Ô‚Å
- if(skill_get_pl(skillid) != 2) //ƒXƒLƒ‹‚Ì?«‚ª’n?«‚Å‚È‚¯‚ê‚Ή½‚à‚µ‚È‚¢
- return 0;
- }
- if(sc_data && sc_data[SC_TRICKDEAD].timer != -1) //Ž€‚ñ‚¾‚Ó‚è’†‚͉½‚à‚µ‚È‚¢
- return 0;
- if(skillid == WZ_STORMGUST) { //Žg—pƒXƒLƒ‹‚ªƒXƒg?ƒ€ƒKƒXƒg‚Å
- if(sc_data && sc_data[SC_FREEZE].timer != -1) //“€Œ‹?‘ԂȂ牽‚à‚µ‚È‚¢
- return 0;
- }
- if(skillid == WZ_FROSTNOVA && dsrc->x == bl->x && dsrc->y == bl->y) //Žg—pƒXƒLƒ‹‚ªƒtƒƒXƒgƒmƒ”ƒ@‚ÅAdsrc‚Æbl‚ª“¯‚¶êŠ‚Ȃ牽‚à‚µ‚È‚¢
- return 0;
- if(src->type == BL_PC && ((struct map_session_data *)src)->chatID) //pŽÒ‚ªPC‚Ń`ƒƒƒbƒg’†‚Ȃ牽‚à‚µ‚È‚¢
- return 0;
- if(dsrc->type == BL_PC && ((struct map_session_data *)dsrc)->chatID) //pŽÒ‚ªPC‚Ń`ƒƒƒbƒg’†‚Ȃ牽‚à‚µ‚È‚¢
- return 0;
- if(src->type == BL_PC && bl && mob_gvmobcheck(((struct map_session_data *)src),bl)==0)
- return 0;
-
-//‰½‚à‚µ‚È‚¢”»’肱‚±‚Ü‚Å
-
- type=-1;
- lv=(flag>>20)&0xf;
- dmg=battle_calc_attack(attack_type,src,bl,skillid,skilllv,flag&0xff ); //ƒ_ƒ?ƒWŒvŽZ
-
-//ƒ}ƒWƒbƒNƒƒbƒh?—‚±‚±‚©‚ç
- if(attack_type&BF_MAGIC && sc_data && sc_data[SC_MAGICROD].timer != -1 && src == dsrc) { //–‚–@U?‚Ń}ƒWƒbƒNƒƒbƒh?‘Ô‚Åsrc=dsrc‚È‚ç
- dmg.damage = dmg.damage2 = 0; //ƒ_ƒ?ƒW0
- if(bl->type == BL_PC) { //?Û‚ªPC‚Ìê‡
- struct map_session_data *sd = (struct map_session_data *)bl;
- if (sd) {
- int sp = skill_get_sp(skillid,skilllv); //Žg—p‚³‚ꂽƒXƒLƒ‹‚ÌSP‚ð‹z?
- sp = sp * sc_data[SC_MAGICROD].val2 / 100; //‹z?—¦ŒvŽZ
- if(skillid == WZ_WATERBALL && skilllv > 1) //ƒEƒH?ƒ^?ƒ{?ƒ‹Lv1ˆÈã
- sp = sp/((skilllv|1)*(skilllv|1)); //‚³‚ç‚ÉŒvŽZH
- if(sp > 0x7fff) sp = 0x7fff; //SP‘½‚·‚¬‚Ìꇂ͗˜_Å‘å’l
- else if(sp < 1) sp = 1; //1ˆÈ‰º‚ÌꇂÍ1
- if(sd->status.sp + sp > sd->status.max_sp) { //‰ñ•œSP+Œ»Ý‚ÌSP‚ªMSP‚æ‚è‘å‚«‚¢ê‡
- sp = sd->status.max_sp - sd->status.sp; //SP‚ðMSP-Œ»ÝSP‚É‚·‚é
- sd->status.sp = sd->status.max_sp; //Œ»Ý‚ÌSP‚ÉMSP‚ð‘ã“ü
- }
- else //‰ñ•œSP+Œ»Ý‚ÌSP‚ªMSP‚æ‚謂³‚¢ê‡‚͉ñ•œSP‚ð‰ÁŽZ
- sd->status.sp += sp;
- clif_heal(sd->fd,SP_SP,sp); //SP‰ñ•œƒGƒtƒFƒNƒg‚Ì•\Ž¦
- sd->canact_tick = tick + skill_delayfix(bl, skill_get_delay(SA_MAGICROD,sc_data[SC_MAGICROD].val1)); //
- }
- }
- clif_skill_nodamage(bl,bl,SA_MAGICROD,sc_data[SC_MAGICROD].val1,1); //ƒ}ƒWƒbƒNƒƒbƒhƒGƒtƒFƒNƒg‚ð•\Ž¦
- }
-//ƒ}ƒWƒbƒNƒƒbƒh?—‚±‚±‚Ü‚Å
-
- if(src->type==BL_PET) { // [Valaris]
- dmg.damage=battle_attr_fix(skilllv, skill_get_pl(skillid), status_get_element(bl) );
- dmg.damage2=0;
- }
-
- damage = dmg.damage + dmg.damage2;
-
- if(lv==15)
- lv=-1;
-
- if( flag&0xff00 )
- type=(flag&0xff00)>>8;
-
- if(damage <= 0 || damage < dmg.div_) //‚«”ò‚΂µ”»’èH¦
- dmg.blewcount = 0;
-
- if(skillid == CR_GRANDCROSS||skillid == NPC_DARKGRANDCROSS) {//ƒOƒ‰ƒ“ƒhƒNƒƒX
- if(battle_config.gx_disptype) dsrc = src; // “Gƒ_ƒ?ƒW”’•¶Žš•\Ž¦
- if( src == bl) type = 4; // ”½“®‚̓_ƒ?ƒWƒ‚?ƒVƒ‡ƒ“‚È‚µ
- }
-
-//Žg—pŽÒ‚ªPC‚ÌꇂÌ?—‚±‚±‚©‚ç
- if(src->type == BL_PC) {
- struct map_session_data *sd = (struct map_session_data *)src;
- nullpo_retr(0, sd);
-//˜A‘Ŷ(MO_CHAINCOMBO)‚±‚±‚©‚ç
- if(skillid == MO_CHAINCOMBO) {
- int delay = 1000 - 4 * status_get_agi(src) - 2 * status_get_dex(src); //Šî–{ƒfƒBƒŒƒC‚ÌŒvŽZ
- if(damage < status_get_hp(bl)) { //ƒ_ƒ?ƒW‚ª?Û‚ÌHP‚æ‚謂³‚¢ê‡
- if(pc_checkskill(sd, MO_COMBOFINISH) > 0 && sd->spiritball > 0) //–Ò—´Œ(MO_COMBOFINISH)Žæ“¾•?‹…•ÛŽŽž‚Í+300ms
- delay += 300 * battle_config.combo_delay_rate /100; //’ljÁƒfƒBƒŒƒC‚ðconf‚É‚æ‚è’²®
-
- status_change_start(src,SC_COMBO,MO_CHAINCOMBO,skilllv,0,0,delay,0); //ƒRƒ“ƒ{?‘Ô‚É
- }
- sd->attackabletime = sd->canmove_tick = tick + delay;
- clif_combo_delay(src,delay); //ƒRƒ“ƒ{ƒfƒBƒŒƒCƒpƒPƒbƒg‚Ì‘—M
- }
-//˜A‘Ŷ(MO_CHAINCOMBO)‚±‚±‚Ü‚Å
-//–Ò—´Œ(MO_COMBOFINISH)‚±‚±‚©‚ç
- else if(skillid == MO_COMBOFINISH) {
- int delay = 700 - 4 * status_get_agi(src) - 2 * status_get_dex(src);
- if(damage < status_get_hp(bl)) {
- //ˆ¢C—…”e™€Œ(MO_EXTREMITYFIST)Žæ“¾•?‹…4ŒÂ•ÛŽ•”š—ô”g“®(MO_EXPLOSIONSPIRITS)?‘ÔŽž‚Í+300ms
- //•šŒÕŒ(CH_TIGERFIST)Žæ“¾Žž‚à+300ms
- if((pc_checkskill(sd, MO_EXTREMITYFIST) > 0 && sd->spiritball >= 4 && sd->sc_data[SC_EXPLOSIONSPIRITS].timer != -1) ||
- (pc_checkskill(sd, CH_TIGERFIST) > 0 && sd->spiritball > 0) ||
- (pc_checkskill(sd, CH_CHAINCRUSH) > 0 && sd->spiritball > 1))
- delay += 300 * battle_config.combo_delay_rate /100; //’ljÁƒfƒBƒŒƒC‚ðconf‚É‚æ‚è’²®
-
- status_change_start(src,SC_COMBO,MO_COMBOFINISH,skilllv,0,0,delay,0); //ƒRƒ“ƒ{?‘Ô‚É
- }
- sd->attackabletime = sd->canmove_tick = tick + delay;
- clif_combo_delay(src,delay); //ƒRƒ“ƒ{ƒfƒBƒŒƒCƒpƒPƒbƒg‚Ì‘—M
- }
-//–Ò—´Œ(MO_COMBOFINISH)‚±‚±‚Ü‚Å
-//•šŒÕŒ(CH_TIGERFIST)‚±‚±‚©‚ç
- else if(skillid == CH_TIGERFIST) {
- int delay = 1000 - 4 * status_get_agi(src) - 2 * status_get_dex(src);
- if(damage < status_get_hp(bl)) {
- if(pc_checkskill(sd, CH_CHAINCRUSH) > 0) //˜A’Œ•ö?(CH_CHAINCRUSH)Žæ“¾Žž‚Í+300ms
- delay += 300 * battle_config.combo_delay_rate /100; //’ljÁƒfƒBƒŒƒC‚ðconf‚É‚æ‚è’²®
-
- status_change_start(src,SC_COMBO,CH_TIGERFIST,skilllv,0,0,delay,0); //ƒRƒ“ƒ{?‘Ô‚É
- }
- sd->attackabletime = sd->canmove_tick = tick + delay;
- clif_combo_delay(src,delay); //ƒRƒ“ƒ{ƒfƒBƒŒƒCƒpƒPƒbƒg‚Ì‘—M
- }
-//•šŒÕŒ(CH_TIGERFIST)‚±‚±‚Ü‚Å
-//˜A’Œ•ö?(CH_CHAINCRUSH)‚±‚±‚©‚ç
- else if(skillid == CH_CHAINCRUSH) {
- int delay = 1000 - 4 * status_get_agi(src) - 2 * status_get_dex(src);
- if(damage < status_get_hp(bl)) {
- //ˆ¢C—…”e™€Œ(MO_EXTREMITYFIST)Žæ“¾•?‹…4ŒÂ•ÛŽ•”š—ô”g“®(MO_EXPLOSIONSPIRITS)?‘ÔŽž‚Í+300ms
- if(pc_checkskill(sd, MO_EXTREMITYFIST) > 0 && sd->spiritball >= 4 && sd->sc_data[SC_EXPLOSIONSPIRITS].timer != -1)
- delay += 300 * battle_config.combo_delay_rate /100; //’ljÁƒfƒBƒŒƒC‚ðconf‚É‚æ‚è’²®
-
- status_change_start(src,SC_COMBO,CH_CHAINCRUSH,skilllv,0,0,delay,0); //ƒRƒ“ƒ{?‘Ô‚É
- }
- sd->attackabletime = sd->canmove_tick = tick + delay;
- clif_combo_delay(src,delay); //ƒRƒ“ƒ{ƒfƒBƒŒƒCƒpƒPƒbƒg‚Ì‘—M
- }
-//˜A’Œ•ö?(CH_CHAINCRUSH)‚±‚±‚Ü‚Å
- }
-//Žg—pŽÒ‚ªPC‚ÌꇂÌ?—‚±‚±‚Ü‚Å
-//•ŠíƒXƒLƒ‹H‚±‚±‚©‚ç
- //AppleGirl Was Here
- if(attack_type&BF_MAGIC && damage > 0 && src != bl && src == dsrc) { //Blah Blah
- if(bl->type == BL_PC) { //Blah Blah
- struct map_session_data *tsd = (struct map_session_data *)bl;
- if(tsd->magic_damage_return > 0) { //More Blah
- rdamage += damage * tsd->magic_damage_return / 100;
- if(rdamage < 1) rdamage = 1;
- }
- }
- }
- //Stop Here
- if(attack_type&BF_WEAPON && damage > 0 && src != bl && src == dsrc) { //•ŠíƒXƒLƒ‹•ƒ_ƒ?ƒW‚ ‚è•Žg—pŽÒ‚Æ?ÛŽÒ‚ªˆá‚¤•src=dsrc
- if(dmg.flag&BF_SHORT) { //‹ß‹——£U?ŽžH¦
- if(bl->type == BL_PC) { //?Û‚ªPC‚ÌŽž
- struct map_session_data *tsd = (struct map_session_data *)bl;
- nullpo_retr(0, tsd);
- if(tsd->short_weapon_damage_return > 0) { //‹ß‹——£U?’µ‚Ë•Ô‚µH¦
- rdamage += damage * tsd->short_weapon_damage_return / 100;
- if(rdamage < 1) rdamage = 1;
- }
- }
- if(sc_data && sc_data[SC_REFLECTSHIELD].timer != -1) { //ƒŠƒtƒŒƒNƒgƒV?ƒ‹ƒhŽž
- rdamage += damage * sc_data[SC_REFLECTSHIELD].val2 / 100; //’µ‚Ë•Ô‚µŒvŽZ
- if(rdamage < 1) rdamage = 1;
- }
- }
- else if(dmg.flag&BF_LONG) { //‰“‹——£U?ŽžH¦
- if(bl->type == BL_PC) { //?Û‚ªPC‚ÌŽž
- struct map_session_data *tsd = (struct map_session_data *)bl;
- nullpo_retr(0, tsd);
- if(tsd->long_weapon_damage_return > 0) { //‰“‹——£U?’µ‚Ë•Ô‚µH¦
- rdamage += damage * tsd->long_weapon_damage_return / 100;
- if(rdamage < 1) rdamage = 1;
- }
- }
- }
- if(rdamage > 0)
- clif_damage(src,src,tick, dmg.amotion,0,rdamage,1,4,0);
- }
-//•ŠíƒXƒLƒ‹H‚±‚±‚Ü‚Å
-
- switch(skillid){
- case AS_SPLASHER:
- clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, -1, 5);
- break;
- case ASC_BREAKER: // [celest]
- if (attack_type&BF_MAGIC) { // only display damage for the 2nd attack
- if (damage + tmpdmg != 0) // if both attacks missed, do not display a 2nd 'miss'
- clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage+tmpdmg, dmg.div_, skillid, skilllv, type);
- tmpdmg = 0; // clear the temporary damage
- } else {
- if (damage == 0) // if weapon attack missed, display the 'miss'
- clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, 0, dmg.div_, skillid, skilllv, type);
- tmpdmg = damage; // store the temporary weapon damage
- }
- break;
- case NPC_SELFDESTRUCTION:
- case NPC_SELFDESTRUCTION2:
- break;
- case SN_SHARPSHOOTING:
- clif_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,0,0,0);
- break;
- default:
- clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, (lv!=0)?lv:skilllv, (skillid==0)? 5:type );
- }
- /* ‚«”ò‚΂µˆ—‚Æ‚»‚̃pƒPƒbƒg */
- if (dmg.blewcount > 0 && bl->type!=BL_SKILL && !map[src->m].flag.gvg) {
- skill_blown(dsrc,bl,dmg.blewcount);
- if(bl->type == BL_MOB)
- clif_fixmobpos((struct mob_data *)bl);
- else if(bl->type == BL_PET)
- clif_fixpetpos((struct pet_data *)bl);
- else
- clif_fixpos(bl);
- }
-
- map_freeblock_lock();
- /* ?ۂɃ_ƒ?ƒW?—‚ðs‚¤ */
- if (skillid || flag) {
- if (attack_type&BF_WEAPON)
- battle_delay_damage(tick+dmg.amotion,src,bl,damage,0);
- else
- battle_damage(src,bl,damage,0);
- }
- if(skillid == RG_INTIMIDATE && damage > 0 && !(status_get_mode(bl)&0x20) && !map[src->m].flag.gvg ) {
- int s_lv = status_get_lv(src),t_lv = status_get_lv(bl);
- int rate = 50 + skilllv * 5;
- rate = rate + (s_lv - t_lv);
- if(rand()%100 < rate)
- skill_addtimerskill(src,tick + 800,bl->id,0,0,skillid,skilllv,0,flag);
- }
- if(damage > 0 && dmg.flag&BF_SKILL && bl->type==BL_PC && pc_checkskill((struct map_session_data *)bl,RG_PLAGIARISM) && sc_data[SC_PRESERVE].timer == -1){
- struct map_session_data *tsd = (struct map_session_data *)bl;
- nullpo_retr(0, tsd);
- if(!tsd->status.skill[skillid].id && !tsd->status.skill[skillid].lv
- && !(skillid > NPC_PIERCINGATT && skillid < NPC_SUMMONMONSTER)
- && !(skillid > NPC_SELFDESTRUCTION2 && skillid < NPC_UNDEADATTACK)){
- //?‚É?‚ñ‚Å‚¢‚éƒXƒLƒ‹‚ª‚ ‚ê‚ΊY?ƒXƒLƒ‹‚ðÁ‚·
- if (tsd->cloneskill_id && tsd->status.skill[tsd->cloneskill_id].flag==13){
- tsd->status.skill[tsd->cloneskill_id].id=0;
- tsd->status.skill[tsd->cloneskill_id].flag=0;
- }
- tsd->cloneskill_id=skillid;
- tsd->status.skill[skillid].id=skillid;
- tsd->status.skill[skillid].lv=(pc_checkskill(tsd,RG_PLAGIARISM) > skill_get_max(skillid))?
- skill_get_max(skillid):pc_checkskill(tsd,RG_PLAGIARISM);
- tsd->status.skill[skillid].flag=13;//cloneskill flag
- clif_skillinfoblock(tsd);
- }
- }
- /* ƒ_ƒ?ƒW‚ª‚ ‚é‚È‚ç’ljÁ?‰Ê”»’è */
- if(bl->prev != NULL){
- if(!status_isdead(bl)) {
- if(damage > 0)
- skill_additional_effect(src,bl,skillid,skilllv,attack_type,tick);
- if(bl->type==BL_MOB && src!=bl) /* ƒXƒLƒ‹Žg—p?Œ‚ÌMOBƒXƒLƒ‹ */
- {
- struct mob_data *md=(struct mob_data *)bl;
- nullpo_retr(0, md);
- if(battle_config.mob_changetarget_byskill == 1)
- {
- int target;
- target=md->target_id;
- if(src->type == BL_PC)
- md->target_id=src->id;
- mobskill_use(md,tick,MSC_SKILLUSED|(skillid<<16));
- md->target_id=target;
- }
- else
- mobskill_use(md,tick,MSC_SKILLUSED|(skillid<<16));
- }
- }
- }
-
- if(src->type == BL_PC && dmg.flag&BF_WEAPON && src != bl && src == dsrc && damage > 0) {
- struct map_session_data *sd = (struct map_session_data *)src;
- int hp = 0,sp = 0;
- nullpo_retr(0, sd);
- if(sd->hp_drain_rate && sd->hp_drain_per > 0 && dmg.damage > 0 && rand()%100 < sd->hp_drain_rate) {
- hp += (dmg.damage * sd->hp_drain_per)/100;
- if(sd->hp_drain_rate > 0 && hp < 1) hp = 1;
- else if(sd->hp_drain_rate < 0 && hp > -1) hp = -1;
- }
- if(sd->hp_drain_rate_ && sd->hp_drain_per_ > 0 && dmg.damage2 > 0 && rand()%100 < sd->hp_drain_rate_) {
- hp += (dmg.damage2 * sd->hp_drain_per_)/100;
- if(sd->hp_drain_rate_ > 0 && hp < 1) hp = 1;
- else if(sd->hp_drain_rate_ < 0 && hp > -1) hp = -1;
- }
- if(sd->sp_drain_rate > 0 && sd->sp_drain_per > 0 && dmg.damage > 0 && rand()%100 < sd->sp_drain_rate) {
- sp += (dmg.damage * sd->sp_drain_per)/100;
- if(sd->sp_drain_rate > 0 && sp < 1) sp = 1;
- else if(sd->sp_drain_rate < 0 && sp > -1) sp = -1;
- }
- if(sd->sp_drain_rate_ > 0 && sd->sp_drain_per_ > 0 && dmg.damage2 > 0 && rand()%100 < sd->sp_drain_rate_) {
- sp += (dmg.damage2 * sd->sp_drain_per_)/100;
- if(sd->sp_drain_rate_ > 0 && sp < 1) sp = 1;
- else if(sd->sp_drain_rate_ < 0 && sp > -1) sp = -1;
- }
- if(hp || sp)
- pc_heal(sd,hp,sp);
- if (sd->sp_drain_type && bl->type == BL_PC)
- battle_heal(NULL,bl,0,-sp,0);
- }
-
- if ((skillid || flag) && rdamage>0) {
- if (attack_type&BF_WEAPON)
- battle_delay_damage(tick+dmg.amotion,bl,src,rdamage,0);
- else
- battle_damage(bl,src,rdamage,0);
- }
-
- if(attack_type&BF_WEAPON && sc_data && sc_data[SC_AUTOCOUNTER].timer != -1 && sc_data[SC_AUTOCOUNTER].val4 > 0) {
- if(sc_data[SC_AUTOCOUNTER].val3 == dsrc->id)
- battle_weapon_attack(bl,dsrc,tick,0x8000|sc_data[SC_AUTOCOUNTER].val1);
- status_change_end(bl,SC_AUTOCOUNTER,-1);
- }
-
- map_freeblock_unlock();
-
- return (dmg.damage+dmg.damage2); /* ?ƒ_ƒ‚ð•Ô‚· */
-}
-
-/*==========================================
- * ƒXƒLƒ‹”Í?U?—p(map_foreachinarea‚©‚çŒÄ‚΂ê‚é)
- * flag‚ɂ‚¢‚ÄF16i?‚ðŠm”F
- * MSB <- 00fTffff ->LSB
- * T =ƒ^?ƒQƒbƒg‘I?—p(BCT_*)
- * ffff=Ž©—R‚ÉŽg—p‰Â”\
- * 0 =—\–ñB0‚ɌŒè
- *------------------------------------------
- */
-static int skill_area_temp[8]; /* ˆêŽž??B•K—v‚È‚çŽg‚¤B */
-typedef int (*SkillFunc)(struct block_list *,struct block_list *,int,int,unsigned int,int);
-int skill_area_sub( struct block_list *bl,va_list ap )
-{
- struct block_list *src;
- int skill_id,skill_lv,flag;
- unsigned int tick;
- SkillFunc func;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- if(bl->type!=BL_PC && bl->type!=BL_MOB && bl->type!=BL_SKILL)
- return 0;
-
- src=va_arg(ap,struct block_list *); //‚±‚±‚Å‚Ísrc‚Ì’l‚ð?Æ‚µ‚Ä‚¢‚È‚¢‚Ì‚ÅNULLƒ`ƒFƒbƒN‚Í‚µ‚È‚¢
- skill_id=va_arg(ap,int);
- skill_lv=va_arg(ap,int);
- tick=va_arg(ap,unsigned int);
- flag=va_arg(ap,int);
- func=va_arg(ap,SkillFunc);
-
- if(battle_check_target(src,bl,flag) > 0)
- func(src,bl,skill_id,skill_lv,tick,flag);
- return 0;
-}
-
-static int skill_check_unit_range_sub( struct block_list *bl,va_list ap )
-{
- struct skill_unit *unit;
- int *c;
- int skillid,unit_id;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, unit = (struct skill_unit *)bl);
- nullpo_retr(0, c = va_arg(ap,int *));
-
- if(bl->prev == NULL || bl->type != BL_SKILL)
- return 0;
-
- if(!unit->alive)
- return 0;
-
- skillid = va_arg(ap,int);
- unit_id = unit->group->unit_id;
-
- if (skillid==MG_SAFETYWALL || skillid==AL_PNEUMA) {
- if(unit_id != 0x7e && unit_id != 0x85)
- return 0;
- } else if (skillid==AL_WARP) {
- if ((unit_id<0x8f || unit_id>0x99) && unit_id!=0x92)
- return 0;
- } else if ((skillid>=HT_SKIDTRAP && skillid<=HT_CLAYMORETRAP) || skillid==HT_TALKIEBOX) {
- if ((unit_id<0x8f || unit_id>0x99) && unit_id!=0x92)
- return 0;
- } else if (skillid==WZ_FIREPILLAR) {
- if (unit_id!=0x87)
- return 0;
- } else if (skillid==HP_BASILICA) {
- if ((unit_id<0x8f || unit_id>0x99) && unit_id!=0x92 && unit_id!=0x83)
- return 0;
- } else
- return 0;
-
- (*c)++;
-
- return 0;
-}
-
-int skill_check_unit_range(int m,int x,int y,int skillid,int skilllv)
-{
- int c = 0;
- int range = skill_get_unit_range(skillid);
- int layout_type = skill_get_unit_layout_type(skillid,skilllv);
- if (layout_type==-1 || layout_type>MAX_SQUARE_LAYOUT) {
- printf("skill_check_unit_range: unsupported layout type %d for skill %d\n",layout_type,skillid);
- return 0;
- }
-
- // ‚Æ‚è‚ ‚¦‚¸³•ûŒ`‚̃†ƒjƒbƒgƒŒƒCƒAƒEƒg‚̂ݑΉž
- range += layout_type;
- map_foreachinarea(skill_check_unit_range_sub,m,
- x-range,y-range,x+range,y+range,BL_SKILL,&c,skillid);
-
- return c;
-}
-
-static int skill_check_unit_range2_sub( struct block_list *bl,va_list ap )
-{
- int *c;
- int skillid;
-
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, c = va_arg(ap,int *));
-
- if(bl->prev == NULL || (bl->type != BL_PC && bl->type != BL_MOB))
- return 0;
-
- if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl))
- return 0;
-
- skillid = va_arg(ap,int);
- if (skillid==HP_BASILICA && bl->type==BL_PC)
- return 0;
-
- (*c)++;
-
- return 0;
-}
-
-int skill_check_unit_range2(struct block_list *bl, int m,int x,int y,int skillid, int skilllv)
-{
- int c = 0, range, type;
-
- switch (skillid) { // to be expanded later
- case WZ_ICEWALL:
- range = 2;
- break;
- default:
- {
- int layout_type = skill_get_unit_layout_type(skillid,skilllv);
- if (layout_type==-1 || layout_type>MAX_SQUARE_LAYOUT) {
- printf("skill_check_unit_range2: unsupported layout type %d for skill %d\n",layout_type,skillid);
- return 0;
- }
- // ‚Æ‚è‚ ‚¦‚¸³•ûŒ`‚̃†ƒjƒbƒgƒŒƒCƒAƒEƒg‚̂ݑΉž
- range = skill_get_unit_range(skillid) + layout_type;
- }
- break;
- }
-
- // if the caster is a monster/NPC, only check for players
- // otherwise just check everything
- if (bl->type == BL_PC)
- type = 0;
- else type = BL_PC;
-
- map_foreachinarea(skill_check_unit_range2_sub, m,
- x - range, y - range, x + range, y + range,
- type, &c, skillid);
-
- return c;
-}
-
-int skill_guildaura_sub (struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd;
- struct guild *g;
- int gid, id;
- int flag = 0;
-
- nullpo_retr(0, sd=(struct map_session_data *)bl);
-
- nullpo_retr(0, ap);
- id = va_arg(ap,int);
- gid = va_arg(ap,int);
- if (sd->status.guild_id != gid)
- return 0;
-
- g = va_arg(ap,struct guild *);
- if (guild_checkskill(g, GD_LEADERSHIP)>0) flag |= 1<<0;
- if (guild_checkskill(g, GD_GLORYWOUNDS)>0) flag |= 1<<1;
- if (guild_checkskill(g, GD_SOULCOLD)>0) flag |= 1<<2;
- if (guild_checkskill(g, GD_HAWKEYES)>0) flag |= 1<<3;
- if (guild_checkskill(g, GD_CHARISMA)>0) flag |= 1<<4;
-
- if (flag > 0) {
- if (sd->sc_count && sd->sc_data[SC_GUILDAURA].timer != -1) {
- if (sd->sc_data[SC_GUILDAURA].val4 != flag) {
- sd->sc_data[SC_GUILDAURA].val4 = flag;
- status_calc_pc (sd, 0);
- }
- return 0;
- }
- status_change_start(&sd->bl, SC_GUILDAURA,1,id,0,flag,0,0 );
- }
-
- return 0;
-}
-
-/*=========================================================================
- * ”Í?ƒXƒLƒ‹Žg—p?—¬•ª‚¯‚±‚±‚©‚ç
- */
-/* ?Û‚Ì?‚ðƒJƒEƒ“ƒg‚·‚éBiskill_area_temp[0]‚ð‰Šú‰»‚µ‚Ä‚¨‚­‚±‚Æj */
-int skill_area_sub_count(struct block_list *src,struct block_list *target,int skillid,int skilllv,unsigned int tick,int flag)
-{
- if(skill_area_temp[0] < 0xffff)
- skill_area_temp[0]++;
- return 0;
-}
-
-int skill_count_water(struct block_list *src,int range)
-{
- int i,x,y,cnt = 0,size = range*2+1;
- struct skill_unit *unit;
-
- for (i=0;i<size*size;i++) {
- x = src->x+(i%size-range);
- y = src->y+(i/size-range);
- if (map_getcell(src->m,x,y,CELL_CHKWATER)) {
- cnt++;
- continue;
- }
- unit = map_find_skill_unit_oncell(src,x,y,SA_DELUGE,NULL);
- if (unit) {
- cnt++;
- skill_delunit(unit);
- }
- }
- return cnt;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int skill_timerskill(int tid, unsigned int tick, int id,int data )
-{
- struct map_session_data *sd = NULL;
- struct mob_data *md = NULL;
- struct pet_data *pd = NULL;
- struct block_list *src = map_id2bl(id),*target;
- struct skill_timerskill *skl = NULL;
- int range;
-
- nullpo_retr(0, src);
-
- if(src->prev == NULL)
- return 0;
-
- if(src->type == BL_PC) {
- nullpo_retr(0, sd = (struct map_session_data *)src);
- skl = &sd->skilltimerskill[data];
- }
- else if(src->type == BL_MOB) {
- nullpo_retr(0, md = (struct mob_data *)src);
- skl = &md->skilltimerskill[data];
- }
- else if(src->type == BL_PET) { // [Valaris]
- nullpo_retr(0, pd = (struct pet_data *)src);
- skl = &pd->skilltimerskill[data];
- }
-
- else
- return 0;
-
- nullpo_retr(0, skl);
-
- skl->timer = -1;
- if (sd) {
- sd->timerskill_count--;
- }
-
- if(skl->target_id) {
- struct block_list tbl;
- target = map_id2bl(skl->target_id);
- if(skl->skill_id == RG_INTIMIDATE) {
- if(target == NULL) {
- target = &tbl; //‰Šú‰»‚µ‚Ä‚È‚¢‚̂ɃAƒhƒŒƒX“Ë‚Á?‚ñ‚Å‚¢‚¢‚Ì‚©‚ÈH
- target->type = BL_NUL;
- target->m = src->m;
- target->prev = target->next = NULL;
- }
- }
- if(target == NULL)
- return 0;
- if(target->prev == NULL && skl->skill_id != RG_INTIMIDATE)
- return 0;
- if(src->m != target->m)
- return 0;
- if(sd && pc_isdead(sd))
- return 0;
- if(target->type == BL_PC && pc_isdead((struct map_session_data *)target) && skl->skill_id != RG_INTIMIDATE)
- return 0;
-
- switch(skl->skill_id) {
- case TF_BACKSLIDING:
- clif_skill_nodamage(src,src,skl->skill_id,skl->skill_lv,1);
- break;
- case RG_INTIMIDATE:
- if(sd && !map[src->m].flag.noteleport) {
- int x,y,i,j;
- pc_randomwarp(sd,3);
- for(i=0;i<16;i++) {
- j = rand()%8;
- x = sd->bl.x + dirx[j];
- y = sd->bl.y + diry[j];
- if(map_getcell(sd->bl.m,x,y,CELL_CHKPASS))
- break;
- }
- if(i >= 16) {
- x = sd->bl.x;
- y = sd->bl.y;
- }
- if(target->prev != NULL) {
- if(target->type == BL_PC && !pc_isdead((struct map_session_data *)target))
- pc_setpos((struct map_session_data *)target,map[sd->bl.m].name,x,y,3);
- else if(target->type == BL_MOB)
- mob_warp((struct mob_data *)target,-1,x,y,3);
- }
- }
- else if(md && !map[src->m].flag.monster_noteleport) {
- int x,y,i,j;
- mob_warp(md,-1,-1,-1,3);
- for(i=0;i<16;i++) {
- j = rand()%8;
- x = md->bl.x + dirx[j];
- y = md->bl.y + diry[j];
- if(map_getcell(md->bl.m,x,y,CELL_CHKPASS))
- break;
- }
- if(i >= 16) {
- x = md->bl.x;
- y = md->bl.y;
- }
- if(target->prev != NULL) {
- if(target->type == BL_PC && !pc_isdead((struct map_session_data *)target))
- pc_setpos((struct map_session_data *)target,map[md->bl.m].name,x,y,3);
- else if(target->type == BL_MOB)
- mob_warp((struct mob_data *)target,-1,x,y,3);
- }
- }
- break;
-
- case BA_FROSTJOKE: /* Š¦‚¢ƒWƒ‡?ƒN */
- case DC_SCREAM: /* ƒXƒNƒŠ?ƒ€ */
- range=battle_config.area_size; //Ž‹ŠE‘S?
- map_foreachinarea(skill_frostjoke_scream,src->m,src->x-range,src->y-range,
- src->x+range,src->y+range,0,src,skl->skill_id,skl->skill_lv,tick);
- break;
-
- case WZ_WATERBALL:
- if (skl->type>1) {
- skl->timer = 0; // skill_addtimerskill‚ÅŽg—p‚³‚ê‚È‚¢‚悤‚É
- skill_addtimerskill(src,tick+150,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag);
- skl->timer = -1;
- }
- skill_attack(BF_MAGIC,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag);
- if (skl->type <= 1) { // partial fix: it still doesn't end if the target dies
- // should put outside of the switch, but since this is the only
- // mage targetted spell for now,
- struct status_change *sc_data = status_get_sc_data(src);
- if(sc_data && sc_data[SC_MAGICPOWER].timer != -1) //ƒ}ƒWƒbƒNƒpƒ?‚Ì?‰ÊI—¹
- status_change_end(src,SC_MAGICPOWER,-1);
- }
- break;
- default:
- skill_attack(skl->type,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag);
- break;
- }
- }
- else {
- if(src->m != skl->map)
- return 0;
- switch(skl->skill_id) {
- case WZ_METEOR:
- if(skl->type >= 0) {
- skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->type>>16,skl->type&0xFFFF,0);
- clif_skill_poseffect(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,tick);
- }
- else
- skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,0);
- break;
- }
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int skill_addtimerskill(struct block_list *src,unsigned int tick,int target,int x,int y,int skill_id,int skill_lv,int type,int flag)
-{
- int i;
-
- nullpo_retr(1, src);
-
- if(src->type == BL_PC) {
- struct map_session_data *sd = (struct map_session_data *)src;
- nullpo_retr(1, sd);
- for(i=0;i<MAX_SKILLTIMERSKILL;i++) {
- if(sd->skilltimerskill[i].timer == -1) {
- sd->skilltimerskill[i].timer = add_timer(tick, skill_timerskill, src->id, i);
- sd->skilltimerskill[i].src_id = src->id;
- sd->skilltimerskill[i].target_id = target;
- sd->skilltimerskill[i].skill_id = skill_id;
- sd->skilltimerskill[i].skill_lv = skill_lv;
- sd->skilltimerskill[i].map = src->m;
- sd->skilltimerskill[i].x = x;
- sd->skilltimerskill[i].y = y;
- sd->skilltimerskill[i].type = type;
- sd->skilltimerskill[i].flag = flag;
- sd->timerskill_count++;
-
- return 0;
- }
- }
- return 1;
- }
- else if(src->type == BL_MOB) {
- struct mob_data *md = (struct mob_data *)src;
- nullpo_retr(1, md);
- for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++) {
- if(md->skilltimerskill[i].timer == -1) {
- md->skilltimerskill[i].timer = add_timer(tick, skill_timerskill, src->id, i);
- md->skilltimerskill[i].src_id = src->id;
- md->skilltimerskill[i].target_id = target;
- md->skilltimerskill[i].skill_id = skill_id;
- md->skilltimerskill[i].skill_lv = skill_lv;
- md->skilltimerskill[i].map = src->m;
- md->skilltimerskill[i].x = x;
- md->skilltimerskill[i].y = y;
- md->skilltimerskill[i].type = type;
- md->skilltimerskill[i].flag = flag;
-
- return 0;
- }
- }
- return 1;
- }
- else if(src->type == BL_PET) { // [Valaris]
- struct pet_data *pd = (struct pet_data *)src;
- nullpo_retr(1, pd);
- for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++) {
- if(pd->skilltimerskill[i].timer == -1) {
- pd->skilltimerskill[i].timer = add_timer(tick, skill_timerskill, src->id, i);
- pd->skilltimerskill[i].src_id = src->id;
- pd->skilltimerskill[i].target_id = target;
- pd->skilltimerskill[i].skill_id = skill_id;
- pd->skilltimerskill[i].skill_lv = skill_lv;
- pd->skilltimerskill[i].map = src->m;
- pd->skilltimerskill[i].x = x;
- pd->skilltimerskill[i].y = y;
- pd->skilltimerskill[i].type = type;
- pd->skilltimerskill[i].flag = flag;
-
- return 0;
- }
- }
- return 1;
- }
- return 1;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int skill_cleartimerskill(struct block_list *src)
-{
- int i;
-
- nullpo_retr(0, src);
-
- if(src->type == BL_PC) {
- struct map_session_data *sd = (struct map_session_data *)src;
- nullpo_retr(0, sd);
-
- if (sd->timerskill_count <= 0)
- return 0;
-
- for(i=0;i<MAX_SKILLTIMERSKILL;i++) {
- if(sd->skilltimerskill[i].timer != -1) {
- delete_timer(sd->skilltimerskill[i].timer, skill_timerskill);
- sd->skilltimerskill[i].timer = -1;
- sd->timerskill_count--;
- }
- }
- }
- else if(src->type == BL_MOB) {
- struct mob_data *md = (struct mob_data *)src;
- nullpo_retr(0, md);
- for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++) {
- if(md->skilltimerskill[i].timer != -1) {
- delete_timer(md->skilltimerskill[i].timer, skill_timerskill);
- md->skilltimerskill[i].timer = -1;
- }
- }
- }
-
- return 0;
-}
-
-/* ”Í?ƒXƒLƒ‹Žg—p?—¬•ª‚¯‚±‚±‚Ü‚Å
- * -------------------------------------------------------------------------
- */
-
-/*==========================================
- * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹AIDŽw’èU?Œnj
- * iƒXƒpƒQƒbƒeƒB‚ÉŒü‚¯‚Ä‚P?‘OiI(ƒ_ƒƒ|)j
- *------------------------------------------
- */
-int skill_castend_damage_id (struct block_list* src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag)
-{
- struct map_session_data *sd = NULL, *tsd = NULL;
- struct status_change *sc_data;
- int i;
-
- if(skillid < 0)
- { // remove the debug print when this case is finished
- printf("skill_castend_damage_id: skillid=%i\ncall: %p %p %i %i %i %i",skillid,
- src, bl,skillid,skilllv,tick,flag);
- return 0;
- }
- if(skillid > 0 && skilllv <= 0) return 0;
-
- nullpo_retr(1, src);
- nullpo_retr(1, bl);
-
- sc_data = status_get_sc_data(src);
-
- if (src->type == BL_PC)
- sd = (struct map_session_data *)src;
- if (sd && pc_isdead(sd))
- return 1;
-
- if ((skillid == CR_GRANDCROSS || skillid == NPC_DARKGRANDCROSS) && src != bl)
- bl = src;
- if (bl->prev == NULL)
- return 1;
- if (bl->type == BL_PC)
- tsd = (struct map_session_data *)bl;
- if (tsd && pc_isdead(tsd))
- return 1;
- map_freeblock_lock();
-
- switch(skillid)
- {
- /* •ŠíU?ŒnƒXƒLƒ‹ */
- case SM_BASH: /* ƒoƒbƒVƒ… */
- case MC_MAMMONITE: /* ƒƒ}?ƒiƒCƒg */
- case AC_DOUBLE: /* ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO */
- case AS_SONICBLOW: /* ƒ\ƒjƒbƒNƒuƒ? */
- case KN_PIERCE: /* ƒsƒA?ƒX */
- case KN_SPEARBOOMERANG: /* ƒXƒsƒAƒu?ƒƒ‰ƒ“ */
- case KN_BRANDISHSPEAR: /* ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA */
- case TF_POISON: /* ƒCƒ“ƒxƒiƒ€ */
- case TF_SPRINKLESAND: /* »‚Ü‚« */
- case AC_CHARGEARROW: /* ƒ`ƒƒ?ƒWƒAƒ? */
- case RG_RAID: /* ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN */
- case RG_INTIMIDATE: /* ƒCƒ“ƒeƒBƒ~ƒfƒCƒg */
- case BA_MUSICALSTRIKE: /* ƒ~ƒ…?ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN */
- case DC_THROWARROW: /* –î?‚¿ */
- case BA_DISSONANCE: /* •s‹¦˜a‰¹ */
- case CR_HOLYCROSS: /* ƒz?ƒŠ?ƒNƒƒX */
- case CR_SHIELDCHARGE:
- case CR_SHIELDBOOMERANG:
- /* ˆÈ‰ºMOB?—p */
- /* ??U?ASPŒ¸­U?A‰“‹——£U?A–hŒä–³Ž‹U?A‘½’iU? */
- case NPC_PIERCINGATT:
- case NPC_MENTALBREAKER:
- case NPC_RANGEATTACK:
- case NPC_CRITICALSLASH:
- case NPC_COMBOATTACK:
- /* •K’†U?A“ÅU?AˆÃ?U?A’¾?U?AƒXƒ^ƒ“U? */
- case NPC_GUIDEDATTACK:
- case NPC_POISON:
- case NPC_BLINDATTACK:
- case NPC_SILENCEATTACK:
- case NPC_STUNATTACK:
- /* Ή»U?AŽô‚¢U?A‡–°U?Aƒ‰ƒ“ƒ_ƒ€ATKU? */
- case NPC_PETRIFYATTACK:
- case NPC_CURSEATTACK:
- case NPC_SLEEPATTACK:
- case NPC_RANDOMATTACK:
- /* …?«U?A’n?«U?A‰Î?«U?A•—?«U? */
- case NPC_WATERATTACK:
- case NPC_GROUNDATTACK:
- case NPC_FIREATTACK:
- case NPC_WINDATTACK:
- /* “Å?«U?A¹?«U?AˆÅ?«U?A”O?«U?ASPŒ¸­U? */
- case NPC_POISONATTACK:
- case NPC_HOLYATTACK:
- case NPC_DARKNESSATTACK:
- case NPC_TELEKINESISATTACK:
- case NPC_UNDEADATTACK:
- case NPC_BREAKARMOR:
- case NPC_BREAKWEAPON:
- case NPC_BREAKHELM:
- case NPC_BREAKSHIELD:
- case LK_AURABLADE: /* ƒI?ƒ‰ƒuƒŒ?ƒh */
- case LK_SPIRALPIERCE: /* ƒXƒpƒCƒ‰ƒ‹ƒsƒA?ƒX */
- case LK_HEADCRUSH: /* ƒwƒbƒhƒNƒ‰ƒbƒVƒ… */
- case LK_JOINTBEAT: /* ƒWƒ‡ƒCƒ“ƒgƒr?ƒg */
- case CG_ARROWVULCAN: /* ƒAƒ?ƒoƒ‹ƒJƒ“ */
- case HW_MAGICCRASHER: /* ƒ}ƒWƒbƒNƒNƒ‰ƒbƒVƒƒ? */
- case ASC_METEORASSAULT: /* ƒƒeƒIƒAƒTƒ‹ƒg */
- case ITM_TOMAHAWK:
- case MO_COMBOFINISH: /* –Ò—´Œ */
- case CH_CHAINCRUSH: /* ˜A’Œ•ö? */
- case CH_PALMSTRIKE: /* –ÒŒÕd”hŽR */
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
- break;
-
- case ASC_BREAKER: /* ƒ\ƒEƒ‹ƒuƒŒ?ƒJ? */ // [DracoRPG]
- // separate weapon and magic attacks
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
- skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
- break;
-
- case SN_SHARPSHOOTING: /* ƒVƒƒ?ƒvƒVƒ…?ƒeƒBƒ“ƒO */
- map_foreachinpath (skill_attack_area,src->m, // function, map
- src->x,src->y, // source xy
- bl->x,bl->y, // target xy
- 2,0, // range, type
- BF_WEAPON,src,src,skillid,skilllv,tick,flag,BCT_ENEMY); // varargs
- break;
-
- case PA_PRESSURE: /* ƒvƒŒƒbƒVƒƒ? */
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
- if (rand()%100 < 50)
- status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(PA_PRESSURE,skilllv),0);
- else
- status_change_start(bl,SC_BLEEDING,skilllv,0,0,0,skill_get_time2(PA_PRESSURE,skilllv),0);
- if (tsd) {
- int sp = tsd->status.max_sp * 10 * skilllv / 100;
- if (sp > tsd->status.sp) sp = tsd->status.sp;
- tsd->status.sp -= sp;
- clif_updatestatus(tsd,SP_SP);
- }
- break;
-
- case NPC_DARKBREATH:
- clif_emotion(src,7);
- skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,flag);
- break;
-
- case MO_INVESTIGATE: /* ?™¤ */
- {
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
- if (sc_data && sc_data[SC_BLADESTOP].timer != -1)
- status_change_end(src,SC_BLADESTOP,-1);
- }
- break;
-
- case SN_FALCONASSAULT: /* ƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg */
- skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,flag);
- break;
-
- case RG_BACKSTAP: /* ƒoƒbƒNƒXƒ^ƒu */
- {
- int dir = map_calc_dir(src,bl->x,bl->y), t_dir = status_get_dir(bl);
- int dist = distance(src->x, src->y, bl->x, bl->y);
- if ((dist > 0 && !map_check_dir(dir, t_dir)) || bl->type == BL_SKILL) {
- if (sc_data && sc_data[SC_HIDING].timer != -1)
- status_change_end(src, SC_HIDING, -1); // ƒnƒCƒfƒBƒ“ƒO‰ðœ
- skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick, flag);
- dir = dir < 4 ? dir+4 : dir-4; // change direction [Celest]
- if (tsd)
- tsd->dir = dir;
- else if (bl->type == BL_MOB) {
- struct mob_data *md = (struct mob_data *)bl;
- if (md) md->dir = dir;
- }
- clif_changed_dir(bl);
- }
- else if (sd)
- clif_skill_fail(sd,sd->skillid,0,0);
- }
- break;
-
- case AM_ACIDTERROR: /* ƒAƒVƒbƒhƒeƒ‰? */
- skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick, flag);
- if (tsd && battle_config.equipment_breaking && rand()%100 < skill_get_time(skillid,skilllv)) {
- pc_breakarmor(tsd);
- clif_emotion(bl, 23);
- }
- break;
-
- case MO_FINGEROFFENSIVE: /* Žw? */
- {
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
- if (battle_config.finger_offensive_type && sd) {
- for (i = 1; i < sd->spiritball_old; i++)
- skill_addtimerskill(src, tick + i * 200, bl->id, 0, 0, skillid, skilllv, BF_WEAPON, flag);
- sd->canmove_tick = tick + (sd->spiritball_old - 1) * 200;
- }
- if (sc_data && sc_data[SC_BLADESTOP].timer != -1)
- status_change_end(src,SC_BLADESTOP,-1);
- }
- break;
-
- case MO_CHAINCOMBO: /* ˜A‘Ŷ */
- {
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
- if (sc_data && sc_data[SC_BLADESTOP].timer != -1)
- status_change_end(src,SC_BLADESTOP,-1);
- }
- break;
-
- case CH_TIGERFIST: /* •šŒÕŒ */
- if (tsd && !(map[bl->m].flag.gvg || map[bl->m].flag.pvp)) {
- map_freeblock_unlock();
- return 1;
- }
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
- break;
-
- case MO_EXTREMITYFIST: /* ˆ¢C—…”e–PŒ */
- {
- if(sd) {
- struct walkpath_data wpd;
- int dx,dy;
-
- dx = bl->x - sd->bl.x;
- dy = bl->y - sd->bl.y;
- if(dx > 0) dx++;
- else if(dx < 0) dx--;
- if (dy > 0) dy++;
- else if(dy < 0) dy--;
- if(dx == 0 && dy == 0) dx++;
- if (path_search(&wpd,src->m,sd->bl.x,sd->bl.y,sd->bl.x+dx,sd->bl.y+dy,1) == -1) {
- dx = bl->x - sd->bl.x;
- dy = bl->y - sd->bl.y;
- if(path_search(&wpd,src->m,sd->bl.x,sd->bl.y,sd->bl.x+dx,sd->bl.y+dy,1) == -1) {
- clif_skill_fail(sd,sd->skillid,0,0);
- break;
- }
- }
- sd->to_x = sd->bl.x + dx;
- sd->to_y = sd->bl.y + dy;
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
- clif_walkok(sd);
- clif_movechar(sd);
- if(dx < 0) dx = -dx;
- if(dy < 0) dy = -dy;
- sd->attackabletime = sd->canmove_tick = tick + 100 + sd->speed * ((dx > dy)? dx:dy);
- if(sd->canact_tick < sd->canmove_tick)
- sd->canact_tick = sd->canmove_tick;
- pc_movepos(sd,sd->to_x,sd->to_y);
- status_change_end(&sd->bl,SC_COMBO,-1);
- }
- else
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
- status_change_end(src, SC_EXPLOSIONSPIRITS, -1);
- if (sc_data && sc_data[SC_BLADESTOP].timer != -1)
- status_change_end(src,SC_BLADESTOP,-1);
- }
- break;
-
- /* •ŠíŒn”Í?U?ƒXƒLƒ‹ */
- case AC_SHOWER: /* ƒAƒ?ƒVƒƒƒ? */
- case AS_GRIMTOOTH: /* ƒOƒŠƒ€ƒgƒD?ƒX */
- case MC_CARTREVOLUTION: /* ƒJ?ƒgƒŒƒ”ƒHƒŠƒ…?ƒVƒ‡ƒ“ */
- case NPC_SPLASHATTACK: /* ƒXƒvƒ‰ƒbƒVƒ…ƒAƒ^ƒbƒN */
- case AS_SPLASHER: /* [Valaris] */
- if(flag&1){
- /* ŒÂ•Ê‚Ƀ_ƒ?ƒW‚ð?‚¦‚é */
- if(bl->id!=skill_area_temp[1]){
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,
- 0x0500);
- }
- } else {
- int ar = 1;
- int x = bl->x, y = bl->y;
- switch (skillid) {
- case AC_SHOWER:
- ar=2;
- break;
- case NPC_SPLASHATTACK:
- ar=3;
- break;
- }
-
- skill_area_temp[1]=bl->id;
- skill_area_temp[2]=x;
- skill_area_temp[3]=y;
- /* ‚Ü‚¸ƒ^?ƒQƒbƒg‚ÉU?‚ð‰Á‚¦‚é */
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0);
- /* ‚»‚ÌŒãƒ^?ƒQƒbƒgˆÈŠO‚Ì”Í??‚Ì“G‘S?‚É?—‚ðs‚¤ */
- map_foreachinarea(skill_area_sub,
- bl->m,x-ar,y-ar,x+ar,y+ar,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
- skill_castend_damage_id);
- }
- break;
-
- case SM_MAGNUM: /* ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN [celest] */
- if(flag&1 && bl->id != skill_area_temp[1]){
- int dist = distance (bl->x, bl->y, skill_area_temp[2], skill_area_temp[3]);
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,
- 0x0500|dist);
- } else {
- skill_area_temp[1]=src->id;
- skill_area_temp[2]=src->x;
- skill_area_temp[3]=src->y;
- map_foreachinarea(skill_area_sub,
- src->m,src->x-2,src->y-2,src->x+2,src->y+2,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
- skill_castend_damage_id);
- status_change_start (src,SC_FLAMELAUNCHER,0,0,0,0,10000,0);
- clif_skill_nodamage (src,src,skillid,skilllv,1);
- }
- break;
-
- case KN_BOWLINGBASH: /* ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ… */
- if(flag&1){
- /* ŒÂ•Ê‚Ƀ_ƒ?ƒW‚ð?‚¦‚é */
- if(bl->id!=skill_area_temp[1])
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0x0500);
- } else {
- int i,c; /* ‘¼l‚©‚ç•·‚¢‚½“®‚«‚È‚Ì‚ÅŠÔˆá‚Á‚Ä‚é‰Â”\«‘å•?—¦‚ª?‚¢‚Á‚·„ƒ */
- /* ‚Ü‚¸ƒ^[ƒQƒbƒg‚ÉUŒ‚‚ð‰Á‚¦‚é */
- if (!skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0))
- break;
- c = skill_get_blewcount(skillid,skilllv);
- if(map[bl->m].flag.gvg) c = 0;
- for(i=0;i<c;i++){
- skill_blown(src,bl,1);
- if(bl->type == BL_MOB)
- clif_fixmobpos((struct mob_data *)bl);
- else if(bl->type == BL_PET)
- clif_fixpetpos((struct pet_data *)bl);
- else
- clif_fixpos(bl);
- skill_area_temp[0]=0;
- map_foreachinarea(skill_area_sub,
- bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY ,
- skill_area_sub_count);
- if(skill_area_temp[0]>1) break;
- }
- skill_area_temp[1]=bl->id;
- /* ‚»‚ÌŒãƒ^?ƒQƒbƒgˆÈŠO‚Ì”Í??‚Ì“G‘S?‚É?—‚ðs‚¤ */
- map_foreachinarea(skill_area_sub,
- bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
- skill_castend_damage_id);
- }
- break;
-
- case KN_SPEARSTAB: /* ƒXƒsƒAƒXƒ^ƒu */
- if(flag&1){
- /* ŒÂ•Ê‚Ƀ_ƒ[ƒW‚ð—^‚¦‚é */
- if (bl->id==skill_area_temp[1])
- break;
- if (skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0x0500))
- skill_blown(src,bl,skill_area_temp[2]);
- } else {
- int x=bl->x,y=bl->y,i,dir;
- /* ‚Ü‚¸ƒ^[ƒQƒbƒg‚ÉUŒ‚‚ð‰Á‚¦‚é */
- dir = map_calc_dir(bl,src->x,src->y);
- skill_area_temp[1] = bl->id;
- skill_area_temp[2] = skill_get_blewcount(skillid,skilllv)|dir<<20;
- if (skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0))
- skill_blown(src,bl,skill_area_temp[2]);
- for (i=0;i<4;i++) {
- map_foreachinarea(skill_area_sub,bl->m,x,y,x,y,0,
- src,skillid,skilllv,tick,flag|BCT_ENEMY|1,
- skill_castend_damage_id);
- x += dirx[dir];
- y += diry[dir];
- }
- }
- break;
-
- case ALL_RESURRECTION: /* ƒŠƒUƒŒƒNƒVƒ‡ƒ“ */
- case PR_TURNUNDEAD: /* ƒ^?ƒ“ƒAƒ“ƒfƒbƒh */
- if(bl->type != BL_PC && battle_check_undead(status_get_race(bl),status_get_elem_type(bl)))
- skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
- else {
- map_freeblock_unlock();
- return 1;
- }
- break;
-
- /* –‚–@ŒnƒXƒLƒ‹ */
- case MG_SOULSTRIKE: /* ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN */
- case NPC_DARKSOULSTRIKE: /*ˆÅƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN*/
- case MG_COLDBOLT: /* ƒR[ƒ‹ƒhƒ{ƒ‹ƒg */
- case MG_FIREBOLT: /* ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg */
- case MG_LIGHTNINGBOLT: /* ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg */
- case WZ_EARTHSPIKE: /* ƒA[ƒXƒXƒpƒCƒN */
- case AL_HEAL: /* ƒq[ƒ‹ */
- case AL_HOLYLIGHT: /* ƒz[ƒŠ[ƒ‰ƒCƒg */
- case WZ_JUPITEL: /* ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[ */
- case NPC_DARKJUPITEL: /*ˆÅƒ†ƒsƒeƒ‹*/
- case NPC_MAGICALATTACK: /* MOB:–‚–@‘Å?U? */
- case PR_ASPERSIO: /* ƒAƒXƒyƒ‹ƒVƒI */
- case MG_FROSTDIVER: /* ƒtƒƒXƒgƒ_ƒCƒo[ */
- skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
- break;
-
- case WZ_WATERBALL: /* ƒEƒH?ƒ^?ƒ{?ƒ‹ */
- skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
- if (skilllv>1) {
- int cnt,range;
- range = skilllv>5?2:skilllv/2;
- if (sd)
- cnt = skill_count_water(src,range)-1;
- else
- cnt = skill_get_num(skillid,skilllv)-1;
- if (cnt>0)
- skill_addtimerskill(src,tick+150,bl->id,0,0,
- skillid,skilllv,cnt,flag);
- }
- break;
-
- case PR_BENEDICTIO: /* ¹?~•Ÿ */
- if(status_get_race(bl)==1 || status_get_race(bl)==6)
- skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
- break;
-
- /* –‚–@Œn”Í?U?ƒXƒLƒ‹ */
- case MG_NAPALMBEAT: /* ƒiƒp?ƒ€ƒr?ƒg */
- case MG_FIREBALL: /* ƒtƒ@ƒCƒ„?ƒ{?ƒ‹ */
- case WZ_SIGHTRASHER: /* ƒTƒCƒgƒ‰ƒbƒVƒƒ[ */
- if (flag & 1) {
- /* ŒÂ•Ê‚Ƀ_ƒ?ƒW‚ð?‚¦‚é */
- if (bl->id != skill_area_temp[1]){
- if(skillid == MG_FIREBALL){ /* ƒtƒ@ƒCƒ„?ƒ{?ƒ‹‚È‚ç’†S‚©‚ç‚Ì‹——£‚ðŒvŽZ */
- skill_area_temp[0] = distance(bl->x, bl->y, skill_area_temp[2], skill_area_temp[3]);
- }
- skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,
- skill_area_temp[0]| 0x0500);
- }
- } else {
- int ar;
- skill_area_temp[0]=0;
- skill_area_temp[1]=bl->id;
- switch (skillid) {
- case MG_NAPALMBEAT:
- ar = 1;
- /* ƒiƒp[ƒ€ƒr[ƒg‚Í•ªŽUƒ_ƒ[ƒW‚È‚Ì‚Å“G‚Ì”‚𔂦‚é */
- map_foreachinarea(skill_area_sub,
- bl->m,bl->x-ar,bl->y-ar,bl->x+ar,bl->y+ar,0,
- src,skillid,skilllv,tick,flag|BCT_ENEMY,
- skill_area_sub_count);
- break;
- case MG_FIREBALL:
- ar = 2;
- skill_area_temp[2]=bl->x;
- skill_area_temp[3]=bl->y;
- /* ƒ^[ƒQƒbƒg‚ÉUŒ‚‚ð‰Á‚¦‚é(ƒXƒLƒ‹ƒGƒtƒFƒNƒg•\Ž¦) */
- skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,
- skill_area_temp[0]);
- break;
- case WZ_SIGHTRASHER:
- default:
- ar = 3;
- bl = src;
- status_change_end(src,SC_SIGHT,-1);
- break;
- }
- if (skillid==WZ_SIGHTRASHER) {
- /* ƒXƒLƒ‹ƒGƒtƒFƒNƒg•\Ž¦ */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- } else {
- /* ƒ^[ƒQƒbƒg‚ÉUŒ‚‚ð‰Á‚¦‚é(ƒXƒLƒ‹ƒGƒtƒFƒNƒg•\Ž¦) */
- skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,
- skill_area_temp[0]);
- }
- /* ƒ^[ƒQƒbƒgˆÈŠO‚͈͓̔à‚Ì“G‘S‘̂Ɉ—‚ðs‚¤ */
- map_foreachinarea(skill_area_sub,
- bl->m,bl->x-ar,bl->y-ar,bl->x+ar,bl->y+ar,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
- skill_castend_damage_id);
- }
- break;
-
- case HW_NAPALMVULCAN: // Fixed By SteelViruZ
- if(flag&1){
- if(bl->id!=skill_area_temp[1]){
- skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,
- skill_area_temp[0]);
- }
- }else{
- int ar=(skillid==HW_NAPALMVULCAN)?1:2;
- skill_area_temp[1]=bl->id;
- if(skillid==HW_NAPALMVULCAN){
- skill_area_temp[0]=0;
- map_foreachinarea(skill_area_sub,
- bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY ,
- skill_area_sub_count);
- }else{
- skill_area_temp[0]=0;
- skill_area_temp[2]=bl->x;
- skill_area_temp[3]=bl->y;
- }
- skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,
- skill_area_temp[0] );
- map_foreachinarea(skill_area_sub,
- bl->m,bl->x-ar,bl->y-ar,bl->x+ar,bl->y+ar,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
- skill_castend_damage_id);
- }
- break;
-
- case WZ_FROSTNOVA: /* ƒtƒƒXƒgƒmƒ”ƒ@ */
- map_foreachinarea(skill_attack_area,src->m,src->x-5,bl->y-5,bl->x+5,bl->y+5,0,BF_MAGIC,src,src,skillid,skilllv,tick,flag,BCT_ENEMY);
- break;
-
- /* ‚»‚Ì‘¼ */
- case HT_BLITZBEAT: /* ƒuƒŠƒbƒcƒr?ƒg */
- if(flag&1){
- /* ŒÂ•Ê‚Ƀ_ƒ?ƒW‚ð?‚¦‚é */
- if(bl->id!=skill_area_temp[1])
- skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,skill_area_temp[0]|(flag&0xf00000));
- }else{
- skill_area_temp[0]=0;
- skill_area_temp[1]=bl->id;
- if(flag&0xf00000)
- map_foreachinarea(skill_area_sub,bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY ,skill_area_sub_count);
- /* ‚Ü‚¸ƒ^?ƒQƒbƒg‚ÉU?‚ð‰Á‚¦‚é */
- skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,skill_area_temp[0]|(flag&0xf00000));
- /* ‚»‚ÌŒãƒ^?ƒQƒbƒgˆÈŠO‚Ì”Í??‚Ì“G‘S?‚É?—‚ðs‚¤ */
- map_foreachinarea(skill_area_sub,
- bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
- skill_castend_damage_id);
- }
- break;
-
- case CR_GRANDCROSS: /* ƒOƒ‰ƒ“ƒhƒNƒƒX */
- case NPC_DARKGRANDCROSS: /*ˆÅƒOƒ‰ƒ“ƒhƒNƒƒX*/
- /* ƒXƒLƒ‹ƒ†ƒjƒbƒg”z’u */
- skill_castend_pos2(src,bl->x,bl->y,skillid,skilllv,tick,0);
- if(sd)
- sd->canmove_tick = tick + 1000;
- else if(src->type == BL_MOB)
- mob_changestate((struct mob_data *)src,MS_DELAY,1000);
- break;
-
- case TF_THROWSTONE: /* ΓŠ‚° */
- case NPC_SMOKING: /* ƒXƒ‚?ƒLƒ“ƒO */
- skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,0 );
- break;
-
- // Celest
- case PF_SOULBURN:
- {
- int per = skilllv < 5 ? 20+ skilllv*10 : 60;
- if (rand()%100 < per) {
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (skilllv == 5)
- skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,0 );
- if (tsd && (map[src->m].flag.pvp || map[src->m].flag.gvg)) {
- tsd->status.sp = 0;
- clif_updatestatus(tsd,SP_SP);
- }
- } else {
- clif_skill_nodamage(src,src,skillid,skilllv,1);
- if (skilllv == 5)
- skill_attack(BF_MAGIC,src,src,src,skillid,skilllv,tick,0 );
- if (sd) {
- sd->status.sp = 0;
- clif_updatestatus(sd,SP_SP);
- }
- }
- if (sd)
- pc_blockskill_start (sd, skillid, (skilllv < 5 ? 10000: 15000));
- }
- break;
-
- case NPC_SELFDESTRUCTION: /* Ž©”š */
- case NPC_SELFDESTRUCTION2: /* Ž©”š2 */
- if(flag&1){
- /* ŒÂ•Ê‚Ƀ_ƒ?ƒW‚ð?‚¦‚é */
- if(src->type==BL_MOB){
- struct mob_data* mb = (struct mob_data*)src;
- nullpo_retr(1, mb);
- mb->hp=skill_area_temp[2];
- if(bl->id!=skill_area_temp[1])
- skill_attack(BF_MISC,src,src,bl,NPC_SELFDESTRUCTION,skilllv,tick,flag );
- mb->hp=1;
- }
- }else{
- struct mob_data *md;
- if((md=(struct mob_data *)src)){
- skill_area_temp[1]=bl->id;
- skill_area_temp[2]=status_get_hp(src);
- clif_skill_nodamage(src,src,NPC_SELFDESTRUCTION,-1,1);
- map_foreachinarea(skill_area_sub,
- bl->m,bl->x-5,bl->y-5,bl->x+5,bl->y+5,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
- skill_castend_damage_id);
- battle_damage(src,src,md->hp,0);
- }
- }
- break;
-
- /* HP‹z?/HP‹z?–‚–@ */
- case NPC_BLOODDRAIN:
- case NPC_ENERGYDRAIN:
- {
- int heal;
- heal = skill_attack((skillid==NPC_BLOODDRAIN)?BF_WEAPON:BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
- if( heal > 0 ){
- struct block_list tbl;
- tbl.id = 0;
- tbl.m = src->m;
- tbl.x = src->x;
- tbl.y = src->y;
- clif_skill_nodamage(&tbl,src,AL_HEAL,heal,1);
- battle_heal(NULL,src,heal,0,0);
- }
- }
- break;
-
- // unknown skills [Celest]
- case NPC_BIND:
- case NPC_EXPLOSIONSPIRITS:
- case NPC_INCAGI:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- break;
-
- case 0:
- if(sd) {
- if(flag&3){
- if(bl->id!=skill_area_temp[1])
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0x0500);
- }
- else{
- int ar=sd->splash_range;
- skill_area_temp[1]=bl->id;
- map_foreachinarea(skill_area_sub,
- bl->m, bl->x - ar, bl->y - ar, bl->x + ar, bl->y + ar, 0,
- src, skillid, skilllv, tick, flag | BCT_ENEMY | 1,
- skill_castend_damage_id);
- }
- }
- break;
-
- default:
- printf("Unknown skill used:%d\n",skillid);
- map_freeblock_unlock();
- return 1;
- }
- if(sc_data) {
- if (sc_data[SC_MAGICPOWER].timer != -1 && skillid != HW_MAGICPOWER) //ƒ}ƒWƒbƒNƒpƒ?‚Ì?‰ÊI—¹
- status_change_end(src,SC_MAGICPOWER,-1);
- }
- map_freeblock_unlock();
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹AIDŽw’èŽx‰‡Œnj
- *------------------------------------------
- */
-int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, int skillid, int skilllv, unsigned int tick, int flag)
-{
- struct map_session_data *sd = NULL;
- struct map_session_data *dstsd = NULL;
- struct mob_data *md = NULL;
- struct mob_data *dstmd = NULL;
- int i;
- int sc_def_vit, sc_def_mdef;
- int sc_dex, sc_luk;
-
- if(skillid < 0)
- { // remove the debug print when this case is finished
- printf("skill_castend_damage_id: skillid=%i\ncall: %p %p %i %i %i %i",skillid,
- src, bl,skillid,skilllv,tick,flag);
- return 0;
- }
- if(skillid > 0 && skilllv <= 0) return 0; // celest
-
- nullpo_retr(1, src);
- nullpo_retr(1, bl);
-
- if (src->type == BL_PC) {
- nullpo_retr (1, sd = (struct map_session_data *)src);
- } else if (src->type == BL_MOB) {
- nullpo_retr (1, md = (struct mob_data *)src);
- }
-
- sc_dex = status_get_mdef (bl);
- sc_luk = status_get_luk (bl);
- sc_def_vit = status_get_sc_def_vit (bl);
- sc_def_mdef = status_get_sc_def_mdef (bl);
-
- if (bl->type == BL_PC){
- nullpo_retr (1, dstsd = (struct map_session_data *)bl);
- } else if (bl->type == BL_MOB){
- nullpo_retr (1, dstmd = (struct mob_data *)bl);
- }
-
- if(bl->prev == NULL)
- return 1;
- if(sd && pc_isdead(sd))
- return 1;
- if(dstsd && pc_isdead(dstsd) && skillid != ALL_RESURRECTION)
- return 1;
- if(status_get_class(bl) == 1288)
- return 1;
- if (sd && skillnotok(skillid, sd)) // [MouseJstr]
- return 0;
-
- map_freeblock_lock();
- switch(skillid)
- {
- case AL_HEAL: /* ƒq?ƒ‹ */
- {
- int heal = skill_calc_heal(src, skilllv);
- int heal_get_jobexp;
- int skill;
-
- if (skilllv > 10)
- heal = 9999; //9999ƒq[ƒ‹
- if (dstsd && dstsd->special_state.no_magic_damage)
- heal=0; /* ?‹à峃J?ƒhiƒq?ƒ‹—Ê‚Oj */
- if (sd) {
- if ((skill = pc_checkskill(sd, HP_MEDITATIO)) > 0) // ƒƒfƒBƒeƒCƒeƒBƒI
- heal += heal * skill * 2 / 100;
- if (sd && dstsd && sd->status.partner_id == dstsd->status.char_id &&
- pc_calc_base_job2(sd->status.class_) == 23 && sd->status.sex == 0) //Ž©•ª‚à?Û‚àPCA?Û‚ªŽ©•ª‚̃p?ƒgƒi?AŽ©•ª‚ªƒXƒpƒmƒrAŽ©•ª‚ªŠ‚È‚ç
- heal = heal*2; //ƒXƒpƒmƒr‚̉łª’U“߂Ƀq?ƒ‹‚·‚é‚Æ2”{‚É‚È‚é
- }
-
- clif_skill_nodamage (src, bl, skillid, heal, 1);
- heal_get_jobexp = battle_heal(NULL,bl,heal,0,0);
-
- // JOB??’lŠl“¾
- if(sd && dstsd && heal > 0 && sd != dstsd && battle_config.heal_exp > 0){
- heal_get_jobexp = heal_get_jobexp * battle_config.heal_exp / 100;
- if (heal_get_jobexp <= 0)
- heal_get_jobexp = 1;
- pc_gainexp (sd, 0, heal_get_jobexp);
- }
- }
- break;
-
- case ALL_RESURRECTION: /* ƒŠƒUƒŒƒNƒVƒ‡ƒ“ */
- if(dstsd) {
- int per = 0;
- if (map[bl->m].flag.pvp && dstsd->pvp_point < 0)
- break; /* PVP‚Å•œŠˆ•s‰Â”\?‘Ô */
-
- if (pc_isdead(dstsd)) { /* Ž€–S”»’è */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- switch(skilllv){
- case 1: per=10; break;
- case 2: per=30; break;
- case 3: per=50; break;
- case 4: per=80; break;
- }
- dstsd->status.hp = dstsd->status.max_hp * per / 100;
- if (dstsd->status.hp <= 0) dstsd->status.hp = 1;
- if (dstsd->special_state.restart_full_recover) { /* ƒIƒVƒŠƒXƒJ?ƒh */
- dstsd->status.hp = dstsd->status.max_hp;
- dstsd->status.sp = dstsd->status.max_sp;
- }
- pc_setstand(dstsd);
- if(battle_config.pc_invincible_time > 0)
- pc_setinvincibletimer(dstsd, battle_config.pc_invincible_time);
- clif_updatestatus(dstsd, SP_HP);
- clif_resurrection(bl, 1);
- if(sd && sd != dstsd && battle_config.resurrection_exp > 0) {
- int exp = 0,jexp = 0;
- int lv = dstsd->status.base_level - sd->status.base_level, jlv = dstsd->status.job_level - sd->status.job_level;
- if(lv > 0) {
- exp = (int)((double)dstsd->status.base_exp * (double)lv * (double)battle_config.resurrection_exp / 1000000.);
- if (exp < 1) exp = 1;
- }
- if(jlv > 0) {
- jexp = (int)((double)dstsd->status.job_exp * (double)lv * (double)battle_config.resurrection_exp / 1000000.);
- if (jexp < 1) jexp = 1;
- }
- if(exp > 0 || jexp > 0)
- pc_gainexp (sd, exp, jexp);
- }
- }
- }
- break;
-
- case AL_DECAGI: /* ‘¬“xŒ¸­ */
- if (dstsd && dstsd->special_state.no_magic_damage)
- break;
- if (rand() % 100 < (50 + skilllv * 3 + (status_get_lv(src) + status_get_int(src) / 5) - sc_def_mdef)) {
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- status_change_start (bl, SkillStatusChangeTable[skillid], skilllv, 0, 0, 0, skill_get_time(skillid,skilllv), 0);
- }
- break;
-
- case AL_CRUCIS:
- if (flag & 1) {
- int race = status_get_race (bl), ele = status_get_elem_type (bl);
- if (battle_check_target (src, bl, BCT_ENEMY) && (race == 6 || battle_check_undead (race, ele))) {
- int slv = status_get_lv (src),tlv = status_get_lv (bl);
- int rate = 25 + skilllv*2 + slv - tlv;
- if (rand()%100 < rate)
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,0,0);
- }
- } else {
- clif_skill_nodamage(src, bl, skillid, skilllv, 1);
- map_foreachinarea(skill_area_sub,
- src->m, src->x-15, src->y-15, src->x+15, src->y+15, 0,
- src, skillid, skilllv, tick, flag|BCT_ENEMY|1,
- skill_castend_nodamage_id);
- }
- break;
-
- case PR_LEXDIVINA: /* ƒŒƒbƒNƒXƒfƒBƒr?ƒi */
- {
- struct status_change *sc_data = status_get_sc_data(bl);
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- if (dstsd && dstsd->special_state.no_magic_damage)
- break;
- if (sc_data && sc_data[SC_DIVINA].timer != -1)
- status_change_end(bl,SC_DIVINA, -1);
- else if (rand() % 100 < sc_def_vit) {
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
- }
- }
- break;
-
- case SA_ABRACADABRA:
- {
- int abra_skillid = 0, abra_skilllv;
- //require 1 yellow gemstone even with mistress card or Into the Abyss
- if ((i = pc_search_inventory(sd, 715)) < 0 ) { //bug fixed by Lupus (item pos can be 0, too!)
- clif_skill_fail(sd,sd->skillid,0,0);
- break;
- }
- pc_delitem(sd, i, 1, 0);
- do {
- abra_skillid = rand() % 331;
- if (skill_abra_db[abra_skillid].req_lv > skilllv ||
- rand()%10000 >= skill_abra_db[abra_skillid].per || //db‚ÉŠî‚­ƒŒƒxƒ‹?Šm—¦”»’è
- (abra_skillid >= NPC_PIERCINGATT && abra_skillid <= NPC_SUMMONMONSTER) || //NPCƒXƒLƒ‹‚̓_ƒ
- skill_get_unit_flag(abra_skillid) & UF_DANCE) //‰‰‘tƒXƒLƒ‹‚̓_ƒ
- abra_skillid = 0; // reset to get a new id
- } while (abra_skillid == 0);
- abra_skilllv = skill_get_max(abra_skillid) > skilllv ? skilllv : skill_get_max(abra_skillid);
- clif_skill_nodamage (src, bl, skillid, skilllv, 1);
- sd->skillitem = abra_skillid;
- sd->skillitemlv = abra_skilllv;
- clif_item_skill (sd, abra_skillid, abra_skilllv, "Abracadabra");
- }
- break;
-
- case SA_COMA:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (dstsd) {
- if (dstsd->special_state.no_magic_damage)
- break;
- dstsd->status.hp = 1;
- dstsd->status.sp = 1;
- clif_updatestatus(dstsd, SP_HP);
- clif_updatestatus(dstsd, SP_SP);
- }
- if(dstmd) dstmd->hp = 1;
- break;
- case SA_FULLRECOVERY:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (dstsd) {
- if (dstsd->special_state.no_magic_damage)
- break;
- pc_heal (dstsd, dstsd->status.max_hp, dstsd->status.max_sp);
- }
- if (dstmd) dstmd->hp = status_get_max_hp(bl);
- break;
- case SA_SUMMONMONSTER:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (sd) mob_once_spawn(sd,map[src->m].name,src->x,src->y,"--ja--",-1,1,"");
- break;
- case SA_LEVELUP:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (sd && pc_nextbaseexp(sd)) pc_gainexp(sd, pc_nextbaseexp(sd) * 10 / 100, 0);
- break;
- case SA_INSTANTDEATH:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (sd) pc_damage(NULL,sd,sd->status.max_hp);
- break;
- case SA_QUESTION:
- case SA_GRAVITY:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- break;
- case SA_CLASSCHANGE:
- {
- //ƒNƒ‰ƒXƒ`ƒFƒ“ƒW—pƒ{ƒXƒ‚ƒ“ƒXƒ^?ID
- int changeclass[]={1038,1039,1046,1059,1086,1087,1112,1115
- ,1157,1159,1190,1272,1312,1373,1492};
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(dstmd) mob_class_change(dstmd,changeclass);
- }
- break;
- case SA_MONOCELL:
- {
- int poringclass[]={1002};
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(dstmd) mob_class_change(dstmd,poringclass);
- }
- break;
- case SA_DEATH:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (dstsd) pc_damage(NULL,dstsd,dstsd->status.max_hp);
- if (dstmd) mob_damage(NULL,dstmd,dstmd->hp,1);
- break;
- case SA_REVERSEORCISH:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (dstsd) pc_setoption(dstsd,dstsd->status.option|0x0800);
- break;
- case SA_FORTUNE:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(sd) pc_getzeny(sd,status_get_lv(bl)*100);
- break;
- case SA_TAMINGMONSTER:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (dstmd) {
- for (i = 0; i < MAX_PET_DB; i++) {
- if (dstmd->class_ == pet_db[i].class_) {
- pet_catch_process1 (sd, dstmd->class_);
- break;
- }
- }
- }
- break;
-
- case AL_INCAGI: /* ‘¬“x?‰Á */
- case AL_BLESSING: /* ƒuƒŒƒbƒVƒ“ƒO */
- case PR_SLOWPOISON:
- case PR_IMPOSITIO: /* ƒCƒ€ƒ|ƒVƒeƒBƒIƒ}ƒkƒX */
- case PR_LEXAETERNA: /* ƒŒƒbƒNƒXƒG?ƒeƒ‹ƒi */
- case PR_SUFFRAGIUM: /* ƒTƒtƒ‰ƒMƒEƒ€ */
- case PR_BENEDICTIO: /* ¹?~•Ÿ */
- case CR_PROVIDENCE: /* ƒvƒƒ”ƒBƒfƒ“ƒX */
- if (dstsd && dstsd->special_state.no_magic_damage)
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- else {
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- }
- break;
-
- case CG_MARIONETTE: /* ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ?ƒ‹ */
- if (sd && dstsd){
- struct status_change *sc_data = status_get_sc_data(src);
- struct status_change *tsc_data = status_get_sc_data(bl);
- int sc = SkillStatusChangeTable[skillid];
- int sc2 = SC_MARIONETTE2;
-
- if ((sd == dstsd)
- || (!sd->status.party_id)
- || (sd->status.party_id != dstsd->status.party_id)) {
- clif_skill_fail(sd,skillid,0,0);
- map_freeblock_unlock();
- return 1;
- }
- if(sc_data && tsc_data){
- if (sc_data[sc].timer == -1 && tsc_data[sc2].timer == -1) {
- status_change_start (src,sc,skilllv,0,bl->id,0,skill_get_time(skillid,skilllv),0);
- status_change_start (bl,sc2,skilllv,0,src->id,0,skill_get_time(skillid,skilllv),0);
- }
- else if (sc_data[sc].timer != -1 && tsc_data[sc2].timer != -1 &&
- sc_data[sc].val3 == bl->id && tsc_data[sc2].val3 == src->id) {
- status_change_end(src, sc, -1);
- status_change_end(bl, sc2, -1);
- }
- else {
- clif_skill_fail(sd,skillid,0,0);
- map_freeblock_unlock();
- return 1;
- }
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- }
- }
- break;
-
- case SA_FLAMELAUNCHER: // added failure chance and chance to break weapon if turned on [Valaris]
- case SA_FROSTWEAPON:
- case SA_LIGHTNINGLOADER:
- case SA_SEISMICWEAPON:
- if (dstsd) {
- if (dstsd->special_state.no_magic_damage) {
- clif_skill_nodamage(src,bl,skillid,skilllv,0);
- break;
- }
- if(dstsd->status.weapon == 0 ||
- (sd && sd->status.party_id > 0 && sd->status.party_id != dstsd->status.party_id) ||
- dstsd->sc_data[SC_FLAMELAUNCHER].timer != -1 ||
- dstsd->sc_data[SC_FROSTWEAPON].timer != -1 ||
- dstsd->sc_data[SC_LIGHTNINGLOADER].timer != -1 ||
- dstsd->sc_data[SC_SEISMICWEAPON].timer != -1 ||
- dstsd->sc_data[SC_ENCPOISON].timer != -1) {
- if (sd) clif_skill_fail(sd,skillid,0,0);
- clif_skill_nodamage(src,bl,skillid,skilllv,0);
- break;
- }
- }
- if(skilllv < 5 && rand()%100 > (60+skilllv*10) ) { //fixed by Lupus (4 -> 5) or else it has 100% success even at lv4
- if (sd) clif_skill_fail(sd,skillid,0,0);
- clif_skill_nodamage(src,bl,skillid,skilllv,0);
- if(dstsd && battle_config.equipment_breaking) {
- if(sd && sd != dstsd) clif_displaymessage(sd->fd,"You broke target's weapon");
- pc_breakweapon(dstsd);
- }
- break;
- } else {
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- }
- break;
-
- case PR_ASPERSIO: /* ƒAƒXƒyƒ‹ƒVƒI */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (dstsd && dstsd->special_state.no_magic_damage)
- break;
- if (dstmd)
- break;
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- break;
-
- case PR_KYRIE: /* ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“ */
- clif_skill_nodamage(bl,bl,skillid,skilllv,1);
- if (dstsd && dstsd->special_state.no_magic_damage)
- break;
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- break;
-
- case KN_AUTOCOUNTER: /* ƒI?ƒgƒJƒEƒ“ƒ^? */
- case KN_TWOHANDQUICKEN: /* ƒc?ƒnƒ“ƒhƒNƒCƒbƒPƒ“ */
- case CR_SPEARQUICKEN: /* ƒXƒsƒAƒNƒCƒbƒPƒ“ */
- case CR_REFLECTSHIELD:
- case AS_POISONREACT: /* ƒ|ƒCƒYƒ“ƒŠƒAƒNƒg */
- case MC_LOUD: /* ƒ‰ƒEƒhƒ{ƒCƒX */
- case MG_ENERGYCOAT: /* ƒGƒiƒW?ƒR?ƒg */
-// case SM_ENDURE: /* ƒCƒ“ƒfƒ…ƒA */
- case MG_SIGHT: /* ƒTƒCƒg */
- case AL_RUWACH: /* ƒ‹ƒAƒt */
- case MO_EXPLOSIONSPIRITS: // ”š—ô”g“®
- case MO_STEELBODY: // ‹à„
- case LK_AURABLADE: /* ƒI?ƒ‰ƒuƒŒ?ƒh */
- case LK_PARRYING: /* ƒpƒŠƒCƒ“ƒO */
- case LK_CONCENTRATION: /* ƒRƒ“ƒZƒ“ƒgƒŒ?ƒVƒ‡ƒ“ */
-// case LK_BERSERK: /* ƒo?ƒT?ƒN */
- case HP_ASSUMPTIO: /* */
- case WS_CARTBOOST: /* ƒJ?ƒgƒu?ƒXƒg */
- case SN_SIGHT: /* ƒgƒDƒ‹?ƒTƒCƒg */
- case WS_MELTDOWN: /* ƒƒ‹ƒgƒ_ƒEƒ“ */
- case ST_REJECTSWORD: /* ƒŠƒWƒFƒNƒgƒ\?ƒh */
- case HW_MAGICPOWER: /* –‚–@—Í?• */
- case PF_MEMORIZE: /* ƒƒ‚ƒ‰ƒCƒY */
- case PA_SACRIFICE:
- case ASC_EDP: // [Celest]
- case CG_MOONLIT: /* ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- break;
-
- case SM_ENDURE: /* ƒCƒ“ƒfƒ…ƒA */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- if (sd)
- pc_blockskill_start (sd, skillid, 10000);
- break;
-
- case SM_AUTOBERSERK: // Celest
- {
- struct status_change *tsc_data = status_get_sc_data(bl);
- int sc = SkillStatusChangeTable[skillid];
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (tsc_data && tsc_data[sc].timer != -1)
- status_change_end(bl, sc, -1);
- else
- status_change_start(bl,sc,skilllv,0,0,0,0,0);
- }
- break;
-
- case AS_ENCHANTPOISON: // Prevent spamming [Valaris]
- if (dstsd) {
- if(dstsd->sc_data[SC_FLAMELAUNCHER].timer != -1 ||
- dstsd->sc_data[SC_FROSTWEAPON].timer != -1 ||
- dstsd->sc_data[SC_LIGHTNINGLOADER].timer != -1 ||
- dstsd->sc_data[SC_SEISMICWEAPON].timer != -1 ||
- dstsd->sc_data[SC_ENCPOISON].timer != -1) {
- clif_skill_nodamage(src,bl,skillid,skilllv,0);
- clif_skill_fail(sd,skillid,0,0);
- break;
- }
- }
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- break;
-
- case LK_TENSIONRELAX: /* ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- pc_setsit(sd);
- clif_sitting(sd);
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- break;
- case LK_BERSERK: /* ƒo?ƒT?ƒN */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- //sd->status.hp = sd->status.max_hp * 3;
- break;
-
- case MC_CHANGECART:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- break;
-
- case AC_CONCENTRATION: /* W’†—ÍŒüã */
- {
- int range = 1;
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- map_foreachinarea( status_change_timer_sub,
- src->m, src->x-range, src->y-range, src->x+range,src->y+range,0,
- src,SkillStatusChangeTable[skillid],tick);
- }
- break;
-
- case SM_PROVOKE: /* ƒvƒƒ{ƒbƒN */
- {
- struct status_change *sc_data = status_get_sc_data(bl);
-
- /* MVPmob‚Æ•sŽ€‚É‚Í?‚©‚È‚¢ */
- if((dstmd && status_get_mode(bl)&0x20) || battle_check_undead(status_get_race(bl),status_get_elem_type(bl))) { //•sŽ€‚É‚Í?‚©‚È‚¢
- map_freeblock_unlock();
- return 1;
- }
-
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
-
- if(dstmd && dstmd->skilltimer!=-1 && dstmd->state.skillcastcancel) // ‰r¥–WŠQ
- skill_castcancel(bl,0);
- if(dstsd && dstsd->skilltimer!=-1 && (!dstsd->special_state.no_castcancel || map[bl->m].flag.gvg)
- && dstsd->state.skillcastcancel && !dstsd->special_state.no_castcancel2)
- skill_castcancel(bl,0);
-
- if(sc_data){
- if(sc_data[SC_FREEZE].timer!=-1)
- status_change_end(bl,SC_FREEZE,-1);
- if(sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0)
- status_change_end(bl,SC_STONE,-1);
- if(sc_data[SC_SLEEP].timer!=-1)
- status_change_end(bl,SC_SLEEP,-1);
- }
-
- if(dstmd) {
- int range = skill_get_range(skillid,skilllv);
- dstmd->state.provoke_flag = src->id;
- mob_target(dstmd,src,range);
- }
- }
- break;
-
- case CR_DEVOTION: /* ƒfƒBƒ{?ƒVƒ‡ƒ“ */
- if(sd && dstsd){
- //?¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
- int s_class = pc_calc_base_job2 (dstsd->status.class_);
-
- int lv = sd->status.base_level - dstsd->status.base_level;
- if (lv < 0) lv = -lv;
- if ((sd == dstsd) // ‘ŠŽè‚ÍPC‚¶‚á‚È‚¢‚Æ‚¾‚ß
- || (sd->bl.id == dstsd->bl.id) // ‘ŠŽè‚ªŽ©•ª‚Í‚¾‚ß
- || (lv > battle_config.devotion_level_difference) // ƒŒƒxƒ‹·}10‚Ü‚Å
- || (!sd->status.party_id && !sd->status.guild_id) // PT‚É‚àƒMƒ‹ƒh‚É‚àŠ?–³‚µ‚Í‚¾‚ß
- || ((sd->status.party_id != dstsd->status.party_id) // “¯‚¶ƒp?ƒeƒB?‚©A
- &&(sd->status.guild_id != dstsd->status.guild_id)) // “¯‚¶ƒMƒ‹ƒh‚¶‚á‚È‚¢‚Æ‚¾‚ß
- || (s_class == 14 || s_class == 21)) { // ƒNƒ‹ƒZ‚¾‚ß
- clif_skill_fail(sd,skillid,0,0);
- map_freeblock_unlock();
- return 1;
- }
- for (i = 0; i < skilllv; i++) {
- if (!sd->dev.val1[i]) { // ‹ó‚«‚ª‚ ‚Á‚½‚ç“ü‚ê‚é
- sd->dev.val1[i] = bl->id;
- sd->dev.val2[i] = bl->id;
- break;
- } else if (i == skilllv - 1) { // ‹ó‚«‚ª‚È‚©‚Á‚½
- clif_skill_fail(sd,skillid,0,0);
- map_freeblock_unlock();
- return 1;
- }
- }
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- clif_devotion(sd,bl->id);
- status_change_start(bl,SkillStatusChangeTable[skillid],src->id,1,0,0,1000*(15+15*skilllv),0 );
- }
- else clif_skill_fail(sd,skillid,0,0);
- break;
-
- case MO_CALLSPIRITS: // ?Œ÷
- if(sd) {
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- pc_addspiritball(sd,skill_get_time(skillid,skilllv),skilllv);
- }
- break;
-
- case CH_SOULCOLLECT: // ‹¶?Œ÷
- if(sd) {
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- for (i = 0; i < 5; i++)
- pc_addspiritball(sd,skill_get_time(skillid,skilllv),5);
- }
- break;
-
- case MO_BLADESTOP: // ”’nŽæ‚è
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- status_change_start(src,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- break;
-
- case MO_ABSORBSPIRITS: // ?’D
- i=0;
- if (dstsd) {
- if ((sd && sd == dstsd) || map[src->m].flag.pvp || map[src->m].flag.gvg) {
- if (dstsd->spiritball > 0) {
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- i = dstsd->spiritball * 7;
- pc_delspiritball(dstsd,dstsd->spiritball,0);
- if(i > 0x7FFF)
- i = 0x7FFF;
- if(sd && sd->status.sp + i > sd->status.max_sp)
- i = sd->status.max_sp - sd->status.sp;
- }
- }
- } else if (dstmd) { //?Û‚ªƒ‚ƒ“ƒXƒ^?‚Ìê‡
- //20%‚ÌŠm—¦‚Å?Û‚ÌLv*2‚ÌSP‚ð‰ñ•œ‚·‚éB¬Œ÷‚µ‚½‚Æ‚«‚̓^?ƒQƒbƒg(ƒÐ?„D?)ƒÐ????!!
- if(rand() % 100 < 20) {
- i = 2 * mob_db[dstmd->class_].lv;
- mob_target(dstmd,src,0);
- }
- }
- if (i && sd){
- sd->status.sp += i;
- clif_heal(sd->fd,SP_SP,i);
- } else clif_skill_nodamage(src,bl,skillid,skilllv,0);
- break;
-
- case AC_MAKINGARROW: /* –îì¬ */
- if(sd) {
- clif_arrow_create_list(sd);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- }
- break;
-
- case AM_PHARMACY: /* ƒ|?ƒVƒ‡ƒ“ì¬ */
- if(sd) {
- clif_skill_produce_mix_list(sd,32);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- }
- break;
- case WS_CREATECOIN: /* ƒNƒŠƒGƒCƒgƒRƒCƒ“ */
- if(sd) {
- clif_skill_produce_mix_list(sd,64);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- }
- break;
- case WS_CREATENUGGET: /* ‰ò»‘¢ */
- if(sd) {
- clif_skill_produce_mix_list(sd,128);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- }
- break;
- case ASC_CDP: // [DracoRPG]
- // notes: success rate (from emperium.org) = 20 + [(20*Dex)/50] + [(20*Luk)/100]
- if(sd) {
- clif_skill_produce_mix_list(sd,256);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- }
- break;
- case BS_HAMMERFALL: /* ƒnƒ“ƒ}?ƒtƒH?ƒ‹ */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(dstsd && dstsd->special_state.no_weapon_damage)
- break;
- if(rand() % 100 < (20 + 10 * skilllv) * sc_def_vit / 100 )
- status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case RG_RAID: /* ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- map_foreachinarea(skill_area_sub,
- bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
- skill_castend_damage_id);
- status_change_end(src, SC_HIDING, -1); // ƒnƒCƒfƒBƒ“ƒO‰ðœ
- break;
-
- case ASC_METEORASSAULT: /* ƒƒeƒIƒAƒTƒ‹ƒg */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- map_foreachinarea(skill_area_sub,
- bl->m,bl->x-2,bl->y-2,bl->x+2,bl->y+2,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
- skill_castend_damage_id);
- break;
-
- case KN_BRANDISHSPEAR: /*ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA*/
- {
- int c,n=4,ar;
- int dir = map_calc_dir(src,bl->x,bl->y);
- struct square tc;
- int x=bl->x,y=bl->y;
- ar=skilllv/3;
- skill_brandishspear_first(&tc,dir,x,y);
- skill_brandishspear_dir(&tc,dir,4);
- /* ”Í?‡C */
- if(skilllv == 10){
- for(c=1;c<4;c++){
- map_foreachinarea(skill_area_sub,
- bl->m,tc.val1[c],tc.val2[c],tc.val1[c],tc.val2[c],0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|n,
- skill_castend_damage_id);
- }
- }
- /* ”Í?‡B‡A */
- if(skilllv > 6){
- skill_brandishspear_dir(&tc,dir,-1);
- n--;
- }else{
- skill_brandishspear_dir(&tc,dir,-2);
- n-=2;
- }
-
- if(skilllv > 3){
- for(c=0;c<5;c++){
- map_foreachinarea(skill_area_sub,
- bl->m,tc.val1[c],tc.val2[c],tc.val1[c],tc.val2[c],0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|n,
- skill_castend_damage_id);
- if(skilllv > 6 && n==3 && c==4){
- skill_brandishspear_dir(&tc,dir,-1);
- n--;c=-1;
- }
- }
- }
- /* ”Í?‡@ */
- for(c=0;c<10;c++){
- if(c==0||c==5) skill_brandishspear_dir(&tc,dir,-1);
- map_foreachinarea(skill_area_sub,
- bl->m,tc.val1[c%5],tc.val2[c%5],tc.val1[c%5],tc.val2[c%5],0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
- skill_castend_damage_id);
- }
- }
- break;
-
- /* ƒp?ƒeƒBƒXƒLƒ‹ */
- case AL_ANGELUS: /* ƒGƒ“ƒWƒFƒ‰ƒX */
- case PR_MAGNIFICAT: /* ƒ}ƒOƒjƒtƒBƒJ?ƒg */
- case PR_GLORIA: /* ƒOƒƒŠƒA */
- case SN_WINDWALK: /* ƒEƒCƒ“ƒhƒEƒH?ƒN */
- if (sd == NULL || sd->status.party_id == 0 || (flag & 1)) {
- /* ŒÂ•Ê‚Ì?— */
- clif_skill_nodamage(bl,bl,skillid,skilllv,1);
- if(dstsd && dstsd->special_state.no_magic_damage)
- break;
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
- } else if (sd) {
- /* ƒp?ƒeƒB‘S?‚Ö‚Ì?— */
- party_foreachsamemap (skill_area_sub,
- sd,1,
- src,skillid,skilllv,tick, flag|BCT_PARTY|1,
- skill_castend_nodamage_id);
- }
- break;
-
- case BS_ADRENALINE: /* ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ… */
- case BS_WEAPONPERFECT: /* ƒEƒFƒ|ƒ“ƒp?ƒtƒFƒNƒVƒ‡ƒ“ */
- case BS_OVERTHRUST: /* ƒI?ƒo?ƒgƒ‰ƒXƒg */
- if (sd == NULL || sd->status.party_id == 0 || (flag & 1)) {
- /* ŒÂ•Ê‚Ì?— */
- clif_skill_nodamage(bl,bl,skillid,skilllv,1);
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,(src == bl)? 1:0,0,0,skill_get_time(skillid,skilllv),0);
- } else if (sd) {
- /* ƒp?ƒeƒB‘S?‚Ö‚Ì?— */
- party_foreachsamemap(skill_area_sub,
- sd,1,
- src,skillid,skilllv,tick, flag|BCT_PARTY|1,
- skill_castend_nodamage_id);
- }
- break;
-
- /*i•t‰Á‚Ɖ𜂪•K—vj */
- case BS_MAXIMIZE: /* ƒ}ƒLƒVƒ}ƒCƒYƒpƒ? */
- case NV_TRICKDEAD: /* Ž€‚ñ‚¾‚Ó‚è */
- case CR_DEFENDER: /* ƒfƒBƒtƒFƒ“ƒ_? */
- case CR_AUTOGUARD: /* ƒI?ƒgƒK?ƒh */
- {
- struct status_change *tsc_data = status_get_sc_data(bl);
- int sc = SkillStatusChangeTable[skillid];
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (tsc_data && tsc_data[sc].timer != -1)
- status_change_end(bl, sc, -1);
- else
- status_change_start(bl,sc,skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
- }
- break;
-
- case TF_HIDING: /* ƒnƒCƒfƒBƒ“ƒO */
- {
- struct status_change *tsc_data = status_get_sc_data(bl);
- int sc = SkillStatusChangeTable[skillid];
- clif_skill_nodamage(src,bl,skillid,-1,1);
- if (tsc_data && tsc_data[sc].timer != -1)
- status_change_end(bl, sc, -1);
- else
- status_change_start(bl,sc,skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
- }
- break;
-
- case AS_CLOAKING: /* ƒNƒ?ƒLƒ“ƒO */
- {
- struct status_change *tsc_data = status_get_sc_data(bl);
- int sc=SkillStatusChangeTable[skillid];
- clif_skill_nodamage(src,bl,skillid,-1,1);
- if(tsc_data && tsc_data[sc].timer!=-1 )
- /* ‰ðœ‚·‚é */
- status_change_end(bl, sc, -1);
- else
- /* •t‰Á‚·‚é */
- status_change_start(bl,sc,skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
- //skill_check_cloaking(bl);
- }
- break;
-
- case ST_CHASEWALK: /* ƒnƒCƒfƒBƒ“ƒO */
- {
- struct status_change *tsc_data = status_get_sc_data(bl);
- int sc=SkillStatusChangeTable[skillid];
- clif_skill_nodamage(src,bl,skillid,-1,1);
- if(tsc_data && tsc_data[sc].timer!=-1 )
- /* ‰ðœ‚·‚é */
- status_change_end(bl, sc, -1);
- else
- /* •t‰Á‚·‚é */
- status_change_start(bl,sc,skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
- }
- break;
-
- /* ?’nƒXƒLƒ‹ */
- case BD_LULLABY: /* ŽqŽç‰S */
- case BD_RICHMANKIM: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
- case BD_ETERNALCHAOS: /* ‰i‰“‚̬“× */
- case BD_DRUMBATTLEFIELD: /* ?‘¾ŒÛ‚Ì‹¿‚« */
- case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
- case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
- case BD_INTOABYSS: /* [•£‚Ì’†‚É */
- case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
- case BA_DISSONANCE: /* •s‹¦˜a‰¹ */
- case BA_POEMBRAGI: /* ƒuƒ‰ƒM‚ÌŽ */
- case BA_WHISTLE: /* Œû“J */
- case BA_ASSASSINCROSS: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
- case BA_APPLEIDUN: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
- case DC_UGLYDANCE: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX */
- case DC_HUMMING: /* ƒnƒ~ƒ“ƒO */
- case DC_DONTFORGETME: /* Ž„‚ð–Y‚ê‚È‚¢‚Åc */
- case DC_FORTUNEKISS: /* K‰^‚̃LƒX */
- case DC_SERVICEFORYOU: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
-// case CG_MOONLIT: /* ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_unitsetting(src,skillid,skilllv,src->x,src->y,0);
- break;
-
- case HP_BASILICA: /* ƒoƒWƒŠƒJ */
- {
- struct skill_unit_group *sg;
- battle_stopwalking(src,1);
- skill_clear_unitgroup(src);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- sg = skill_unitsetting(src,skillid,skilllv,src->x,src->y,0);
- status_change_start(src,SkillStatusChangeTable[skillid],skilllv,0,0,(int)sg,
- skill_get_time(skillid,skilllv),0);
- }
- break;
-
- case PA_GOSPEL: /* ƒSƒXƒyƒ‹ */
- skill_clear_unitgroup(src);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_unitsetting(src,skillid,skilllv,src->x,src->y,0);
- status_change_start(src,SkillStatusChangeTable[skillid],skilllv,0,0,BCT_SELF,skill_get_time(skillid,skilllv),0);
- break;
-
- case BD_ADAPTATION: /* ƒAƒhƒŠƒu */
- {
- struct status_change *sc_data = status_get_sc_data(src);
- if(sc_data && sc_data[SC_DANCING].timer!=-1){
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_stop_dancing(src,0);
- }
- }
- break;
-
- case BA_FROSTJOKE: /* Š¦‚¢ƒWƒ‡?ƒN */
- case DC_SCREAM: /* ƒXƒNƒŠ?ƒ€ */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,0,flag);
- break;
-
- case TF_STEAL: // ƒXƒeƒB?ƒ‹
- if(sd) {
- if(pc_steal_item(sd,bl))
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- else
- clif_skill_fail(sd,skillid,0x0a,0);
- }
- break;
-
- case RG_STEALCOIN: // ƒXƒeƒB?ƒ‹ƒRƒCƒ“
- if(sd) {
- if(pc_steal_coin(sd,bl)) {
- int range = skill_get_range(skillid,skilllv);
- if(range < 0)
- range = status_get_range(src) - (range + 1);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- mob_target((struct mob_data *)bl,src,range);
- }
- else
- clif_skill_fail(sd,skillid,0,0);
- }
- break;
-
- case MG_STONECURSE: /* ƒXƒg?ƒ“ƒJ?ƒX */
- {
- struct status_change *sc_data = status_get_sc_data(bl);
- // Level 6-10 doesn't consume a red gem if it fails [celest]
- int i, gem_flag = 1, fail_flag = 0;
- if (dstmd && status_get_mode(bl)&0x20) {
- clif_skill_fail(sd,sd->skillid,0,0);
- break;
- }
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(dstsd && dstsd->special_state.no_magic_damage )
- break;
- if (sc_data && sc_data[SC_STONE].timer != -1) {
- status_change_end(bl,SC_STONE,-1);
- if (sd) {
- fail_flag = 1;
- clif_skill_fail(sd,skillid,0,0);
- }
- }
- else if( rand()%100 < skilllv*4+20 && !battle_check_undead(status_get_race(bl),status_get_elem_type(bl)))
- status_change_start(bl,SC_STONE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- else if(sd) {
- if (skilllv > 5) gem_flag = 0;
- clif_skill_fail(sd,skillid,0,0);
- fail_flag = 1;
- }
- if (dstmd)
- mob_target(dstmd,src,skill_get_range(skillid,skilllv));
- if (sd && gem_flag) {
- if ((i=pc_search_inventory(sd, skill_db[skillid].itemid[0])) < 0 ) {
- if (!fail_flag) clif_skill_fail(sd,sd->skillid,0,0);
- break;
- }
- pc_delitem(sd, i, skill_db[skillid].amount[0], 0);
- }
- }
- break;
-
- case NV_FIRSTAID: /* ?‹}Žè? */
- clif_skill_nodamage(src,bl,skillid,5,1);
- battle_heal(NULL,bl,5,0,0);
- break;
-
- case AL_CURE: /* ƒLƒ…ƒA? */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(dstsd && dstsd->special_state.no_magic_damage )
- break;
- status_change_end(bl, SC_SILENCE , -1 );
- status_change_end(bl, SC_BLIND , -1 );
- status_change_end(bl, SC_CONFUSION, -1 );
- if( battle_check_undead(status_get_race(bl),status_get_elem_type(bl)) ){//ƒAƒ“ƒfƒbƒh‚È‚çˆÃˆÅ?‰Ê
- status_change_start(bl, SC_CONFUSION,1,0,0,0,6000,0);
- }
- break;
-
- case TF_DETOXIFY: /* ‰ð“Å */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- status_change_end(bl, SC_POISON , -1 );
- status_change_end(bl, SC_DPOISON , -1 );
- break;
-
- case PR_STRECOVERY: /* ƒŠƒJƒoƒŠ? */
- {
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(dstsd && dstsd->special_state.no_magic_damage)
- break;
- status_change_end(bl, SC_FREEZE , -1 );
- status_change_end(bl, SC_STONE , -1 );
- status_change_end(bl, SC_SLEEP , -1 );
- status_change_end(bl, SC_STAN , -1 );
- if( battle_check_undead(status_get_race(bl),status_get_elem_type(bl)) ){//ƒAƒ“ƒfƒbƒh‚È‚çˆÃˆÅ?‰Ê
- if(rand()%100 < (100-(status_get_int(bl)/2+status_get_vit(bl)/3+status_get_luk(bl)/10))) {
- status_change_start(bl, SC_BLIND,1,0,0,0,
- 1000 * 30 * (100-(status_get_int(bl)+status_get_vit(bl))/2)/100,0);
- }
- }
- if(dstmd){
- dstmd->attacked_id=0;
- dstmd->target_id=0;
- dstmd->state.targettype = NONE_ATTACKABLE;
- dstmd->state.skillstate=MSS_IDLE;
- dstmd->next_walktime=tick+rand()%3000+3000;
- }
- }
- break;
-
- case WZ_ESTIMATION: /* ƒ‚ƒ“ƒXƒ^?î•ñ */
- if(sd) {
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- clif_skill_estimation((struct map_session_data *)src,bl);
- }
- break;
-
- case MC_IDENTIFY: /* ƒAƒCƒeƒ€ŠÓ’è */
- if(sd)
- clif_item_identify_list(sd);
- break;
-
- case BS_REPAIRWEAPON: /* •ŠíC— */
- if(sd) {
-//“®ì‚µ‚È‚¢‚Ì‚Å‚Æ‚è‚ ‚¦‚¸ƒRƒƒ“ƒgƒAƒEƒg
- /*if (pc_search_inventory(sd, 999) < 0 ) { //fixed by Lupus (item pos can be = 0!)
- clif_skill_fail(sd,sd->skillid,0,0);
- map_freeblock_unlock();
- return 1;
- }*/
- clif_item_repair_list(sd);
- }
- break;
-
- case MC_VENDING: /* ˜I“XŠJÝ */
- if(sd)
- clif_openvendingreq(sd,2+sd->skilllv);
- break;
-
- case AL_TELEPORT: /* ƒeƒŒƒ|?ƒg */
- if(sd) {
- if (map[sd->bl.m].flag.noteleport) { /* ƒeƒŒƒ|‹ÖŽ~ */
- clif_skill_teleportmessage(sd,0);
- break;
- }
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(sd->skilllv == 1)
- clif_skill_warppoint(sd,sd->skillid,"Random","","","");
- else {
- clif_skill_warppoint(sd,sd->skillid,"Random",
- sd->status.save_point.map,"","");
- }
- } else if(dstmd)
- mob_warp(dstmd,-1,-1,-1,3);
- break;
-
- case AL_HOLYWATER: /* ƒAƒNƒAƒxƒlƒfƒBƒNƒ^ */
- if(sd) {
- int eflag;
- struct item item_tmp;
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- memset(&item_tmp,0,sizeof(item_tmp));
- item_tmp.nameid = 523;
- item_tmp.identify = 1;
- if(battle_config.holywater_name_input) {
- item_tmp.card[0] = 0xfe;
- item_tmp.card[1] = 0;
- *((unsigned long *)(&item_tmp.card[2]))=sd->char_id; /* ƒLƒƒƒ‰ID */
- }
- eflag = pc_additem(sd,&item_tmp,1);
- if(eflag) {
- clif_additem(sd,0,0,eflag);
- map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- }
- break;
- case TF_PICKSTONE:
- if(sd) {
- int eflag;
- struct item item_tmp;
- struct block_list tbl;
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- memset(&item_tmp,0,sizeof(item_tmp));
- memset(&tbl,0,sizeof(tbl)); // [MouseJstr]
- item_tmp.nameid = 7049;
- item_tmp.identify = 1;
- tbl.id = 0;
- clif_takeitem(&sd->bl,&tbl);
- eflag = pc_additem(sd,&item_tmp,1);
- if(eflag) {
- clif_additem(sd,0,0,eflag);
- map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- }
- break;
-
- case RG_STRIPWEAPON: /* ƒXƒgƒŠƒbƒvƒEƒFƒ|ƒ“ */
- case RG_STRIPSHIELD: /* ƒXƒgƒŠƒbƒvƒV[ƒ‹ƒh */
- case RG_STRIPARMOR: /* ƒXƒgƒŠƒbƒvƒA[ƒ}[ */
- case RG_STRIPHELM: /* ƒXƒgƒŠƒbƒvƒwƒ‹ƒ€ */
- {
- struct status_change *tsc_data;
- int strip_time, strip_per, strip_fix;
- int scid, cp_scid = 0, equip;
-
- tsc_data = status_get_sc_data(bl);
- scid = SkillStatusChangeTable[skillid];
- switch (skillid) {
- case RG_STRIPWEAPON:
- equip = EQP_WEAPON;
- cp_scid = SC_CP_WEAPON;
- break;
- case RG_STRIPSHIELD:
- equip = EQP_SHIELD;
- cp_scid = SC_CP_SHIELD;
- break;
- case RG_STRIPARMOR:
- equip = EQP_ARMOR;
- cp_scid = SC_CP_ARMOR;
- break;
- case RG_STRIPHELM:
- equip = EQP_HELM;
- cp_scid = SC_CP_HELM;
- break;
- default:
- map_freeblock_unlock();
- return 1;
- }
-
- if (tsc_data && (tsc_data[scid].timer != -1 || tsc_data[cp_scid].timer != -1))
- break;
- if (dstsd && dstsd->unstripable_equip & equip)
- break;
-
- strip_fix = status_get_dex(src) - status_get_dex(bl);
- if(strip_fix < 0)
- strip_fix=0;
- strip_per = 5+5*skilllv+strip_fix/5;
- if (rand()%100 >= strip_per)
- break;
-
- if (dstsd) {
- for (i=0;i<MAX_INVENTORY;i++) {
- if (dstsd->status.inventory[i].equip && (dstsd->status.inventory[i].equip & equip)){
- pc_unequipitem(dstsd,i,3);
- break;
- }
- }
- if (i == MAX_INVENTORY)
- break;
- }
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- strip_time = skill_get_time(skillid,skilllv)+strip_fix/2;
- status_change_start(bl,scid,skilllv,0,0,0,strip_time,0 );
- break;
- }
- case ST_FULLSTRIP: // Celest
- {
- struct status_change *tsc_data;
- int i, j, strip_time, strip_per, strip_fix;
- int equip[4] = { EQP_WEAPON, EQP_SHIELD, EQP_ARMOR, EQP_HELM };
- int scid[4] = { SC_STRIPWEAPON, SC_STRIPSHIELD, SC_STRIPARMOR, SC_STRIPHELM };
- int cp_scid[4] = { SC_CP_WEAPON, SC_CP_SHIELD, SC_CP_ARMOR, SC_CP_HELM };
-
- tsc_data = status_get_sc_data(bl);
- strip_fix = status_get_dex(src) - status_get_dex(bl);
- if(strip_fix < 0)
- strip_fix = 0;
- strip_per = 5+5*skilllv+strip_fix/5;
- if (rand()%100 >= strip_per)
- break;
- strip_time = skill_get_time(skillid,skilllv)+strip_fix/2;
-
- for (i=0; i<4; i++) {
- if (dstsd) {
- if (tsc_data && (tsc_data[scid[i]].timer != -1 || tsc_data[cp_scid[i]].timer != -1))
- continue;
- if (dstsd->unstripable_equip & equip[i])
- continue;
- for (j=0; j<MAX_INVENTORY; j++) {
- if (dstsd->status.inventory[j].equip && (dstsd->status.inventory[j].equip & equip[i])){
- pc_unequipitem(dstsd,j,3);
- break;
- }
- }
- if (j == MAX_INVENTORY)
- continue;
- }
- status_change_start(bl,scid[i],skilllv,0,0,0,strip_time,0 );
- }
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- break;
- }
-
- /* PotionPitcher */
- case AM_POTIONPITCHER: /* ƒ|?ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ? */
- {
- struct block_list tbl;
- int i,x,hp = 0,sp = 0;
- if(sd) {
- x = skilllv%11 - 1;
- i = pc_search_inventory(sd,skill_db[skillid].itemid[x]);
- if(i < 0 || skill_db[skillid].itemid[x] <= 0) {
- clif_skill_fail(sd,skillid,0,0);
- map_freeblock_unlock();
- return 1;
- }
- if(sd->inventory_data[i] == NULL || sd->status.inventory[i].amount < skill_db[skillid].amount[x]) {
- clif_skill_fail(sd,skillid,0,0);
- map_freeblock_unlock();
- return 1;
- }
- sd->state.potionpitcher_flag = 1;
- sd->potion_hp = sd->potion_sp = sd->potion_per_hp = sd->potion_per_sp = 0;
- sd->skilltarget = bl->id;
- run_script(sd->inventory_data[i]->use_script,0,sd->bl.id,0);
- pc_delitem(sd,i,skill_db[skillid].amount[x],0);
- sd->state.potionpitcher_flag = 0;
- if(sd->potion_per_hp > 0 || sd->potion_per_sp > 0) {
- hp = status_get_max_hp(bl) * sd->potion_per_hp / 100;
- hp = hp * (100 + pc_checkskill(sd,AM_POTIONPITCHER)*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*5)/100;
- if(dstsd) {
- sp = dstsd->status.max_sp * sd->potion_per_sp / 100;
- sp = sp * (100 + pc_checkskill(sd,AM_POTIONPITCHER)*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*5)/100;
- }
- }
- else {
- if(sd->potion_hp > 0) {
- hp = sd->potion_hp * (100 + pc_checkskill(sd,AM_POTIONPITCHER)*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*5)/100;
- hp = hp * (100 + (status_get_vit(bl)<<1)) / 100;
- if(dstsd)
- hp = hp * (100 + pc_checkskill(dstsd,SM_RECOVERY)*10) / 100;
- }
- if(sd->potion_sp > 0) {
- sp = sd->potion_sp * (100 + pc_checkskill(sd,AM_POTIONPITCHER)*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*5)/100;
- sp = sp * (100 + (status_get_int(bl)<<1)) / 100;
- if(dstsd)
- sp = sp * (100 + pc_checkskill(dstsd,MG_SRECOVERY)*10) / 100;
- }
- }
- }
- else {
- hp = (1 + rand()%400) * (100 + skilllv*10) / 100;
- hp = hp * (100 + (status_get_vit(bl)<<1)) / 100;
- if(dstsd)
- hp = hp * (100 + pc_checkskill(dstsd,SM_RECOVERY)*10) / 100;
- }
- tbl.id = 0;
- tbl.m = src->m;
- tbl.x = src->x;
- tbl.y = src->y;
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(hp > 0 || (hp <= 0 && sp <= 0))
- clif_skill_nodamage(&tbl,bl,AL_HEAL,hp,1);
- if(sp > 0)
- clif_skill_nodamage(&tbl,bl,MG_SRECOVERY,sp,1);
- battle_heal(src,bl,hp,sp,0);
- }
- break;
- case AM_CP_WEAPON:
- case AM_CP_SHIELD:
- case AM_CP_ARMOR:
- case AM_CP_HELM:
- {
- int scid = SC_STRIPWEAPON + (skillid - AM_CP_WEAPON);
- struct status_change *tsc_data = status_get_sc_data(bl);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(tsc_data && tsc_data[scid].timer != -1)
- status_change_end(bl, scid, -1 );
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- }
- break;
-
- case SA_DISPELL: /* ƒfƒBƒXƒyƒ‹ */
- {
- int i;
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(dstsd && dstsd->special_state.no_magic_damage )
- break;
- for(i=0;i<136;i++){
- if(i==SC_RIDING || i== SC_FALCON || i==SC_HALLUCINATION || i==SC_WEIGHT50
- || i==SC_WEIGHT90 || i==SC_STRIPWEAPON || i==SC_STRIPSHIELD || i==SC_STRIPARMOR
- || i==SC_STRIPHELM || i==SC_CP_WEAPON || i==SC_CP_SHIELD || i==SC_CP_ARMOR
- || i==SC_CP_HELM || i==SC_COMBO)
- continue;
- status_change_end(bl,i,-1);
- }
- }
- break;
-
- case TF_BACKSLIDING: /* ƒoƒbƒNƒXƒeƒbƒv */
- battle_stopwalking(src,1);
- skill_blown(src,bl,skill_get_blewcount(skillid,skilllv)|0x10000);
- if (sd)
- clif_fixpos(src);
- else if (md)
- clif_fixmobpos(md);
- else if (src->type == BL_PET)
- clif_fixpetpos((struct pet_data *)src);
- skill_addtimerskill(src,tick + 200,src->id,0,0,skillid,skilllv,0,flag);
- break;
-
- case SA_CASTCANCEL:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_castcancel(src,1);
- if(sd) {
- int sp = skill_get_sp(sd->skillid_old,sd->skilllv_old);
- sp = sp * (90 - (skilllv-1)*20) / 100;
- if(sp < 0) sp = 0;
- pc_heal(sd,0,-sp);
- }
- break;
- case SA_SPELLBREAKER: // ƒXƒyƒ‹ƒuƒŒƒCƒJ?
- {
- struct status_change *sc_data = status_get_sc_data(bl);
- int sp;
- if(sc_data && sc_data[SC_MAGICROD].timer != -1) {
- if(dstsd) {
- sp = skill_get_sp(skillid,skilllv);
- sp = sp * sc_data[SC_MAGICROD].val2 / 100;
- if(sp > 0x7fff) sp = 0x7fff;
- else if(sp < 1) sp = 1;
- if(dstsd->status.sp + sp > dstsd->status.max_sp) {
- sp = dstsd->status.max_sp - dstsd->status.sp;
- dstsd->status.sp = dstsd->status.max_sp;
- }
- else
- dstsd->status.sp += sp;
- clif_heal(dstsd->fd,SP_SP,sp);
- }
- clif_skill_nodamage(bl,bl,SA_MAGICROD,sc_data[SC_MAGICROD].val1,1);
- if(sd) {
- sp = sd->status.max_sp/5;
- if(sp < 1) sp = 1;
- pc_heal(sd,0,-sp);
- }
- }
- else {
- int bl_skillid=0,bl_skilllv=0;
- if(bl->type == BL_PC) {
- if(dstsd && dstsd->skilltimer != -1) {
- bl_skillid = dstsd->skillid;
- bl_skilllv = dstsd->skilllv;
- }
- }
- else if(bl->type == BL_MOB) {
- if(dstmd && dstmd->skilltimer != -1) {
- bl_skillid = dstmd->skillid;
- bl_skilllv = dstmd->skilllv;
- }
- }
- if(bl_skillid > 0 && skill_db[bl_skillid].skill_type == BF_MAGIC) {
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_castcancel(bl,0);
- sp = skill_get_sp(bl_skillid,bl_skilllv);
- if(dstsd)
- pc_heal(dstsd,0,-sp);
- if(sd) {
- sp = sp*(25*(skilllv-1))/100;
- if(skilllv > 1 && sp < 1) sp = 1;
- if(sp > 0x7fff) sp = 0x7fff;
- else if(sp < 1) sp = 1;
- if(sd->status.sp + sp > sd->status.max_sp) {
- sp = sd->status.max_sp - sd->status.sp;
- sd->status.sp = sd->status.max_sp;
- }
- else
- sd->status.sp += sp;
- clif_heal(sd->fd,SP_SP,sp);
- }
- }
- else if(sd)
- clif_skill_fail(sd,skillid,0,0);
- }
- }
- break;
- case SA_MAGICROD:
- if (dstsd && dstsd->special_state.no_magic_damage )
- break;
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- break;
- case SA_AUTOSPELL: /* ƒI?ƒgƒXƒyƒ‹ */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(sd)
- clif_autospell(sd,skilllv);
- else {
- int maxlv=1,spellid=0;
- static const int spellarray[3] = { MG_COLDBOLT,MG_FIREBOLT,MG_LIGHTNINGBOLT };
- if(skilllv >= 10) {
- spellid = MG_FROSTDIVER;
- maxlv = skilllv - 9;
- }
- else if(skilllv >=8) {
- spellid = MG_FIREBALL;
- maxlv = skilllv - 7;
- }
- else if(skilllv >=5) {
- spellid = MG_SOULSTRIKE;
- maxlv = skilllv - 4;
- }
- else if(skilllv >=2) {
- int i = rand()%3;
- spellid = spellarray[i];
- maxlv = skilllv - 1;
- }
- else if(skilllv > 0) {
- spellid = MG_NAPALMBEAT;
- maxlv = 3;
- }
- if(spellid > 0)
- status_change_start(src,SC_AUTOSPELL,skilllv,spellid,maxlv,0,
- skill_get_time(SA_AUTOSPELL,skilllv),0);
- }
- break;
-
- /* ƒ‰ƒ“ƒ_ƒ€?«?‰»A…?«?‰»A’nA‰ÎA•— */
- case NPC_ATTRICHANGE:
- case NPC_CHANGEWATER:
- case NPC_CHANGEGROUND:
- case NPC_CHANGEFIRE:
- case NPC_CHANGEWIND:
- /* “ÅA¹A”OAˆÅ */
- case NPC_CHANGEPOISON:
- case NPC_CHANGEHOLY:
- case NPC_CHANGEDARKNESS:
- case NPC_CHANGETELEKINESIS:
- if(md){
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- md->def_ele=skill_get_pl(skillid);
- if(md->def_ele==0) /* ƒ‰ƒ“ƒ_ƒ€?‰»A‚½‚¾‚µA*/
- md->def_ele=rand()%10; /* •sŽ€?«‚Íœ‚­ */
- md->def_ele+=(1+rand()%4)*20; /* ?«ƒŒƒxƒ‹‚̓‰ƒ“ƒ_ƒ€ */
- }
- break;
-
- case NPC_PROVOCATION:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(md)
- clif_pet_performance(src,mob_db[md->class_].skill[md->skillidx].val[0]);
- break;
-
- case NPC_HALLUCINATION:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(dstsd && dstsd->special_state.no_magic_damage )
- break;
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- break;
-
- case NPC_KEEPING:
- case NPC_BARRIER:
- {
- int skill_time = skill_get_time(skillid,skilllv);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_time,0 );
- if (md)
- mob_changestate(md,MS_DELAY,skill_time);
- else if (sd)
- sd->attackabletime = sd->canmove_tick = tick + skill_time;
- }
- break;
-
- case NPC_DARKBLESSING:
- {
- int sc_def = 100 - status_get_mdef(bl);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(dstsd && dstsd->special_state.no_magic_damage )
- break;
- if(status_get_elem_type(bl) == 7 || status_get_race(bl) == 6)
- break;
- if(rand()%100 < sc_def*(50+skilllv*5)/100) {
- if(dstsd) {
- int hp = status_get_hp(bl)-1;
- pc_heal(dstsd,-hp,0);
- }
- else if(dstmd)
- dstmd->hp = 1;
- }
- }
- break;
-
- case NPC_SELFDESTRUCTION: /* Ž©”š */
- case NPC_SELFDESTRUCTION2: /* Ž©”š2 */
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,skillid,0,0,skill_get_time(skillid,skilllv),0);
- break;
- case NPC_LICK:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (dstsd) {
- if (dstsd->special_state.no_weapon_damage )
- break;
- pc_heal(dstsd,0,-100);
- }
- if(rand()%100 < (skilllv*5)*sc_def_vit/100)
- status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case NPC_SUICIDE: /* Ž©Œˆ */
- if(src && bl){
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (md)
- mob_damage(NULL,md,md->hp,0);
- else if (sd)
- pc_damage(NULL,sd,sd->status.hp);
- }
- break;
-
- case NPC_SUMMONSLAVE: /* Žè‰º¢Š« */
- case NPC_SUMMONMONSTER: /* MOB¢Š« */
- if(md)
- mob_summonslave(md,mob_db[md->class_].skill[md->skillidx].val,skilllv,(skillid==NPC_SUMMONSLAVE)?1:0);
- break;
-
- case NPC_RECALL: //Žæ‚芪‚«ŒÄ‚Ñ–ß‚µ
- if(md) {
- int mobcount;
- md->recallcount = 0;//‰Šú‰»
- md->recall_flag = 0;
- mobcount = mob_countslave(md);
- if(mobcount > 0) {
- md->recall_flag = 1; //mob.c‚Ì[Žæ‚芪‚«ƒ‚ƒ“ƒXƒ^[‚̈—]‚Å—˜—p
- md->recallmob_count = mobcount;
- }
- }
- break;
-
- case NPC_RUNAWAY: //Œã‘Þ
- if(md) {
- int check;
- int dist = skilllv;//Œã‘Þ‚·‚é‹——£
- check = md->dir; //Ž©•ª‚ª‚Ç‚Ì•ûŒü‚ÉŒü‚¢‚Ä‚é‚©ƒ`ƒFƒbƒN
- md->attacked_id = 0;
- md->target_id = 0;
- md->state.targettype = NONE_ATTACKABLE;
- md->state.skillstate = MSS_IDLE;
- switch (check) {
- case 0: //Ž©•ª‚ÌŒü‚¢‚Ä‚é•ûŒü‚Æ‹t‚Ɉړ®‚·‚é
- mob_walktoxy(md,md->bl.x,md->bl.y-dist,0);//‚»‚µ‚ÄAˆÚ“®‚·‚é
- break;
- case 1:
- mob_walktoxy(md,md->bl.x-dist,md->bl.y-dist,0);
- break;
- case 2:
- mob_walktoxy(md,md->bl.x+dist,md->bl.y,0);
- break;
- case 3:
- mob_walktoxy(md,md->bl.x+dist,md->bl.y+dist,0);
- break;
- case 4:
- mob_walktoxy(md,md->bl.x,md->bl.y+dist,0);
- break;
- case 5:
- mob_walktoxy(md,md->bl.x-dist,md->bl.y+dist,0);
- break;
- case 6:
- mob_walktoxy(md,md->bl.x-dist,md->bl.y,0);
- break;
- case 7:
- mob_walktoxy(md,md->bl.x-dist,md->bl.y-dist,0);
- break;
- }
- }
- break;
-
- case NPC_TRANSFORMATION:
- case NPC_METAMORPHOSIS:
- if(md)
- mob_class_change(md,mob_db[md->class_].skill[md->skillidx].val);
- break;
-
- case NPC_EMOTION: /* ƒGƒ‚?ƒVƒ‡ƒ“ */
- if(md)
- clif_emotion(&md->bl,mob_db[md->class_].skill[md->skillidx].val[0]);
- break;
-
- case NPC_DEFENDER:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- break;
-
- // Equipment breaking monster skills [Celest]
- case NPC_BREAKWEAPON:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(dstsd && battle_config.equipment_breaking)
- pc_breakweapon(dstsd);
- break;
-
- case NPC_BREAKARMOR:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(dstsd && battle_config.equipment_breaking)
- pc_breakarmor(dstsd);
- break;
-
- case NPC_BREAKHELM:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(dstsd && battle_config.equipment_breaking)
- pc_breakhelm(dstsd);
- break;
-
- case NPC_BREAKSHIELD:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(dstsd && battle_config.equipment_breaking)
- pc_breakshield(dstsd);
- break;
-
- case NPC_EXPLOSIONSPIRITS: //NPC”š—ô”g“®
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- status_change_start(bl,SC_EXPLOSIONSPIRITS,skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- break;
-
- case WE_MALE: /* ŒN‚¾‚¯‚ÍŒì‚é‚æ */
- if(sd && dstsd){
- int hp_rate=(skilllv <= 0)? 0:skill_db[skillid].hp_rate[skilllv-1];
- int gain_hp=sd->status.max_hp*abs(hp_rate)/100;// 15%
- clif_skill_nodamage(src,bl,skillid,gain_hp,1);
- battle_heal(NULL,bl,gain_hp,0,0);
- }
- break;
- case WE_FEMALE: /* ‚ ‚È‚½‚Ì?‚É?µ‚É‚È‚è‚Ü‚· */
- if(sd && dstsd){
- int sp_rate=(skilllv <= 0)? 0:skill_db[skillid].sp_rate[skilllv-1];
- int gain_sp=sd->status.max_sp*abs(sp_rate)/100;// 15%
- clif_skill_nodamage(src,bl,skillid,gain_sp,1);
- battle_heal(NULL,bl,0,gain_sp,0);
- }
- break;
-
- case WE_CALLPARTNER: /* ‚ ‚È‚½‚É?‚¢‚½‚¢ */
- if(sd && dstsd){
- if((dstsd = pc_get_partner(sd)) == NULL){
- clif_skill_fail(sd,skillid,0,0);
- map_freeblock_unlock();
- return 0;
- }
- if(map[sd->bl.m].flag.nomemo || map[sd->bl.m].flag.nowarpto || map[dstsd->bl.m].flag.nowarp){
- clif_skill_teleportmessage(sd,1);
- map_freeblock_unlock();
- return 0;
- }
- skill_unitsetting(src,skillid,skilllv,sd->bl.x,sd->bl.y,0);
- }
- break;
-
-// parent-baby skills
- case WE_BABY:
- if(sd && dstsd){
- struct map_session_data *f_sd = pc_get_father(sd);
- struct map_session_data *m_sd = pc_get_mother(sd);
- // if neither was found
- if(!f_sd && !m_sd){
- clif_skill_fail(sd,skillid,0,0);
- map_freeblock_unlock();
- return 0;
- }
- status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- if (f_sd) status_change_start(&f_sd->bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- if (m_sd) status_change_start(&m_sd->bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- }
- break;
-
- case WE_CALLPARENT:
- if(sd && dstsd){
- struct map_session_data *f_sd = pc_get_father(sd);
- struct map_session_data *m_sd = pc_get_mother(sd);
- // if neither was found
- if(!f_sd && !m_sd){
- clif_skill_fail(sd,skillid,0,0);
- map_freeblock_unlock();
- return 0;
- }
- if(map[sd->bl.m].flag.nomemo || map[sd->bl.m].flag.nowarpto || map[dstsd->bl.m].flag.nowarp){
- clif_skill_teleportmessage(sd,1);
- map_freeblock_unlock();
- return 0;
- }
- if (f_sd) pc_setpos(f_sd,map[sd->bl.m].name,sd->bl.x,sd->bl.y,3);
- if (m_sd) pc_setpos(f_sd,map[sd->bl.m].name,sd->bl.x,sd->bl.y,3);
- }
- break;
-
- case WE_CALLBABY:
- if(sd && dstsd){
- if((dstsd = pc_get_child(sd)) == NULL){
- clif_skill_fail(sd,skillid,0,0);
- map_freeblock_unlock();
- return 0;
- }
- if(map[sd->bl.m].flag.nomemo || map[sd->bl.m].flag.nowarpto || map[dstsd->bl.m].flag.nowarp){
- clif_skill_teleportmessage(sd,1);
- map_freeblock_unlock();
- return 0;
- }
- pc_setpos(dstsd,map[sd->bl.m].name,sd->bl.x,sd->bl.y,3);
- }
- break;
-
- case PF_HPCONVERSION: /* ƒ‰ƒCƒt’u‚«Š·‚¦ */
- clif_skill_nodamage(src, bl, skillid, skilllv, 1);
- if (sd) {
- int hp, sp;
- hp = sd->status.max_hp / 10; //Šî–{‚ÍHP‚Ì10%
- sp = hp * 10 * skilllv / 100;
- if (sd->status.sp + sp > sd->status.max_sp)
- sp = sd->status.max_sp - sd->status.sp;
- // we need to check with the sp that was taken away when casting too
- if (sd->status.sp + skill_get_sp(skillid, skilllv) >= sd->status.max_sp)
- hp = sp = 0;
- pc_heal(sd, -hp, sp);
- clif_heal(sd->fd, SP_SP, sp);
- clif_updatestatus(sd, SP_SP);
- }
- break;
- case HT_REMOVETRAP: /* ƒŠƒ€?ƒuƒgƒ‰ƒbƒv */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- {
- struct skill_unit *su=NULL;
- struct item item_tmp;
- int flag;
- if((bl->type==BL_SKILL) &&
- (su=(struct skill_unit *)bl) &&
- (su->group->src_id == src->id || map[bl->m].flag.pvp || map[bl->m].flag.gvg) &&
- (su->group->unit_id >= 0x8f && su->group->unit_id <= 0x99) &&
- (su->group->unit_id != 0x92)){ //?‚ðŽæ‚è•Ô‚·
- if(sd){
- if(battle_config.skill_removetrap_type == 1){
- for(i=0;i<10;i++) {
- if(skill_db[su->group->skill_id].itemid[i] > 0){
- memset(&item_tmp,0,sizeof(item_tmp));
- item_tmp.nameid = skill_db[su->group->skill_id].itemid[i];
- item_tmp.identify = 1;
- if(item_tmp.nameid && (flag=pc_additem(sd,&item_tmp,skill_db[su->group->skill_id].amount[i]))){
- clif_additem(sd,0,0,flag);
- map_addflooritem(&item_tmp,skill_db[su->group->skill_id].amount[i],sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- }
- }
- }else{
- memset(&item_tmp,0,sizeof(item_tmp));
- item_tmp.nameid = 1065;
- item_tmp.identify = 1;
- if(item_tmp.nameid && (flag=pc_additem(sd,&item_tmp,1))){
- clif_additem(sd,0,0,flag);
- map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- }
-
- }
- if(su->group->unit_id == 0x91 && su->group->val2){
- struct block_list *target=map_id2bl(su->group->val2);
- if(target && (target->type == BL_PC || target->type == BL_MOB))
- status_change_end(target,SC_ANKLE,-1);
- }
- skill_delunit(su);
- }
- }
- break;
- case HT_SPRINGTRAP: /* ƒXƒvƒŠƒ“ƒOƒgƒ‰ƒbƒv */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- {
- struct skill_unit *su=NULL;
- if((bl->type==BL_SKILL) && (su=(struct skill_unit *)bl) && (su->group) ){
- switch(su->group->unit_id){
- case 0x91: // ankle snare
- if (su->group->val2 != 0)
- // if it is already trapping something don't spring it,
- // remove trap should be used instead
- break;
- // otherwise fallthrough to below
- case 0x8f: /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
- case 0x90: /* ƒXƒLƒbƒhƒgƒ‰ƒbƒv */
- case 0x93: /* ƒ‰ƒ“ƒhƒ}ƒCƒ“ */
- case 0x94: /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
- case 0x95: /* ƒTƒ“ƒhƒ}ƒ“ */
- case 0x96: /* ƒtƒ‰ƒbƒVƒƒ? */
- case 0x97: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
- case 0x98: /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
- case 0x99: /* ƒg?ƒL?ƒ{ƒbƒNƒX */
- su->group->unit_id = 0x8c;
- clif_changelook(bl,LOOK_BASE,su->group->unit_id);
- su->group->limit=DIFF_TICK(tick+1500,su->group->tick);
- su->limit=DIFF_TICK(tick+1500,su->group->tick);
- }
- }
- }
- break;
- case BD_ENCORE: /* ƒAƒ“ƒR?ƒ‹ */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(sd)
- skill_use_id(sd,src->id,sd->skillid_dance,sd->skilllv_dance);
- break;
-
- case AS_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ? */
- if((double)status_get_max_hp(bl)*2/3 < status_get_hp(bl)) { //HP‚ª2/3ˆÈã?‚Á‚Ä‚¢‚½‚玸”s
- map_freeblock_unlock();
- return 1;
- }
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,skillid,src->id,skill_get_time(skillid,skilllv),1000,0 );
- break;
-
- case PF_MINDBREAKER: /* ƒvƒƒ{ƒbƒN */
- {
- struct status_change *sc_data = status_get_sc_data(bl);
-
- /* MVPmob‚Æ•sŽ€‚É‚Í?‚©‚È‚¢ */
- if((dstmd && status_get_mode(bl)&0x20) || battle_check_undead(status_get_race(bl),status_get_elem_type(bl))) //•sŽ€‚É‚Í?‚©‚È‚¢
- {
- map_freeblock_unlock();
- return 1;
- }
-
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
-
- if(dstmd && dstmd->skilltimer!=-1 && dstmd->state.skillcastcancel) // ‰r¥–WŠQ
- skill_castcancel(bl,0);
- if(dstsd && dstsd->skilltimer!=-1 && (!dstsd->special_state.no_castcancel || map[bl->m].flag.gvg)
- && dstsd->state.skillcastcancel && !dstsd->special_state.no_castcancel2)
- skill_castcancel(bl,0);
-
- if(sc_data){
- if(sc_data[SC_FREEZE].timer!=-1)
- status_change_end(bl,SC_FREEZE,-1);
- if(sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0)
- status_change_end(bl,SC_STONE,-1);
- if(sc_data[SC_SLEEP].timer!=-1)
- status_change_end(bl,SC_SLEEP,-1);
- }
-
- if(dstmd)
- mob_target(dstmd,src,skill_get_range(skillid,skilllv));
- }
- break;
-
- case PF_SOULCHANGE:
- {
- int sp1 = 0, sp2 = 0;
- if (sd) {
- if (dstsd) {
- sp1 = sd->status.sp > dstsd->status.max_sp ? dstsd->status.max_sp : sd->status.sp;
- sp2 = dstsd->status.sp > sd->status.max_sp ? sd->status.max_sp : dstsd->status.sp;
- sd->status.sp = sp2;
- dstsd->status.sp = sp1;
- clif_heal(sd->fd,SP_SP,sp2);
- clif_updatestatus(sd,SP_SP);
- clif_heal(dstsd->fd,SP_SP,sp1);
- clif_updatestatus(dstsd,SP_SP);
- } else if (dstmd) {
- if (dstmd->state.soul_change_flag) {
- clif_skill_fail(sd,skillid,0,0);
- map_freeblock_unlock();
- return 0;
- }
- sp2 = sd->status.max_sp * 3 /100;
- if (sd->status.sp + sp2 > sd->status.max_sp)
- sp2 = sd->status.max_sp - sd->status.sp;
- sd->status.sp += sp2;
- clif_heal(sd->fd,SP_SP,sp2);
- clif_updatestatus(sd,SP_SP);
- dstmd->state.soul_change_flag = 1;
- }
- }
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- }
- break;
-
- case PF_SPIDERWEB: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_unitsetting(src,skillid,skilllv,bl->x,bl->y,0);
- break;
-
- // Weapon Refining [Celest]
- case WS_WEAPONREFINE:
- if(sd)
- clif_item_refine_list(sd);
- break;
-
- // Slim Pitcher
- case CR_SLIMPITCHER:
- {
- if (sd && flag&1) {
- struct block_list tbl;
- int hp = sd->potion_hp * (100 + pc_checkskill(sd,CR_SLIMPITCHER)*10 + pc_checkskill(sd,AM_POTIONPITCHER)*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*5)/100;
- hp = hp * (100 + (status_get_vit(bl)<<1))/100;
- if (dstsd) {
- hp = hp * (100 + pc_checkskill(dstsd,SM_RECOVERY)*10)/100;
- }
- tbl.id = 0;
- tbl.m = src->m;
- tbl.x = src->x;
- tbl.y = src->y;
- clif_skill_nodamage(&tbl,bl,AL_HEAL,hp,1);
- battle_heal(NULL,bl,hp,0,0);
- }
- }
- break;
- // Full Chemical Protection
- case CR_FULLPROTECTION:
- {
- int i, skilltime;
- struct status_change *tsc_data = status_get_sc_data(bl);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skilltime = skill_get_time(skillid,skilllv);
- for (i=0; i<4; i++) {
- if(tsc_data && tsc_data[SC_STRIPWEAPON + i].timer != -1)
- status_change_end(bl, SC_STRIPWEAPON + i, -1 );
- status_change_start(bl,SC_CP_WEAPON + i,skilllv,0,0,0,skilltime,0 );
- }
- }
- break;
-
- case RG_CLEANER: //AppleGirl
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- {
- struct skill_unit *su=NULL;
- if((bl->type==BL_SKILL) &&
- (su=(struct skill_unit *)bl) &&
- (su->group->src_id == src->id || map[bl->m].flag.pvp || map[bl->m].flag.gvg) &&
- (su->group->unit_id == 0xb0)){ //?‚ðŽæ‚è•Ô‚·
- if(sd)
- skill_delunit(su);
- }
- }
- break;
- case ST_PRESERVE:
- if (sd){
- if (sd->sc_count && sd->sc_data[SC_PRESERVE].timer != -1)
- status_change_end(src, SC_PRESERVE, -1 );
- else
- status_change_start(src,SC_PRESERVE,skilllv,0,0,0,skill_get_time(skillid, skilllv),0 );
- clif_skill_nodamage(src,src,skillid,skilllv,1);
- }
- break;
-
- // New guild skills [Celest]
- case GD_BATTLEORDER:
- {
- struct guild *g = NULL;
- // Only usable during WoE
- if (!agit_flag) {
- clif_skill_fail(sd,skillid,0,0);
- map_freeblock_unlock();
- return 0;
- }
- if(flag&1) {
- if (dstsd && dstsd->status.guild_id == sd->status.guild_id) {
- status_change_start(&dstsd->bl,SC_BATTLEORDERS,skilllv,0,0,0,0,0 );
- }
- }
- else if (sd && sd->status.guild_id > 0 && (g = guild_search(sd->status.guild_id)) &&
- strcmp(sd->status.name,g->master)==0) {
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- map_foreachinarea(skill_area_sub,
- src->m,src->x-15,src->y-15,src->x+15,src->y+15,0,
- src,skillid,skilllv,tick, flag|BCT_ALL|1,
- skill_castend_nodamage_id);
- pc_blockskill_start (sd, skillid, 300000);
- }
- }
- break;
- case GD_REGENERATION:
- {
- struct guild *g = NULL;
- // Only usable during WoE
- if (!agit_flag) {
- clif_skill_fail(sd,skillid,0,0);
- map_freeblock_unlock();
- return 0;
- }
- if(flag&1) {
- if (dstsd && dstsd->status.guild_id == sd->status.guild_id) {
- status_change_start(&dstsd->bl,SC_REGENERATION,skilllv,0,0,0,0,0 );
- }
- }
- else if (sd && sd->status.guild_id > 0 && (g = guild_search(sd->status.guild_id)) &&
- strcmp(sd->status.name,g->master)==0) {
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- map_foreachinarea(skill_area_sub,
- src->m,src->x-15,src->y-15,src->x+15,src->y+15,0,
- src,skillid,skilllv,tick, flag|BCT_ALL|1,
- skill_castend_nodamage_id);
- pc_blockskill_start (sd, skillid, 300000);
- }
- }
- break;
- case GD_RESTORE:
- {
- struct guild *g = NULL;
- // Only usable during WoE
- if (!agit_flag) {
- clif_skill_fail(sd,skillid,0,0);
- map_freeblock_unlock();
- return 0;
- }
- if(flag&1) {
- if (dstsd && dstsd->status.guild_id == sd->status.guild_id) {
- int hp, sp;
- hp = dstsd->status.max_hp*9/10;
- sp = dstsd->status.max_sp*9/10;
- sp = dstsd->status.sp + sp <= dstsd->status.max_sp ? sp : dstsd->status.max_sp - dstsd->status.sp;
- clif_skill_nodamage(src,bl,AL_HEAL,hp,1);
- battle_heal(NULL,bl,hp,sp,0);
- }
- }
- else if (sd && sd->status.guild_id > 0 && (g = guild_search(sd->status.guild_id)) &&
- strcmp(sd->status.name,g->master)==0) {
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- map_foreachinarea(skill_area_sub,
- src->m,src->x-15,src->y-15,src->x+15,src->y+15,0,
- src,skillid,skilllv,tick, flag|BCT_ALL|1,
- skill_castend_nodamage_id);
- pc_blockskill_start (sd, skillid, 300000);
- }
- }
- break;
- case GD_EMERGENCYCALL:
- {
- int dx[9]={-1, 1, 0, 0,-1, 1,-1, 1, 0};
- int dy[9]={ 0, 0, 1,-1, 1,-1,-1, 1, 0};
- int j = 0;
- struct guild *g = NULL;
- // Only usable during WoE
- if (!agit_flag ||
- (sd && map[sd->bl.m].flag.nowarpto && // if not allowed to warp to the map
- guild_mapname2gc(sd->mapname) == NULL)) { // and it's not a castle...
- clif_skill_fail(sd,skillid,0,0);
- map_freeblock_unlock();
- return 0;
- }
- // i don't know if it actually summons in a circle, but oh well. ;P
- if (sd && sd->status.guild_id > 0 && (g = guild_search(sd->status.guild_id)) &&
- strcmp(sd->status.name,g->master)==0) {
- for(i = 0; i < g->max_member; i++, j++) {
- if (j>8) j=0;
- if ((dstsd = g->member[i].sd) != NULL && sd != dstsd) {
- if (map[dstsd->bl.m].flag.nowarp &&
- guild_mapname2gc(sd->mapname) == NULL)
- continue;
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(map_getcell(sd->bl.m,sd->bl.x+dx[j],sd->bl.y+dy[j],CELL_CHKNOPASS))
- dx[j] = dy[j] = 0;
- pc_setpos(dstsd, sd->mapname, sd->bl.x+dx[j], sd->bl.y+dy[j], 2);
- }
- }
- pc_blockskill_start (sd, skillid, 300000);
- }
- }
- break;
-
- default:
- printf("Unknown skill used:%d\n",skillid);
- map_freeblock_unlock();
- return 1;
- }
-
- map_freeblock_unlock();
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹AIDŽw’èj
- *------------------------------------------
- */
-int skill_castend_id( int tid, unsigned int tick, int id,int data )
-{
- struct map_session_data* sd = map_id2sd(id)/*,*target_sd=NULL*/;
- struct block_list *bl;
- int range,inf2;
-
- nullpo_retr(0, sd);
-
- if( sd->bl.prev == NULL ) //prev‚ª–³‚¢‚Ì‚Í‚ ‚è‚È‚ÌH
- return 0;
-
- if(sd->skillid != SA_CASTCANCEL && sd->skilltimer != tid ) /* ƒ^ƒCƒ}ID‚ÌŠm”F */
- return 0;
- if(sd->skillid != SA_CASTCANCEL && sd->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST) > 0) {
- sd->speed = sd->prev_speed;
- clif_updatestatus(sd,SP_SPEED);
- }
- if(sd->skillid != SA_CASTCANCEL)
- sd->skilltimer=-1;
-
- if((bl=map_id2bl(sd->skilltarget))==NULL || bl->prev==NULL) {
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- if(sd->bl.m != bl->m || pc_isdead(sd)) { //ƒ}ƒbƒv‚ªˆá‚¤‚©Ž©•ª‚ªŽ€‚ñ‚Å‚¢‚é
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
-
- if(sd->skillid == PR_LEXAETERNA) {
- struct status_change *sc_data = status_get_sc_data(bl);
- if(sc_data && (sc_data[SC_FREEZE].timer != -1 || (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0))) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- }
- else if(sd->skillid == RG_BACKSTAP) {
- int dir = map_calc_dir(&sd->bl,bl->x,bl->y),t_dir = status_get_dir(bl);
- int dist = distance(sd->bl.x,sd->bl.y,bl->x,bl->y);
- if(bl->type != BL_SKILL && (dist == 0 || map_check_dir(dir,t_dir))) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- }
-
- inf2 = skill_get_inf2(sd->skillid);
- if( ( (skill_get_inf(sd->skillid)&1) || inf2&4 ) && // ”Þ‰ä“G??ŒWƒ`ƒFƒbƒN
- battle_check_target(&sd->bl,bl, BCT_ENEMY)<=0 ) {
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- if(inf2 & 0xC00 && sd->bl.id != bl->id) {
- int fail_flag = 1;
- if(inf2 & 0x400 && battle_check_target(&sd->bl,bl, BCT_PARTY) > 0)
- fail_flag = 0;
- if(inf2 & 0x800 && sd->status.guild_id > 0 && sd->status.guild_id == status_get_guild_id(bl))
- fail_flag = 0;
- if(fail_flag) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- }
-
- range = skill_get_range(sd->skillid,sd->skilllv);
- if(range < 0)
- range = status_get_range(&sd->bl) - (range + 1);
- range += battle_config.pc_skill_add_range;
- if((sd->skillid == MO_EXTREMITYFIST && sd->sc_data[SC_COMBO].timer != -1 && sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH) ||
- (sd->skillid == CH_TIGERFIST && sd->sc_data[SC_COMBO].timer != -1 && sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH) ||
- (sd->skillid == CH_CHAINCRUSH && sd->sc_data[SC_COMBO].timer != -1 && sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH) ||
- (sd->skillid == CH_CHAINCRUSH && sd->sc_data[SC_COMBO].timer != -1 && sd->sc_data[SC_COMBO].val1 == CH_TIGERFIST))
- range += skill_get_blewcount(MO_COMBOFINISH,sd->sc_data[SC_COMBO].val2);
- if(battle_config.skill_out_range_consume) { // changed to allow casting when target walks out of range [Valaris]
- if(range < distance(sd->bl.x,sd->bl.y,bl->x,bl->y)) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- }
- if(!skill_check_condition(sd,1)) { /* Žg—p?Œƒ`ƒFƒbƒN */
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- sd->skillitem = sd->skillitemlv = -1;
- if(battle_config.skill_out_range_consume) {
- if(range < distance(sd->bl.x,sd->bl.y,bl->x,bl->y)) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- return 0;
- }
- }
-
- if(battle_config.pc_skill_log)
- printf("PC %d skill castend skill=%d\n",sd->bl.id,sd->skillid);
- pc_stop_walking(sd,0);
-
- switch( skill_get_nk(sd->skillid) )
- {
- /* U?Œn/‚«”ò‚΂µŒn */
- case 0: case 2:
- skill_castend_damage_id(&sd->bl,bl,sd->skillid,sd->skilllv,tick,0);
- break;
- case 1:/* Žx‰‡Œn */
- if( (sd->skillid==AL_HEAL || (sd->skillid==ALL_RESURRECTION && bl->type != BL_PC) || sd->skillid==PR_ASPERSIO) && battle_check_undead(status_get_race(bl),status_get_elem_type(bl)))
- skill_castend_damage_id(&sd->bl,bl,sd->skillid,sd->skilllv,tick,0);
- else
- skill_castend_nodamage_id(&sd->bl,bl,sd->skillid,sd->skilllv,tick,0);
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹Aꊎw’è‚Ì?Û‚Ì?—j
- *------------------------------------------
- */
-int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skilllv,unsigned int tick,int flag)
-{
- struct map_session_data *sd=NULL;
- int i,tmpx = 0,tmpy = 0, x1 = 0, y1 = 0;
-
- //if(skilllv <= 0) return 0;
- if(skillid > 0 && skilllv <= 0) return 0; // celest
-
- nullpo_retr(0, src);
-
- if(src->type==BL_PC){
- nullpo_retr(0, sd=(struct map_session_data *)src);
- }
- if( skillid != WZ_METEOR &&
- skillid != AM_CANNIBALIZE &&
- skillid != AM_SPHEREMINE)
- clif_skill_poseffect(src,skillid,skilllv,x,y,tick);
-
- if (sd && skillnotok(skillid, sd)) // [MouseJstr]
- return 0;
-
- switch(skillid)
- {
- case PR_BENEDICTIO: /* ¹?~•Ÿ */
- skill_area_temp[1]=src->id;
- map_foreachinarea(skill_area_sub,
- src->m,x-1,y-1,x+1,y+1,0,
- src,skillid,skilllv,tick, flag|BCT_NOENEMY|1,
- skill_castend_nodamage_id);
- map_foreachinarea(skill_area_sub,
- src->m,x-1,y-1,x+1,y+1,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
- skill_castend_damage_id);
- break;
-
- case BS_HAMMERFALL: /* ƒnƒ“ƒ}?ƒtƒH?ƒ‹ */
- {
- int r = 2;
- if (skilllv > 5) {
- r = 14;
- skilllv = 5; // ƒXƒ^ƒ“—¦ã‚ª‚è‚·‚¬‚邽‚ߌvŽZ‚ÍLv5‚ŌŒè
- }
- skill_area_temp[1] = src->id;
- skill_area_temp[2] = x;
- skill_area_temp[3] = y;
- map_foreachinarea (skill_area_sub,
- src->m, x-r, y-r, x+r, y+r, 0,
- src, skillid, skilllv, tick, flag|BCT_ENEMY|2,
- skill_castend_nodamage_id);
- }
- break;
-
- case HT_DETECTING: /* ƒfƒBƒeƒNƒeƒBƒ“ƒO */
- {
- int range=skilllv*2+1;
- if(src->x!=x)
- x+=(src->x-x>0)?-range:range;
- if(src->y!=y)
- y+=(src->y-y>0)?-range:range;
- map_foreachinarea( status_change_timer_sub,
- src->m, x-range, y-range, x+range,y+range,0,
- src,SC_SIGHT,tick);
- }
- break;
-
- case MG_SAFETYWALL: /* ƒZƒCƒtƒeƒBƒEƒH?ƒ‹ */
- case MG_FIREWALL: /* ƒtƒ@ƒCƒ„?ƒEƒH?ƒ‹ */
- case MG_THUNDERSTORM: /* ƒTƒ“ƒ_?ƒXƒg?ƒ€ */
- case AL_PNEUMA: /* ƒjƒ…?ƒ} */
- case WZ_ICEWALL: /* ƒAƒCƒXƒEƒH?ƒ‹ */
- case WZ_FIREPILLAR: /* ƒtƒ@ƒCƒAƒsƒ‰? */
- case WZ_QUAGMIRE: /* ƒNƒ@ƒOƒ}ƒCƒA */
- case WZ_VERMILION: /* ƒ?ƒhƒIƒuƒ”ƒ@?ƒ~ƒŠƒIƒ“ */
- //case WZ_FROSTNOVA: /* ƒtƒƒXƒgƒmƒ”ƒ@ */
- case WZ_STORMGUST: /* ƒXƒg?ƒ€ƒKƒXƒg */
- case WZ_HEAVENDRIVE: /* ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu */
- case PR_SANCTUARY: /* ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ */
- case PR_MAGNUS: /* ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€ */
- case CR_GRANDCROSS: /* ƒOƒ‰ƒ“ƒhƒNƒƒX */
- case NPC_DARKGRANDCROSS: /*ˆÅƒOƒ‰ƒ“ƒhƒNƒƒX*/
- case HT_SKIDTRAP: /* ƒXƒLƒbƒhƒgƒ‰ƒbƒv */
- case HT_LANDMINE: /* ƒ‰ƒ“ƒhƒ}ƒCƒ“ */
- case HT_ANKLESNARE: /* ƒAƒ“ƒNƒ‹ƒXƒlƒA */
- case HT_SHOCKWAVE: /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
- case HT_SANDMAN: /* ƒTƒ“ƒhƒ}ƒ“ */
- case HT_FLASHER: /* ƒtƒ‰ƒbƒVƒƒ? */
- case HT_FREEZINGTRAP: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
- case HT_BLASTMINE: /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
- case HT_CLAYMORETRAP: /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
- case AS_VENOMDUST: /* ƒxƒmƒ€ƒ_ƒXƒg */
- case AM_DEMONSTRATION: /* ƒfƒ‚ƒ“ƒXƒgƒŒ?ƒVƒ‡ƒ“ */
- case PF_FOGWALL: /* ƒtƒHƒOƒEƒH?ƒ‹ */
- case HT_TALKIEBOX: /* ƒg?ƒL?ƒ{ƒbƒNƒX */
- skill_unitsetting(src,skillid,skilllv,x,y,0);
- break;
-
- case RG_GRAFFITI: /* Graffiti [Valaris] */
- skill_clear_unitgroup(src);
- skill_unitsetting(src,skillid,skilllv,x,y,0);
- break;
-
- case SA_VOLCANO: /* ƒ{ƒ‹ƒP?ƒm */
- case SA_DELUGE: /* ƒfƒŠƒ…?ƒW */
- case SA_VIOLENTGALE: /* ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹ */
- case SA_LANDPROTECTOR: /* ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^? */
- skill_clear_element_field(src);//?‚ÉŽ©•ª‚ª?“®‚µ‚Ä‚¢‚é?«ê‚ðƒNƒŠƒA
- skill_unitsetting(src,skillid,skilllv,x,y,0);
- break;
-
- case WZ_METEOR: //ƒƒeƒIƒXƒg?ƒ€
- {
- int flag=0;
- for(i=0;i<2+(skilllv>>1);i++) {
- int j=0;
- do {
- tmpx = x + (rand()%7 - 3);
- tmpy = y + (rand()%7 - 3);
- if(tmpx < 0)
- tmpx = 0;
- else if(tmpx >= map[src->m].xs)
- tmpx = map[src->m].xs - 1;
- if(tmpy < 0)
- tmpy = 0;
- else if(tmpy >= map[src->m].ys)
- tmpy = map[src->m].ys - 1;
- j++;
- } while((map_getcell(src->m,tmpx,tmpy,CELL_CHKNOPASS)) && j<100);
- if(j >= 100)
- continue;
- if(flag==0){
- clif_skill_poseffect(src,skillid,skilllv,tmpx,tmpy,tick);
- flag=1;
- }
- if(i > 0)
- skill_addtimerskill(src,tick+i*1000,0,tmpx,tmpy,skillid,skilllv,(x1<<16)|y1,flag);
- x1 = tmpx;
- y1 = tmpy;
- }
- skill_addtimerskill(src,tick+i*1000,0,tmpx,tmpy,skillid,skilllv,-1,flag);
- }
- break;
-
- case AL_WARP: /* ƒ?ƒvƒ|?ƒ^ƒ‹ */
- if(sd) {
- if(map[sd->bl.m].flag.noteleport) /* ƒeƒŒƒ|‹ÖŽ~ */
- break;
- clif_skill_warppoint(sd,sd->skillid,sd->status.save_point.map,
- (sd->skilllv>1)?sd->status.memo_point[0].map:"",
- (sd->skilllv>2)?sd->status.memo_point[1].map:"",
- (sd->skilllv>3)?sd->status.memo_point[2].map:"");
- }
- break;
- case MO_BODYRELOCATION:
- if(sd){
- pc_movepos(sd,x,y);
- }else if( src->type==BL_MOB )
- mob_warp((struct mob_data *)src,-1,x,y,0);
- if (sd)
- pc_blockskill_start (sd, MO_EXTREMITYFIST, 2000);
- break;
- case AM_CANNIBALIZE: // ƒoƒCƒIƒvƒ‰ƒ“ƒg
- if(sd) {
- int id;
- int summons[5] = { 1020, 1068, 1118, 1500, 1368 };
- struct mob_data *md;
-
- // Correct info, don't change any of this! [celest]
- id = mob_once_spawn (sd, "this", x, y, "--ja--", summons[skilllv-1] ,1,"");
-
- if( (md=(struct mob_data *)map_id2bl(id)) !=NULL ){
- md->master_id = sd->bl.id;
- // different levels of HP according to skill level
- md->hp = 1500 + skilllv * 200 + sd->status.base_level * 10;
- md->state.special_mob_ai = 1;
- //”ñˆÚ“®‚ŃAƒNƒeƒBƒu‚Å”½Œ‚‚·‚é[0x0:”ñˆÚ“® 0x1:ˆÚ“® 0x4:ACT 0x8:”ñACT 0x40:”½Œ‚–³ 0x80:”½Œ‚—L]
- md->mode = 0x0 + 0x4 + 0x80;
- md->deletetimer = add_timer (gettick() + skill_get_time(skillid,skilllv), mob_timer_delete, id, 0);
- }
- // To-do: ¢ŠÒ‚³‚ê‚郂ƒ“ƒXƒ^[‚É‚Í¢ŠÒ‚µ‚½ƒvƒŒ[ƒ„[‚Ì–¼‘O‚ª•t‚«‚Ü‚·
- // (attach name of player?)
- clif_skill_poseffect(src,skillid,skilllv,x,y,tick);
- }
- break;
- case AM_SPHEREMINE: // ƒXƒtƒBƒA?ƒ}ƒCƒ“
- if(sd){
- int id;
- struct mob_data *md;
-
- id = mob_once_spawn(sd, "this", x, y, "--ja--", 1142, 1, "");
- if( (md=(struct mob_data *)map_id2bl(id)) !=NULL ){
- md->master_id = sd->bl.id;
- md->hp = 2000 + skilllv * 400;
- md->state.special_mob_ai = 2;
- md->deletetimer = add_timer (gettick() + skill_get_time(skillid,skilllv), mob_timer_delete, id, 0);
- }
- clif_skill_poseffect(src,skillid,skilllv,x,y,tick);
- }
- break;
-
- // Slim Pitcher [Celest]
- case CR_SLIMPITCHER:
- {
- if (sd) {
- int i = skilllv%11 - 1;
- int j = pc_search_inventory(sd,skill_db[skillid].itemid[i]);
- if(j < 0 || skill_db[skillid].itemid[i] <= 0 || sd->inventory_data[j] == NULL ||
- sd->status.inventory[j].amount < skill_db[skillid].amount[i]) {
- clif_skill_fail(sd,skillid,0,0);
- return 1;
- }
- sd->state.potionpitcher_flag = 1;
- sd->potion_hp = 0;
- run_script(sd->inventory_data[j]->use_script,0,sd->bl.id,0);
- pc_delitem(sd,j,skill_db[skillid].amount[i],0);
- sd->state.potionpitcher_flag = 0;
- clif_skill_poseffect(src,skillid,skilllv,x,y,tick);
- if(sd->potion_hp > 0) {
- map_foreachinarea(skill_area_sub,
- src->m,x-3,y-3,x+3,y+3,0,
- src,skillid,skilllv,tick,flag|BCT_PARTY|1,
- skill_castend_nodamage_id);
- }
- }
- }
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹AmapŽw’èj
- *------------------------------------------
- */
-int skill_castend_map( struct map_session_data *sd,int skill_num, const char *map)
-{
- int x=0,y=0;
-
- nullpo_retr(0, sd);
- if( sd->bl.prev == NULL || pc_isdead(sd) )
- return 0;
-
- if(skillnotok(skill_num, sd))
- return 0;
-
- if( sd->opt1>0 || sd->status.option&2 )
- return 0;
- //ƒXƒLƒ‹‚ªŽg‚¦‚È‚¢?‘ÔˆÙí’†
- if(sd->sc_count){
- if( sd->sc_data[SC_DIVINA].timer!=-1 ||
- sd->sc_data[SC_ROKISWEIL].timer!=-1 ||
- sd->sc_data[SC_AUTOCOUNTER].timer != -1 ||
- sd->sc_data[SC_STEELBODY].timer != -1 ||
- sd->sc_data[SC_DANCING].timer!=-1 ||
- sd->sc_data[SC_BERSERK].timer != -1 ||
- sd->sc_data[SC_MARIONETTE].timer != -1)
- return 0;
- }
-
- if( skill_num != sd->skillid) /* •s³ƒpƒPƒbƒg‚炵‚¢ */
- return 0;
-
- pc_stopattack(sd);
-
- if(battle_config.pc_skill_log)
- printf("PC %d skill castend skill =%d map=%s\n",sd->bl.id,skill_num,map);
- pc_stop_walking(sd,0);
-
- if(strcmp(map,"cancel")==0)
- return 0;
-
- switch(skill_num){
- case AL_TELEPORT: /* ƒeƒŒƒ|?ƒg */
- if(strcmp(map,"Random")==0)
- pc_randomwarp(sd,3);
- else
- pc_setpos(sd,sd->status.save_point.map,
- sd->status.save_point.x,sd->status.save_point.y,3);
- break;
-
- case AL_WARP: /* ƒ?ƒvƒ|?ƒ^ƒ‹ */
- {
- const struct point *p[4];
- struct skill_unit_group *group;
- int i;
- int maxcount=0;
- p[0] = &sd->status.save_point;
- p[1] = &sd->status.memo_point[0];
- p[2] = &sd->status.memo_point[1];
- p[3] = &sd->status.memo_point[2];
-
- if((maxcount = skill_get_maxcount(sd->skillid)) > 0) {
- int c;
- for(i=c=0;i<MAX_SKILLUNITGROUP;i++) {
- if(sd->skillunit[i].alive_count > 0 && sd->skillunit[i].skill_id == sd->skillid)
- c++;
- }
- if(c >= maxcount) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->canact_tick = gettick();
- sd->canmove_tick = gettick();
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- }
-
- if(sd->skilllv <= 0) return 0;
- for(i=0;i<sd->skilllv;i++){
- if(strcmp(map,p[i]->map)==0){
- x=p[i]->x;
- y=p[i]->y;
- break;
- }
- }
- if(x==0 || y==0) /* •s³ƒpƒPƒbƒgH */
- return 0;
-
- if(!skill_check_condition(sd,3))
- return 0;
- if((group=skill_unitsetting(&sd->bl,sd->skillid,sd->skilllv,sd->skillx,sd->skilly,0))==NULL)
- return 0;
- group->valstr=(char *)aCallocA(24,sizeof(char));
- memcpy(group->valstr,map,24);
- group->val2=(x<<16)|y;
- }
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgÝ’è?—
- *------------------------------------------
- */
-struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,int skilllv,int x,int y,int flag)
-{
- struct skill_unit_group *group;
- int i,limit,val1=0,val2=0,val3=0;
- int count=0;
- int target,interval,range,unit_flag;
- struct skill_unit_layout *layout;
- struct status_change *sc_data;
- int active_flag=1;
-
- nullpo_retr(0, src);
-
- limit = skill_get_time(skillid,skilllv);
- range = skill_get_unit_range(skillid);
- interval = skill_get_unit_interval(skillid);
- target = skill_get_unit_target(skillid);
- unit_flag = skill_get_unit_flag(skillid);
- layout = skill_get_unit_layout(skillid,skilllv,src,x,y);
-
- if (unit_flag&UF_DEFNOTENEMY && battle_config.defnotenemy)
- target = BCT_NOENEMY;
-
- sc_data = status_get_sc_data(src); // for firewall and fogwall - celest
-
- switch(skillid){ /* Ý’è */
-
- case MG_SAFETYWALL: /* ƒZƒCƒtƒeƒBƒEƒH?ƒ‹ */
- val2=skilllv+1;
- break;
- case MG_FIREWALL: /* ƒtƒ@ƒCƒ„?ƒEƒH?ƒ‹ */
- if(sc_data && sc_data[SC_VIOLENTGALE].timer!=-1)
- limit = limit*3/2;
- val2=4+skilllv;
- break;
-
- case AL_WARP: /* ƒ?ƒvƒ|?ƒ^ƒ‹ */
- val1=skilllv+6;
- if(flag==0)
- limit=2000;
- active_flag=0;
- break;
-
- case PR_SANCTUARY: /* ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ */
- val1=(skilllv+3)*2;
- val2=(skilllv>6)?777:skilllv*100;
- interval += 500;
- break;
-
- case WZ_FIREPILLAR: /* ƒtƒ@ƒCƒA?ƒsƒ‰? */
- if(flag!=0)
- limit=1000;
- val1=skilllv+2;
- if(skilllv >= 6)
- range=2;
- break;
- case WZ_METEOR:
- if (skilllv > 10) //L”͈̓ƒeƒI
- range = 10;
- break;
- case WZ_VERMILION:
- if (skilllv > 10) //L”͈ÍLOV
- range = 25;
- break;
-
- case HT_SANDMAN: /* ƒTƒ“ƒhƒ}ƒ“ */
- case HT_CLAYMORETRAP: /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
- case HT_SKIDTRAP: /* ƒXƒLƒbƒhƒgƒ‰ƒbƒv */
- case HT_LANDMINE: /* ƒ‰ƒ“ƒhƒ}ƒCƒ“ */
- case HT_ANKLESNARE: /* ƒAƒ“ƒNƒ‹ƒXƒlƒA */
- case HT_FLASHER: /* ƒtƒ‰ƒbƒVƒƒ? */
- case HT_FREEZINGTRAP: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
- case HT_BLASTMINE: /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
- // longer trap times in WOE [celest]
- if (map[src->m].flag.gvg) limit *= 4;
- break;
- case HT_SHOCKWAVE: /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
- val1=skilllv*15+10;
- break;
-
- case SA_LANDPROTECTOR: /* ƒOƒ‰ƒ“ƒhƒNƒƒX */
- {
- int aoe_diameter; // -- aoe_diameter (moonsoul) added for sage Area Of Effect skills
- val1=skilllv*15+10;
- aoe_diameter=skilllv+skilllv%2+5;
- count=aoe_diameter*aoe_diameter; // -- this will not function if changed to ^2 (moonsoul)
- }
- break;
-
- case BA_WHISTLE: /* Œû“J */
- if(src->type == BL_PC)
- val1 = (pc_checkskill((struct map_session_data *)src,BA_MUSICALLESSON)+1)>>1;
- val2 = ((status_get_agi(src)/10)&0xffff)<<16;
- val2 |= (status_get_luk(src)/10)&0xffff;
- break;
- case DC_HUMMING: /* ƒnƒ~ƒ“ƒO */
- if(src->type == BL_PC)
- val1 = (pc_checkskill((struct map_session_data *)src,DC_DANCINGLESSON)+1)>>1;
- val2 = status_get_dex(src)/10;
- break;
- case DC_DONTFORGETME: /* Ž„‚ð–Y‚ê‚È‚¢‚Åc */
- if(src->type == BL_PC)
- val1 = (pc_checkskill((struct map_session_data *)src,DC_DANCINGLESSON)+1)>>1;
- val2 = ((status_get_dex(src)/20)&0xffff)<<16;
- val2 |= (status_get_agi(src)/10)&0xffff;
- break;
- case BA_POEMBRAGI: /* ƒuƒ‰ƒM‚ÌŽ */
- if(src->type == BL_PC)
- val1 = pc_checkskill((struct map_session_data *)src,BA_MUSICALLESSON);
- val2 = ((status_get_dex(src)/10)&0xffff)<<16;
- val2 |= (status_get_int(src)/5)&0xffff;
- break;
- case BA_APPLEIDUN: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
- if(src->type == BL_PC)
- val1 = pc_checkskill((struct map_session_data *)src,BA_MUSICALLESSON)&0xffff;
- val2 |= (status_get_vit(src))&0xffff;
- val3 = 0;//‰ñ•œ—pƒ^ƒCƒ€ƒJƒEƒ“ƒ^(6•b?‚É1?‰Á)
- break;
- case DC_SERVICEFORYOU: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
- if(src->type == BL_PC)
- val1 = (pc_checkskill((struct map_session_data *)src,DC_DANCINGLESSON)+1)>>1;
- val2 = status_get_int(src)/10;
- break;
- case BA_ASSASSINCROSS: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
- if(src->type == BL_PC)
- val1 = (pc_checkskill((struct map_session_data *)src,BA_MUSICALLESSON)+1)>>1;
- val2 = status_get_agi(src)/20;
- break;
- case DC_FORTUNEKISS: /* K‰^‚̃LƒX */
- if(src->type == BL_PC)
- val1 = (pc_checkskill((struct map_session_data *)src,DC_DANCINGLESSON)+1)>>1;
- val2 = status_get_luk(src)/10;
- break;
-
- case PF_FOGWALL: /* ƒtƒHƒOƒEƒH?ƒ‹ */
- if(sc_data && sc_data[SC_DELUGE].timer!=-1) limit *= 2;
- break;
-
- case RG_GRAFFITI: /* Graffiti */
- count=1; // Leave this at 1 [Valaris]
- break;
- }
-
- nullpo_retr(NULL, group=skill_initunitgroup(src,(count > 0 ? count : layout->count),
- skillid,skilllv,skill_get_unit_id(skillid,flag&1)));
- group->limit=limit;
- group->val1=val1;
- group->val2=val2;
- group->val3=val3;
- group->target_flag=target;
- group->interval=interval;
- if(skillid==HT_TALKIEBOX ||
- skillid==RG_GRAFFITI){
- group->valstr=(char *) aCallocA(80, 1);
- if(group->valstr==NULL){
- printf("skill_castend_map: out of memory !\n");
- exit(1);
- }
- memcpy(group->valstr,talkie_mes,80);
- }
- for(i=0;i<layout->count;i++){
- struct skill_unit *unit;
- int ux,uy,val1=skilllv,val2=0,limit=group->limit,alive=1;
- ux = x + layout->dx[i];
- uy = y + layout->dy[i];
- switch (skillid) {
- case MG_FIREWALL: /* ƒtƒ@ƒCƒ„?ƒEƒH?ƒ‹ */
- val2=group->val2;
- break;
- case WZ_ICEWALL: /* ƒAƒCƒXƒEƒH?ƒ‹ */
- if(skilllv <= 1)
- val1 = 500;
- else
- val1 = 200 + 200*skilllv;
- break;
- case RG_GRAFFITI: /* Graffiti [Valaris] */
- ux+=(i%5-2);
- uy+=(i/5-2);
- break;
- }
- //’¼ãƒXƒLƒ‹‚Ìê‡Ý’uÀ•Wã‚Ƀ‰ƒ“ƒhƒvƒƒeƒNƒ^?‚ª‚È‚¢‚©ƒ`ƒFƒbƒN
- if(range<=0)
- map_foreachinarea(skill_landprotector,src->m,ux,uy,ux,uy,BL_SKILL,skillid,&alive);
-
- if(skillid==WZ_ICEWALL && alive){
- val2=map_getcell(src->m,ux,uy,CELL_GETTYPE);
- if(val2==5 || val2==1)
- alive=0;
- else {
- map_setcell(src->m,ux,uy,5);
- clif_changemapcell(src->m,ux,uy,5,0);
- }
- }
-
- if(alive){
- nullpo_retr(NULL, unit=skill_initunit(group,i,ux,uy));
- unit->val1=val1;
- unit->val2=val2;
- unit->limit=limit;
- unit->range=range;
-
- if (range==0 && active_flag)
- map_foreachinarea(skill_unit_effect,unit->bl.m
- ,unit->bl.x,unit->bl.y,unit->bl.x,unit->bl.y
- ,0,&unit->bl,gettick(),1);
- }
- }
-
- return group;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒg‚Ì?“®ƒCƒxƒ“ƒg
- *------------------------------------------
- */
-int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int tick)
-{
- struct skill_unit_group *sg;
- struct block_list *ss;
- struct skill_unit *unit2;
- struct status_change *sc_data;
- int type;
-
- nullpo_retr(0, src);
- nullpo_retr(0, bl);
-
- if(bl->prev==NULL || !src->alive ||
- (bl->type == BL_PC && pc_isdead((struct map_session_data *)bl)))
- return 0;
-
- nullpo_retr(0, sg=src->group);
- nullpo_retr(0, ss=map_id2bl(sg->src_id));
-
- sc_data = status_get_sc_data(bl);
- type = SkillStatusChangeTable[sg->skill_id];
-
- if (battle_check_target(&src->bl,bl,sg->target_flag)<=0)
- return 0;
-
- // ‘ÎÛ‚ªLPã‚É‹‚éꇂ͖³Œø
- if (map_find_skill_unit_oncell(bl,bl->x,bl->y,SA_LANDPROTECTOR,NULL))
- return 0;
-
- switch (sg->unit_id) {
- case 0x85: /* ƒjƒ…[ƒ} */
- case 0x7e: /* ƒZƒCƒtƒeƒBƒEƒH[ƒ‹ */
- if (sc_data && sc_data[type].timer == -1)
- status_change_start(bl,type,sg->skill_lv,(int)src,0,0,0,0);
- break;
-
- case 0x80: /* ƒ[ƒvƒ|[ƒ^ƒ‹(”­“®Œã) */
- if(bl->type==BL_PC){
- struct map_session_data *sd = (struct map_session_data *)bl;
- if(sd && src->bl.m == bl->m && src->bl.x == bl->x && src->bl.y == bl->y &&
- src->bl.x == sd->to_x && src->bl.y == sd->to_y) {
- if( battle_config.chat_warpportal || !sd->chatID ){
- pc_setpos(sd,sg->valstr,sg->val2>>16,sg->val2&0xffff,3);
- if(sg->src_id == bl->id || (strcmp(map[src->bl.m].name,sg->valstr) == 0 &&
- src->bl.x == (sg->val2>>16) && src->bl.y == (sg->val2&0xffff) ))
- skill_delunitgroup(sg);
- if (--sg->val1<=0)
- skill_delunitgroup(sg);
- }
- }
- } else if(bl->type==BL_MOB && battle_config.mob_warpportal){
- int m = map_mapname2mapid(sg->valstr);
- mob_warp((struct mob_data *)bl,m,sg->val2>>16,sg->val2&0xffff,3);
- }
- break;
-
- case 0x8e: /* ƒNƒ@ƒOƒ}ƒCƒA */
- if(bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
- break;
- if(sc_data && sc_data[type].timer==-1)
- status_change_start(bl,type,sg->skill_lv,(int)src,0,0,
- skill_get_time2(sg->skill_id,sg->skill_lv),0);
- break;
-
- case 0x9a: /* ƒ{ƒ‹ƒP?ƒm */
- case 0x9b: /* ƒfƒŠƒ…?ƒW */
- case 0x9c: /* ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹ */
- if (sc_data && sc_data[type].timer!=-1) {
- unit2 = (struct skill_unit *)sc_data[type].val4;
- if (unit2 && unit2->group &&
- (unit2==src || DIFF_TICK(sg->tick,unit2->group->tick)<=0))
- break;
- }
- status_change_start(bl,type,sg->skill_lv,(int)src,0,0,
- skill_get_time2(sg->skill_id,sg->skill_lv),0);
- break;
-
- case 0x9e: /* ŽqŽç‰S */
- case 0x9f: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
- case 0xa0: /* ‰i‰“‚̬“× */
- case 0xa1: /* ?‘¾ŒÛ‚Ì‹¿‚« */
- case 0xa2: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
- case 0xa3: /* ƒƒL‚Ì‹©‚Ñ */
- case 0xa4: /* [•£‚Ì’†‚É */
- case 0xa5: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
- case 0xa6: /* •s‹¦˜a‰¹ */
- case 0xa7: /* Œû“J */
- case 0xa8: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
- case 0xa9: /* ƒuƒ‰ƒM‚ÌŽ */
- case 0xaa: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
- case 0xab: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX */
- case 0xac: /* ƒnƒ~ƒ“ƒO */
- case 0xad: /* Ž„‚ð–Y‚ê‚È‚¢‚Åc */
- case 0xae: /* K‰^‚̃LƒX */
- case 0xaf: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
- if (sg->src_id==bl->id)
- break;
- if (sc_data && sc_data[type].timer!=-1) {
- unit2 = (struct skill_unit *)sc_data[type].val4;
- if (unit2 && unit2->group &&
- (unit2 == src || DIFF_TICK(sg->tick,unit2->group->tick)<=0))
- break;
- }
- status_change_start(bl,type,sg->skill_lv,sg->val1,sg->val2,
- (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0);
- break;
-
- case 0xb4: // Basilica
- if (battle_check_target(&src->bl,bl,BCT_NOENEMY)>0) {
- if (sc_data && sc_data[type].timer!=-1) {
- struct skill_unit_group *sg2 = (struct skill_unit_group *)sc_data[type].val4;
- if (sg2 && (sg2 == src->group || DIFF_TICK(sg->tick,sg2->tick)<=0))
- break;
- } else
- status_change_start(bl,type,sg->skill_lv,(int)src,0,0,
- skill_get_time2(sg->skill_id,sg->skill_lv),0);
- } else if (!status_get_mode(bl)&0x20)
- skill_blown(&src->bl,bl,1);
- break;
-
- case 0xb6: /* ƒtƒHƒOƒEƒH?ƒ‹ */
- if (sc_data && sc_data[type].timer!=-1) {
- struct skill_unit_group *sg2 = (struct skill_unit_group *)sc_data[type].val4;
- if (sg2 && (sg2 == src->group || DIFF_TICK(sg->tick,sg2->tick)<=0))
- break;
- }
- status_change_start (bl, type, sg->skill_lv, sg->val1, sg->val2, (int)sg,
- skill_get_time2(sg->skill_id, sg->skill_lv), 0);
- if (battle_check_target(&src->bl,bl,BCT_ENEMY)>0)
- skill_additional_effect (ss, bl, sg->skill_id, sg->skill_lv, BF_MISC, tick);
- break;
-
- case 0xb2: /* ‚ ‚È‚½‚ð_?‚¢‚½‚¢‚Å‚· */
- case 0xb3: /* ƒSƒXƒyƒ‹ */
- //‚Æ‚è‚ ‚¦‚¸‰½‚à‚µ‚È‚¢
- break;
- /* default:
- if(battle_config.error_log)
- printf("skill_unit_onplace: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id);
- break;*/
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒg‚Ì”­“®ƒCƒxƒ“ƒg(ƒ^ƒCƒ}[”­“®)
- *------------------------------------------
- */
-int skill_unit_onplace_timer(struct skill_unit *src,struct block_list *bl,unsigned int tick)
-{
- struct skill_unit_group *sg;
- struct block_list *ss;
- int splash_count=0;
- struct status_change *sc_data;
- struct skill_unit_group_tickset *ts;
- int type;
- int diff=0;
-
- nullpo_retr(0, src);
- nullpo_retr(0, bl);
-
- if (bl->type!=BL_PC && bl->type!=BL_MOB)
- return 0;
-
- if (bl->prev==NULL || !src->alive ||
- (bl->type==BL_PC && pc_isdead((struct map_session_data *)bl)))
- return 0;
-
- nullpo_retr(0, sg=src->group);
- nullpo_retr(0, ss=map_id2bl(sg->src_id));
- sc_data = status_get_sc_data(bl);
- type = SkillStatusChangeTable[sg->skill_id];
-
- // ‘ÎÛ‚ªLPã‚É‹‚éꇂ͖³Œø
- if (map_find_skill_unit_oncell(bl,bl->x,bl->y,SA_LANDPROTECTOR,NULL))
- return 0;
-
- // ‘O‚ɉe‹¿‚ðŽó‚¯‚Ä‚©‚çinterval‚̊Ԃ͉e‹¿‚ðŽó‚¯‚È‚¢
- nullpo_retr(0,ts = skill_unitgrouptickset_search(bl,sg,tick));
- diff = DIFF_TICK(tick,ts->tick);
- if (sg->skill_id == PR_SANCTUARY)
- diff += 500; // V‹K‚ɉñ•œ‚µ‚½ƒ†ƒjƒbƒg‚¾‚¯ƒJƒEƒ“ƒg‚·‚邽‚ß‚ÌŽdŠ|‚¯
- if (diff < 0)
- return 0;
- ts->tick = tick+sg->interval;
- // GX‚Íd‚È‚Á‚Ä‚¢‚½‚ç3HIT‚µ‚È‚¢
- if (sg->skill_id==CR_GRANDCROSS && !battle_config.gx_allhit)
- ts->tick += sg->interval*(map_count_oncell(bl->m,bl->x,bl->y)-1);
-
- switch (sg->unit_id) {
- case 0x83: /* ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ */
- {
- int race = status_get_race(bl);
-
- if (battle_check_undead(race, status_get_elem_type(bl)) || race==6) {
- if (skill_attack(BF_MAGIC, ss, &src->bl, bl, sg->skill_id, sg->skill_lv, tick, 0)) {
- // reduce healing count if this was meant for damaging [hekate]
- sg->val1 -= 2;
- //sg->val1--; // ƒ`ƒƒƒbƒgƒLƒƒƒ“ƒZƒ‹‚ɑΉž
- }
- } else {
- int heal = sg->val2;
- if (status_get_hp(bl) >= status_get_max_hp(bl))
- break;
- if (bl->type == BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage)
- heal = 0; /* ‰©‹à峃J[ƒhiƒq[ƒ‹—Ê‚Oj */
- clif_skill_nodamage(&src->bl, bl, AL_HEAL, heal, 1);
- battle_heal(NULL, bl, heal, 0, 0);
- if (diff >= 500)
- sg->val1--; // V‹K‚É“ü‚Á‚½ƒ†ƒjƒbƒg‚¾‚¯ƒJƒEƒ“ƒg
- }
- if (sg->val1 <= 0)
- skill_delunitgroup(sg);
- break;
- }
-
- case 0x84: /* ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€ */
- {
- int race = status_get_race(bl);
- if (!battle_check_undead(race,status_get_elem_type(bl)) && race!=6)
- return 0;
- skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
- src->val2++;
- break;
- }
-
- case 0x7f: /* ƒtƒ@ƒCƒ„[ƒEƒH[ƒ‹ */
- skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
- if (--src->val2<=0)
- skill_delunit(src);
- break;
- case 0x86: /* ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“(TS,MS,FN,SG,HD,GX,ˆÅGX) */
- skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
- break;
- case 0x87: /* ƒtƒ@ƒCƒA[ƒsƒ‰[(”­“®‘O) */
- skill_delunit(src);
- skill_unitsetting(ss,sg->skill_id,sg->skill_lv,src->bl.x,src->bl.y,1);
- break;
-
- case 0x88: /* ƒtƒ@ƒCƒA[ƒsƒ‰[(”­“®Œã) */
- map_foreachinarea(skill_attack_area,bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
- BF_MAGIC,ss,&src->bl,sg->skill_id,sg->skill_lv,tick,0,BCT_ENEMY); // area damage [Celest]
- //skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
- break;
-
- case 0x90: /* ƒXƒLƒbƒhƒgƒ‰ƒbƒv */
- {
- int i,c = skill_get_blewcount(sg->skill_id,sg->skill_lv);
- if(map[bl->m].flag.gvg) c = 0;
- for(i=0;i<c;i++)
- skill_blown(&src->bl,bl,1|0x30000);
- sg->unit_id = 0x8c;
- clif_changelook(&src->bl,LOOK_BASE,sg->unit_id);
- sg->limit=DIFF_TICK(tick,sg->tick)+1500;
- }
- break;
-
- case 0x93: /* ƒ‰ƒ“ƒhƒ}ƒCƒ“ */
- skill_attack(BF_MISC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
- sg->unit_id = 0x8c;
- clif_changelook(&src->bl,LOOK_BASE,0x88);
- sg->limit=DIFF_TICK(tick,sg->tick)+1500;
- break;
-
- case 0x8f: /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
- case 0x94: /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
- case 0x95: /* ƒTƒ“ƒhƒ}ƒ“ */
- case 0x96: /* ƒtƒ‰ƒbƒVƒƒ? */
- case 0x97: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
- case 0x98: /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
- map_foreachinarea(skill_count_target,src->bl.m
- ,src->bl.x-src->range,src->bl.y-src->range
- ,src->bl.x+src->range,src->bl.y+src->range
- ,0,&src->bl,&splash_count);
- map_foreachinarea(skill_trap_splash,src->bl.m
- ,src->bl.x-src->range,src->bl.y-src->range
- ,src->bl.x+src->range,src->bl.y+src->range
- ,0,&src->bl,tick,splash_count);
- sg->unit_id = 0x8c;
- clif_changelook(&src->bl,LOOK_BASE,sg->unit_id);
- sg->limit=DIFF_TICK(tick,sg->tick)+1500;
- break;
-
- case 0x91: /* ƒAƒ“ƒNƒ‹ƒXƒlƒA */
- if(sg->val2==0 && sc_data && sc_data[SC_ANKLE].timer==-1){
- int moveblock = ( bl->x/BLOCK_SIZE != src->bl.x/BLOCK_SIZE || bl->y/BLOCK_SIZE != src->bl.y/BLOCK_SIZE);
- int sec = skill_get_time2(sg->skill_id,sg->skill_lv) - status_get_agi(bl)*100;
- if(status_get_mode(bl)&0x20)
- sec = sec/5;
- if (sec < 3000) // minimum time of 3 seconds [celest]
- sec = 3000;
- battle_stopwalking(bl,1);
- status_change_start(bl,SC_ANKLE,sg->skill_lv,0,0,0,sec,0);
-
- skill_unit_move(bl,tick,0);
- if(moveblock) map_delblock(bl);
- bl->x = src->bl.x;
- bl->y = src->bl.y;
- if(moveblock) map_addblock(bl);
- skill_unit_move(bl,tick,1);
- if(bl->type == BL_MOB)
- clif_fixmobpos((struct mob_data *)bl);
- else if(bl->type == BL_PET)
- clif_fixpetpos((struct pet_data *)bl);
- else
- clif_fixpos(bl);
- clif_01ac(&src->bl);
- sg->limit=DIFF_TICK(tick,sg->tick) + sec;
- sg->val2=bl->id;
- sg->interval = -1;
- src->range = 0;
- }
- break;
-
- case 0x92: /* ƒxƒmƒ€ƒ_ƒXƒg */
- if(sc_data && sc_data[type].timer==-1 )
- status_change_start(bl,type,sg->skill_lv,(int)src,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),0);
- break;
-
- case 0xb1: /* ƒfƒ‚ƒ“ƒXƒgƒŒ?ƒVƒ‡ƒ“ */
- skill_attack(BF_WEAPON,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
- if(bl->type == BL_PC && rand()%100 < sg->skill_lv && battle_config.equipment_breaking)
- pc_breakweapon((struct map_session_data *)bl);
- break;
-
- case 0x99: /* ƒg[ƒL[ƒ{ƒbƒNƒX */
- if(sg->src_id == bl->id) //Ž©•ª‚ª“¥‚ñ‚Å‚à”­“®‚µ‚È‚¢
- break;
- if(sg->val2==0){
- clif_talkiebox(&src->bl,sg->valstr);
- sg->unit_id = 0x8c;
- clif_changelook(&src->bl,LOOK_BASE,sg->unit_id);
- sg->limit=DIFF_TICK(tick,sg->tick)+5000;
- sg->val2=-1; //“¥‚ñ‚¾
- }
- break;
-
- // Basilica
- case 0xb4: /* ƒoƒWƒŠƒJ */
- if (battle_check_target(&src->bl,bl,BCT_ENEMY)>0 &&
- !(status_get_mode(bl)&0x20))
- skill_blown(&src->bl,bl,1);
- if (sg->src_id==bl->id)
- break;
- if (battle_check_target(&src->bl,bl,BCT_NOENEMY)>0 && sc_data && sc_data[type].timer == -1)
- status_change_start(bl,type,sg->skill_lv,(int)src,0,0,
- skill_get_time2(sg->skill_id,sg->skill_lv),0);
- break;
-
- case 0xb7: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
- if(sg->val2==0){
- int moveblock = ( bl->x/BLOCK_SIZE != src->bl.x/BLOCK_SIZE || bl->y/BLOCK_SIZE != src->bl.y/BLOCK_SIZE);
- skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MISC,tick);
- skill_unit_move(bl,tick,0);
- if(moveblock) map_delblock(bl);
- bl->x = src->bl.x;
- bl->y = src->bl.y;
- if(moveblock) map_addblock(bl);
- skill_unit_move(bl,tick,1);
- if(bl->type == BL_MOB)
- clif_fixmobpos((struct mob_data *)bl);
- else if(bl->type == BL_PET)
- clif_fixpetpos((struct pet_data *)bl);
- else
- clif_fixpos(bl);
- sg->limit = DIFF_TICK(tick,sg->tick)+skill_get_time2(sg->skill_id,sg->skill_lv);
- sg->val2=bl->id;
- sg->interval = -1;
- src->range = 0;
- }
- break;
-
-/* default:
- if(battle_config.error_log)
- printf("skill_unit_onplace: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id);
- break;*/
- }
-
- if(bl->type==BL_MOB && ss!=bl) /* ƒXƒLƒ‹Žg—p?Œ‚ÌMOBƒXƒLƒ‹ */
- {
- if(battle_config.mob_changetarget_byskill == 1)
- {
- int target=((struct mob_data *)bl)->target_id;
- if(ss->type == BL_PC)
- ((struct mob_data *)bl)->target_id=ss->id;
- mobskill_use((struct mob_data *)bl,tick,MSC_SKILLUSED|(sg->skill_id<<16));
- ((struct mob_data *)bl)->target_id=target;
- }
- else
- mobskill_use((struct mob_data *)bl,tick,MSC_SKILLUSED|(sg->skill_id<<16));
- }
-
- return 0;
-}
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒg‚©‚ç—£?‚·‚é(‚à‚µ‚­‚Í‚µ‚Ä‚¢‚é)ê‡
- *------------------------------------------
- */
-int skill_unit_onout(struct skill_unit *src,struct block_list *bl,unsigned int tick)
-{
- struct skill_unit_group *sg;
- struct status_change *sc_data;
- int type;
-
- nullpo_retr(0, src);
- nullpo_retr(0, bl);
- nullpo_retr(0, sg=src->group);
- sc_data = status_get_sc_data(bl);
- type = SkillStatusChangeTable[sg->skill_id];
-
- if (bl->prev==NULL || !src->alive ||
- (bl->type == BL_PC && pc_isdead((struct map_session_data *)bl)))
- return 0;
-
- switch(sg->unit_id){
- case 0x7e: /* ƒZƒCƒtƒeƒBƒEƒH[ƒ‹ */
- case 0x85: /* ƒjƒ…[ƒ} */
- case 0x8e: /* ƒNƒ@ƒOƒ}ƒCƒA */
- case 0x9a: /* ƒ{ƒ‹ƒP[ƒm */
- case 0x9b: /* ƒfƒŠƒ…[ƒW */
- case 0x9c: /* ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹ */
- if (type==SC_QUAGMIRE && bl->type==BL_MOB)
- break;
- if (sc_data && sc_data[type].timer!=-1 && sc_data[type].val2==(int)src) {
- status_change_end(bl,type,-1);
- }
- break;
- case 0x91: /* ƒAƒ“ƒNƒ‹ƒXƒlƒA */
- {
- struct block_list *target = map_id2bl(sg->val2);
- if(target && target == bl){
- status_change_end(bl,SC_ANKLE,-1);
- sg->limit=DIFF_TICK(tick,sg->tick)+1000;
- }
- break;
- }
- case 0x9e: /* ŽqŽç‰S */
- case 0x9f: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
- case 0xa0: /* ‰i‰“‚̬“× */
- case 0xa1: /* 푾ŒÛ‚Ì‹¿‚« */
- case 0xa2: /* ƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
- case 0xa3: /* ƒƒL‚Ì‹©‚Ñ */
- case 0xa4: /* [•£‚Ì’†‚É */
- case 0xa5: /* •sŽ€g‚̃W[ƒNƒtƒŠ[ƒh */
- case 0xad: /* Ž„‚ð–Y‚ê‚È‚¢‚Åc */
- if (sc_data[type].timer!=-1 && sc_data[type].val4==(int)src) {
- status_change_end(bl,type,-1);
- }
- break;
-
- case 0xa6: /* •s‹¦˜a‰¹ */
- case 0xa7: /* Œû“J */
- case 0xa8: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
- case 0xa9: /* ƒuƒ‰ƒM‚ÌŽ */
- case 0xaa: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
- case 0xab: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX */
- case 0xac: /* ƒnƒ~ƒ“ƒO */
- case 0xae: /* K‰^‚̃LƒX */
- case 0xaf: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
- if (sg->src_id==bl->id) {
- status_change_end(bl,type,-1);
- break;
- }
- if (sc_data[type].timer!=-1 && sc_data[type].val4==(int)src) {
- sc_data[type].timer = add_timer(20000+tick, status_change_timer, bl->id, type);
- }
- break;
-
- case 0xb4: // Basilica
- if (sc_data[type].timer!=-1 && sc_data[type].val4==(int)sg) {
- status_change_end(bl,type,-1);
- }
- break;
-
- case 0xb6:
- {
- if (sc_data[type].timer!=-1 && sc_data[type].val4==(int)sg) {
- status_change_end(bl,SC_FOGWALL,-1);
- if (sc_data && sc_data[SC_BLIND].timer!=-1)
- sc_data[SC_BLIND].timer = add_timer(
- gettick() + 30000, status_change_timer, bl->id, 0);
- }
- break;
- }
-
- case 0xb7: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
- {
- struct block_list *target = map_id2bl(sg->val2);
- if (target && target==bl)
- status_change_end(bl,SC_SPIDERWEB,-1);
- sg->limit = DIFF_TICK(tick,sg->tick)+1000;
- break;
- }
-
-/* default:
- if(battle_config.error_log)
- printf("skill_unit_onout: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id);
- break;*/
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgŒø‰Ê”­“®/—£’Eˆ—(foreachinarea)
- * bl: ƒ†ƒjƒbƒg(BL_PC/BL_MOB)
- *------------------------------------------
- */
-int skill_unit_effect(struct block_list *bl,va_list ap)
-{
- struct skill_unit *unit;
- struct skill_unit_group *group;
- int flag;
- unsigned int tick;
- static int called = 0;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, unit=va_arg(ap,struct skill_unit*));
- tick = va_arg(ap,unsigned int);
- flag = va_arg(ap,unsigned int);
-
- if (bl->type!=BL_PC && bl->type!=BL_MOB)
- return 0;
-
- if (!unit->alive || bl->prev==NULL)
- return 0;
-
- nullpo_retr(0, group=unit->group);
-
- if (flag)
- skill_unit_onplace(unit,bl,tick);
- else {
- skill_unit_onout(unit,bl,tick);
- unit = map_find_skill_unit_oncell(bl,bl->x,bl->y,group->skill_id,unit);
- if (unit && called == 0) {
- called = 1;
- skill_unit_onplace(unit,bl,tick);
- called = 0;
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒg‚ÌŒÀŠEƒCƒxƒ“ƒg
- *------------------------------------------
- */
-int skill_unit_onlimit(struct skill_unit *src,unsigned int tick)
-{
- struct skill_unit_group *sg;
- nullpo_retr(0, src);
- nullpo_retr(0, sg=src->group);
-
- switch(sg->unit_id){
- case 0x81: /* ƒ?ƒvƒ|?ƒ^ƒ‹(?“®‘O) */
- {
- struct skill_unit_group *group=
- skill_unitsetting(map_id2bl(sg->src_id),sg->skill_id,sg->skill_lv,
- src->bl.x,src->bl.y,1);
- if(group == NULL)
- return 0;
- group->valstr=(char *) aCallocA(24, 1);
- if(group->valstr==NULL){
- printf("skill_unit_onlimit: out of memory !\n");
- exit(1);
- }
- memcpy(group->valstr,sg->valstr,24);
- group->val2=sg->val2;
- }
- break;
-
- case 0x8d: /* ƒAƒCƒXƒEƒH?ƒ‹ */
- map_setcell(src->bl.m,src->bl.x,src->bl.y,src->val2);
- clif_changemapcell(src->bl.m,src->bl.x,src->bl.y,src->val2,1);
- break;
- case 0xb2: /* ‚ ‚È‚½‚É?‚¢‚½‚¢ */
- {
- struct map_session_data *sd = NULL;
- struct map_session_data *p_sd = NULL;
- if((sd = map_id2sd(sg->src_id)) == NULL)
- return 0;
- if((p_sd = pc_get_partner(sd)) == NULL)
- return 0;
-
- pc_setpos(p_sd,map[src->bl.m].name,src->bl.x,src->bl.y,3);
- }
- break;
- }
- return 0;
-}
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒg‚̃_ƒ?ƒWƒCƒxƒ“ƒg
- *------------------------------------------
- */
-int skill_unit_ondamaged(struct skill_unit *src,struct block_list *bl,
- int damage,unsigned int tick)
-{
- struct skill_unit_group *sg;
-
- nullpo_retr(0, src);
- nullpo_retr(0, sg=src->group);
-
- switch(sg->unit_id){
- case 0x8d: /* ƒAƒCƒXƒEƒH?ƒ‹ */
- src->val1-=damage;
- break;
- case 0x8f: /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
- case 0x98: /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
- skill_blown(bl,&src->bl,2); //‚«”ò‚΂µ‚Ä‚Ý‚é
- break;
- default:
- damage = 0;
- break;
- }
- return damage;
-}
-
-
-/*---------------------------------------------------------------------------- */
-
-/*==========================================
- * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹Aꊎw’èj
- *------------------------------------------
- */
-int skill_castend_pos( int tid, unsigned int tick, int id,int data )
-{
- struct map_session_data* sd=map_id2sd(id)/*,*target_sd=NULL*/;
- int range,maxcount;
-
- nullpo_retr(0, sd);
-
- if( sd->bl.prev == NULL )
- return 0;
- if( sd->skilltimer != tid ) /* ƒ^ƒCƒ}ID‚ÌŠm”F */
- return 0;
- if(sd->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST) > 0) {
- sd->speed = sd->prev_speed;
- clif_updatestatus(sd,SP_SPEED);
- }
- sd->skilltimer=-1;
- if(pc_isdead(sd)) {
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
-
- /*case MG_SAFETYWALL:
- case WZ_FIREPILLAR:
- case HT_SKIDTRAP:
- case HT_LANDMINE:
- case HT_ANKLESNARE:
- case HT_SHOCKWAVE:
- case HT_SANDMAN:
- case HT_FLASHER:
- case HT_FREEZINGTRAP:
- case HT_BLASTMINE:
- case HT_CLAYMORETRAP:
- case HT_TALKIEBOX:
- case AL_WARP:
- case PF_SPIDERWEB:
- case RG_GRAFFITI:
- range = 0;
- break;
- case AL_PNEUMA:
- range = 1;
- break;*/
- if (!battle_config.pc_skill_reiteration &&
- skill_get_unit_flag(sd->skillid)&UF_NOREITERATION &&
- skill_check_unit_range(sd->bl.m,sd->skillx,sd->skilly,sd->skillid,sd->skilllv)) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- /*case WZ_FIREPILLAR:
- case HT_SKIDTRAP:
- case HT_LANDMINE:
- case HT_ANKLESNARE:
- case HT_SHOCKWAVE:
- case HT_SANDMAN:
- case HT_FLASHER:
- case HT_FREEZINGTRAP:
- case HT_BLASTMINE:
- case HT_CLAYMORETRAP:
- case HT_TALKIEBOX:
- case PF_SPIDERWEB:
- case WZ_ICEWALL:
- range = 2;
- break;
- case AL_WARP:
- range = 0;
- break;*/
- if (battle_config.pc_skill_nofootset &&
- skill_get_unit_flag(sd->skillid)&UF_NOFOOTSET &&
- skill_check_unit_range2(&sd->bl,sd->bl.m,sd->skillx,sd->skilly,sd->skillid,sd->skilllv)) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- if(battle_config.pc_land_skill_limit) {
- maxcount = skill_get_maxcount(sd->skillid);
- if(maxcount > 0) {
- int i,c;
- for(i=c=0;i<MAX_SKILLUNITGROUP;i++) {
- if(sd->skillunit[i].alive_count > 0 && sd->skillunit[i].skill_id == sd->skillid)
- c++;
- }
- if(c >= maxcount) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- }
- }
-
- if(sd->skilllv <= 0) return 0;
- range = skill_get_range(sd->skillid,sd->skilllv);
- if(range < 0)
- range = status_get_range(&sd->bl) - (range + 1);
- range += battle_config.pc_skill_add_range;
- if(battle_config.skill_out_range_consume) { // changed to allow casting when target walks out of range [Valaris]
- if(range < distance(sd->bl.x,sd->bl.y,sd->skillx,sd->skilly)) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- }
- if(!skill_check_condition(sd,1)) { /* Žg—p?Œƒ`ƒFƒbƒN */
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- sd->skillitem = sd->skillitemlv = -1;
- if(battle_config.skill_out_range_consume) {
- if(range < distance(sd->bl.x,sd->bl.y,sd->skillx,sd->skilly)) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- return 0;
- }
- }
-
- if(battle_config.pc_skill_log)
- printf("PC %d skill castend skill=%d\n",sd->bl.id,sd->skillid);
- pc_stop_walking(sd,0);
-
- skill_castend_pos2(&sd->bl,sd->skillx,sd->skilly,sd->skillid,sd->skilllv,tick,0);
-
- return 0;
-}
-
-/*==========================================
- * ”Í??ƒLƒƒƒ‰‘¶ÝŠm”F”»’è?—(foreachinarea)
- *------------------------------------------
- */
-
-static int skill_check_condition_char_sub(struct block_list *bl,va_list ap)
-{
- int *c;
- struct block_list *src;
- struct map_session_data *sd;
- struct map_session_data *ssd;
- struct pc_base_job s_class;
- struct pc_base_job ss_class;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, sd=(struct map_session_data*)bl);
- nullpo_retr(0, src=va_arg(ap,struct block_list *));
- nullpo_retr(0, c=va_arg(ap,int *));
- nullpo_retr(0, ssd=(struct map_session_data*)src);
-
- s_class = pc_calc_base_job(sd->status.class_);
- //ƒ`ƒFƒbƒN‚µ‚È‚¢Ý’è‚È‚çc‚É‚ ‚肦‚È‚¢‘å‚«‚È?Žš‚ð•Ô‚µ‚ÄI—¹
- if(!battle_config.player_skill_partner_check){ //–{?‚Íforeach‚Ì‘O‚É‚â‚肽‚¢‚¯‚ÇÝ’è“K—p‰ÓŠ‚ð‚܂Ƃ߂邽‚ß‚É‚±‚±‚Ö
- (*c)=99;
- return 0;
- }
-
- ss_class = pc_calc_base_job(ssd->status.class_);
-
- switch(ssd->skillid){
- case PR_BENEDICTIO: /* ¹?~•Ÿ */
- if(sd != ssd && (s_class.job == 4 || s_class.job == 8 || s_class.job == 15) &&
- (sd->bl.x == ssd->bl.x - 1 || sd->bl.x == ssd->bl.x + 1) && sd->status.sp >= 10)
- (*c)++;
- break;
- case BD_LULLABY: /* ŽqŽç‰Ì */
- case BD_RICHMANKIM: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
- case BD_ETERNALCHAOS: /* ‰i‰“‚̬“× */
- case BD_DRUMBATTLEFIELD: /* ?‘¾ŒÛ‚Ì‹¿‚« */
- case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
- case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
- case BD_INTOABYSS: /* [•£‚Ì’†‚É */
- case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
- case BD_RAGNAROK: /* _?‚Ì?¨ */
- case CG_MOONLIT: /* ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç */
- if(sd != ssd &&
- ((ss_class.job==19 && s_class.job==20) ||
- (ss_class.job==20 && s_class.job==19)) &&
- pc_checkskill(sd,ssd->skillid) > 0 &&
- (*c)==0 &&
- sd->status.party_id == ssd->status.party_id &&
- !pc_issit(sd) &&
- sd->sc_data[SC_DANCING].timer==-1
- )
- (*c)=pc_checkskill(sd,ssd->skillid);
- break;
- }
- return 0;
-}
-/*==========================================
- * ”Í??ƒLƒƒƒ‰‘¶ÝŠm”F”»’èŒãƒXƒLƒ‹Žg—p?—(foreachinarea)
- *------------------------------------------
- */
-
-static int skill_check_condition_use_sub(struct block_list *bl,va_list ap)
-{
- int *c;
- struct block_list *src;
- struct map_session_data *sd;
- struct map_session_data *ssd;
- struct pc_base_job s_class;
- struct pc_base_job ss_class;
- int skillid,skilllv;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, sd=(struct map_session_data*)bl);
- nullpo_retr(0, src=va_arg(ap,struct block_list *));
- nullpo_retr(0, c=va_arg(ap,int *));
- nullpo_retr(0, ssd=(struct map_session_data*)src);
-
- s_class = pc_calc_base_job(sd->status.class_);
-
- //ƒ`ƒFƒbƒN‚µ‚È‚¢Ý’è‚È‚çc‚É‚ ‚肦‚È‚¢‘å‚«‚È?Žš‚ð•Ô‚µ‚ÄI—¹
- if(!battle_config.player_skill_partner_check){ //–{?‚Íforeach‚Ì‘O‚É‚â‚肽‚¢‚¯‚ÇÝ’è“K—p‰ÓŠ‚ð‚܂Ƃ߂邽‚ß‚É‚±‚±‚Ö
- (*c)=99;
- return 0;
- }
-
- ss_class = pc_calc_base_job(ssd->status.class_);
- skillid=ssd->skillid;
- skilllv=ssd->skilllv;
- //if(skilllv <= 0) return 0;
- if(skillid > 0 && skilllv <= 0) return 0; // celest
- switch(skillid){
- case PR_BENEDICTIO: /* ¹?~•Ÿ */
- if(sd != ssd && (s_class.job == 4 || s_class.job == 8 || s_class.job == 15) &&
- (sd->bl.x == ssd->bl.x - 1 || sd->bl.x == ssd->bl.x + 1) && sd->status.sp >= 10){
- sd->status.sp -= 10;
- status_calc_pc(sd,0);
- (*c)++;
- }
- break;
- case BD_LULLABY: /* ŽqŽç‰Ì */
- case BD_RICHMANKIM: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
- case BD_ETERNALCHAOS: /* ‰i‰“‚̬“× */
- case BD_DRUMBATTLEFIELD: /* ?‘¾ŒÛ‚Ì‹¿‚« */
- case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
- case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
- case BD_INTOABYSS: /* [•£‚Ì’†‚É */
- case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
- case BD_RAGNAROK: /* _?‚Ì?¨ */
- case CG_MOONLIT: /* ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç */
- if(sd != ssd && //–{lˆÈŠO‚Å
- ((ss_class.job==19 && s_class.job==20) || //Ž©•ª‚ªƒo?ƒh‚È‚çƒ_ƒ“ƒT?‚Å
- (ss_class.job==20 && s_class.job==19)) && //Ž©•ª‚ªƒ_ƒ“ƒT?‚È‚çƒo?ƒh‚Å
- pc_checkskill(sd,skillid) > 0 && //ƒXƒLƒ‹‚ðŽ‚Á‚Ä‚¢‚Ä
- (*c)==0 && //ʼn‚̈êl‚Å
- sd->status.party_id == ssd->status.party_id && //ƒp?ƒeƒB?‚ª“¯‚¶‚Å
- !pc_issit(sd) && //À‚Á‚Ä‚È‚¢
- sd->sc_data[SC_DANCING].timer==-1 //ƒ_ƒ“ƒX’†‚¶‚á‚È‚¢
- ){
- ssd->sc_data[SC_DANCING].val4=bl->id;
- clif_skill_nodamage(bl,src,skillid,skilllv,1);
- status_change_start(bl,SC_DANCING,skillid,ssd->sc_data[SC_DANCING].val2,0,src->id,skill_get_time(skillid,skilllv)+1000,0);
- sd->skillid_dance=sd->skillid=skillid;
- sd->skilllv_dance=sd->skilllv=skilllv;
- (*c)++;
- }
- break;
- }
- return 0;
-}
-/*==========================================
- * ”Í??ƒoƒCƒIƒvƒ‰ƒ“ƒgAƒXƒtƒBƒAƒ}ƒCƒ“—pMob‘¶ÝŠm”F”»’è?—(foreachinarea)
- *------------------------------------------
- */
-
-static int skill_check_condition_mob_master_sub(struct block_list *bl,va_list ap)
-{
- int *c,src_id=0,mob_class=0;
- struct mob_data *md;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, md=(struct mob_data*)bl);
- nullpo_retr(0, src_id=va_arg(ap,int));
- nullpo_retr(0, mob_class=va_arg(ap,int));
- nullpo_retr(0, c=va_arg(ap,int *));
-
- if(md->class_==mob_class && md->master_id==src_id)
- (*c)++;
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹Žg—p?Œi?‚ÅŽg—pŽ¸”sj
- *------------------------------------------
- */
-int skill_check_condition(struct map_session_data *sd,int type)
-{
- int i,hp,sp,hp_rate,sp_rate,zeny,weapon,state,spiritball,skill,lv,mhp;
- int index[10],itemid[10],amount[10];
- int arrow_flag = 0;
-
- nullpo_retr(0, sd);
-
- if( battle_config.gm_skilluncond>0 && pc_isGM(sd)>= battle_config.gm_skilluncond ) {
- sd->skillitem = sd->skillitemlv = -1;
- return 1;
- }
-
- if( sd->opt1>0) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- if(pc_is90overweight(sd)) {
- clif_skill_fail(sd,sd->skillid,9,0);
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
-
- if(sd->skillid == AC_MAKINGARROW && sd->state.make_arrow_flag == 1) {
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- if((sd->skillid == AM_PHARMACY || sd->skillid == ASC_CDP)
- && sd->state.produce_flag == 1) {
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
-
- if(sd->skillitem == sd->skillid) { /* ƒAƒCƒeƒ€‚Ìꇖ³?Œ¬Œ÷ */
- if(type&1)
- sd->skillitem = sd->skillitemlv = -1;
- return 1;
- }
- if( sd->opt1>0 ){
- clif_skill_fail(sd,sd->skillid,0,0);
- return 0;
- }
- if(sd->sc_count){
- if( sd->sc_data[SC_DIVINA].timer!=-1 ||
- sd->sc_data[SC_ROKISWEIL].timer!=-1 ||
- (sd->sc_data[SC_AUTOCOUNTER].timer != -1 && sd->skillid != KN_AUTOCOUNTER) ||
- sd->sc_data[SC_STEELBODY].timer != -1 ||
- sd->sc_data[SC_BERSERK].timer != -1 ||
- (sd->sc_data[SC_MARIONETTE].timer != -1 && sd->skillid != CG_MARIONETTE)){
- clif_skill_fail(sd,sd->skillid,0,0);
- return 0; /* ?‘ÔˆÙí‚â’¾?‚È‚Ç */
- }
- }
- skill = sd->skillid;
- lv = sd->skilllv;
- if(lv <= 0) return 0;
- // for the guild skills [celest]
- if (skill >= 10000 && skill < 10015) skill-= 9500;
- hp=skill_get_hp(skill, lv); /* Á”ïHP */
- sp=skill_get_sp(skill, lv); /* Á”ïSP */
- if((sd->skillid_old == BD_ENCORE) && skill==sd->skillid_dance)
- sp=sp/2; //ƒAƒ“ƒR?ƒ‹Žž‚ÍSPÁ””¼•ª
- hp_rate = (lv <= 0)? 0:skill_db[skill].hp_rate[lv-1];
- sp_rate = (lv <= 0)? 0:skill_db[skill].sp_rate[lv-1];
- zeny = skill_get_zeny(skill,lv);
- weapon = skill_db[skill].weapon;
- state = skill_db[skill].state;
- spiritball = (lv <= 0)? 0:skill_db[skill].spiritball[lv-1];
- mhp=skill_get_mhp(skill, lv); /* Á”ïHP */
- for(i=0;i<10;i++) {
- itemid[i] = skill_db[skill].itemid[i];
- amount[i] = skill_db[skill].amount[i];
- }
- if(mhp > 0)
- hp += (sd->status.max_hp * mhp)/100;
- if(hp_rate > 0)
- hp += (sd->status.hp * hp_rate)/100;
- else
- hp += (sd->status.max_hp * abs(hp_rate))/100;
- if(sp_rate > 0)
- sp += (sd->status.sp * sp_rate)/100;
- else
- sp += (sd->status.max_sp * abs(sp_rate))/100;
- if(sd->dsprate!=100)
- sp=sp*sd->dsprate/100; /* Á”ïSPC³ */
-
- switch(skill) {
- case SA_CASTCANCEL:
- if(sd->skilltimer == -1) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case BS_MAXIMIZE: /* ƒ}ƒLƒVƒ}ƒCƒYƒpƒ? */
- case NV_TRICKDEAD: /* Ž€‚ñ‚¾‚Ó‚è */
- case TF_HIDING: /* ƒnƒCƒfƒBƒ“ƒO */
- case AS_CLOAKING: /* ƒNƒ?ƒLƒ“ƒO */
- case CR_AUTOGUARD: /* ƒI?ƒgƒK?ƒh */
- case CR_DEFENDER: /* ƒfƒBƒtƒFƒ“ƒ_? */
- case ST_CHASEWALK:
- if(sd->sc_data[SkillStatusChangeTable[skill]].timer!=-1)
- return 1; /* ‰ðœ‚·‚éꇂÍSPÁ”‚È‚¢ */
- break;
- case AL_TELEPORT:
- case AL_WARP:
- if(map[sd->bl.m].flag.noteleport) {
- clif_skill_teleportmessage(sd,0);
- return 0;
- }
- break;
- case MO_CALLSPIRITS: /* ?Œ÷ */
- if(sd->spiritball >= lv) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case CH_SOULCOLLECT: /* ‹¶?Œ÷ */
- if(sd->spiritball >= 5) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case MO_FINGEROFFENSIVE: //Žw?
- if (sd->spiritball > 0 && sd->spiritball < spiritball) {
- spiritball = sd->spiritball;
- sd->spiritball_old = sd->spiritball;
- }
- else sd->spiritball_old = lv;
- break;
- case MO_BODYRELOCATION:
- if (sd->sc_count && sd->sc_data[SC_EXPLOSIONSPIRITS].timer!=-1)
- spiritball = 0;
- break;
- case MO_CHAINCOMBO: //˜A‘Ŷ
- if(sd->sc_data[SC_BLADESTOP].timer==-1){
- if(sd->sc_data[SC_COMBO].timer == -1 || sd->sc_data[SC_COMBO].val1 != MO_TRIPLEATTACK)
- return 0;
- }
- break;
- case MO_COMBOFINISH: //–Ò—´Œ
- if(sd->sc_data[SC_COMBO].timer == -1 || sd->sc_data[SC_COMBO].val1 != MO_CHAINCOMBO)
- return 0;
- break;
- case CH_TIGERFIST: //•šŒÕŒ
- if((sd->sc_data[SC_COMBO].timer == -1 || sd->sc_data[SC_COMBO].val1 != MO_COMBOFINISH) && !sd->state.skill_flag)
- return 0;
- break;
- case CH_CHAINCRUSH: //˜A’Œ•ö?
- if(sd->sc_data[SC_COMBO].timer == -1)
- return 0;
- if(sd->sc_data[SC_COMBO].val1 != MO_COMBOFINISH && sd->sc_data[SC_COMBO].val1 != CH_TIGERFIST)
- return 0;
- break;
- case MO_EXTREMITYFIST: // ˆ¢C—…”e–PŒ
- if((sd->sc_data[SC_COMBO].timer != -1 && (sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH || sd->sc_data[SC_COMBO].val1 == CH_CHAINCRUSH)) || sd->sc_data[SC_BLADESTOP].timer!=-1)
- spiritball--;
- break;
- case BD_ADAPTATION: /* ƒAƒhƒŠƒu */
- {
- struct skill_unit_group *group=NULL;
- if(sd->sc_data[SC_DANCING].timer==-1 || ((group=(struct skill_unit_group*)sd->sc_data[SC_DANCING].val2) && (skill_get_time(sd->sc_data[SC_DANCING].val1,group->skill_lv) - sd->sc_data[SC_DANCING].val3*1000) <= skill_get_time2(skill,lv))){ //ƒ_ƒ“ƒX’†‚ÅŽg—pŒã5•bˆÈã‚Ì‚ÝH
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- }
- break;
- case PR_BENEDICTIO: /* ¹?~•Ÿ */
- {
- int range=1;
- int c=0;
- if(!(type&1)){
- map_foreachinarea(skill_check_condition_char_sub,sd->bl.m,
- sd->bl.x-range,sd->bl.y-range,
- sd->bl.x+range,sd->bl.y+range,BL_PC,&sd->bl,&c);
- if(c<2){
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- }else{
- map_foreachinarea(skill_check_condition_use_sub,sd->bl.m,
- sd->bl.x-range,sd->bl.y-range,
- sd->bl.x+range,sd->bl.y+range,BL_PC,&sd->bl,&c);
- }
- }
- break;
- case WE_CALLPARTNER: /* ‚ ‚È‚½‚Ɉ§‚¢‚½‚¢ */
- if(!sd->status.partner_id){
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case AM_CANNIBALIZE: /* ƒoƒCƒIƒvƒ‰ƒ“ƒg */
- case AM_SPHEREMINE: /* ƒXƒtƒBƒA?ƒ}ƒCƒ“ */
- if(type&1){
- int c=0;
- int summons[5] = { 1020, 1068, 1118, 1500, 1368 };
- int maxcount = (skill==AM_CANNIBALIZE)? 6-lv : skill_get_maxcount(skill);
- int mob_class = (skill==AM_CANNIBALIZE)? summons[lv-1] :1142;
- if(battle_config.pc_land_skill_limit && maxcount>0) {
- map_foreachinarea(skill_check_condition_mob_master_sub ,sd->bl.m, 0, 0, map[sd->bl.m].xs, map[sd->bl.m].ys, BL_MOB, sd->bl.id, mob_class,&c );
- if(c >= maxcount){
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- }
- }
- break;
- case MG_FIREWALL: /* ƒtƒ@ƒCƒA?ƒEƒH?ƒ‹ */
- case WZ_QUAGMIRE:
- case WZ_FIREPILLAR: // celest
- case PF_FOGWALL:
- /* ?§ŒÀ */
- if(battle_config.pc_land_skill_limit) {
- int maxcount = skill_get_maxcount(skill);
- if(maxcount > 0) {
- int i,c;
- for(i=c=0;i<MAX_SKILLUNITGROUP;i++) {
- if(sd->skillunit[i].alive_count > 0 && sd->skillunit[i].skill_id == skill)
- c++;
- }
- if(c >= maxcount) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- }
- }
- break;
- // skills require arrows as of 12/07 [celest]
- case AC_DOUBLE:
- case AC_SHOWER:
- case AC_CHARGEARROW:
- case BA_MUSICALSTRIKE:
- case DC_THROWARROW:
- case SN_SHARPSHOOTING:
- case CG_ARROWVULCAN:
- if(sd->equip_index[10] < 0) {
- clif_arrow_fail(sd,0);
- return 0;
- }
- arrow_flag = 1;
- break;
- case RG_BACKSTAP:
- if(sd->status.weapon == 11) {
- if (sd->equip_index[10] < 0) {
- clif_arrow_fail(sd,0);
- return 0;
- }
- arrow_flag = 1;
- }
- break;
- }
-
- if(!(type&2)){
- if( hp>0 && sd->status.hp < hp) { /* HPƒ`ƒFƒbƒN */
- clif_skill_fail(sd,skill,2,0); /* HP•s‘«FŽ¸”s’Ê’m */
- return 0;
- }
- if( sp>0 && sd->status.sp < sp) { /* SPƒ`ƒFƒbƒN */
- clif_skill_fail(sd,skill,1,0); /* SP•s‘«FŽ¸”s’Ê’m */
- return 0;
- }
- if( zeny>0 && sd->status.zeny < zeny) {
- clif_skill_fail(sd,skill,5,0);
- return 0;
- }
- if(!(weapon & (1<<sd->status.weapon) ) ) {
- clif_skill_fail(sd,skill,6,0);
- return 0;
- }
- if( spiritball > 0 && sd->spiritball < spiritball) {
- clif_skill_fail(sd,skill,0,0); // Ÿ†‹…•s‘«
- return 0;
- }
- }
-
- switch(state) {
- case ST_HIDING:
- if(!(sd->status.option&2)) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case ST_CLOAKING:
- if(!(sd->status.option&4)) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case ST_HIDDEN:
- if(!pc_ishiding(sd)) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case ST_RIDING:
- if(!pc_isriding(sd)) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case ST_FALCON:
- if(!pc_isfalcon(sd)) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case ST_CART:
- if(!pc_iscarton(sd)) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case ST_SHIELD:
- if(sd->status.shield <= 0) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case ST_SIGHT:
- if(sd->sc_data[SC_SIGHT].timer == -1 && type&1) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case ST_EXPLOSIONSPIRITS:
- if (skill == MO_EXTREMITYFIST && ((sd->sc_data[SC_COMBO].timer != -1 && (sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH || sd->sc_data[SC_COMBO].val1 == CH_CHAINCRUSH)) || sd->sc_data[SC_BLADESTOP].timer!=-1)) {
- break;
- }
- if(sd->sc_data[SC_EXPLOSIONSPIRITS].timer == -1) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case ST_RECOV_WEIGHT_RATE:
- if(battle_config.natural_heal_weight_rate <= 100 && sd->weight*100/sd->max_weight >= battle_config.natural_heal_weight_rate) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case ST_MOVE_ENABLE:
- {
- struct walkpath_data wpd;
- if(path_search(&wpd,sd->bl.m,sd->bl.x,sd->bl.y,sd->skillx,sd->skilly,1)==-1) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- }
- break;
- case ST_WATER:
- if((!map_getcell(sd->bl.m,sd->bl.x,sd->bl.y,CELL_CHKWATER))&& (sd->sc_data[SC_DELUGE].timer==-1)){ //…ê”»’è
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- }
-
- for(i=0;i<10;i++) {
- int x = lv%11 - 1;
- index[i] = -1;
- if(itemid[i] <= 0)
- continue;
- if(itemid[i] >= 715 && itemid[i] <= 717 && sd->special_state.no_gemstone)
- continue;
- if(((itemid[i] >= 715 && itemid[i] <= 717) || itemid[i] == 1065) && sd->sc_data[SC_INTOABYSS].timer != -1)
- continue;
- if(skill == WZ_FIREPILLAR && lv<=5)
- continue; // no gemstones for 1-5 [Celest]
- if((skill == AM_POTIONPITCHER ||
- skill == CR_SLIMPITCHER) && i != x)
- continue;
-
- index[i] = pc_search_inventory(sd,itemid[i]);
- if(index[i] < 0 || sd->status.inventory[index[i]].amount < amount[i]) {
- if(itemid[i] == 716 || itemid[i] == 717)
- clif_skill_fail(sd,skill,(7+(itemid[i]-716)),0);
- else
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- }
-
- if(!(type&1))
- return 1;
-
- if(skill != AM_POTIONPITCHER &&
- skill != CR_SLIMPITCHER &&
- skill != MG_STONECURSE) {
- if(skill == AL_WARP && !(type&2))
- return 1;
- for(i=0;i<10;i++) {
- if(index[i] >= 0)
- pc_delitem(sd,index[i],amount[i],0); // ƒAƒCƒeƒ€Á”ï
- }
- if (arrow_flag && battle_config.arrow_decrement)
- pc_delitem(sd,sd->equip_index[10],1,0);
- }
-
- if(type&2)
- return 1;
-
- if(sp > 0) { // SPÁ”ï
- sd->status.sp-=sp;
- clif_updatestatus(sd,SP_SP);
- }
- if(hp > 0) { // HPÁ”ï
- sd->status.hp-=hp;
- clif_updatestatus(sd,SP_HP);
- }
- if(zeny > 0) // ZenyÁ”ï
- pc_payzeny(sd,zeny);
- if(spiritball > 0) // Ÿ†‹…Á”ï
- pc_delspiritball(sd,spiritball,0);
-
-
- return 1;
-}
-
-/*==========================================
- * ‰r¥ŽžŠÔŒvŽZ
- *------------------------------------------
- */
-int skill_castfix( struct block_list *bl, int time )
-{
- struct map_session_data *sd = NULL;
- struct mob_data *md; // [Valaris]
- struct status_change *sc_data;
- int castrate=100;
- int skill,lv;
-
- nullpo_retr(0, bl);
-
- if(bl->type==BL_MOB){ // Crash fix [Valaris]
- nullpo_retr(0, md=(struct mob_data*)bl);
- skill = md->skillid;
- lv = md->skilllv;
- } else {
- nullpo_retr(0, sd=(struct map_session_data*)bl);
- skill = sd->skillid;
- lv = sd->skilllv;
- }
-
- if(lv <= 0) return 0;
-
- sc_data = status_get_sc_data(bl);
-
- if (skill > MAX_SKILL_DB || skill < 0)
- return 0;
-
- /* ƒTƒtƒ‰ƒMƒEƒ€ */
- if(sc_data && sc_data[SC_SUFFRAGIUM].timer!=-1 )
- time=time*(100-sc_data[SC_SUFFRAGIUM].val1*15)/100;
- status_change_end( bl, SC_SUFFRAGIUM, -1);
-
- if(time==0)
- return 0;
- if (sd) {
- if(!skill_get_castnodex(skill, lv) > 0) {
- castrate=((struct map_session_data *)bl)->castrate;
- time=time*castrate*(battle_config.castrate_dex_scale - status_get_dex(bl))/(battle_config.castrate_dex_scale * 100);
- time=time*battle_config.cast_rate/100;
- }
- }
-
- /* ƒuƒ‰ƒM‚ÌŽ */
- if(sc_data && sc_data[SC_POEMBRAGI].timer!=-1)
- time=time*(100-(sc_data[SC_POEMBRAGI].val1*3+sc_data[SC_POEMBRAGI].val2
- +(sc_data[SC_POEMBRAGI].val3>>16)))/100;
-
- return (time>0)?time:0;
-}
-/*==========================================
- * ƒfƒBƒŒƒCŒvŽZ
- *------------------------------------------
- */
-int skill_delayfix( struct block_list *bl, int time )
-{
- struct status_change *sc_data;
- struct map_session_data *sd = NULL;
- int skill = 0,lv = 0;
- int delayrate = 100;
-
- nullpo_retr(0, bl);
-
- if(bl->type == BL_PC){
- nullpo_retr(0, sd = (struct map_session_data*)bl);
- skill = sd->skillid;
- lv = sd->skilllv;
- }
-
- if(lv <= 0) return 0;
-
- sc_data = status_get_sc_data(bl);
-
- if(sd) {
- delayrate = sd->delayrate;
-
- // instant cast attack skills depend on aspd as delay [celest]
- if (time == 0) {
- if (skill_db[skill].skill_type == BF_WEAPON)
- time = status_get_adelay (bl)/2;
- else
- time = 300; // default delay, according to official servers
- } else if (time < 0)
- time = abs(time) + status_get_adelay (bl)/2; // if set to <0, the aspd delay will be added
-
- if(battle_config.delay_dependon_dex && /* dex‚̉e‹¿‚ðŒvŽZ‚·‚é */
- !skill_get_delaynodex(skill, lv)) // if skill casttime is allowed to be reduced by dex
- time = time * (battle_config.castrate_dex_scale - status_get_dex(bl)) / (battle_config.castrate_dex_scale);
-
- time = time * delayrate * battle_config.delay_rate / 10000;
-
- if (time < battle_config.min_skill_delay_limit) // check minimum skill delay
- time = battle_config.min_skill_delay_limit;
- }
-
- /* ƒuƒ‰ƒM‚ÌŽ */
- if(sc_data && sc_data[SC_POEMBRAGI].timer != -1 )
- time = time * (100 - (sc_data[SC_POEMBRAGI].val1 * 3 + sc_data[SC_POEMBRAGI].val2
- + (sc_data[SC_POEMBRAGI].val3 & 0xffff))) / 100;
-
- return (time>0)?time:0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹Žg—piIDŽw’èj
- *------------------------------------------
- */
-int skill_use_id (struct map_session_data *sd, int target_id, int skill_num, int skill_lv)
-{
- int casttime = 0, delay = 0, skill, range;
- struct map_session_data* tsd = NULL;
- struct block_list *bl = NULL;
- struct status_change *sc_data;
- int forcecast = 0;
- unsigned int tick = gettick();
-
- nullpo_retr(0, sd);
-
- if ((bl = map_id2bl(target_id)) == NULL)
- return 0;
- if (bl->type == BL_PC) {
- nullpo_retr(0, tsd = (struct map_session_data*)bl);
- }
- if(sd->bl.m != bl->m || pc_isdead(sd))
- return 0;
- if(skillnotok(skill_num, sd)) // [MouseJstr]
- return 0;
- if (tsd && skill_num == ALL_RESURRECTION && !pc_isdead(tsd))
- return 0;
-
- sc_data = sd->sc_data;
-
- /* ’¾?‚âˆÙíi‚½‚¾‚µAƒOƒŠƒ€‚È‚Ç‚Ì”»’è‚ð‚·‚éj */
- if (sd->opt1 > 0)
- return 0;
- if (sc_data) {
- // allow to use only Chasewalk [celest]
- if (sc_data[SC_CHASEWALK].timer != -1 && skill_num != ST_CHASEWALK)
- return 0;
- if (sc_data[SC_VOLCANO].timer != -1 && skill_num == WZ_ICEWALL)
- return 0;
- if (sc_data[SC_ROKISWEIL].timer != -1 && skill_num == BD_ADAPTATION)
- return 0;
- if (sc_data[SC_DIVINA].timer != -1 ||
- sc_data[SC_ROKISWEIL].timer != -1 ||
- (sc_data[SC_AUTOCOUNTER].timer != -1 && sd->skillid != KN_AUTOCOUNTER) ||
- sc_data[SC_STEELBODY].timer != -1 ||
- sc_data[SC_BERSERK].timer != -1 ||
- (sc_data[SC_MARIONETTE].timer != -1 && sd->skillid != CG_MARIONETTE))
- return 0; /* ?‘ÔˆÙí‚â’¾?‚È‚Ç */
- if (sc_data[SC_BLADESTOP].timer != -1) {
- if (sc_data[SC_BLADESTOP].val2 == 1) return 0;//”’‰H‚³‚ꂽ‘¤‚Ȃ̂Ń_ƒ
- switch (sc_data[SC_BLADESTOP].val1) {
- case 1: return 0;
- case 2: if (skill_num != MO_FINGEROFFENSIVE) return 0; else break;
- case 3: if (skill_num != MO_FINGEROFFENSIVE && skill_num != MO_INVESTIGATE) return 0; else break;
- case 4: if (skill_num != MO_FINGEROFFENSIVE && skill_num != MO_INVESTIGATE && skill_num != MO_CHAINCOMBO) return 0; else break;
- case 5: if (skill_num != MO_FINGEROFFENSIVE && skill_num != MO_INVESTIGATE && skill_num != MO_CHAINCOMBO && skill_num!=MO_EXTREMITYFIST) return 0; else break;
- }
- }
- if (sc_data[SC_BASILICA].timer != -1) { // Disallow all other skills in Basilica [celest]
- struct skill_unit_group *sg = (struct skill_unit_group *)sc_data[SC_BASILICA].val4;
- // if caster is the owner of basilica
- if (sg && sg->src_id == sd->bl.id &&
- skill_num == HP_BASILICA) ; // do nothing
- // otherwise...
- else return 0;
- }
- /* ‰‰‘t/ƒ_ƒ“ƒX’† */
- if (sc_data[SC_DANCING].timer != -1) {
- if (sc_data[SC_DANCING].val4 && skill_num != BD_ADAPTATION) //‡‘t’†‚̓AƒhƒŠƒuˆÈŠO•s‰Â
- return 0;
- if (skill_num != BD_ADAPTATION && skill_num != BA_MUSICALSTRIKE && skill_num != DC_THROWARROW)
- return 0;
- }
- }
-
- if (sd->status.option & 4 && skill_num == TF_HIDING)
- return 0;
- if (sd->status.option & 2 && skill_num != TF_HIDING && skill_num != AS_GRIMTOOTH && skill_num != RG_BACKSTAP && skill_num != RG_RAID)
- return 0;
- if(skill_get_inf2(skill_num) & 0x200 && sd->bl.id == target_id)
- return 0;
-
- //’¼‘O‚̃XƒLƒ‹‚ª‰½‚©?‚¦‚é•K—v‚Ì‚ ‚éƒXƒLƒ‹
- switch (skill_num) {
- case SA_CASTCANCEL:
- if (sd->skillid != skill_num){ //ƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹Ž©?‚Í?‚¦‚È‚¢
- sd->skillid_old = sd->skillid;
- sd->skilllv_old = sd->skilllv;
- break;
- }
-
- case BD_ENCORE: /* ƒAƒ“ƒR?ƒ‹ */
- if (!sd->skillid_dance) { //‘O‰ñŽg—p‚µ‚½—x‚肪‚È‚¢‚Æ‚¾‚ß
- clif_skill_fail(sd,skill_num,0,0);
- return 0;
- } else {
- sd->skillid_old = skill_num;
- }
- break;
-
- case GD_BATTLEORDER:
- case GD_REGENERATION:
- case GD_RESTORE:
- case GD_EMERGENCYCALL:
- {
- struct guild *g;
- if (!sd->status.guild_id)
- return 0;
- if ((g = guild_search(sd->status.guild_id)) == NULL)
- return 0;
- if (strcmp(sd->status.name,g->master))
- return 0;
- skill_lv = guild_checkskill(g, skill_num);
- if (skill_lv <= 0) return 0;
- }
- break;
-
- case BD_LULLABY: /* ŽqŽç‰Ì */
- case BD_RICHMANKIM: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
- case BD_ETERNALCHAOS: /* ‰i‰“‚̬“× */
- case BD_DRUMBATTLEFIELD: /* ?‘¾ŒÛ‚Ì‹¿‚« */
- case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
- case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
- case BD_INTOABYSS: /* [•£‚Ì’†‚É */
- case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
- case BD_RAGNAROK: /* _?‚Ì?¨ */
- case CG_MOONLIT: /* ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç */
- {
- int range = 1;
- int c = 0;
- map_foreachinarea (skill_check_condition_char_sub, sd->bl.m,
- sd->bl.x-range, sd->bl.y-range,
- sd->bl.x+range, sd->bl.y+range, BL_PC, &sd->bl, &c);
- if (c < 1) {
- clif_skill_fail(sd,skill_num,0,0);
- return 0;
- } else if (c == 99) { //‘Š•û•s—vݒ肾‚Á‚½
- ;
- } else {
- sd->skilllv = (c + skill_lv)/2;
- }
- }
- break;
- }
-
- sd->skillid = skill_num;
- sd->skilllv = skill_lv;
- if (!skill_check_condition(sd,0)) return 0;
-
- {
- int check_range_flag = 0;
-
- /* ŽË’ö‚ÆáŠQ•¨ƒ`ƒFƒbƒN */
- range = skill_get_range(skill_num,skill_lv);
- if(range < 0)
- range = status_get_range(&sd->bl) - (range + 1);
- // be lenient if the skill was cast before we have moved to the correct position [Celest]
- if (sd->walktimer != -1)
- range++;
- else check_range_flag = 1;
- if(!battle_check_range(&sd->bl,bl,range)) {
- if (check_range_flag && battle_check_range(&sd->bl,bl,range + 1)) {
- int mask[8][2] = {{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1}};
- int dir = map_calc_dir(&sd->bl,bl->x,bl->y);
- pc_walktoxy (sd, sd->bl.x + mask[dir][0], sd->bl.y + mask[dir][1]);
- } else
- return 0;
- }
- }
-
- if ((skill_num != MO_CHAINCOMBO &&
- skill_num != MO_COMBOFINISH &&
- skill_num != MO_EXTREMITYFIST &&
- skill_num != CH_TIGERFIST &&
- skill_num != CH_CHAINCRUSH) ||
- (skill_num == CH_CHAINCRUSH && sd->state.skill_flag) ||
- (skill_num == MO_EXTREMITYFIST && sd->state.skill_flag) )
- pc_stopattack(sd);
-
- casttime = skill_castfix(&sd->bl, skill_get_cast(skill_num, skill_lv));
- if (skill_num != SA_MAGICROD)
- delay = skill_delayfix(&sd->bl, skill_get_delay(skill_num, skill_lv));
- sd->state.skillcastcancel = skill_get_castcancel(skill_num);
-
- switch (skill_num) { /* ‰½‚©“ÁŽê‚È?—‚ª•K—v */
- case ALL_RESURRECTION: /* ƒŠƒUƒŒƒNƒVƒ‡ƒ“ */
- if (!tsd && battle_check_undead(status_get_race(bl),status_get_elem_type(bl))) { /* “G‚ªƒAƒ“ƒfƒbƒh‚È‚ç */
- forcecast = 1; /* ƒ^?ƒ“ƒAƒ“ƒfƒbƒg‚Æ“¯‚¶‰r¥ŽžŠÔ */
- casttime = skill_castfix(&sd->bl, skill_get_cast(PR_TURNUNDEAD, skill_lv));
- }
- break;
-
- case MO_FINGEROFFENSIVE: /* Žw? */
- casttime += casttime * ((skill_lv > sd->spiritball) ? sd->spiritball : skill_lv);
- break;
-
- case MO_CHAINCOMBO: /*˜A‘Ŷ*/
- target_id = sd->attacktarget;
- if (sc_data && sc_data[SC_BLADESTOP].timer != -1){
- struct block_list *tbl;
- if ((tbl=(struct block_list *)sc_data[SC_BLADESTOP].val4) == NULL) //ƒ^?ƒQƒbƒg‚ª‚¢‚È‚¢H
- return 0;
- target_id = tbl->id;
- }
- break;
- case MO_COMBOFINISH: /*–Ò—´Œ*/
- case CH_CHAINCRUSH: /* ˜A’Œ•ö? */
- target_id = sd->attacktarget;
- break;
-
- case CH_TIGERFIST: /* •šŒÕŒ */
- if (sc_data && sc_data[SC_COMBO].timer != -1 && sc_data[SC_COMBO].val1 == MO_COMBOFINISH)
- target_id = sd->attacktarget;
- break;
-
-// -- moonsoul (altered to allow proper usage of extremity from new champion combos)
-//
- case MO_EXTREMITYFIST: /*ˆ¢C—…”e–PŒ*/
- if (sc_data && sc_data[SC_COMBO].timer != -1 && (sc_data[SC_COMBO].val1 == MO_COMBOFINISH || sc_data[SC_COMBO].val1 == CH_CHAINCRUSH)) {
- casttime = 0;
- target_id = sd->attacktarget;
- }
- forcecast = 1;
- break;
-
- case SA_MAGICROD:
- case SA_SPELLBREAKER:
- forcecast = 1;
- break;
-
- case WE_MALE:
- case WE_FEMALE:
- {
- struct map_session_data *p_sd = pc_get_partner(sd);
- if (p_sd == NULL)
- return 0;
- if (skill_num == WE_MALE && sd->status.hp <= ((15*sd->status.max_hp)/100)) // Requires more than 15% of Max HP for WE_MALE
- return 0;
- else if (skill_num == WE_FEMALE && sd->status.sp <= ((15*sd->status.max_sp)/100)) // Requires more than 15% of Max SP for WE_FEMALE
- return 0;
- target_id = p_sd->bl.id;
- //range‚ð‚à‚¤1‰ñ?¸
- if (!battle_check_range(&sd->bl, &p_sd->bl, skill_get_range(skill_num,skill_lv)))
- return 0;
- }
- break;
-
- // parent-baby skills
- case WE_BABY:
- case WE_CALLPARENT:
- {
- struct map_session_data *f_sd = pc_get_father(sd);
- struct map_session_data *m_sd = pc_get_mother(sd);
-
- // set target as any one of the parent
- if (f_sd) target_id = f_sd->bl.id;
- else if (m_sd) target_id = m_sd->bl.id;
- else return 0; // neither are found
-
- // skip range check
- //range‚ð‚à‚¤1‰ñ?¸
- //range = skill_get_range(skill_num,skill_lv);
- //if(!battle_check_range(&sd->bl,&p_sd->bl,range))
- // return 0;
- }
- break;
-
- case WE_CALLBABY:
- {
- struct map_session_data *p_sd = pc_get_child(sd);
- if (p_sd == NULL)
- return 0;
- target_id = p_sd->bl.id;
- //range‚ð‚à‚¤1‰ñ?¸
- if(!battle_check_range(&sd->bl, &p_sd->bl, skill_get_range(skill_num,skill_lv)))
- return 0;
- }
- break;
-
- case HP_BASILICA: /* ƒoƒWƒŠƒJ */
- {
- if (skill_check_unit_range(sd->bl.m,sd->bl.x,sd->bl.y,sd->skillid,sd->skilllv)) {
- clif_skill_fail(sd,sd->skillid,0,0);
- return 0;
- }
- if (skill_check_unit_range2(&sd->bl,sd->bl.m,sd->bl.x,sd->bl.y,sd->skillid,sd->skilllv)) {
- clif_skill_fail(sd,sd->skillid,0,0);
- return 0;
- }
- // cancel Basilica if already in effect
- if (sc_data && sc_data[SC_BASILICA].timer != -1) {
- struct skill_unit_group *sg = (struct skill_unit_group *)sd->sc_data[SC_BASILICA].val4;
- if (sg && sg->src_id == sd->bl.id) {
- status_change_end(&sd->bl,SC_BASILICA,-1);
- skill_delunitgroup (sg);
- return 0;
- }
- }
- }
- break;
-
- case GD_BATTLEORDER:
- case GD_REGENERATION:
- case GD_RESTORE:
- case GD_EMERGENCYCALL:
- casttime = 1000; // temporary [Celest]
- break;
- }
-
- //ƒƒ‚ƒ‰ƒCƒY?‘Ô‚È‚çƒLƒƒƒXƒgƒ^ƒCƒ€‚ª1/3
- if (sc_data && sc_data[SC_MEMORIZE].timer != -1 && casttime > 0) {
- casttime = casttime/2;
- if ((--sc_data[SC_MEMORIZE].val2) <= 0)
- status_change_end(&sd->bl, SC_MEMORIZE, -1);
- }
-
- if (battle_config.pc_skill_log)
- printf ("PC %d skill use target_id=%d skill=%d lv=%d cast=%d\n",
- sd->bl.id, target_id, skill_num, skill_lv, casttime);
-
- if (casttime > 0 || forcecast) { /* ‰r¥‚ª•K—v */
- struct mob_data *md;
- clif_skillcasting(&sd->bl, sd->bl.id, target_id, 0,0, skill_num,casttime);
-
- /* ‰r¥”½?ƒ‚ƒ“ƒXƒ^? */
- if (bl->type == BL_MOB && (md = (struct mob_data *)bl) && mob_db[md->class_].mode & 0x10 &&
- md->state.state != MS_ATTACK && sd->invincible_timer == -1){
- md->target_id = sd->bl.id;
- md->state.targettype = ATTACKABLE;
- md->min_chase = 13;
- }
- }
-
- sd->skilltarget = target_id;
- sd->skillx = 0;
- sd->skilly = 0;
- sd->canact_tick = tick + casttime + delay;
- sd->canmove_tick = tick;
-
- if (!(battle_config.pc_cloak_check_type & 2) && sc_data && sc_data[SC_CLOAKING].timer != -1 && sd->skillid != AS_CLOAKING)
- status_change_end(&sd->bl,SC_CLOAKING,-1);
- if (casttime > 0) {
- sd->skilltimer = add_timer (tick + casttime, skill_castend_id, sd->bl.id, 0);
- if ((skill = pc_checkskill(sd,SA_FREECAST)) > 0) {
- sd->prev_speed = sd->speed;
- status_calc_speed (sd);
- }
- else
- pc_stop_walking(sd,0);
- } else {
- sd->state.skillcastcancel = 0; /* ‰r¥‚Ì–³‚¢‚à‚̂̓Lƒƒƒ“ƒZƒ‹‚³‚ê‚È‚¢ */
- if (skill_num != SA_CASTCANCEL)
- sd->skilltimer = -1;
- skill_castend_id(sd->skilltimer,tick,sd->bl.id,0);
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹Žg—piꊎw’èj
- *------------------------------------------
- */
-int skill_use_pos (struct map_session_data *sd, int skill_x, int skill_y, int skill_num, int skill_lv)
-{
- struct block_list bl;
- struct status_change *sc_data;
- int casttime = 0, delay = 0, skill, range;
- unsigned int tick = gettick();
-
- nullpo_retr(0, sd);
-
- if (pc_isdead(sd))
- return 0;
- if (skillnotok(skill_num, sd)) // [MoueJstr]
- return 0;
- if (skill_num == WZ_ICEWALL && map[sd->bl.m].flag.noicewall && !map[sd->bl.m].flag.pvp) { // noicewall flag [Valaris]
- clif_skill_fail(sd,sd->skillid,0,0);
- return 0;
- }
-
- sc_data = sd->sc_data;
-
- if (sd->opt1 > 0)
- return 0;
- if (sc_data){
- if (sc_data[SC_DIVINA].timer != -1 ||
- sc_data[SC_ROKISWEIL].timer != -1 ||
- sc_data[SC_AUTOCOUNTER].timer != -1 ||
- sc_data[SC_STEELBODY].timer != -1 ||
- sc_data[SC_DANCING].timer!=-1 ||
- sc_data[SC_BERSERK].timer != -1 ||
- sc_data[SC_MARIONETTE].timer != -1)
- return 0; /* ?‘ÔˆÙí‚â’¾?‚È‚Ç */
-
- if (sc_data[SC_BASILICA].timer != -1) {
- struct skill_unit_group *sg = (struct skill_unit_group *)sc_data[SC_BASILICA].val4;
- // if caster is the owner of basilica
- if (sg && sg->src_id == sd->bl.id &&
- skill_num == HP_BASILICA) ; // do nothing
- // otherwise...
- else return 0;
- }
- }
-
- if(sd->status.option & 2)
- return 0;
-
- sd->skillid = skill_num;
- sd->skilllv = skill_lv;
- if (skill_lv <= 0) return 0;
- sd->skillx = skill_x;
- sd->skilly = skill_y;
- if (!skill_check_condition(sd,0)) return 0;
-
- /* ŽË’ö‚ÆáŠQ•¨ƒ`ƒFƒbƒN */
- bl.type = BL_NUL;
- bl.m = sd->bl.m;
- bl.x = skill_x;
- bl.y = skill_y;
-
- {
- int check_range_flag = 0;
-
- /* ŽË’ö‚ÆáŠQ•¨ƒ`ƒFƒbƒN */
- range = skill_get_range(skill_num,skill_lv);
- if(range < 0)
- range = status_get_range(&sd->bl) - (range + 1);
- // be lenient if the skill was cast before we have moved to the correct position [Celest]
- if (sd->walktimer != -1)
- range ++;
- else check_range_flag = 1;
- if(!battle_check_range(&sd->bl,&bl,range)) {
- if (check_range_flag && battle_check_range(&sd->bl,&bl,range + 1)) {
- int mask[8][2] = {{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1}};
- int dir = map_calc_dir(&sd->bl,bl.x,bl.y);
- pc_walktoxy (sd, sd->bl.x + mask[dir][0], sd->bl.y + mask[dir][1]);
- } else
- return 0;
- }
- }
-
- pc_stopattack(sd);
-
- casttime = skill_castfix(&sd->bl, skill_get_cast( skill_num,skill_lv) );
- delay = skill_delayfix(&sd->bl, skill_get_delay( skill_num,skill_lv) );
- sd->state.skillcastcancel = skill_db[skill_num].castcancel;
-
- if (battle_config.pc_skill_log)
- printf("PC %d skill use target_pos=(%d,%d) skill=%d lv=%d cast=%d\n",
- sd->bl.id, skill_x, skill_y, skill_num, skill_lv, casttime);
-
- //ƒƒ‚ƒ‰ƒCƒY?‘Ô‚È‚çƒLƒƒƒXƒgƒ^ƒCƒ€‚ª1/3
- if (sc_data && sc_data[SC_MEMORIZE].timer != -1 && casttime > 0){
- casttime = casttime/3;
- if ((--sc_data[SC_MEMORIZE].val2)<=0)
- status_change_end(&sd->bl, SC_MEMORIZE, -1);
- }
-
- if (casttime > 0) /* ‰r¥‚ª•K—v */
- clif_skillcasting(&sd->bl, sd->bl.id, 0, skill_x, skill_y, skill_num, casttime);
-
- sd->skilltarget = 0;
- sd->canact_tick = tick + casttime + delay;
- sd->canmove_tick = tick;
- if (!(battle_config.pc_cloak_check_type&2) && sc_data && sc_data[SC_CLOAKING].timer != -1)
- status_change_end(&sd->bl,SC_CLOAKING,-1);
- if (casttime > 0) {
- sd->skilltimer = add_timer(tick + casttime, skill_castend_pos, sd->bl.id, 0);
- if ((skill = pc_checkskill(sd,SA_FREECAST)) > 0) {
- sd->prev_speed = sd->speed;
- status_calc_speed (sd);
- }
- else
- pc_stop_walking(sd,0);
- } else {
- sd->state.skillcastcancel = 0; /* ‰r¥‚Ì–³‚¢‚à‚̂̓Lƒƒƒ“ƒZƒ‹‚³‚ê‚È‚¢ */
- sd->skilltimer = -1;
- skill_castend_pos(sd->skilltimer,tick,sd->bl.id,0);
- }
- //ƒ}ƒWƒbƒNƒpƒ?‚Ì?‰ÊI—¹
- if (skill_get_unit_id(skill_num, 0) != 0x86 &&
- sc_data && sc_data[SC_MAGICPOWER].timer != -1)
- status_change_end(&sd->bl,SC_MAGICPOWER,-1);
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹‰r¥ƒLƒƒƒ“ƒZƒ‹
- *------------------------------------------
- */
-int skill_castcancel (struct block_list *bl, int type)
-{
- int inf;
- int ret = 0;
-
- nullpo_retr(0, bl);
-
- if (bl->type == BL_PC) {
- struct map_session_data *sd = (struct map_session_data *)bl;
- unsigned long tick = gettick();
- nullpo_retr(0, sd);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- if (sd->skilltimer != -1) {
- if (pc_checkskill(sd,SA_FREECAST) > 0) {
- sd->speed = sd->prev_speed;
- clif_updatestatus(sd,SP_SPEED);
- }
- if (!type) {
- if ((inf = skill_get_inf( sd->skillid )) == 2 || inf == 32)
- ret = delete_timer( sd->skilltimer, skill_castend_pos );
- else
- ret=delete_timer( sd->skilltimer, skill_castend_id );
- if (ret < 0)
- printf("delete timer error : skillid : %d\n", sd->skillid);
- } else {
- if ((inf = skill_get_inf( sd->skillid_old )) == 2 || inf == 32)
- ret = delete_timer( sd->skilltimer, skill_castend_pos );
- else
- ret = delete_timer( sd->skilltimer, skill_castend_id );
- if (ret < 0)
- printf("delete timer error : skillid : %d\n", sd->skillid_old);
- }
- sd->skilltimer = -1;
- clif_skillcastcancel(bl);
- }
- return 0;
- } else if (bl->type == BL_MOB) {
- struct mob_data *md = (struct mob_data *)bl;
- nullpo_retr(0, md);
- if (md->skilltimer != -1) {
- if ((inf = skill_get_inf( md->skillid )) == 2 || inf == 32)
- ret = delete_timer( md->skilltimer, mobskill_castend_pos );
- else
- ret = delete_timer( md->skilltimer, mobskill_castend_id );
- md->skilltimer = -1;
- clif_skillcastcancel(bl);
- }
- if (ret < 0)
- printf("delete timer error : skillid : %d\n", md->skillid);
- return 0;
- }
-
- return 1;
-}
-/*=========================================
- * ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA ‰Šú”Í?Œˆ’è
- *----------------------------------------
- */
-void skill_brandishspear_first(struct square *tc,int dir,int x,int y){
-
- nullpo_retv(tc);
-
- if(dir == 0){
- tc->val1[0]=x-2;
- tc->val1[1]=x-1;
- tc->val1[2]=x;
- tc->val1[3]=x+1;
- tc->val1[4]=x+2;
- tc->val2[0]=
- tc->val2[1]=
- tc->val2[2]=
- tc->val2[3]=
- tc->val2[4]=y-1;
- }
- else if(dir==2){
- tc->val1[0]=
- tc->val1[1]=
- tc->val1[2]=
- tc->val1[3]=
- tc->val1[4]=x+1;
- tc->val2[0]=y+2;
- tc->val2[1]=y+1;
- tc->val2[2]=y;
- tc->val2[3]=y-1;
- tc->val2[4]=y-2;
- }
- else if(dir==4){
- tc->val1[0]=x-2;
- tc->val1[1]=x-1;
- tc->val1[2]=x;
- tc->val1[3]=x+1;
- tc->val1[4]=x+2;
- tc->val2[0]=
- tc->val2[1]=
- tc->val2[2]=
- tc->val2[3]=
- tc->val2[4]=y+1;
- }
- else if(dir==6){
- tc->val1[0]=
- tc->val1[1]=
- tc->val1[2]=
- tc->val1[3]=
- tc->val1[4]=x-1;
- tc->val2[0]=y+2;
- tc->val2[1]=y+1;
- tc->val2[2]=y;
- tc->val2[3]=y-1;
- tc->val2[4]=y-2;
- }
- else if(dir==1){
- tc->val1[0]=x-1;
- tc->val1[1]=x;
- tc->val1[2]=x+1;
- tc->val1[3]=x+2;
- tc->val1[4]=x+3;
- tc->val2[0]=y-4;
- tc->val2[1]=y-3;
- tc->val2[2]=y-1;
- tc->val2[3]=y;
- tc->val2[4]=y+1;
- }
- else if(dir==3){
- tc->val1[0]=x+3;
- tc->val1[1]=x+2;
- tc->val1[2]=x+1;
- tc->val1[3]=x;
- tc->val1[4]=x-1;
- tc->val2[0]=y-1;
- tc->val2[1]=y;
- tc->val2[2]=y+1;
- tc->val2[3]=y+2;
- tc->val2[4]=y+3;
- }
- else if(dir==5){
- tc->val1[0]=x+1;
- tc->val1[1]=x;
- tc->val1[2]=x-1;
- tc->val1[3]=x-2;
- tc->val1[4]=x-3;
- tc->val2[0]=y+3;
- tc->val2[1]=y+2;
- tc->val2[2]=y+1;
- tc->val2[3]=y;
- tc->val2[4]=y-1;
- }
- else if(dir==7){
- tc->val1[0]=x-3;
- tc->val1[1]=x-2;
- tc->val1[2]=x-1;
- tc->val1[3]=x;
- tc->val1[4]=x+1;
- tc->val2[1]=y;
- tc->val2[0]=y+1;
- tc->val2[2]=y-1;
- tc->val2[3]=y-2;
- tc->val2[4]=y-3;
- }
-
-}
-
-/*=========================================
- * ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA •ûŒü”»’è ”Í??’£
- *-----------------------------------------
- */
-void skill_brandishspear_dir(struct square *tc,int dir,int are){
-
- int c;
-
- nullpo_retv(tc);
-
- for(c=0;c<5;c++){
- if(dir==0){
- tc->val2[c]+=are;
- }else if(dir==1){
- tc->val1[c]-=are; tc->val2[c]+=are;
- }else if(dir==2){
- tc->val1[c]-=are;
- }else if(dir==3){
- tc->val1[c]-=are; tc->val2[c]-=are;
- }else if(dir==4){
- tc->val2[c]-=are;
- }else if(dir==5){
- tc->val1[c]+=are; tc->val2[c]-=are;
- }else if(dir==6){
- tc->val1[c]+=are;
- }else if(dir==7){
- tc->val1[c]+=are; tc->val2[c]+=are;
- }
- }
-}
-
-/*==========================================
- * ƒfƒBƒ{?ƒVƒ‡ƒ“ —L?Šm”F
- *------------------------------------------
- */
-void skill_devotion(struct map_session_data *md,int target)
-{
- // ?Šm”F
- int n;
-
- nullpo_retv(md);
-
- for(n=0;n<5;n++){
- if(md->dev.val1[n]){
- struct map_session_data *sd = map_id2sd(md->dev.val1[n]);
- // ‘ŠŽè‚ªŒ©‚‚©‚ç‚È‚¢ // ‘ŠŽè‚ðƒfƒBƒ{‚µ‚Ä‚é‚Ì‚ªŽ©•ª‚¶‚á‚È‚¢ // ‹——£‚ª—£‚ê‚Ä‚é
- if( sd == NULL || (sd->sc_data && (md->bl.id != sd->sc_data[SC_DEVOTION].val1)) || skill_devotion3(&md->bl,md->dev.val1[n])){
- skill_devotion_end(md,sd,n);
- }
- }
- }
-}
-void skill_devotion2(struct block_list *bl,int crusader)
-{
- // ”íƒfƒBƒ{?ƒVƒ‡ƒ“‚ª?‚¢‚½Žž‚Ì‹——£ƒ`ƒFƒbƒN
- struct map_session_data *sd = map_id2sd(crusader);
-
- nullpo_retv(bl);
-
- if(sd) skill_devotion3(&sd->bl,bl->id);
-}
-int skill_devotion3(struct block_list *bl,int target)
-{
- // ƒNƒ‹ƒZ‚ª?‚¢‚½Žž‚Ì‹——£ƒ`ƒFƒbƒN
- struct map_session_data *md;
- struct map_session_data *sd;
- int n,r=0;
-
- nullpo_retr(1, bl);
- md = (struct map_session_data *)bl;
-
- if ((sd = map_id2sd(target))==NULL)
- return 1;
- else
- r = distance(bl->x,bl->y,sd->bl.x,sd->bl.y);
-
- if(pc_checkskill(md,CR_DEVOTION)+6 < r){ // ‹–—e”Í?‚ð’´‚¦‚Ä‚½
- for(n=0;n<5;n++)
- if(md->dev.val1[n]==target)
- md->dev.val2[n]=0; // —£‚ꂽŽž‚ÍA?‚ð؂邾‚¯
- clif_devotion(md,sd->bl.id);
- return 1;
- }
- return 0;
-}
-
-void skill_devotion_end(struct map_session_data *md,struct map_session_data *sd,int target)
-{
- // ƒNƒ‹ƒZ‚Æ”íƒfƒBƒ{ƒLƒƒƒ‰‚̃ŠƒZƒbƒg
- nullpo_retv(md);
- nullpo_retv(sd);
-
- md->dev.val1[target]=md->dev.val2[target]=0;
- if(sd && sd->sc_data){
- // status_change_end(sd->bl,SC_DEVOTION,-1);
- sd->sc_data[SC_DEVOTION].val1=0;
- sd->sc_data[SC_DEVOTION].val2=0;
- clif_status_change(&sd->bl,SC_DEVOTION,0);
- clif_devotion(md,sd->bl.id);
- }
-}
-/*==========================================
- * ƒI?ƒgƒXƒyƒ‹
- *------------------------------------------
- */
-int skill_autospell(struct map_session_data *sd,int skillid)
-{
- int skilllv;
- int maxlv=1,lv;
-
- nullpo_retr(0, sd);
-
- skilllv = pc_checkskill(sd,SA_AUTOSPELL);
- if(skilllv <= 0) return 0;
-
- if(skillid==MG_NAPALMBEAT) maxlv=3;
- else if(skillid==MG_COLDBOLT || skillid==MG_FIREBOLT || skillid==MG_LIGHTNINGBOLT){
- if(skilllv==2) maxlv=1;
- else if(skilllv==3) maxlv=2;
- else if(skilllv>=4) maxlv=3;
- }
- else if(skillid==MG_SOULSTRIKE){
- if(skilllv==5) maxlv=1;
- else if(skilllv==6) maxlv=2;
- else if(skilllv>=7) maxlv=3;
- }
- else if(skillid==MG_FIREBALL){
- if(skilllv==8) maxlv=1;
- else if(skilllv>=9) maxlv=2;
- }
- else if(skillid==MG_FROSTDIVER) maxlv=1;
- else return 0;
-
- if(maxlv > (lv=pc_checkskill(sd,skillid)))
- maxlv = lv;
-
- status_change_start(&sd->bl,SC_AUTOSPELL,skilllv,skillid,maxlv,0, // val1:ƒXƒLƒ‹ID val2:Žg—pÅ‘åLv
- skill_get_time(SA_AUTOSPELL,skilllv),0);// ‚É‚µ‚Ä‚Ý‚½‚¯‚Çbscript‚ª‘‚«ˆÕ‚¢???H
- return 0;
-}
-
-/*==========================================
- * ƒMƒƒƒ“ƒOƒXƒ^?ƒpƒ‰ƒ_ƒCƒX”»’è?—(foreachinarea)
- *------------------------------------------
- */
-
-static int skill_gangster_count(struct block_list *bl,va_list ap)
-{
- int *c;
- struct map_session_data *sd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- sd=(struct map_session_data*)bl;
- c=va_arg(ap,int *);
-
- if(sd && c && pc_issit(sd) && pc_checkskill(sd,RG_GANGSTER) > 0)
- (*c)++;
- return 0;
-}
-
-static int skill_gangster_in(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- sd=(struct map_session_data*)bl;
- if(sd && pc_issit(sd) && pc_checkskill(sd,RG_GANGSTER) > 0)
- sd->state.gangsterparadise=1;
- return 0;
-}
-
-static int skill_gangster_out(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- sd=(struct map_session_data*)bl;
- if(sd && sd->state.gangsterparadise)
- sd->state.gangsterparadise=0;
- return 0;
-}
-
-int skill_gangsterparadise(struct map_session_data *sd ,int type)
-{
- int range=1;
- int c=0;
-
- nullpo_retr(0, sd);
-
- if(pc_checkskill(sd,RG_GANGSTER) <= 0)
- return 0;
-
- if(type==1) {/* À‚Á‚½Žž‚Ì?— */
- map_foreachinarea(skill_gangster_count,sd->bl.m,
- sd->bl.x-range,sd->bl.y-range,
- sd->bl.x+range,sd->bl.y+range,BL_PC,&c);
- if(c > 1) {/*ƒMƒƒƒ“ƒOƒXƒ^?¬Œ÷‚µ‚½‚玩•ª‚É‚àƒMƒƒƒ“ƒOƒXƒ^??«•t?*/
- map_foreachinarea(skill_gangster_in,sd->bl.m,
- sd->bl.x-range,sd->bl.y-range,
- sd->bl.x+range,sd->bl.y+range,BL_PC);
- sd->state.gangsterparadise = 1;
- }
- return 0;
- }
- else if(type==0) {/* —§‚¿ã‚ª‚Á‚½‚Æ‚«‚Ì?— */
- map_foreachinarea(skill_gangster_count,sd->bl.m,
- sd->bl.x-range,sd->bl.y-range,
- sd->bl.x+range,sd->bl.y+range,BL_PC,&c);
- if(c < 2)
- map_foreachinarea(skill_gangster_out,sd->bl.m,
- sd->bl.x-range,sd->bl.y-range,
- sd->bl.x+range,sd->bl.y+range,BL_PC);
- sd->state.gangsterparadise = 0;
- return 0;
- }
- return 0;
-}
-/*==========================================
- * Š¦‚¢ƒWƒ‡?ƒN?ƒXƒNƒŠ?ƒ€”»’è?—(foreachinarea)
- *------------------------------------------
- */
-int skill_frostjoke_scream(struct block_list *bl,va_list ap)
-{
- struct block_list *src;
- int skillnum,skilllv;
- unsigned int tick;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, src=va_arg(ap,struct block_list*));
-
- skillnum=va_arg(ap,int);
- skilllv=va_arg(ap,int);
- if(skilllv <= 0) return 0;
- tick=va_arg(ap,unsigned int);
-
- if(src == bl)//Ž©•ª‚É‚Í?‚©‚È‚¢
- return 0;
-
- if (map[src->m].flag.gvg || map[src->m].flag.pvp)
- skill_additional_effect(src,bl,skillnum,skilllv,BF_MISC,tick);
- // we freeze everybody except of ourselfes on pvp/gvg [veider]
- else {
- if(battle_check_target(src,bl,BCT_ENEMY) > 0)
- skill_additional_effect(src,bl,skillnum,skilllv,BF_MISC,tick);
- else if(battle_check_target(src,bl,BCT_PARTY) > 0 && rand()%100 < 10)
- skill_additional_effect(src,bl,skillnum,skilllv,BF_MISC,tick);
- }
- // so on non-pvp/gvg we are just freezing as freezed before
-
- return 0;
-}
-
-/*==========================================
- * Moonlit creates a 'safe zone' [celest]
- *------------------------------------------
- */
-static int skill_moonlit_count(struct block_list *bl,va_list ap)
-{
- int *c, id;
- struct map_session_data *sd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, (sd=(struct map_session_data *)bl));
-
- id=va_arg(ap,int);
- c=va_arg(ap,int *);
-
- if (sd->bl.id != id && sd->sc_count && sd->sc_data[SC_MOONLIT].timer != -1 && c)
- (*c)++;
- return 0;
-}
-
-int skill_check_moonlit (struct block_list *bl, int dx, int dy)
-{
- int c=0;
- nullpo_retr(0, bl);
- map_foreachinarea(skill_moonlit_count,bl->m,
- dx-1,dy-1,dx+1,dy+1,BL_PC,bl->id,&c);
- return (c>0);
-}
-
-/*==========================================
- * ƒoƒWƒŠƒJ‚̃Zƒ‹‚ðÝ’è‚·‚é
- *------------------------------------------
- */
-void skill_basilica_cell(struct skill_unit *unit,int flag)
-{
- int i,x,y,range = skill_get_unit_range(HP_BASILICA);
- int size = range*2+1;
-
- for (i=0;i<size*size;i++) {
- x = unit->bl.x+(i%size-range);
- y = unit->bl.y+(i/size-range);
- map_setcell(unit->bl.m,x,y,flag);
- }
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int skill_attack_area(struct block_list *bl,va_list ap)
-{
- struct block_list *src,*dsrc;
- int atk_type,skillid,skilllv,flag,type;
- unsigned int tick;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- atk_type = va_arg(ap,int);
- if((src=va_arg(ap,struct block_list*)) == NULL)
- return 0;
- if((dsrc=va_arg(ap,struct block_list*)) == NULL)
- return 0;
- skillid=va_arg(ap,int);
- skilllv=va_arg(ap,int);
- //if(skilllv <= 0) return 0;
- if(skillid > 0 && skilllv <= 0) return 0; // celest
- tick=va_arg(ap,unsigned int);
- flag=va_arg(ap,int);
- type=va_arg(ap,int);
-
- if(battle_check_target(dsrc,bl,type) > 0)
- skill_attack(atk_type,src,dsrc,bl,skillid,skilllv,tick,flag);
-
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int skill_clear_element_field(struct block_list *bl)
-{
- struct mob_data *md=NULL;
- struct map_session_data *sd=NULL;
- int i,max,skillid;
-
- nullpo_retr(0, bl);
-
- if (bl->type==BL_MOB) {
- max = MAX_MOBSKILLUNITGROUP;
- md = (struct mob_data *)bl;
- } else if(bl->type==BL_PC) {
- max = MAX_SKILLUNITGROUP;
- sd = (struct map_session_data *)bl;
- } else
- return 0;
-
- for (i=0;i<max;i++) {
- if(sd){
- skillid=sd->skillunit[i].skill_id;
- if(skillid==SA_DELUGE||skillid==SA_VOLCANO||skillid==SA_VIOLENTGALE||skillid==SA_LANDPROTECTOR)
- skill_delunitgroup(&sd->skillunit[i]);
- }else if(md){
- skillid=md->skillunit[i].skill_id;
- if(skillid==SA_DELUGE||skillid==SA_VOLCANO||skillid==SA_VIOLENTGALE||skillid==SA_LANDPROTECTOR)
- skill_delunitgroup(&md->skillunit[i]);
- }
- }
- return 0;
-}
-/*==========================================
- * ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^?ƒ`ƒFƒbƒN(foreachinarea)
- *------------------------------------------
- */
-int skill_landprotector(struct block_list *bl, va_list ap )
-{
- int skillid;
- int *alive;
- struct skill_unit *unit;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- skillid = va_arg(ap,int);
- alive = va_arg(ap,int *);
-
- if ((unit = (struct skill_unit *)bl) == NULL)
- return 0;
-
- if (skillid == SA_LANDPROTECTOR)
- skill_delunit(unit);
- else if (alive && unit->group && unit->group->skill_id == SA_LANDPROTECTOR)
- (*alive) = 0;
-
- return 0;
-}
-/*==========================================
- * ƒCƒhƒDƒ“‚Ì—ÑŒç‚̉ñ•œ?—(foreachinarea)
- *------------------------------------------
- */
-int skill_idun_heal (struct block_list *bl, va_list ap)
-{
- struct skill_unit *unit;
- struct skill_unit_group *sg;
- int heal;
-
- nullpo_retr(0, bl);
- if (bl->type != BL_PC && bl->type != BL_MOB)
- return 0;
-
- nullpo_retr(0, ap);
- nullpo_retr(0, unit = va_arg(ap,struct skill_unit *));
- nullpo_retr(0, sg = unit->group);
- if (bl->id == sg->src_id)
- return 0;
-
- heal = 30 + sg->skill_lv * 5 + ((sg->val1) >> 16) * 5 + ((sg->val1) & 0xfff) / 2;
- clif_skill_nodamage(&unit->bl, bl, AL_HEAL, heal, 1);
- battle_heal(NULL, bl, heal, 0, 0);
-
- return 0;
-}
-
-/*==========================================
- * Žw’è”Í??‚Åsrc‚É?‚µ‚Ä—L?‚ȃ^?ƒQƒbƒg‚Ìbl‚Ì?‚ð?‚¦‚é(foreachinarea)
- *------------------------------------------
- */
-int skill_count_target (struct block_list *bl, va_list ap)
-{
- struct block_list *src;
- int *c;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- if ((src = va_arg(ap,struct block_list *)) == NULL)
- return 0;
- if ((c = va_arg(ap,int *)) == NULL)
- return 0;
- if (battle_check_target(src,bl,BCT_ENEMY) > 0)
- (*c)++;
- return 0;
-}
-/*==========================================
- * ƒgƒ‰ƒbƒv”Í??—(foreachinarea)
- *------------------------------------------
- */
-int skill_trap_splash (struct block_list *bl, va_list ap)
-{
- struct block_list *src;
- int tick;
- int splash_count;
- struct skill_unit *unit;
- struct skill_unit_group *sg;
- struct block_list *ss;
- int i;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, src = va_arg(ap,struct block_list *));
- nullpo_retr(0, unit = (struct skill_unit *)src);
- nullpo_retr(0, sg = unit->group);
- nullpo_retr(0, ss = map_id2bl(sg->src_id));
-
- tick = va_arg(ap,int);
- splash_count = va_arg(ap,int);
-
- if(battle_check_target(src,bl,BCT_ENEMY) > 0){
- switch(sg->unit_id){
- case 0x95: /* ƒTƒ“ƒhƒ}ƒ“ */
- case 0x96: /* ƒtƒ‰ƒbƒVƒƒ? */
- case 0x94: /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
- skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MISC,tick);
- break;
- case 0x8f: /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
- case 0x98: /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
- for(i=0;i<splash_count;i++){
- skill_attack(BF_MISC,ss,src,bl,sg->skill_id,sg->skill_lv,tick,(sg->val2)?0x0500:0);
- }
- break;
- case 0x97: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
- skill_attack(BF_WEAPON, ss,src,bl,sg->skill_id,sg->skill_lv,tick,(sg->val2)?0x0500:0);
- break;
- default:
- break;
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒe?ƒ^ƒXˆÙíI—¹
- *------------------------------------------
- */
-int skill_enchant_elemental_end (struct block_list *bl, int type)
-{
- struct status_change *sc_data;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, sc_data = status_get_sc_data(bl));
-
- if (type != SC_ENCPOISON && sc_data[SC_ENCPOISON].timer != -1) /* ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“‰ðœ */
- status_change_end(bl, SC_ENCPOISON, -1);
- if (type != SC_ASPERSIO && sc_data[SC_ASPERSIO].timer != -1) /* ƒAƒXƒyƒ‹ƒVƒI‰ðœ */
- status_change_end(bl, SC_ASPERSIO, -1);
- if (type != SC_FLAMELAUNCHER && sc_data[SC_FLAMELAUNCHER].timer != -1) /* ƒtƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ‰ðœ */
- status_change_end(bl, SC_FLAMELAUNCHER, -1);
- if (type != SC_FROSTWEAPON && sc_data[SC_FROSTWEAPON].timer != -1) /* ƒtƒƒXƒgƒEƒFƒ|ƒ“‰ðœ */
- status_change_end(bl, SC_FROSTWEAPON, -1);
- if (type != SC_LIGHTNINGLOADER && sc_data[SC_LIGHTNINGLOADER].timer != -1) /* ƒ‰ƒCƒgƒjƒ“ƒOƒ?ƒ_?‰ðœ */
- status_change_end(bl, SC_LIGHTNINGLOADER, -1);
- if (type != SC_SEISMICWEAPON && sc_data[SC_SEISMICWEAPON].timer != -1) /* ƒTƒCƒXƒ~ƒbƒNƒEƒFƒ|ƒ“‰ðœ */
- status_change_end(bl, SC_SEISMICWEAPON, -1);
-
- return 0;
-}
-
-/* ƒNƒ?ƒLƒ“ƒO?¸iŽü‚è‚Ɉړ®•s‰Â”\’n?‚ª‚ ‚é‚©j */
-int skill_check_cloaking(struct block_list *bl)
-{
- struct map_session_data *sd = NULL;
- static int dx[] = { 0, 1, 0, -1, -1, 1, 1, -1}; //optimized by Lupus
- static int dy[] = {-1, 0, 1, 0, -1, -1, 1, 1};
- int end = 1,i;
-
- nullpo_retr(1, bl);
-
- if (bl->type == BL_PC) {
- nullpo_retr(1, sd = (struct map_session_data *)bl);
- if (!battle_config.pc_cloak_check_type) // If it's No it shouldn't be checked
- return 0;
- } else if (bl->type == BL_MOB && !battle_config.monster_cloak_check_type)
- return 0;
-
- for (i = 0; i < 8; i++) {
- if (map_getcell(bl->m, bl->x+dx[i], bl->y+dy[i], CELL_CHKNOPASS)) {
- end = 0;
- break;
- }
- }
- if(end){
- if ((sd && pc_checkskill(sd,AS_CLOAKING)<3) || bl->type == BL_MOB) {
- status_change_end(bl, SC_CLOAKING, -1);
- }
- else if (sd && sd->sc_data[SC_CLOAKING].val3 != 130) {
- sd->sc_data[SC_CLOAKING].val3 = 130;
- status_calc_speed (sd);
- }
- }
- else {
- if (sd && sd->sc_data[SC_CLOAKING].val3 != 103) {
- sd->sc_data[SC_CLOAKING].val3 = 103;
- status_calc_speed (sd);
- }
- }
-
- return end;
-}
-
-/*
- *----------------------------------------------------------------------------
- * ƒXƒLƒ‹ƒ†ƒjƒbƒg
- *----------------------------------------------------------------------------
- */
-
-/*==========================================
- * ‰‰‘t/ƒ_ƒ“ƒX‚ð‚â‚ß‚é
- * flag 1‚Ň‘t’†‚È‚ç‘Š•û‚Ƀ†ƒjƒbƒg‚ð”C‚¹‚é
- *
- *------------------------------------------
- */
-void skill_stop_dancing(struct block_list *src, int flag)
-{
- struct status_change* sc_data;
- struct skill_unit_group* group;
- short* sc_count;
-
- nullpo_retv(src);
- nullpo_retv(sc_data = status_get_sc_data(src));
- nullpo_retv(sc_count = status_get_sc_count(src));
-
- if((*sc_count) > 0 && sc_data[SC_DANCING].timer != -1) {
- group = (struct skill_unit_group *)sc_data[SC_DANCING].val2; //ƒ_ƒ“ƒX‚̃XƒLƒ‹ƒ†ƒjƒbƒgID‚Íval2‚É“ü‚Á‚Ä‚é
- if (src->type == BL_PC) {
- if (group && sc_data[SC_DANCING].val4){ //‡‘t’†?
- struct map_session_data* dsd = map_id2sd(sc_data[SC_DANCING].val4); //‘Š•û‚ÌsdŽæ“¾
- if (flag && dsd) { //ƒƒOƒAƒEƒg‚ȂǕЕû‚ª—Ž‚¿‚Ä‚à‰‰‘t‚ª??‚³‚ê‚é
- if (src->id == group->src_id) { //ƒOƒ‹?ƒv‚ðŽ‚Á‚Ä‚éPC‚ª—Ž‚¿‚é
- group->src_id = sc_data[SC_DANCING].val4; //‘Š•û‚ɃOƒ‹?ƒv‚ð”C‚¹‚é
- if (flag & 1) //ƒƒOƒAƒEƒg
- dsd->sc_data[SC_DANCING].val4 = 0; //‘Š•û‚Ì‘Š•û‚ð0‚É‚µ‚ć‘tI—¹¨’Êí‚̃_ƒ“ƒX?‘Ô
- if(flag & 2) //ƒnƒG”ò‚Ñ‚È‚Ç
- return; //‡‘t‚àƒ_ƒ“ƒX?‘Ô‚àI—¹‚³‚¹‚È‚¢•ƒXƒLƒ‹ƒ†ƒjƒbƒg‚Í’u‚¢‚Ä‚¯‚Ú‚è
- } else if (dsd->bl.id == group->src_id) { //‘Š•û‚ªƒOƒ‹?ƒv‚ðŽ‚Á‚Ä‚¢‚éPC‚ª—Ž‚¿‚é(Ž©•ª‚̓Oƒ‹?ƒv‚ðŽ‚Á‚Ä‚¢‚È‚¢)
- if (flag & 1) //ƒƒOƒAƒEƒg
- dsd->sc_data[SC_DANCING].val4 = 0; //‘Š•û‚Ì‘Š•û‚ð0‚É‚µ‚ć‘tI—¹¨’Êí‚̃_ƒ“ƒX?‘Ô
- if(flag & 2) //ƒnƒG”ò‚Ñ‚È‚Ç
- return; //‡‘t‚àƒ_ƒ“ƒX?‘Ô‚àI—¹‚³‚¹‚È‚¢•ƒXƒLƒ‹ƒ†ƒjƒbƒg‚Í’u‚¢‚Ä‚¯‚Ú‚è
- }
- status_change_end(src, SC_DANCING, -1); //Ž©•ª‚̃Xƒe?ƒ^ƒX‚ðI—¹‚³‚¹‚é
- //‚»‚µ‚ăOƒ‹?ƒv‚ÍÁ‚³‚È‚¢•Á‚³‚È‚¢‚̂ŃXƒe?ƒ^ƒXŒvŽZ‚à‚¢‚ç‚È‚¢H
- return;
- } else if (dsd) {
- if (src->id == group->src_id) //ƒOƒ‹?ƒv‚ðŽ‚Á‚Ä‚éPC‚ªŽ~‚ß‚é
- status_change_end(&dsd->bl, SC_DANCING, -1); //‘ŠŽè‚̃Xƒe?ƒ^ƒX‚ðI—¹‚³‚¹‚é
- if(dsd->bl.id == group->src_id) //‘Š•û‚ªƒOƒ‹?ƒv‚ðŽ‚Á‚Ä‚¢‚éPC‚ªŽ~‚ß‚é(Ž©•ª‚̓Oƒ‹?ƒv‚ðŽ‚Á‚Ä‚¢‚È‚¢)
- status_change_end(src, SC_DANCING, -1); //Ž©•ª‚̃Xƒe?ƒ^ƒX‚ðI—¹‚³‚¹‚é
- }
- }
- if(flag & 2 && group) { //ƒnƒG‚Å”ò‚ñ‚¾‚Æ‚«‚Æ‚©‚̓†ƒjƒbƒg‚à”ò‚Ô
- struct map_session_data *sd = (struct map_session_data *)src;
- if (sd) skill_unit_move_unit_group(group, sd->bl.m, (sd->to_x - sd->bl.x), (sd->to_y - sd->bl.y));
- return;
- }
- }
- skill_delunitgroup(group);
- }
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒg‰Šú‰»
- *------------------------------------------
- */
-struct skill_unit *skill_initunit(struct skill_unit_group *group,int idx,int x,int y)
-{
- struct skill_unit *unit;
-
- nullpo_retr(NULL, group);
- nullpo_retr(NULL, unit=&group->unit[idx]);
-
- if(!unit->alive)
- group->alive_count++;
-
- unit->bl.id=map_addobject(&unit->bl);
- unit->bl.type=BL_SKILL;
- unit->bl.m=group->map;
- unit->bl.x=x;
- unit->bl.y=y;
- unit->group=group;
- unit->val1=unit->val2=0;
- unit->alive=1;
-
- map_addblock(&unit->bl);
- clif_skill_setunit(unit);
-
- if (group->skill_id==HP_BASILICA)
- skill_basilica_cell(unit,CELL_SETBASILICA);
-
- return unit;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgíœ
- *------------------------------------------
- */
-int skill_delunit(struct skill_unit *unit)
-{
- struct skill_unit_group *group;
-
- nullpo_retr(0, unit);
- if(!unit->alive)
- return 0;
- nullpo_retr(0, group=unit->group);
-
- /* onlimitƒCƒxƒ“ƒgŒÄ‚Ño‚µ */
- skill_unit_onlimit( unit,gettick() );
-
- /* onoutƒCƒxƒ“ƒgŒÄ‚Ño‚µ */
- if (!unit->range) {
- map_foreachinarea(skill_unit_effect,unit->bl.m,
- unit->bl.x,unit->bl.y,unit->bl.x,unit->bl.y,0,
- &unit->bl,gettick(),0);
- }
-
- if (group->skill_id==HP_BASILICA)
- skill_basilica_cell(unit,CELL_CLRBASILICA);
-
- clif_skill_delunit(unit);
-
- unit->group=NULL;
- unit->alive=0;
- map_delobjectnofree(unit->bl.id);
- if(group->alive_count>0 && (--group->alive_count)<=0)
- skill_delunitgroup(group);
-
- return 0;
-}
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒOƒ‹?ƒv‰Šú‰»
- *------------------------------------------
- */
-static int skill_unit_group_newid = MAX_SKILL_DB;
-struct skill_unit_group *skill_initunitgroup(struct block_list *src,
- int count,int skillid,int skilllv,int unit_id)
-{
- int i;
- struct skill_unit_group *group=NULL, *list=NULL;
- int maxsug=0;
-
- if(skilllv <= 0) return 0;
-
- nullpo_retr(NULL, src);
-
- if(src->type==BL_PC){
- list=((struct map_session_data *)src)->skillunit;
- maxsug=MAX_SKILLUNITGROUP;
- }else if(src->type==BL_MOB){
- list=((struct mob_data *)src)->skillunit;
- maxsug=MAX_MOBSKILLUNITGROUP;
- }else if(src->type==BL_PET){
- list=((struct pet_data *)src)->skillunit;
- maxsug=MAX_MOBSKILLUNITGROUP;
- }
- if(list){
- for(i=0;i<maxsug;i++) /* ‹ó‚¢‚Ä‚¢‚é‚à‚Ì?õ */
- if(list[i].group_id==0){
- group=&list[i];
- break;
- }
-
- if(group==NULL){ /* ‹ó‚¢‚Ä‚È‚¢‚̂Ō¢‚à‚Ì?õ */
- int j=0;
- unsigned maxdiff=0,x,tick=gettick();
- for(i=0;i<maxsug;i++)
- if((x=DIFF_TICK(tick,list[i].tick))>maxdiff){
- maxdiff=x;
- j=i;
- }
- skill_delunitgroup(&list[j]);
- group=&list[j];
- }
- }
-
- if(group==NULL){
- printf("skill_initunitgroup: error unit group !\n");
- exit(1);
- }
-
- group->src_id=src->id;
- group->party_id=status_get_party_id(src);
- group->guild_id=status_get_guild_id(src);
- group->group_id=skill_unit_group_newid++;
- if(skill_unit_group_newid<=0)
- skill_unit_group_newid = MAX_SKILL_DB;
- group->unit=(struct skill_unit *)aCalloc(count,sizeof(struct skill_unit));
- group->unit_count=count;
- group->val1=group->val2=0;
- group->skill_id=skillid;
- group->skill_lv=skilllv;
- group->unit_id=unit_id;
- group->map=src->m;
- group->limit=10000;
- group->interval=1000;
- group->tick=gettick();
- group->valstr=NULL;
-
- if (skill_get_unit_flag(skillid)&UF_DANCE) {
- struct map_session_data *sd = NULL;
- if(src->type==BL_PC && (sd=(struct map_session_data *)src) ){
- sd->skillid_dance=skillid;
- sd->skilllv_dance=skilllv;
- }
- status_change_start(src,SC_DANCING,skillid,(int)group,0,0,skill_get_time(skillid,skilllv)+1000,0);
- //‡‘tƒXƒLƒ‹‚Í‘Š•û‚ðƒ_ƒ“ƒXó‘Ô‚É‚·‚é
- if (sd && skill_get_unit_flag(skillid)&UF_ENSEMBLE) {
- int c=0;
- map_foreachinarea(skill_check_condition_use_sub,sd->bl.m,
- sd->bl.x-1,sd->bl.y-1,sd->bl.x+1,sd->bl.y+1,BL_PC,&sd->bl,&c);
- }
- }
- return group;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒOƒ‹?ƒvíœ
- *------------------------------------------
- */
-int skill_delunitgroup(struct skill_unit_group *group)
-{
- struct block_list *src;
- int i;
-
- nullpo_retr(0, group);
- if(group->unit_count<=0)
- return 0;
-
- src=map_id2bl(group->src_id);
- //ƒ_ƒ“ƒXƒXƒLƒ‹‚̓_ƒ“ƒXó‘Ô‚ð‰ðœ‚·‚é
- if(src) {
- if (skill_get_unit_flag(group->skill_id)&UF_DANCE)
- status_change_end(src,SC_DANCING,-1);
- if (group->unit_id == 0x86) {
- struct status_change *sc_data = status_get_sc_data(src);
- if(sc_data && sc_data[SC_MAGICPOWER].timer != -1) //ƒ}ƒWƒbƒNƒpƒ?‚Ì?‰ÊI—¹
- status_change_end(src,SC_MAGICPOWER,-1);
- }
- }
-
- group->alive_count=0;
- if(group->unit!=NULL){
- for(i=0;i<group->unit_count;i++)
- if(group->unit[i].alive)
- skill_delunit(&group->unit[i]);
- }
- if(group->valstr!=NULL){
- map_freeblock(group->valstr);
- group->valstr=NULL;
- }
-
- map_freeblock(group->unit); /* aFree()‚Ì‘Ö‚í‚è */
- group->unit=NULL;
- group->src_id=0;
- group->group_id=0;
- group->unit_count=0;
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒOƒ‹?ƒv‘Síœ
- *------------------------------------------
- */
-int skill_clear_unitgroup(struct block_list *src)
-{
- struct skill_unit_group *group=NULL;
- int maxsug=0;
-
- nullpo_retr(0, src);
-
- if(src->type==BL_PC){
- group=((struct map_session_data *)src)->skillunit;
- maxsug=MAX_SKILLUNITGROUP;
- } else if(src->type==BL_MOB){
- group=((struct mob_data *)src)->skillunit;
- maxsug=MAX_MOBSKILLUNITGROUP;
- } else if(src->type==BL_PET){ // [Valaris]
- group=((struct pet_data *)src)->skillunit;
- maxsug=MAX_MOBSKILLUNITGROUP;
- } else
- return 0;
- if(group){
- int i;
- for(i=0;i<maxsug;i++)
- if(group[i].group_id>0 && group[i].src_id == src->id)
- skill_delunitgroup(&group[i]);
- }
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒOƒ‹?ƒv‚Ì”í‰e‹¿tick?õ
- *------------------------------------------
- */
-struct skill_unit_group_tickset *skill_unitgrouptickset_search(
- struct block_list *bl,struct skill_unit_group *group,int tick)
-{
- int i,j=-1,k,s,id;
- struct skill_unit_group_tickset *set;
-
- nullpo_retr(0, bl);
- if (group->interval==-1)
- return NULL;
-
- if (bl->type == BL_PC)
- set = ((struct map_session_data *)bl)->skillunittick;
- else if (bl->type == BL_MOB)
- set = ((struct mob_data *)bl)->skillunittick;
- else
- return 0;
-
- if (skill_get_unit_flag(group->skill_id)&UF_NOOVERLAP)
- id = s = group->skill_id;
- else
- id = s = group->group_id;
-
- for (i=0; i<MAX_SKILLUNITGROUPTICKSET; i++) {
- k = (i+s) % MAX_SKILLUNITGROUPTICKSET;
- if (set[k].id == id)
- return &set[k];
- else if (j==-1 && (DIFF_TICK(tick,set[k].tick)>0 || set[k].id==0))
- j=k;
- }
-
- if (j == -1) {
- if(battle_config.error_log) {
- sprintf (tmp_output, "skill_unitgrouptickset_search: tickset is full\n");
- ShowWarning (tmp_output);
- }
- j = id % MAX_SKILLUNITGROUPTICKSET;
- }
-
- set[j].id = id;
- set[j].tick = tick;
- return &set[j];
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒ^ƒCƒ}??“®?——p(foreachinarea)
- *------------------------------------------
- */
-int skill_unit_timer_sub_onplace( struct block_list *bl, va_list ap )
-{
- struct skill_unit *unit;
- struct skill_unit_group *group;
- unsigned int tick;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- unit = va_arg(ap,struct skill_unit *);
- tick = va_arg(ap,unsigned int);
-
- if (bl->type!=BL_PC && bl->type!=BL_MOB)
- return 0;
- if (!unit->alive || bl->prev==NULL)
- return 0;
-
- nullpo_retr(0, group=unit->group);
-
- if (battle_check_target(&unit->bl,bl,group->target_flag)<=0)
- return 0;
-
- skill_unit_onplace_timer(unit,bl,tick);
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒ^ƒCƒ}??——p(foreachobject)
- *------------------------------------------
- */
-int skill_unit_timer_sub( struct block_list *bl, va_list ap )
-{
- struct skill_unit *unit;
- struct skill_unit_group *group;
- int range;
- unsigned int tick;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, unit=(struct skill_unit *)bl);
- tick=va_arg(ap,unsigned int);
-
- if(!unit->alive)
- return 0;
- group=unit->group;
-
- nullpo_retr(0, group);
- range = unit->range;
-
- /* onplace_timerƒCƒxƒ“ƒgŒÄ‚Ño‚µ */
- if (range>=0 && group->interval!=-1) {
- map_foreachinarea(skill_unit_timer_sub_onplace, bl->m,
- bl->x-range,bl->y-range,bl->x+range,bl->y+range,0,bl,tick);
- if (!unit->alive)
- return 0;
- // ƒ}ƒOƒkƒX‚Í”­“®‚µ‚½ƒ†ƒjƒbƒg‚Í휂·‚é
- if (group->skill_id==PR_MAGNUS && unit->val2) {
- skill_delunit(unit);
- return 0;
- }
- }
- // ƒCƒhƒDƒ“‚Ì—ÑŒç‚É‚æ‚é‰ñ•œ
- if (group->unit_id==0xaa && DIFF_TICK(tick,group->tick)>=6000*group->val3) {
- struct block_list *src = map_id2bl(group->src_id);
- int range = skill_get_unit_layout_type(group->skill_id,group->skill_lv);
- nullpo_retr(0, src);
- map_foreachinarea(skill_idun_heal,src->m,
- src->x-range,src->y-range,src->x+range,src->y+range,0,unit);
- group->val3++;
- }
- /* ŽžŠÔØ‚êíœ */
- if((DIFF_TICK(tick,group->tick)>=group->limit || DIFF_TICK(tick,group->tick)>=unit->limit)){
- switch(group->unit_id){
- case 0x8f: /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
- group->unit_id = 0x8c;
- clif_changelook(bl,LOOK_BASE,group->unit_id);
- group->limit=DIFF_TICK(tick+1500,group->tick);
- unit->limit=DIFF_TICK(tick+1500,group->tick);
- break;
- case 0x90: /* ƒXƒLƒbƒhƒgƒ‰ƒbƒv */
- case 0x91: /* ƒAƒ“ƒNƒ‹ƒXƒlƒA */
- case 0x93: /* ƒ‰ƒ“ƒhƒ}ƒCƒ“ */
- case 0x94: /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
- case 0x95: /* ƒTƒ“ƒhƒ}ƒ“ */
- case 0x96: /* ƒtƒ‰ƒbƒVƒƒ? */
- case 0x97: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
- case 0x98: /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
- case 0x99: /* ƒg?ƒL?ƒ{ƒbƒNƒX */
- {
- struct block_list *src=map_id2bl(group->src_id);
- if(group->unit_id == 0x91 && group->val2);
- else{
- if(src && src->type==BL_PC){
- struct item item_tmp;
- memset(&item_tmp,0,sizeof(item_tmp));
- item_tmp.nameid=1065;
- item_tmp.identify=1;
- map_addflooritem(&item_tmp,1,bl->m,bl->x,bl->y,NULL,NULL,NULL,0); // ?•ÔŠÒ
- }
- }
- skill_delunit(unit);
- }
- break;
-
- case 0xc1:
- case 0xc2:
- case 0xc3:
- case 0xc4:
- {
- struct block_list *src=map_id2bl(group->src_id);
- if (src)
- group->tick = tick;
- }
- break;
-
- default:
- skill_delunit(unit);
- }
- }
-
- if(group->unit_id == 0x8d) {
- unit->val1 -= 5;
- if(unit->val1 <= 0 && unit->limit + group->tick > tick + 700)
- unit->limit = DIFF_TICK(tick+700,group->tick);
- }
-
- return 0;
-}
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒ^ƒCƒ}??—
- *------------------------------------------
- */
-int skill_unit_timer( int tid,unsigned int tick,int id,int data)
-{
- map_freeblock_lock();
-
- map_foreachobject( skill_unit_timer_sub, BL_SKILL, tick );
-
- map_freeblock_unlock();
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgˆÚ“®Žž?——p(foreachinarea)
- *------------------------------------------
- */
-int skill_unit_move_sub( struct block_list *bl, va_list ap )
-{
- struct skill_unit *unit = (struct skill_unit *)bl;
- struct skill_unit_group *group;
- struct block_list *target;
- unsigned int tick,flag;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, target=va_arg(ap,struct block_list*));
- tick = va_arg(ap,unsigned int);
- flag = va_arg(ap,int);
-
- if (target->type!=BL_PC && target->type!=BL_MOB)
- return 0;
-
- nullpo_retr(0, group=unit->group);
- if (group->interval!=-1)
- return 0;
-
- if (!unit->alive || target->prev==NULL)
- return 0;
-
- if (flag)
- skill_unit_onplace(unit,target,tick);
- else
- skill_unit_onout(unit,target,tick);
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgˆÚ“®Žž?—
- *------------------------------------------
- */
-int skill_unit_move(struct block_list *bl,unsigned int tick,int flag)
-{
- nullpo_retr(0, bl);
-
- if(bl->prev==NULL )
- return 0;
-
- map_foreachinarea(skill_unit_move_sub,
- bl->m,bl->x,bl->y,bl->x,bl->y,BL_SKILL,bl,tick,flag);
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgŽ©?‚̈ړ®Žž?—
- * ˆø?‚̓Oƒ‹?ƒv‚ƈړ®—Ê
- *------------------------------------------
- */
-int skill_unit_move_unit_group( struct skill_unit_group *group, int m,int dx,int dy)
-{
- int i,j;
- int tick = gettick();
- int *m_flag;
- struct skill_unit *unit1;
- struct skill_unit *unit2;
-
- nullpo_retr(0, group);
- if (group->unit_count<=0)
- return 0;
- if (group->unit==NULL)
- return 0;
-
- // ˆÚ“®‰Â”\‚ȃXƒLƒ‹‚̓_ƒ“ƒXŒn‚ÆAƒuƒ‰ƒXƒgƒ}ƒCƒ“AƒNƒŒƒCƒ‚ƒA[ƒgƒ‰ƒbƒv‚Ì‚Ý
- if (!(skill_get_unit_flag(group->skill_id)&UF_DANCE) &&
- group->skill_id!=HT_CLAYMORETRAP && group->skill_id!=HT_BLASTMINE)
- return 0;
-
- m_flag = (int *) aMalloc(sizeof(int)*group->unit_count);
- memset(m_flag,0,sizeof(int)*group->unit_count);// ˆÚ“®ƒtƒ‰ƒO
- // æ‚Ƀtƒ‰ƒO‚ð‘S•”Œˆ‚ß‚é
- // m_flag
- // 0: ’PƒˆÚ“®
- // 1: ƒ†ƒjƒbƒg‚ðˆÚ“®‚·‚é(Œ»ˆÊ’u‚©‚烆ƒjƒbƒg‚ª‚È‚­‚È‚é)
- // 2: Žc—¯•VˆÊ’u‚ªˆÚ“®æ‚Æ‚È‚é(ˆÚ“®æ‚Ƀ†ƒjƒbƒg‚ª‘¶Ý‚µ‚È‚¢)
- // 3: Žc—¯
- for(i=0;i<group->unit_count;i++){
- unit1=&group->unit[i];
- if (!unit1->alive || unit1->bl.m!=m)
- continue;
- for(j=0;j<group->unit_count;j++){
- unit2=&group->unit[j];
- if (!unit2->alive)
- continue;
- if (unit1->bl.x+dx==unit2->bl.x && unit1->bl.y+dy==unit2->bl.y){
- // ˆÚ“®æ‚Ƀ†ƒjƒbƒg‚ª‚©‚Ô‚Á‚Ä‚¢‚é
- m_flag[i] |= 0x1;
- }
- if (unit1->bl.x-dx==unit2->bl.x && unit1->bl.y-dy==unit2->bl.y){
- // ƒ†ƒjƒbƒg‚ª‚±‚Ìꊂɂâ‚Á‚Ä‚­‚é
- m_flag[i] |= 0x2;
- }
- }
- }
- // ƒtƒ‰ƒO‚ÉŠî‚¢‚ă†ƒjƒbƒgˆÚ“®
- // ƒtƒ‰ƒO‚ª1‚Ìunit‚ð’T‚µAƒtƒ‰ƒO‚ª2‚Ìunit‚̈ړ®æ‚Ɉڂ·
- j = 0;
- for (i=0;i<group->unit_count;i++) {
- unit1=&group->unit[i];
- if (!unit1->alive)
- continue;
- if (!(m_flag[i]&0x2)) {
- // ƒ†ƒjƒbƒg‚ª‚È‚­‚È‚éꊂŃXƒLƒ‹ƒ†ƒjƒbƒg‰e‹¿‚ðÁ‚·
- map_foreachinarea(skill_unit_effect,unit1->bl.m,
- unit1->bl.x,unit1->bl.y,unit1->bl.x,unit1->bl.y,0,
- &unit1->bl,tick,0);
- }
- if (m_flag[i]==0) {
- // ’PƒˆÚ“®
- map_delblock(&unit1->bl);
- unit1->bl.m = m;
- unit1->bl.x += dx;
- unit1->bl.y += dy;
- map_addblock(&unit1->bl);
- clif_skill_setunit(unit1);
- } else if (m_flag[i]==1) {
- // ƒtƒ‰ƒO‚ª2‚Ì‚à‚Ì‚ð’T‚µ‚Ä‚»‚̃†ƒjƒbƒg‚̈ړ®æ‚Ɉړ®
- for(;j<group->unit_count;j++) {
- if (m_flag[j]==2) {
- // Œp³ˆÚ“®
- unit2 = &group->unit[j];
- if (!unit2->alive)
- continue;
- map_delblock(&unit1->bl);
- unit1->bl.m = m;
- unit1->bl.x = unit2->bl.x+dx;
- unit1->bl.y = unit2->bl.y+dy;
- map_addblock(&unit1->bl);
- clif_skill_setunit(unit1);
- j++;
- break;
- }
- }
- }
- if (!(m_flag[i]&0x2)) {
- // ˆÚ“®Œã‚ÌꊂŃXƒLƒ‹ƒ†ƒjƒbƒg‚ð”­“®
- map_foreachinarea(skill_unit_effect,unit1->bl.m,
- unit1->bl.x,unit1->bl.y,unit1->bl.x,unit1->bl.y,0,
- &unit1->bl,tick,1);
- }
- }
- aFree(m_flag);
- return 0;
-}
-
-/*----------------------------------------------------------------------------
- * ƒAƒCƒeƒ€‡¬
- *----------------------------------------------------------------------------
- */
-
-/*==========================================
- * ƒAƒCƒeƒ€‡¬‰Â”\”»’è
- *------------------------------------------
- */
-int skill_can_produce_mix( struct map_session_data *sd, int nameid, int trigger )
-{
- int i,j;
-
- nullpo_retr(0, sd);
-
- if(nameid<=0)
- return 0;
-
- for(i=0;i<MAX_SKILL_PRODUCE_DB;i++){
- if(skill_produce_db[i].nameid == nameid )
- break;
- }
- if( i >= MAX_SKILL_PRODUCE_DB ) /* ƒf?ƒ^ƒx?ƒX‚É‚È‚¢ */
- return 0;
-
- if(trigger>=0){
- if(trigger == 32 || trigger == 16 || trigger==64 || trigger == 256) {
- if(skill_produce_db[i].itemlv!=trigger) /* ƒtƒ@?ƒ}ƒV?–ƒ|?ƒVƒ‡ƒ“—Þ‚Æ—n??–?ΈȊO‚Í‚¾‚ß */
- return 0;
- }else{
- if(skill_produce_db[i].itemlv>=16) /* •ŠíˆÈŠO‚Í‚¾‚ß */
- return 0;
- if( itemdb_wlv(nameid)>trigger ) /* •ŠíLv”»’è */
- return 0;
- }
- }
- if( (j=skill_produce_db[i].req_skill)>0 && pc_checkskill(sd,j)<=0 )
- return 0; /* ƒXƒLƒ‹‚ª‘«‚è‚È‚¢ */
-
- for(j=0;j<MAX_PRODUCE_RESOURCE;j++){
- int id,x,y;
- if( (id=skill_produce_db[i].mat_id[j]) <= 0 ) /* ‚±‚êˆÈã‚ÍÞ—¿—v‚ç‚È‚¢ */
- continue;
- if(skill_produce_db[i].mat_amount[j] <= 0) {
- if(pc_search_inventory(sd,id) < 0)
- return 0;
- }
- else {
- for(y=0,x=0;y<MAX_INVENTORY;y++)
- if( sd->status.inventory[y].nameid == id )
- x+=sd->status.inventory[y].amount;
- if(x<skill_produce_db[i].mat_amount[j]) /* ƒAƒCƒeƒ€‚ª‘«‚è‚È‚¢ */
- return 0;
- }
- }
- return i+1;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€‡¬‰Â”\”»’è
- *------------------------------------------
- */
-int skill_produce_mix( struct map_session_data *sd,
- int nameid, int slot1, int slot2, int slot3 )
-{
- int slot[3];
- int i,sc,ele,idx,equip,wlv,make_per,flag;
-
- nullpo_retr(0, sd);
-
- if( !(idx=skill_can_produce_mix(sd,nameid,-1)) ) /* ?Œ•s‘« */
- return 0;
- idx--;
- slot[0]=slot1;
- slot[1]=slot2;
- slot[2]=slot3;
-
- /* –„‚ß?‚Ý?— */
- for(i=0,sc=0,ele=0;i<3;i++){
- int j;
- if( slot[i]<=0 )
- continue;
- j = pc_search_inventory(sd,slot[i]);
- if(j < 0) /* •s³ƒpƒPƒbƒg(ƒAƒCƒeƒ€‘¶Ý)ƒ`ƒFƒbƒN */
- continue;
- if(slot[i]==1000){ /* ¯‚Ì‚©‚¯‚ç */
- pc_delitem(sd,j,1,1);
- sc++;
- }
- if(slot[i]>=994 && slot[i]<=997 && ele==0){ /* ?«Î */
- static const int ele_table[4]={3,1,4,2};
- pc_delitem(sd,j,1,1);
- ele=ele_table[slot[i]-994];
- }
- }
-
- /* Þ—¿Á”ï */
- for(i=0;i<MAX_PRODUCE_RESOURCE;i++){
- int j,id,x;
- if( (id=skill_produce_db[idx].mat_id[i]) <= 0 )
- continue;
- x=skill_produce_db[idx].mat_amount[i]; /* •K—v‚ÈŒÂ? */
- do{ /* ‚Q‚ˆÈã‚̃Cƒ“ƒfƒbƒNƒX‚É‚Ü‚½‚ª‚Á‚Ä‚¢‚é‚©‚à‚µ‚ê‚È‚¢ */
- int y=0;
- j = pc_search_inventory(sd,id);
-
- if(j >= 0){
- y = sd->status.inventory[j].amount;
- if(y>x)y=x; /* ‘«‚è‚Ä‚¢‚é */
- pc_delitem(sd,j,y,0);
- }else {
- if(battle_config.error_log)
- printf("skill_produce_mix: material item error\n");
- }
-
- x-=y; /* ‚Ü‚¾‘«‚è‚È‚¢ŒÂ?‚ðŒvŽZ */
- }while( j>=0 && x>0 ); /* Þ—¿‚ðÁ”ï‚·‚é‚©AƒGƒ‰?‚É‚È‚é‚Ü‚ÅŒJ‚è•Ô‚· */
- }
-
- /* Šm—¦”»’è */
- equip = itemdb_isequip(nameid);
- if(!equip) {
-// Corrected rates [DracoRPG] --------------------------//
- if(skill_produce_db[idx].req_skill==AM_PHARMACY) {
- make_per = pc_checkskill(sd,AM_LEARNINGPOTION)*100
- + pc_checkskill(sd,AM_PHARMACY)*300 + sd->status.job_level*20
- + sd->paramc[4]*10+sd->paramc[5]*10;
-
- if(nameid >= 501 && nameid <= 505) // Normal potions
- make_per += 2000 + pc_checkskill(sd,AM_POTIONPITCHER)*100;
- else if(nameid >= 605 && nameid <= 606) // Anodyne & Aloevera (not sure of the formula, I put the same base value as normal pots but without the Aid Potion bonus since they are not throwable pots ^^)
- make_per += 2000;
- else if(nameid >= 545 && nameid <= 547) // Concentrated potions
- ;
- else if(nameid == 970) // Alcohol
- make_per += 1000;
- else if(nameid == 7135) // Bottle Grenade
- make_per += 500 + pc_checkskill(sd,AM_DEMONSTRATION)*100;
- else if(nameid == 7136) // Acid Bottle
- make_per += 500 + pc_checkskill(sd,AM_ACIDTERROR)*100;
- else if(nameid == 7137) // Plant Bottle
- make_per += 500 + pc_checkskill(sd,AM_CANNIBALIZE)*100;
- else if(nameid == 7138) // Marine Sphere Bottle
- make_per += 500 + pc_checkskill(sd,AM_SPHEREMINE)*100;
- else if(nameid == 7139) // Glistening Coat
- make_per += 500 + pc_checkskill(sd,AM_CP_WEAPON)*100 + pc_checkskill(sd,AM_CP_SHIELD)*100 +
- pc_checkskill(sd,AM_CP_ARMOR)*100 + pc_checkskill(sd,AM_CP_HELM)*100;
- } else if (skill_produce_db[idx].req_skill == ASC_CDP) {
- make_per = 2000 + 40*sd->paramc[4] + 20*sd->paramc[5];
- } else {
- if(nameid == 998)
- make_per = 1500 + sd->status.job_level*35 + sd->paramc[4]*10 + sd->paramc[5]*10 + pc_checkskill(sd,skill_produce_db[idx].req_skill)*600;
- else
- make_per = 1000 + sd->status.job_level*35 + sd->paramc[4]*10 + sd->paramc[5]*10 + pc_checkskill(sd,skill_produce_db[idx].req_skill)*500;
- }
- if(battle_config.pp_rate != 100)
- make_per = make_per * battle_config.pp_rate / 100;
- } else { // Corrected rates [DracoRPG]
- int add_per=0;
- if(pc_search_inventory(sd,989) >= 0) add_per = 400;
- else if(pc_search_inventory(sd,988) >= 0) add_per = 300;
- else if(pc_search_inventory(sd,987) >= 0) add_per = 200;
- else if(pc_search_inventory(sd,986) >= 0) add_per = 100;
- wlv = itemdb_wlv(nameid);
- make_per = 1500 + sd->status.job_level*35 + sd->paramc[4]*10 + sd->paramc[5]*10 + pc_checkskill(sd,skill_produce_db[idx].req_skill)*1000 + pc_checkskill(sd,BS_WEAPONRESEARCH)*100 +
- ((wlv >= 3)? pc_checkskill(sd,BS_ORIDEOCON)*100 : 0) + add_per - (ele? 2500:0) - sc*((4-wlv)*500) - wlv*1000;
- if(battle_config.wp_rate != 100) /* Šm—¦•â³ */
- make_per = make_per * battle_config.wp_rate / 100;
- }
-// -----------------------------------------------------//
-
- if(make_per < 1) make_per = 1;
-
-// if(battle_config.etc_log)
-// printf("make rate = %d\n",make_per);
-
- if(rand()%10000 < make_per){
- /* ¬Œ÷ */
- struct item tmp_item;
- memset(&tmp_item,0,sizeof(tmp_item));
- tmp_item.nameid=nameid;
- tmp_item.amount=1;
- tmp_item.identify=1;
- if(equip){ /* •Ší‚Ìê‡ */
- tmp_item.card[0]=0x00ff; /* »‘¢•Šíƒtƒ‰ƒO */
- tmp_item.card[1]=((sc*5)<<8)+ele; /* ?«‚Ƃ‚悳 */
- *((unsigned long *)(&tmp_item.card[2]))=sd->char_id; /* ƒLƒƒƒ‰ID */
- }
- else if((battle_config.produce_item_name_input && skill_produce_db[idx].req_skill!=AM_PHARMACY) ||
- (battle_config.produce_potion_name_input && skill_produce_db[idx].req_skill==AM_PHARMACY)) {
- tmp_item.card[0]=0x00fe;
- tmp_item.card[1]=0;
- *((unsigned long *)(&tmp_item.card[2]))=sd->char_id; /* ƒLƒƒƒ‰ID */
- }
-
- if(log_config.produce > 0)
- log_produce(sd,nameid,slot1,slot2,slot3,1);
-
- switch (skill_produce_db[idx].req_skill) {
- case AM_PHARMACY:
- clif_produceeffect(sd,2,nameid);/* »?ƒGƒtƒFƒNƒg */
- clif_misceffect(&sd->bl,5); /* ‘¼l‚ɂଌ÷‚ð’Ê’m */
- break;
- case ASC_CDP:
- clif_produceeffect(sd,2,nameid);/* Žb’è‚Å»?ƒGƒtƒFƒNƒg */
- clif_misceffect(&sd->bl,5);
- break;
- default: /* •Ší»‘¢AƒRƒCƒ“»‘¢ */
- clif_produceeffect(sd,0,nameid); /* •Ší»‘¢ƒGƒtƒFƒNƒg */
- clif_misceffect(&sd->bl,3);
- break;
- }
-
- if((flag = pc_additem(sd,&tmp_item,1))) {
- clif_additem(sd,0,0,flag);
- map_addflooritem(&tmp_item,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- } else {
- if(log_config.produce > 0)
- log_produce(sd,nameid,slot1,slot2,slot3,0);
-
- switch (skill_produce_db[idx].req_skill) {
- case AM_PHARMACY:
- clif_produceeffect(sd,3,nameid);/* »?Ž¸”sƒGƒtƒFƒNƒg */
- clif_misceffect(&sd->bl,6); /* ‘¼l‚É‚àŽ¸”s‚ð’Ê’m */
- break;
- case ASC_CDP:
- {
- clif_produceeffect(sd,3,nameid); /* Žb’è‚Å»?ƒGƒtƒFƒNƒg */
- clif_misceffect(&sd->bl,6); /* ‘¼l‚É‚àŽ¸”s‚ð’Ê’m */
- pc_heal(sd, -(sd->status.max_hp>>2), 0);
- }
- break;
- default:
- clif_produceeffect(sd,1,nameid);/* •Ší»‘¢Ž¸”sƒGƒtƒFƒNƒg */
- clif_misceffect(&sd->bl,2); /* ‘¼l‚É‚àŽ¸”s‚ð’Ê’m */
- break;
- }
- }
- return 0;
-}
-
-int skill_arrow_create( struct map_session_data *sd,int nameid)
-{
- int i,j,flag,index=-1;
- struct item tmp_item;
-
- nullpo_retr(0, sd);
-
- if(nameid <= 0)
- return 1;
-
- for(i=0;i<MAX_SKILL_ARROW_DB;i++)
- if(nameid == skill_arrow_db[i].nameid) {
- index = i;
- break;
- }
-
- if(index < 0 || (j = pc_search_inventory(sd,nameid)) < 0)
- return 1;
-
- pc_delitem(sd,j,1,0);
- for(i=0;i<5;i++) {
- memset(&tmp_item,0,sizeof(tmp_item));
- tmp_item.identify = 1;
- tmp_item.nameid = skill_arrow_db[index].cre_id[i];
- tmp_item.amount = skill_arrow_db[index].cre_amount[i];
- if(battle_config.making_arrow_name_input) {
- tmp_item.card[0]=0x00fe;
- tmp_item.card[1]=0;
- *((unsigned long *)(&tmp_item.card[2]))=sd->char_id; /* ƒLƒƒƒ‰ID */
- }
- if(tmp_item.nameid <= 0 || tmp_item.amount <= 0)
- continue;
- if((flag = pc_additem(sd,&tmp_item,tmp_item.amount))) {
- clif_additem(sd,0,0,flag);
- map_addflooritem(&tmp_item,tmp_item.amount,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- }
-
- return 0;
-}
-
-/*----------------------------------------------------------------------------
- * ‰Šú‰»Œn
- */
-
-/*----------------------------------------------------------------------------
- * ‰Šú‰»Œn
- */
-
-/*
- * •¶Žš—ñˆ—
- * ',' ‚Å‹æØ‚Á‚Ä val ‚É–ß‚·
- */
-int skill_split_str(char *str,char **val,int num)
-{
- int i;
-
- for (i=0; i<num && str; i++){
- val[i] = str;
- str = strchr(str,',');
- if (str)
- *str++=0;
- }
- return i;
-}
-/*
- * •¶Žš—ñˆ—
- * ':' ‚Å‹æØ‚Á‚Äatoi‚µ‚Äval‚É–ß‚·
- */
-int skill_split_atoi(char *str,int *val)
-{
- int i, max = 0;
-
- for (i=0; i<MAX_SKILL_LEVEL; i++) {
- if (str) {
- val[i] = max = atoi(str);
- str = strchr(str,':');
- if (str)
- *str++=0;
- } else {
- val[i] = max;
- }
- }
- return i;
-}
-
-/*
- * ƒXƒLƒ‹ƒ†ƒjƒbƒg‚Ì”z’uî•ñì¬
- */
-void skill_init_unit_layout()
-{
- int i,j,size,pos = 0;
-
- memset(skill_unit_layout,0,sizeof(skill_unit_layout));
- // ‹éŒ`‚̃†ƒjƒbƒg”z’u‚ð쬂·‚é
- for (i=0; i<=MAX_SQUARE_LAYOUT; i++) {
- size = i*2+1;
- skill_unit_layout[i].count = size*size;
- for (j=0; j<size*size; j++) {
- skill_unit_layout[i].dx[j] = (j%size-i);
- skill_unit_layout[i].dy[j] = (j/size-i);
- }
- }
- pos = i;
- // ‹éŒ`ˆÈŠO‚̃†ƒjƒbƒg”z’u‚ð쬂·‚é
- for (i=0;i<MAX_SKILL_DB;i++) {
- if (!skill_db[i].unit_id[0] || skill_db[i].unit_layout_type[0] != -1)
- continue;
- switch (i) {
- case MG_FIREWALL:
- case WZ_ICEWALL:
- // ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹AƒAƒCƒXƒEƒH[ƒ‹‚Í•ûŒü‚Å•Ï‚í‚é‚̂ŕʈ—
- break;
- case PR_SANCTUARY:
- {
- static const int dx[] = {
- -1, 0, 1,-2,-1, 0, 1, 2,-2,-1,
- 0, 1, 2,-2,-1, 0, 1, 2,-1, 0, 1};
- static const int dy[]={
- -2,-2,-2,-1,-1,-1,-1,-1, 0, 0,
- 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2};
- skill_unit_layout[pos].count = 21;
- memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx));
- memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
- break;
- }
- case PR_MAGNUS:
- {
- static const int dx[] = {
- -1, 0, 1,-1, 0, 1,-3,-2,-1, 0,
- 1, 2, 3,-3,-2,-1, 0, 1, 2, 3,
- -3,-2,-1, 0, 1, 2, 3,-1, 0, 1,-1, 0, 1};
- static const int dy[] = {
- -3,-3,-3,-2,-2,-2,-1,-1,-1,-1,
- -1,-1,-1, 0, 0, 0, 0, 0, 0, 0,
- 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3};
- skill_unit_layout[pos].count = 33;
- memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx));
- memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
- break;
- }
- case AS_VENOMDUST:
- {
- static const int dx[] = {-1, 0, 0, 0, 1};
- static const int dy[] = { 0,-1, 0, 1, 0};
- skill_unit_layout[pos].count = 5;
- memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx));
- memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
- break;
- }
- case CR_GRANDCROSS:
- case NPC_DARKGRANDCROSS:
- {
- static const int dx[] = {
- 0, 0,-1, 0, 1,-2,-1, 0, 1, 2,
- -4,-3,-2,-1, 0, 1, 2, 3, 4,-2,
- -1, 0, 1, 2,-1, 0, 1, 0, 0};
- static const int dy[] = {
- -4,-3,-2,-2,-2,-1,-1,-1,-1,-1,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
- 1, 1, 1, 1, 2, 2, 2, 3, 4};
- skill_unit_layout[pos].count = 29;
- memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx));
- memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
- break;
- }
- case PF_FOGWALL:
- {
- static const int dx[] = {
- -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2};
- static const int dy[] = {
- -1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1};
- skill_unit_layout[pos].count = 15;
- memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx));
- memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
- break;
- }
- case PA_GOSPEL:
- {
- static const int dx[] = {
- -1, 0, 1,-1, 0, 1,-3,-2,-1, 0,
- 1, 2, 3,-3,-2,-1, 0, 1, 2, 3,
- -3,-2,-1, 0, 1, 2, 3,-1, 0, 1,
- -1, 0, 1};
- static const int dy[] = {
- -3,-3,-3,-2,-2,-2,-1,-1,-1,-1,
- -1,-1,-1, 0, 0, 0, 0, 0, 0, 0,
- 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
- 3, 3, 3};
- skill_unit_layout[pos].count = 33;
- memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx));
- memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
- break;
- }
- default:
- printf("unknown unit layout at skill %d\n",i);
- break;
- }
- if (!skill_unit_layout[pos].count)
- continue;
- for (j=0;j<MAX_SKILL_LEVEL;j++)
- skill_db[i].unit_layout_type[j] = pos;
- pos++;
- }
- // ƒtƒ@ƒCƒ„[ƒEƒH[ƒ‹
- firewall_unit_pos = pos;
- for (i=0;i<8;i++) {
- if (i&1) { /* ŽÎ‚ß”z’u */
- skill_unit_layout[pos].count = 5;
- if (i&0x2) {
- int dx[] = {-1,-1, 0, 0, 1};
- int dy[] = { 1, 0, 0,-1,-1};
- memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx));
- memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
- } else {
- int dx[] = { 1, 1 ,0, 0,-1};
- int dy[] = { 1, 0, 0,-1,-1};
- memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx));
- memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
- }
- } else { /* c‰¡”z’u */
- skill_unit_layout[pos].count = 3;
- if (i%4==0) { /* ㉺ */
- int dx[] = {-1, 0, 1};
- int dy[] = { 0, 0, 0};
- memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx));
- memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
- } else { /* ¶‰E */
- int dx[] = { 0, 0, 0};
- int dy[] = {-1, 0, 1};
- memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx));
- memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
- }
- }
- pos++;
- }
- // ƒAƒCƒXƒEƒH[ƒ‹
- icewall_unit_pos = pos;
- for (i=0;i<8;i++) {
- skill_unit_layout[pos].count = 5;
- if (i&1) { /* ŽÎ‚ß”z’u */
- if (i&0x2) {
- int dx[] = {-2,-1, 0, 1, 2};
- int dy[] = { 2,-1, 0,-1,-2};
- memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx));
- memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
- } else {
- int dx[] = { 2, 1 ,0,-1,-2};
- int dy[] = { 2, 1, 0,-1,-2};
- memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx));
- memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
- }
- } else { /* c‰¡”z’u */
- if (i%4==0) { /* ㉺ */
- int dx[] = {-2,-1, 0, 1, 2};
- int dy[] = { 0, 0, 0, 0, 0};
- memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx));
- memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
- } else { /* ¶‰E */
- int dx[] = { 0, 0, 0, 0, 0};
- int dy[] = {-2,-1, 0, 1, 2};
- memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx));
- memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
- }
- }
- pos++;
- }
-}
-
-/*==========================================
- * ƒXƒLƒ‹?ŒWƒtƒ@ƒCƒ‹?‚Ý?‚Ý
- * skill_db.txt ƒXƒLƒ‹ƒf?ƒ^
- * skill_cast_db.txt ƒXƒLƒ‹‚̉r¥ŽžŠÔ‚ƃfƒBƒŒƒCƒf?ƒ^
- * produce_db.txt ƒAƒCƒeƒ€ì¬ƒXƒLƒ‹—pƒf?ƒ^
- * create_arrow_db.txt –î쬃XƒLƒ‹—pƒf?ƒ^
- * abra_db.txt ƒAƒuƒ‰ƒJƒ_ƒuƒ‰?“®ƒXƒLƒ‹ƒf?ƒ^
- *------------------------------------------
- */
-int skill_readdb(void)
-{
- int i,j,k,l,m;
- FILE *fp;
- char line[1024],*p;
- char *filename[]={"db/produce_db.txt","db/produce_db2.txt"};
-
- /* ƒXƒLƒ‹ƒf?ƒ^ƒx?ƒX */
- memset(skill_db,0,sizeof(skill_db));
- fp=fopen("db/skill_db.txt","r");
- if(fp==NULL){
- printf("can't read db/skill_db.txt\n");
- return 1;
- }
- while(fgets(line,1020,fp)){
- char *split[50];
- if(line[0]=='/' && line[1]=='/')
- continue;
- j = skill_split_str(line,split,14);
- if(split[13]==NULL || j<14)
- continue;
-
- i=atoi(split[0]);
- if (i>=10000 && i<10015) // for guild skills [Celest]
- i -= 9500;
- else if(i<=0 || i>MAX_SKILL_DB)
- continue;
-
-/* printf("skill id=%d\n",i); */
- skill_split_atoi(split[1],skill_db[i].range);
- skill_db[i].hit=atoi(split[2]);
- skill_db[i].inf=atoi(split[3]);
- skill_db[i].pl=atoi(split[4]);
- skill_db[i].nk=atoi(split[5]);
- skill_db[i].max=atoi(split[6]);
- skill_split_atoi(split[7],skill_db[i].num);
-
- if(strcmpi(split[8],"yes") == 0)
- skill_db[i].castcancel=1;
- else
- skill_db[i].castcancel=0;
- skill_db[i].cast_def_rate=atoi(split[9]);
- skill_db[i].inf2=atoi(split[10]);
- skill_db[i].maxcount=atoi(split[11]);
- if(strcmpi(split[12],"weapon") == 0)
- skill_db[i].skill_type=BF_WEAPON;
- else if(strcmpi(split[12],"magic") == 0)
- skill_db[i].skill_type=BF_MAGIC;
- else if(strcmpi(split[12],"misc") == 0)
- skill_db[i].skill_type=BF_MISC;
- else
- skill_db[i].skill_type=0;
- skill_split_atoi(split[13],skill_db[i].blewcount);
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/skill_db.txt");
- ShowStatus(tmp_output);
-
- fp=fopen("db/skill_require_db.txt","r");
- if(fp==NULL){
- printf("can't read db/skill_require_db.txt\n");
- return 1;
- }
- while(fgets(line,1020,fp)){
- char *split[50];
- if(line[0]=='/' && line[1]=='/')
- continue;
- j = skill_split_str(line,split,30);
- if(split[29]==NULL || j<30)
- continue;
-
- i=atoi(split[0]);
- if (i>=10000 && i<10015) // for guild skills [Celest]
- i -= 9500;
- else if(i<=0 || i>MAX_SKILL_DB)
- continue;
-
- skill_split_atoi(split[1],skill_db[i].hp);
- skill_split_atoi(split[2],skill_db[i].mhp);
- skill_split_atoi(split[3],skill_db[i].sp);
- skill_split_atoi(split[4],skill_db[i].hp_rate);
- skill_split_atoi(split[5],skill_db[i].sp_rate);
- skill_split_atoi(split[6],skill_db[i].zeny);
-
- p = split[7];
- for(j=0;j<32;j++){
- l = atoi(p);
- if (l==99) {
- skill_db[i].weapon = 0xffffffff;
- break;
- }
- else
- skill_db[i].weapon |= 1<<l;
- p=strchr(p,':');
- if(!p)
- break;
- p++;
- }
-
- if( strcmpi(split[8],"hiding")==0 ) skill_db[i].state=ST_HIDING;
- else if( strcmpi(split[8],"cloaking")==0 ) skill_db[i].state=ST_CLOAKING;
- else if( strcmpi(split[8],"hidden")==0 ) skill_db[i].state=ST_HIDDEN;
- else if( strcmpi(split[8],"riding")==0 ) skill_db[i].state=ST_RIDING;
- else if( strcmpi(split[8],"falcon")==0 ) skill_db[i].state=ST_FALCON;
- else if( strcmpi(split[8],"cart")==0 ) skill_db[i].state=ST_CART;
- else if( strcmpi(split[8],"shield")==0 ) skill_db[i].state=ST_SHIELD;
- else if( strcmpi(split[8],"sight")==0 ) skill_db[i].state=ST_SIGHT;
- else if( strcmpi(split[8],"explosionspirits")==0 ) skill_db[i].state=ST_EXPLOSIONSPIRITS;
- else if( strcmpi(split[8],"recover_weight_rate")==0 ) skill_db[i].state=ST_RECOV_WEIGHT_RATE;
- else if( strcmpi(split[8],"move_enable")==0 ) skill_db[i].state=ST_MOVE_ENABLE;
- else if( strcmpi(split[8],"water")==0 ) skill_db[i].state=ST_WATER;
- else skill_db[i].state=ST_NONE;
-
- skill_split_atoi(split[9],skill_db[i].spiritball);
- skill_db[i].itemid[0]=atoi(split[10]);
- skill_db[i].amount[0]=atoi(split[11]);
- skill_db[i].itemid[1]=atoi(split[12]);
- skill_db[i].amount[1]=atoi(split[13]);
- skill_db[i].itemid[2]=atoi(split[14]);
- skill_db[i].amount[2]=atoi(split[15]);
- skill_db[i].itemid[3]=atoi(split[16]);
- skill_db[i].amount[3]=atoi(split[17]);
- skill_db[i].itemid[4]=atoi(split[18]);
- skill_db[i].amount[4]=atoi(split[19]);
- skill_db[i].itemid[5]=atoi(split[20]);
- skill_db[i].amount[5]=atoi(split[21]);
- skill_db[i].itemid[6]=atoi(split[22]);
- skill_db[i].amount[6]=atoi(split[23]);
- skill_db[i].itemid[7]=atoi(split[24]);
- skill_db[i].amount[7]=atoi(split[25]);
- skill_db[i].itemid[8]=atoi(split[26]);
- skill_db[i].amount[8]=atoi(split[27]);
- skill_db[i].itemid[9]=atoi(split[28]);
- skill_db[i].amount[9]=atoi(split[29]);
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/skill_require_db.txt");
- ShowStatus(tmp_output);
-
- /* ƒLƒƒƒXƒeƒBƒ“ƒOƒf?ƒ^ƒx?ƒX */
- fp=fopen("db/skill_cast_db.txt","r");
- if(fp==NULL){
- printf("can't read db/skill_cast_db.txt\n");
- return 1;
- }
- while(fgets(line,1020,fp)){
- char *split[50];
- memset(split,0,sizeof(split)); // [Valaris] thanks to fov
- if(line[0]=='/' && line[1]=='/')
- continue;
- j = skill_split_str(line,split,5);
- if(split[4]==NULL || j<5)
- continue;
-
- i=atoi(split[0]);
- if (i>=10000 && i<10015) // for guild skills [Celest]
- i -= 9500;
- else if(i<=0 || i>MAX_SKILL_DB)
- continue;
-
- skill_split_atoi(split[1],skill_db[i].cast);
- skill_split_atoi(split[2],skill_db[i].delay);
- skill_split_atoi(split[3],skill_db[i].upkeep_time);
- skill_split_atoi(split[4],skill_db[i].upkeep_time2);
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/skill_cast_db.txt");
- ShowStatus(tmp_output);
-
- /* ƒXƒLƒ‹ƒ†ƒjƒbƒgƒf[ƒ^ƒx[ƒX */
- fp = fopen("db/skill_unit_db.txt","r");
- if (fp==NULL) {
- printf("can't read db/skill_unit_db.txt\n");
- return 1;
- }
- k = 0;
- while (fgets(line,1020,fp)) {
- char *split[50];
- if (line[0]=='/' && line[1]=='/')
- continue;
- j = skill_split_str(line,split,8);
- if (split[7]==NULL || j<8)
- continue;
-
- i=atoi(split[0]);
- if (i>=10000 && i<10015) // for guild skills [Celest]
- i -= 9500;
- else if(i<=0 || i>MAX_SKILL_DB)
- continue;
- skill_db[i].unit_id[0] = strtol(split[1],NULL,16);
- skill_db[i].unit_id[1] = strtol(split[2],NULL,16);
- skill_split_atoi(split[3],skill_db[i].unit_layout_type);
- skill_db[i].unit_range = atoi(split[4]);
- skill_db[i].unit_interval = atoi(split[5]);
-
- if( strcmpi(split[6],"noenemy")==0 ) skill_db[i].unit_target=BCT_NOENEMY;
- else if( strcmpi(split[6],"friend")==0 ) skill_db[i].unit_target=BCT_NOENEMY;
- else if( strcmpi(split[6],"party")==0 ) skill_db[i].unit_target=BCT_PARTY;
- else if( strcmpi(split[6],"all")==0 ) skill_db[i].unit_target=BCT_ALL;
- else if( strcmpi(split[6],"enemy")==0 ) skill_db[i].unit_target=BCT_ENEMY;
- else if( strcmpi(split[6],"self")==0 ) skill_db[i].unit_target=BCT_SELF;
- else skill_db[i].unit_target = strtol(split[6],NULL,16);
-
- skill_db[i].unit_flag = strtol(split[7],NULL,16);
- k++;
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/skill_unit_db.txt");
- ShowStatus(tmp_output);
- skill_init_unit_layout();
-
- /* »‘¢ŒnƒXƒLƒ‹ƒf?ƒ^ƒx?ƒX */
- memset(skill_produce_db,0,sizeof(skill_produce_db));
- for(m=0;m<2;m++){
- fp=fopen(filename[m],"r");
- if(fp==NULL){
- if(m>0)
- continue;
- printf("can't read %s\n",filename[m]);
- return 1;
- }
- k=0;
- while(fgets(line,1020,fp)){
- char *split[6 + MAX_PRODUCE_RESOURCE * 2];
- int x,y;
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(split,0,sizeof(split));
- j = skill_split_str(line,split,(3 + MAX_PRODUCE_RESOURCE * 2));
- if(split[0]==0) //fixed by Lupus
- continue;
- i=atoi(split[0]);
- if(i<=0) continue;
-
- skill_produce_db[k].nameid=i;
- skill_produce_db[k].itemlv=atoi(split[1]);
- skill_produce_db[k].req_skill=atoi(split[2]);
-
- for(x=3,y=0; split[x] && split[x+1] && y<MAX_PRODUCE_RESOURCE; x+=2,y++){
- skill_produce_db[k].mat_id[y]=atoi(split[x]);
- skill_produce_db[k].mat_amount[y]=atoi(split[x+1]);
- }
- k++;
- if(k >= MAX_SKILL_PRODUCE_DB)
- break;
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",k,filename[m]);
- ShowStatus(tmp_output);
- }
-
- memset(skill_arrow_db,0,sizeof(skill_arrow_db));
- fp=fopen("db/create_arrow_db.txt","r");
- if(fp==NULL){
- printf("can't read db/create_arrow_db.txt\n");
- return 1;
- }
- k=0;
- while(fgets(line,1020,fp)){
- char *split[16];
- int x,y;
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(split,0,sizeof(split));
- j = skill_split_str(line,split,13);
- if(split[0]==0) //fixed by Lupus
- continue;
- i=atoi(split[0]);
- if(i<=0)
- continue;
-
- skill_arrow_db[k].nameid=i;
-
- for(x=1,y=0;split[x] && split[x+1] && y<5;x+=2,y++){
- skill_arrow_db[k].cre_id[y]=atoi(split[x]);
- skill_arrow_db[k].cre_amount[y]=atoi(split[x+1]);
- }
- k++;
- if(k >= MAX_SKILL_ARROW_DB)
- break;
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",k,"db/create_arrow_db.txt");
- ShowStatus(tmp_output);
-
- memset(skill_abra_db,0,sizeof(skill_abra_db));
- fp=fopen("db/abra_db.txt","r");
- if(fp==NULL){
- printf("can't read db/abra_db.txt\n");
- return 1;
- }
- k=0;
- while(fgets(line,1020,fp)){
- char *split[16];
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(split,0,sizeof(split));
- j = skill_split_str(line,split,13);
- if(split[0]==0) //fixed by Lupus
- continue;
- i=atoi(split[0]);
- if(i<=0)
- continue;
-
- skill_abra_db[i].req_lv=atoi(split[2]);
- skill_abra_db[i].per=atoi(split[3]);
-
- k++;
- if(k >= MAX_SKILL_ABRA_DB)
- break;
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",k,"db/abra_db.txt");
- ShowStatus(tmp_output);
-
- fp=fopen("db/skill_castnodex_db.txt","r");
- if(fp==NULL){
- printf("can't read db/skill_castnodex_db.txt\n");
- return 1;
- }
- while(fgets(line,1020,fp)){
- char *split[50];
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(split,0,sizeof(split));
- j = skill_split_str(line,split,3);
- if(split[0]==0) //fixed by Lupus
- continue;
- i=atoi(split[0]);
- if (i>=10000 && i<10015) // for guild skills [Celest]
- i -= 9500;
- else if(i<=0 || i>MAX_SKILL_DB)
- continue;
-
- skill_split_atoi(split[1],skill_db[i].castnodex);
- if (!split[2])
- continue;
- skill_split_atoi(split[2],skill_db[i].delaynodex);
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/skill_castnodex_db.txt");
- ShowStatus(tmp_output);
-
- fp=fopen("db/skill_nocast_db.txt","r");
- if(fp==NULL){
- printf("can't read db/skill_nocast_db.txt\n");
- return 1;
- }
- k=0;
- while(fgets(line,1020,fp)){
- char *split[16];
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(split,0,sizeof(split));
- j = skill_split_str(line,split,2);
- if(split[0]==0) //fixed by Lupus
- continue;
- i=atoi(split[0]);
- if (i>=10000 && i<10015) // for guild skills [Celest]
- i -= 9500;
- else if(i<=0 || i>MAX_SKILL_DB)
- continue;
- skill_db[i].nocast=atoi(split[1]);
- k++;
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/skill_nocast_db");
- ShowStatus(tmp_output);
-
- return 0;
-}
-
-/*===============================================
- * For reading leveluseskillspamount.txt [Celest]
- *-----------------------------------------------
- */
-static int skill_read_skillspamount(void)
-{
- char *buf,*p;
- struct skill_db *skill = NULL;
- int s, idx, new_flag=1, level=1, sp=0;
-
- buf=(char *) grfio_reads("data\\leveluseskillspamount.txt",&s);
-
- if(buf==NULL)
- return -1;
-
- buf[s]=0;
- for(p=buf;p-buf<s;){
- char buf2[64];
-
- if (sscanf(p,"%[@]",buf2) == 1) {
- level = 1;
- new_flag = 1;
- } else if (new_flag && sscanf(p,"%[^#]#",buf2) == 1) {
- for (idx=0; skill_names[idx].id != 0; idx++) {
- if (strstr(buf2, skill_names[idx].name) != NULL) {
- skill = &skill_db[ skill_names[idx].id ];
- new_flag = 0;
- break;
- }
- }
- } else if (!new_flag && sscanf(p,"%d#",&sp) == 1) {
- skill->sp[level-1]=sp;
- level++;
- }
-
- p=strchr(p,10);
- if(!p) break;
- p++;
- }
- aFree(buf);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","data\\leveluseskillspamount.txt");
- ShowStatus(tmp_output);
-
- return 0;
-}
-
-void skill_reload(void)
-{
- skill_readdb();
- if (battle_config.skill_sp_override_grffile)
- skill_read_skillspamount();
-}
-
-/*==========================================
- * ƒXƒLƒ‹?ŒW‰Šú‰»?—
- *------------------------------------------
- */
-int do_init_skill(void)
-{
- skill_readdb();
- if (battle_config.skill_sp_override_grffile)
- skill_read_skillspamount();
-
- add_timer_func_list(skill_unit_timer,"skill_unit_timer");
- add_timer_func_list(skill_castend_id,"skill_castend_id");
- add_timer_func_list(skill_castend_pos,"skill_castend_pos");
- add_timer_func_list(skill_timerskill,"skill_timerskill");
- add_timer_interval(gettick()+SKILLUNITTIMER_INVERVAL,skill_unit_timer,0,0,SKILLUNITTIMER_INVERVAL);
-
- return 0;
-}
diff --git a/src/map/skill.h b/src/map/skill.h
deleted file mode 100644
index 67d7a906c..000000000
--- a/src/map/skill.h
+++ /dev/null
@@ -1,731 +0,0 @@
-// $Id: skill.h,v 1.5 2004/12/23 7:43:16 PM Celestia $
-#ifndef _SKILL_H_
-#define _SKILL_H_
-
-#include "map.h"
-
-#define MAX_SKILL_DB 750
-#define MAX_SKILL_PRODUCE_DB 150
-#define MAX_PRODUCE_RESOURCE 7
-#define MAX_SKILL_ARROW_DB 150
-#define MAX_SKILL_ABRA_DB 350
-
-// ƒXƒLƒ‹ƒf?ƒ^ƒx?ƒX
-struct skill_db {
- int range[MAX_SKILL_LEVEL],hit,inf,pl,nk,max;
- int num[MAX_SKILL_LEVEL];
- int cast[MAX_SKILL_LEVEL],delay[MAX_SKILL_LEVEL];
- int upkeep_time[MAX_SKILL_LEVEL],upkeep_time2[MAX_SKILL_LEVEL];
- int castcancel,cast_def_rate;
- int inf2,maxcount,skill_type;
- int blewcount[MAX_SKILL_LEVEL];
- int hp[MAX_SKILL_LEVEL],sp[MAX_SKILL_LEVEL],mhp[MAX_SKILL_LEVEL],hp_rate[MAX_SKILL_LEVEL],sp_rate[MAX_SKILL_LEVEL],zeny[MAX_SKILL_LEVEL];
- int weapon,state,spiritball[MAX_SKILL_LEVEL];
- int itemid[10],amount[10];
- int castnodex[MAX_SKILL_LEVEL];
- int delaynodex[MAX_SKILL_LEVEL];
- int nocast;
- int unit_id[2];
- int unit_layout_type[MAX_SKILL_LEVEL];
- int unit_range;
- int unit_interval;
- int unit_target;
- int unit_flag;
-};
-extern struct skill_db skill_db[MAX_SKILL_DB];
-
-struct skill_name_db {
- int id; // skill id
- char *name; // search strings
- char *desc; // description that shows up for search's
-};
-extern const struct skill_name_db skill_names[];
-
-#define MAX_SKILL_UNIT_LAYOUT 50
-#define MAX_SQUARE_LAYOUT 5 // 11*11‚̃†ƒjƒbƒg”z’u‚ªÅ‘å
-#define MAX_SKILL_UNIT_COUNT ((MAX_SQUARE_LAYOUT*2+1)*(MAX_SQUARE_LAYOUT*2+1))
-struct skill_unit_layout {
- int count;
- int dx[MAX_SKILL_UNIT_COUNT];
- int dy[MAX_SKILL_UNIT_COUNT];
-};
-
-enum {
- UF_DEFNOTENEMY = 0x0001, // defnotenemy Ý’è‚ÅBCT_NOENEMY‚ÉØ‚è‘Ö‚¦
- UF_NOREITERATION = 0x0002, // d•¡’u‚«‹ÖŽ~
- UF_NOFOOTSET = 0x0004, // ‘«Œ³’u‚«‹ÖŽ~
- UF_NOOVERLAP = 0x0008, // ƒ†ƒjƒbƒgŒø‰Ê‚ªd•¡‚µ‚È‚¢
- UF_DANCE = 0x0100, // ƒ_ƒ“ƒXƒXƒLƒ‹
- UF_ENSEMBLE = 0x0200, // ‡‘tƒXƒLƒ‹
-};
-
-// ƒAƒCƒeƒ€ì¬ƒf?ƒ^ƒx?ƒX
-struct skill_produce_db {
- int nameid, trigger;
- int req_skill,itemlv;
- int mat_id[MAX_PRODUCE_RESOURCE],mat_amount[MAX_PRODUCE_RESOURCE];
-};
-extern struct skill_produce_db skill_produce_db[MAX_SKILL_PRODUCE_DB];
-
-// –î쬃f?ƒ^ƒx?ƒX
-struct skill_arrow_db {
- int nameid, trigger;
- int cre_id[5],cre_amount[5];
-};
-extern struct skill_arrow_db skill_arrow_db[MAX_SKILL_ARROW_DB];
-
-// ƒAƒuƒ‰ƒJƒ_ƒuƒ‰ƒf?ƒ^ƒx?ƒX
-struct skill_abra_db {
- int nameid;
- int req_lv;
- int per;
-};
-extern struct skill_abra_db skill_abra_db[MAX_SKILL_ABRA_DB];
-
-extern int enchant_eff[5];
-extern int deluge_eff[5];
-
-struct block_list;
-struct map_session_data;
-struct skill_unit;
-struct skill_unit_group;
-
-int do_init_skill(void);
-
-// ƒXƒLƒ‹ƒf?ƒ^ƒx?ƒX‚ւ̃AƒNƒZƒT
-int skill_get_hit( int id );
-int skill_get_inf( int id );
-int skill_get_pl( int id );
-int skill_get_nk( int id );
-int skill_get_max( int id );
-int skill_get_range( int id , int lv );
-int skill_get_hp( int id ,int lv );
-int skill_get_mhp( int id ,int lv );
-int skill_get_sp( int id ,int lv );
-int skill_get_zeny( int id ,int lv );
-int skill_get_num( int id ,int lv );
-int skill_get_cast( int id ,int lv );
-int skill_get_delay( int id ,int lv );
-int skill_get_time( int id ,int lv );
-int skill_get_time2( int id ,int lv );
-int skill_get_castdef( int id );
-int skill_get_weapontype( int id );
-int skill_get_unit_id(int id,int flag);
-int skill_get_inf2( int id );
-int skill_get_maxcount( int id );
-int skill_get_blewcount( int id ,int lv );
-int skill_get_unit_flag( int id );
-int skill_tree_get_max( int id, int b_class ); // Celest
-
-// ƒXƒLƒ‹‚ÌŽg—p
-int skill_use_id( struct map_session_data *sd, int target_id,
- int skill_num,int skill_lv);
-int skill_use_pos( struct map_session_data *sd,
- int skill_x, int skill_y, int skill_num, int skill_lv);
-
-int skill_castend_map( struct map_session_data *sd,int skill_num, const char *map);
-
-int skill_cleartimerskill(struct block_list *src);
-int skill_addtimerskill(struct block_list *src,unsigned int tick,int target,int x,int y,int skill_id,int skill_lv,int type,int flag);
-
-// ’ljÁ?‰Ê
-int skill_additional_effect( struct block_list* src, struct block_list *bl,int skillid,int skilllv,int attack_type,unsigned int tick);
-
-// ƒ†ƒjƒbƒgƒXƒLƒ‹
-struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,int skilllv,int x,int y,int flag);
-struct skill_unit *skill_initunit(struct skill_unit_group *group,int idx,int x,int y);
-int skill_delunit(struct skill_unit *unit);
-struct skill_unit_group *skill_initunitgroup(struct block_list *src,
- int count,int skillid,int skilllv,int unit_id);
-int skill_delunitgroup(struct skill_unit_group *group);
-int skill_clear_unitgroup(struct block_list *src);
-
-int skill_unit_ondamaged(struct skill_unit *src,struct block_list *bl,
- int damage,unsigned int tick);
-
-int skill_castfix( struct block_list *bl, int time );
-int skill_delayfix( struct block_list *bl, int time );
-int skill_check_unit_range(int m,int x,int y,int skillid, int skilllv);
-int skill_check_unit_range2(struct block_list *bl,int m,int x,int y,int skillid, int skilllv);
-// -- moonsoul (added skill_check_unit_cell)
-int skill_check_unit_cell(int skillid,int m,int x,int y,int unit_id);
-int skill_unit_out_all( struct block_list *bl,unsigned int tick,int range);
-int skill_unit_move(struct block_list *bl,unsigned int tick,int flag);
-int skill_unit_move_unit_group( struct skill_unit_group *group, int m,int dx,int dy);
-
-struct skill_unit_group *skill_check_dancing( struct block_list *src );
-void skill_stop_dancing(struct block_list *src, int flag);
-
-// Guild skills [celest]
-int skill_guildaura_sub (struct block_list *bl,va_list ap);
-
-// ‰r¥ƒLƒƒƒ“ƒZƒ‹
-int skill_castcancel(struct block_list *bl,int type);
-
-int skill_gangsterparadise(struct map_session_data *sd ,int type);
-int skill_check_moonlit (struct block_list *bl, int dx, int dy);
-void skill_brandishspear_first(struct square *tc,int dir,int x,int y);
-void skill_brandishspear_dir(struct square *tc,int dir,int are);
-int skill_autospell(struct map_session_data *md,int skillid);
-void skill_devotion(struct map_session_data *md,int target);
-void skill_devotion2(struct block_list *bl,int crusader);
-int skill_devotion3(struct block_list *bl,int target);
-void skill_devotion_end(struct map_session_data *md,struct map_session_data *sd,int target);
-
-#define skill_calc_heal(bl,skill_lv) (( status_get_lv(bl)+status_get_int(bl) )/8 *(4+ skill_lv*8))
-
-// ‚»‚Ì‘¼
-int skill_check_cloaking(struct block_list *bl);
-
-// ƒXƒe?ƒ^ƒXˆÙí
-int skill_enchant_elemental_end(struct block_list *bl, int type);
-int skillnotok(int skillid, struct map_session_data *sd);
-
-// ƒAƒCƒeƒ€ì¬
-int skill_can_produce_mix( struct map_session_data *sd, int nameid, int trigger );
-int skill_produce_mix( struct map_session_data *sd,
- int nameid, int slot1, int slot2, int slot3 );
-
-int skill_arrow_create( struct map_session_data *sd,int nameid);
-
-// mobƒXƒLƒ‹‚Ì‚½‚ß
-int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag );
-int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag );
-int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skilllv,unsigned int tick,int flag);
-
-// ƒXƒLƒ‹U?ˆêŠ‡?—
-int skill_attack( int attack_type, struct block_list* src, struct block_list *dsrc,
- struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag );
-
-void skill_reload(void);
-
-enum {
- ST_NONE,ST_HIDING,ST_CLOAKING,ST_HIDDEN,ST_RIDING,ST_FALCON,ST_CART,ST_SHIELD,ST_SIGHT,ST_EXPLOSIONSPIRITS,
- ST_RECOV_WEIGHT_RATE,ST_MOVE_ENABLE,ST_WATER,
-};
-
-enum {
- NV_BASIC = 1,
-
- SM_SWORD,
- SM_TWOHAND,
- SM_RECOVERY,
- SM_BASH,
- SM_PROVOKE,
- SM_MAGNUM,
- SM_ENDURE,
-
- MG_SRECOVERY,
- MG_SIGHT,
- MG_NAPALMBEAT,
- MG_SAFETYWALL,
- MG_SOULSTRIKE,
- MG_COLDBOLT,
- MG_FROSTDIVER,
- MG_STONECURSE,
- MG_FIREBALL,
- MG_FIREWALL,
- MG_FIREBOLT,
- MG_LIGHTNINGBOLT,
- MG_THUNDERSTORM,
-
- AL_DP,
- AL_DEMONBANE,
- AL_RUWACH,
- AL_PNEUMA,
- AL_TELEPORT,
- AL_WARP,
- AL_HEAL,
- AL_INCAGI,
- AL_DECAGI,
- AL_HOLYWATER,
- AL_CRUCIS,
- AL_ANGELUS,
- AL_BLESSING,
- AL_CURE,
-
- MC_INCCARRY,
- MC_DISCOUNT,
- MC_OVERCHARGE,
- MC_PUSHCART,
- MC_IDENTIFY,
- MC_VENDING,
- MC_MAMMONITE,
-
- AC_OWL,
- AC_VULTURE,
- AC_CONCENTRATION,
- AC_DOUBLE,
- AC_SHOWER,
-
- TF_DOUBLE,
- TF_MISS,
- TF_STEAL,
- TF_HIDING,
- TF_POISON,
- TF_DETOXIFY,
-
- ALL_RESURRECTION,
-
- KN_SPEARMASTERY,
- KN_PIERCE,
- KN_BRANDISHSPEAR,
- KN_SPEARSTAB,
- KN_SPEARBOOMERANG,
- KN_TWOHANDQUICKEN,
- KN_AUTOCOUNTER,
- KN_BOWLINGBASH,
- KN_RIDING,
- KN_CAVALIERMASTERY,
-
- PR_MACEMASTERY,
- PR_IMPOSITIO,
- PR_SUFFRAGIUM,
- PR_ASPERSIO,
- PR_BENEDICTIO,
- PR_SANCTUARY,
- PR_SLOWPOISON,
- PR_STRECOVERY,
- PR_KYRIE,
- PR_MAGNIFICAT,
- PR_GLORIA,
- PR_LEXDIVINA,
- PR_TURNUNDEAD,
- PR_LEXAETERNA,
- PR_MAGNUS,
-
- WZ_FIREPILLAR,
- WZ_SIGHTRASHER,
- WZ_FIREIVY,
- WZ_METEOR,
- WZ_JUPITEL,
- WZ_VERMILION,
- WZ_WATERBALL,
- WZ_ICEWALL,
- WZ_FROSTNOVA,
- WZ_STORMGUST,
- WZ_EARTHSPIKE,
- WZ_HEAVENDRIVE,
- WZ_QUAGMIRE,
- WZ_ESTIMATION,
-
- BS_IRON,
- BS_STEEL,
- BS_ENCHANTEDSTONE,
- BS_ORIDEOCON,
- BS_DAGGER,
- BS_SWORD,
- BS_TWOHANDSWORD,
- BS_AXE,
- BS_MACE,
- BS_KNUCKLE,
- BS_SPEAR,
- BS_HILTBINDING,
- BS_FINDINGORE,
- BS_WEAPONRESEARCH,
- BS_REPAIRWEAPON,
- BS_SKINTEMPER,
- BS_HAMMERFALL,
- BS_ADRENALINE,
- BS_WEAPONPERFECT,
- BS_OVERTHRUST,
- BS_MAXIMIZE,
-
- HT_SKIDTRAP,
- HT_LANDMINE,
- HT_ANKLESNARE,
- HT_SHOCKWAVE,
- HT_SANDMAN,
- HT_FLASHER,
- HT_FREEZINGTRAP,
- HT_BLASTMINE,
- HT_CLAYMORETRAP,
- HT_REMOVETRAP,
- HT_TALKIEBOX,
- HT_BEASTBANE,
- HT_FALCON,
- HT_STEELCROW,
- HT_BLITZBEAT,
- HT_DETECTING,
- HT_SPRINGTRAP,
-
- AS_RIGHT,
- AS_LEFT,
- AS_KATAR,
- AS_CLOAKING,
- AS_SONICBLOW,
- AS_GRIMTOOTH,
- AS_ENCHANTPOISON,
- AS_POISONREACT,
- AS_VENOMDUST,
- AS_SPLASHER,
-
- NV_FIRSTAID,
- NV_TRICKDEAD,
- SM_MOVINGRECOVERY,
- SM_FATALBLOW,
- SM_AUTOBERSERK,
- AC_MAKINGARROW,
- AC_CHARGEARROW,
- TF_SPRINKLESAND,
- TF_BACKSLIDING,
- TF_PICKSTONE,
- TF_THROWSTONE,
- MC_CARTREVOLUTION,
- MC_CHANGECART,
- MC_LOUD,
- AL_HOLYLIGHT,
- MG_ENERGYCOAT,
-
- NPC_PIERCINGATT,
- NPC_MENTALBREAKER,
- NPC_RANGEATTACK,
- NPC_ATTRICHANGE,
- NPC_CHANGEWATER,
- NPC_CHANGEGROUND,
- NPC_CHANGEFIRE,
- NPC_CHANGEWIND,
- NPC_CHANGEPOISON,
- NPC_CHANGEHOLY,
- NPC_CHANGEDARKNESS,
- NPC_CHANGETELEKINESIS,
- NPC_CRITICALSLASH,
- NPC_COMBOATTACK,
- NPC_GUIDEDATTACK,
- NPC_SELFDESTRUCTION,
- NPC_SPLASHATTACK,
- NPC_SUICIDE,
- NPC_POISON,
- NPC_BLINDATTACK,
- NPC_SILENCEATTACK,
- NPC_STUNATTACK,
- NPC_PETRIFYATTACK,
- NPC_CURSEATTACK,
- NPC_SLEEPATTACK,
- NPC_RANDOMATTACK,
- NPC_WATERATTACK,
- NPC_GROUNDATTACK,
- NPC_FIREATTACK,
- NPC_WINDATTACK,
- NPC_POISONATTACK,
- NPC_HOLYATTACK,
- NPC_DARKNESSATTACK,
- NPC_TELEKINESISATTACK,
- NPC_MAGICALATTACK,
- NPC_METAMORPHOSIS,
- NPC_PROVOCATION,
- NPC_SMOKING,
- NPC_SUMMONSLAVE,
- NPC_EMOTION,
- NPC_TRANSFORMATION,
- NPC_BLOODDRAIN,
- NPC_ENERGYDRAIN,
- NPC_KEEPING,
- NPC_DARKBREATH,
- NPC_DARKBLESSING,
- NPC_BARRIER,
- NPC_DEFENDER,
- NPC_LICK,
- NPC_HALLUCINATION,
- NPC_REBIRTH,
- NPC_SUMMONMONSTER,
-
- RG_SNATCHER,
- RG_STEALCOIN,
- RG_BACKSTAP,
- RG_TUNNELDRIVE,
- RG_RAID,
- RG_STRIPWEAPON,
- RG_STRIPSHIELD,
- RG_STRIPARMOR,
- RG_STRIPHELM,
- RG_INTIMIDATE,
- RG_GRAFFITI,
- RG_FLAGGRAFFITI,
- RG_CLEANER,
- RG_GANGSTER,
- RG_COMPULSION,
- RG_PLAGIARISM,
-
- AM_AXEMASTERY,
- AM_LEARNINGPOTION,
- AM_PHARMACY,
- AM_DEMONSTRATION,
- AM_ACIDTERROR,
- AM_POTIONPITCHER,
- AM_CANNIBALIZE,
- AM_SPHEREMINE,
- AM_CP_WEAPON,
- AM_CP_SHIELD,
- AM_CP_ARMOR,
- AM_CP_HELM,
- AM_BIOETHICS,
- AM_BIOTECHNOLOGY,
- AM_CREATECREATURE,
- AM_CULTIVATION,
- AM_FLAMECONTROL,
- AM_CALLHOMUN,
- AM_REST,
- AM_DRILLMASTER,
- AM_HEALHOMUN,
- AM_RESURRECTHOMUN,
-
- CR_TRUST,
- CR_AUTOGUARD,
- CR_SHIELDCHARGE,
- CR_SHIELDBOOMERANG,
- CR_REFLECTSHIELD,
- CR_HOLYCROSS,
- CR_GRANDCROSS,
- CR_DEVOTION,
- CR_PROVIDENCE,
- CR_DEFENDER,
- CR_SPEARQUICKEN,
-
- MO_IRONHAND,
- MO_SPIRITSRECOVERY,
- MO_CALLSPIRITS,
- MO_ABSORBSPIRITS,
- MO_TRIPLEATTACK,
- MO_BODYRELOCATION,
- MO_DODGE,
- MO_INVESTIGATE,
- MO_FINGEROFFENSIVE,
- MO_STEELBODY,
- MO_BLADESTOP,
- MO_EXPLOSIONSPIRITS,
- MO_EXTREMITYFIST,
- MO_CHAINCOMBO,
- MO_COMBOFINISH,
-
- SA_ADVANCEDBOOK,
- SA_CASTCANCEL,
- SA_MAGICROD,
- SA_SPELLBREAKER,
- SA_FREECAST,
- SA_AUTOSPELL,
- SA_FLAMELAUNCHER,
- SA_FROSTWEAPON,
- SA_LIGHTNINGLOADER,
- SA_SEISMICWEAPON,
- SA_DRAGONOLOGY,
- SA_VOLCANO,
- SA_DELUGE,
- SA_VIOLENTGALE,
- SA_LANDPROTECTOR,
- SA_DISPELL,
- SA_ABRACADABRA,
- SA_MONOCELL,
- SA_CLASSCHANGE,
- SA_SUMMONMONSTER,
- SA_REVERSEORCISH,
- SA_DEATH,
- SA_FORTUNE,
- SA_TAMINGMONSTER,
- SA_QUESTION,
- SA_GRAVITY,
- SA_LEVELUP,
- SA_INSTANTDEATH,
- SA_FULLRECOVERY,
- SA_COMA,
-
- BD_ADAPTATION,
- BD_ENCORE,
- BD_LULLABY,
- BD_RICHMANKIM,
- BD_ETERNALCHAOS,
- BD_DRUMBATTLEFIELD,
- BD_RINGNIBELUNGEN,
- BD_ROKISWEIL,
- BD_INTOABYSS,
- BD_SIEGFRIED,
- BD_RAGNAROK,
-
- BA_MUSICALLESSON,
- BA_MUSICALSTRIKE,
- BA_DISSONANCE,
- BA_FROSTJOKE,
- BA_WHISTLE,
- BA_ASSASSINCROSS,
- BA_POEMBRAGI,
- BA_APPLEIDUN,
-
- DC_DANCINGLESSON,
- DC_THROWARROW,
- DC_UGLYDANCE,
- DC_SCREAM,
- DC_HUMMING,
- DC_DONTFORGETME,
- DC_FORTUNEKISS,
- DC_SERVICEFORYOU,
-
- WE_MALE = 334,
- WE_FEMALE,
- WE_CALLPARTNER,
-
- NPC_SELFDESTRUCTION2 = 331,
- ITM_TOMAHAWK = 337,
- NPC_DARKCROSS = 338,
- NPC_DARKGRANDCROSS,
- NPC_DARKSOULSTRIKE,
- NPC_DARKJUPITEL,
- // temporary names for mob skills [Celest]
- NPC_BIND,
- NPC_BREAKWEAPON,
- NPC_BREAKARMOR,
- NPC_BREAKHELM,
- NPC_BREAKSHIELD,
- NPC_UNDEADATTACK,
-
- NPC_RUNAWAY = 348,
- NPC_EXPLOSIONSPIRITS,
- NPC_INCAGI,
-
- NPC_RECALL = 354,
-
- LK_AURABLADE = 355,
- LK_PARRYING,
- LK_CONCENTRATION,
- LK_TENSIONRELAX,
- LK_BERSERK,
- LK_FURY,
- HP_ASSUMPTIO,
- HP_BASILICA,
- HP_MEDITATIO,
- HW_SOULDRAIN,
- HW_MAGICCRASHER,
- HW_MAGICPOWER,
- PA_PRESSURE,
- PA_SACRIFICE,
- PA_GOSPEL,
- CH_PALMSTRIKE,
- CH_TIGERFIST,
- CH_CHAINCRUSH,
- PF_HPCONVERSION,
- PF_SOULCHANGE,
- PF_SOULBURN,
- ASC_KATAR,
- ASC_HALLUCINATION,
- ASC_EDP,
- ASC_BREAKER,
- SN_SIGHT,
- SN_FALCONASSAULT,
- SN_SHARPSHOOTING,
- SN_WINDWALK,
- WS_MELTDOWN,
- WS_CREATECOIN,
- WS_CREATENUGGET,
- WS_CARTBOOST,
- WS_SYSTEMCREATE,
- ST_CHASEWALK,
- ST_REJECTSWORD,
- ST_STEALBACKPACK,
- CR_ALCHEMY,
- CR_SYNTHESISPOTION,
- CG_ARROWVULCAN,
- CG_MOONLIT,
- CG_MARIONETTE,
- LK_SPIRALPIERCE,
- LK_HEADCRUSH,
- LK_JOINTBEAT,
- HW_NAPALMVULCAN,
- CH_SOULCOLLECT,
- PF_MINDBREAKER,
- PF_MEMORIZE,
- PF_FOGWALL,
- PF_SPIDERWEB,
- ASC_METEORASSAULT,
- ASC_CDP,
- WE_BABY,
- WE_CALLPARENT,
- WE_CALLBABY,
-
- TK_RUN = 411,
- TK_READYSTORM,
- TK_STORMKICK,
- TK_READYDOWN,
- TK_DOWNKICK,
- TK_READYTURN,
- TK_TURNKICK,
- TK_READYCOUNTER,
- TK_COUNTER,
- TK_DODGE,
- TK_JUMPKICK,
- TK_HPTIME,
- TK_SPTIME,
- TK_POWER,
- TK_SEVENWIND,
- TK_HIGHJUMP,
- SG_FEEL,
- SG_SUN_WARM,
- SG_MOON_WARM,
- SG_STAR_WARM,
- SG_SUN_COMFORT,
- SG_MOON_COMFORT,
- SG_STAR_COMFORT,
- SG_HATE,
- SG_SUN_ANGER,
- SG_MOON_ANGER,
- SG_STAR_ANGER,
- SG_SUN_BLESS,
- SG_MOON_BLESS,
- SG_STAR_BLESS,
- SG_DEVIL,
- SG_FRIEND,
- SG_KNOWLEDGE,
- SG_FUSION,
- SL_ALCHEMIST,
- AM_BERSERKPITCHER,
- SL_MONK,
- SL_STAR,
- SL_SAGE,
- SL_CRUSADER,
- SL_SUPERNOVICE,
- SL_KNIGHT,
- SL_WIZARD,
- SL_PRIEST,
- SL_BARDDANCER,
- SL_ROGUE,
- SL_ASSASIN,
- SL_BLACKSMITH,
- BS_ADRENALINE2,
- SL_HUNTER,
- SL_SOULLINKER,
- SL_KAIZEL,
- SL_KAAHI,
- SL_KAUPE,
- SL_KAITE,
- SL_KAINA,
- SL_STIN,
- SL_STUN,
- SL_SMA,
- SL_SWOO,
- SL_SKE,
- SL_SKA,
-
- ST_PRESERVE = 475,
- ST_FULLSTRIP,
- WS_WEAPONREFINE,
- CR_SLIMPITCHER,
- CR_FULLPROTECTION,
-
-
-// moved to common/mmo.h
-/* GD_APPROVAL=10000,
- GD_KAFRACONTACT=10001,
- GD_GUARDIANRESEARCH=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,*/
-};
-
-#endif
diff --git a/src/map/status.c b/src/map/status.c
deleted file mode 100644
index a9967d956..000000000
--- a/src/map/status.c
+++ /dev/null
@@ -1,5159 +0,0 @@
-
-// ƒXƒe[ƒ^ƒXŒvŽZAó‘ÔˆÙ툗
-#include <time.h>
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <memory.h>
-
-#include "pc.h"
-#include "map.h"
-#include "pet.h"
-#include "mob.h"
-#include "clif.h"
-#include "guild.h"
-#include "skill.h"
-#include "itemdb.h"
-#include "battle.h"
-#include "chrif.h"
-#include "status.h"
-
-#include "timer.h"
-#include "nullpo.h"
-#include "script.h"
-#include "showmsg.h"
-
-/* ƒXƒLƒ‹”Ô?„ƒXƒe?ƒ^ƒXˆÙí”Ô??Š·ƒe?ƒuƒ‹ */
-int SkillStatusChangeTable[]={ /* status.h‚Ìenum‚ÌSC_***‚Æ‚ ‚킹‚邱‚Æ */
-/* 0- */
- -1,-1,-1,-1,-1,-1,
- SC_PROVOKE, /* ƒvƒƒ{ƒbƒN */
- -1, 1,-1,
-/* 10- */
- SC_SIGHT, /* ƒTƒCƒg */
- -1,
- SC_SAFETYWALL, /* ƒZ[ƒtƒeƒB[ƒEƒH[ƒ‹ */
- -1,-1,-1,
- SC_FREEZE, /* ƒtƒƒXƒgƒ_ƒCƒo? */
- SC_STONE, /* ƒXƒg?ƒ“ƒJ?ƒX */
- -1,-1,
-/* 20- */
- -1,-1,-1,-1,
- SC_RUWACH, /* ƒ‹ƒAƒt */
- SC_PNEUMA, /* ƒjƒ…[ƒ} */
- -1,-1,-1,
- SC_INCREASEAGI, /* ‘¬“x?‰Á */
-/* 30- */
- SC_DECREASEAGI, /* ‘¬“xŒ¸­ */
- -1,
- SC_SIGNUMCRUCIS, /* ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX */
- SC_ANGELUS, /* ƒGƒ“ƒWƒFƒ‰ƒX */
- SC_BLESSING, /* ƒuƒŒƒbƒVƒ“ƒO */
- -1,-1,-1,-1,-1,
-/* 40- */
- -1,-1,-1,-1,-1,
- SC_CONCENTRATE, /* W’†—ÍŒüã */
- -1,-1,-1,-1,
-/* 50- */
- -1,
- SC_HIDING, /* ƒnƒCƒfƒBƒ“ƒO */
- -1,-1,-1,-1,-1,-1,-1,-1,
-/* 60- */
- SC_TWOHANDQUICKEN, /* 2HQ */
- SC_AUTOCOUNTER,
- -1,-1,-1,-1,
- SC_IMPOSITIO, /* ƒCƒ“ƒ|ƒVƒeƒBƒIƒ}ƒkƒX */
- SC_SUFFRAGIUM, /* ƒTƒtƒ‰ƒMƒEƒ€ */
- SC_ASPERSIO, /* ƒAƒXƒyƒ‹ƒVƒI */
- SC_BENEDICTIO, /* ¹?~•Ÿ */
-/* 70- */
- -1,
- SC_SLOWPOISON,
- -1,
- SC_KYRIE, /* ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“ */
- SC_MAGNIFICAT, /* ƒ}ƒOƒjƒtƒBƒJ?ƒg */
- SC_GLORIA, /* ƒOƒƒŠƒA */
- SC_DIVINA, /* ƒŒƒbƒNƒXƒfƒBƒr?ƒi */
- -1,
- SC_AETERNA, /* ƒŒƒbƒNƒXƒG?ƒeƒ‹ƒi */
- -1,
-/* 80- */
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-/* 90- */
- -1,-1,
- SC_QUAGMIRE, /* ƒNƒ@ƒOƒ}ƒCƒA */
- -1,-1,-1,-1,-1,-1,-1,
-/* 100- */
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-/* 110- */
- -1,
- SC_ADRENALINE, /* ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ… */
- SC_WEAPONPERFECTION,/* ƒEƒFƒ|ƒ“ƒp?ƒtƒFƒNƒVƒ‡ƒ“ */
- SC_OVERTHRUST, /* ƒI?ƒo?ƒgƒ‰ƒXƒg */
- SC_MAXIMIZEPOWER, /* ƒ}ƒLƒVƒ}ƒCƒYƒpƒ? */
- -1,-1,-1,-1,-1,
-/* 120- */
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-/* 130- */
- -1,-1,-1,-1,-1,
- SC_CLOAKING, /* ƒNƒ?ƒLƒ“ƒO */
- SC_STAN, /* ƒ\ƒjƒbƒNƒuƒ? */
- -1,
- SC_ENCPOISON, /* ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“ */
- SC_POISONREACT, /* ƒ|ƒCƒYƒ“ƒŠƒAƒNƒg */
-/* 140- */
- SC_POISON, /* ƒxƒmƒ€ƒ_ƒXƒg */
- SC_SPLASHER, /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ? */
- -1,
- SC_TRICKDEAD, /* Ž€‚ñ‚¾‚Ó‚è */
- -1,-1,SC_AUTOBERSERK,-1,-1,-1,
-/* 150- */
- -1,-1,-1,-1,-1,
- SC_LOUD, /* ƒ‰ƒEƒhƒ{ƒCƒX */
- -1,
- SC_ENERGYCOAT, /* ƒGƒiƒW?ƒR?ƒg */
- -1,-1,
-/* 160- */
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,
- SC_SELFDESTRUCTION,
- -1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,
- SC_KEEPING,
- -1,-1,
- SC_BARRIER,
- -1,-1,
- SC_HALLUCINATION,
- -1,-1,
-/* 210- */
- -1,-1,-1,-1,-1,
- SC_STRIPWEAPON,
- SC_STRIPSHIELD,
- SC_STRIPARMOR,
- SC_STRIPHELM,
- -1,
-/* 220- */
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-/* 230- */
- -1,-1,-1,-1,
- SC_CP_WEAPON,
- SC_CP_SHIELD,
- SC_CP_ARMOR,
- SC_CP_HELM,
- -1,-1,
-/* 240- */
- -1,-1,-1,-1,-1,-1,-1,-1,-1,
- SC_AUTOGUARD,
-/* 250- */
- -1,-1,
- SC_REFLECTSHIELD,
- -1,-1,
- SC_DEVOTION,
- SC_PROVIDENCE,
- SC_DEFENDER,
- SC_SPEARSQUICKEN,
- -1,
-/* 260- */
- -1,-1,-1,-1,-1,-1,-1,-1,
- SC_STEELBODY,
- SC_BLADESTOP_WAIT,
-/* 270- */
- SC_EXPLOSIONSPIRITS,
- SC_EXTREMITYFIST,
- -1,-1,-1,-1,
- SC_MAGICROD,
- -1,-1,-1,
-/* 280- */
- SC_FLAMELAUNCHER,
- SC_FROSTWEAPON,
- SC_LIGHTNINGLOADER,
- SC_SEISMICWEAPON,
- -1,
- SC_VOLCANO,
- SC_DELUGE,
- SC_VIOLENTGALE,
- SC_LANDPROTECTOR,
- -1,
-/* 290- */
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-/* 300- */
- -1,-1,-1,-1,-1,-1,
- SC_LULLABY,
- SC_RICHMANKIM,
- SC_ETERNALCHAOS,
- SC_DRUMBATTLE,
-/* 310- */
- SC_NIBELUNGEN,
- SC_ROKISWEIL,
- SC_INTOABYSS,
- SC_SIEGFRIED,
- -1,-1,-1,
- SC_DISSONANCE,
- -1,
- SC_WHISTLE,
-/* 320- */
- SC_ASSNCROS,
- SC_POEMBRAGI,
- SC_APPLEIDUN,
- -1,-1,
- SC_UGLYDANCE,
- -1,
- SC_HUMMING,
- SC_DONTFORGETME,
- SC_FORTUNE,
-/* 330- */
- SC_SERVICE4U,
- SC_SELFDESTRUCTION,
- -1,-1,-1,-1,-1,-1,-1,-1,
-/* 340- */
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-/* 350- */
- -1,-1,-1,-1,-1,
- SC_AURABLADE,
- SC_PARRYING,
- SC_CONCENTRATION,
- SC_TENSIONRELAX,
- SC_BERSERK,
-/* 360- */
- SC_BERSERK,
- SC_ASSUMPTIO,
- SC_BASILICA,
- -1,-1,-1,
- SC_MAGICPOWER,
- -1,
- SC_SACRIFICE,
- SC_GOSPEL,
-/* 370- */
- -1,-1,-1,-1,-1,-1,-1,-1,
- SC_EDP,
- -1,
-/* 380- */
- SC_TRUESIGHT,
- -1,-1,
- SC_WINDWALK,
- SC_MELTDOWN,
- -1,-1,
- SC_CARTBOOST,
- -1,
- SC_CHASEWALK,
-/* 390- */
- SC_REJECTSWORD,
- -1,-1,-1,-1,
- SC_MOONLIT,
- SC_MARIONETTE,
- -1,
- SC_BLEEDING,
- SC_JOINTBEAT,
-/* 400 */
- -1,-1,
- SC_MINDBREAKER,
- SC_MEMORIZE,
- SC_FOGWALL,
- SC_SPIDERWEB,
- -1,-1,
- SC_BABY,
- -1,
-/* 410- */
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-};
-
-static int max_weight_base[MAX_PC_CLASS];
-static int hp_coefficient[MAX_PC_CLASS];
-static int hp_coefficient2[MAX_PC_CLASS];
-static int hp_sigma_val[MAX_PC_CLASS][MAX_LEVEL];
-static int sp_coefficient[MAX_PC_CLASS];
-static int aspd_base[MAX_PC_CLASS][20];
-static int refinebonus[5][3]; // ¸˜Bƒ{[ƒiƒXƒe[ƒuƒ‹(refine_db.txt)
-int percentrefinery[5][10]; // ¸˜B¬Œ÷—¦(refine_db.txt)
-static int atkmods[3][20]; // •ŠíATKƒTƒCƒYC³(size_fix.txt)
-static char job_bonus[3][MAX_PC_CLASS][MAX_LEVEL];
-
-int current_equip_item_index; //Contains inventory index of an equipped item. To pass it into the EQUP_SCRIPT [Lupus]
-//we need it for new cards 15 Feb 2005, to check if the combo cards are insrerted into the CURRENT weapon only
-//to avoid cards exploits
-
-/*==========================================
- * ¸˜Bƒ{[ƒiƒX
- *------------------------------------------
- */
-int status_getrefinebonus(int lv,int type)
-{
- if (lv >= 0 && lv < 5 && type >= 0 && type < 3)
- return refinebonus[lv][type];
- return 0;
-}
-
-/*==========================================
- * ¸˜B¬Œ÷—¦
- *------------------------------------------
- */
-int status_percentrefinery(struct map_session_data *sd,struct item *item)
-{
- int percent;
-
- nullpo_retr(0, item);
- percent=percentrefinery[itemdb_wlv(item->nameid)][(int)item->refine];
-
- percent += pc_checkskill(sd,BS_WEAPONRESEARCH); // •ŠíŒ¤‹†ƒXƒLƒ‹ŠŽ
-
- // Šm—¦‚Ì—LŒø”͈̓`ƒFƒbƒN
- if( percent > 100 ){
- percent = 100;
- }
- if( percent < 0 ){
- percent = 0;
- }
-
- return percent;
-}
-
-/*==========================================
- * ƒpƒ‰ƒ[ƒ^ŒvŽZ
- * first==0‚ÌŽžAŒvŽZ‘Îۂ̃pƒ‰ƒ[ƒ^‚ªŒÄ‚Ño‚µ‘O‚©‚ç
- * •Ï ‰»‚µ‚½ê‡Ž©“®‚Åsend‚·‚邪A
- * ”\“®“I‚ɕω»‚³‚¹‚½ƒpƒ‰ƒ[ƒ^‚ÍŽ©‘O‚Åsend‚·‚é‚悤‚É
- *------------------------------------------
- */
-
-int status_calc_pc(struct map_session_data* sd,int first)
-{
- int b_speed,b_max_hp,b_max_sp,b_hp,b_sp,b_weight,b_max_weight,b_paramb[6],b_parame[6],b_hit,b_flee;
- int b_aspd,b_watk,b_def,b_watk2,b_def2,b_flee2,b_critical,b_attackrange,b_matk1,b_matk2,b_mdef,b_mdef2,b_class;
- int b_base_atk;
- struct skill b_skill[MAX_SKILL];
- int i,bl,index;
- int skill,aspd_rate,wele,wele_,def_ele,refinedef=0;
- int pele=0,pdef_ele=0;
- int str,dstr,dex;
- struct pc_base_job s_class;
-
- nullpo_retr(0, sd);
-
- //?¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
- s_class = pc_calc_base_job(sd->status.class_);
-
- b_speed = sd->speed;
- b_max_hp = sd->status.max_hp;
- b_max_sp = sd->status.max_sp;
- b_hp = sd->status.hp;
- b_sp = sd->status.sp;
- b_weight = sd->weight;
- b_max_weight = sd->max_weight;
- memcpy(b_paramb,&sd->paramb,sizeof(b_paramb));
- memcpy(b_parame,&sd->paramc,sizeof(b_parame));
- memcpy(b_skill,&sd->status.skill,sizeof(b_skill));
- b_hit = sd->hit;
- b_flee = sd->flee;
- b_aspd = sd->aspd;
- b_watk = sd->watk;
- b_def = sd->def;
- b_watk2 = sd->watk2;
- b_def2 = sd->def2;
- b_flee2 = sd->flee2;
- b_critical = sd->critical;
- b_attackrange = sd->attackrange;
- b_matk1 = sd->matk1;
- b_matk2 = sd->matk2;
- b_mdef = sd->mdef;
- b_mdef2 = sd->mdef2;
- b_class = sd->view_class;
- sd->view_class = sd->status.class_;
- b_base_atk = sd->base_atk;
-
- pc_calc_skilltree(sd); // ƒXƒLƒ‹ƒcƒŠ?‚ÌŒvŽZ
-
- sd->max_weight = max_weight_base[s_class.job]+sd->status.str*300;
-
- if(first&1) {
- sd->weight=0;
- for(i=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid==0 || sd->inventory_data[i] == NULL)
- continue;
- sd->weight += sd->inventory_data[i]->weight*sd->status.inventory[i].amount;
- }
- sd->cart_max_weight=battle_config.max_cart_weight;
- sd->cart_weight=0;
- sd->cart_max_num=MAX_CART;
- sd->cart_num=0;
- for(i=0;i<MAX_CART;i++){
- if(sd->status.cart[i].nameid==0)
- continue;
- sd->cart_weight+=itemdb_weight(sd->status.cart[i].nameid)*sd->status.cart[i].amount;
- sd->cart_num++;
- }
- }
-
- memset(sd->paramb,0,sizeof(sd->paramb));
- memset(sd->parame,0,sizeof(sd->parame));
- sd->hit = 0;
- sd->flee = 0;
- sd->flee2 = 0;
- sd->critical = 0;
- sd->aspd = 0;
- sd->watk = 0;
- sd->def = 0;
- sd->mdef = 0;
- sd->watk2 = 0;
- sd->def2 = 0;
- sd->mdef2 = 0;
- sd->status.max_hp = 0;
- sd->status.max_sp = 0;
- sd->attackrange = 0;
- sd->attackrange_ = 0;
- sd->atk_ele = 0;
- sd->def_ele = 0;
- sd->star =0;
- sd->overrefine =0;
- sd->matk1 =0;
- sd->matk2 =0;
- sd->speed = DEFAULT_WALK_SPEED ;
- sd->hprate=battle_config.hp_rate;
- sd->sprate=battle_config.sp_rate;
- sd->castrate=100;
- sd->delayrate=100;
- sd->dsprate=100;
- sd->base_atk=0;
- sd->arrow_atk=0;
- sd->arrow_ele=0;
- sd->arrow_hit=0;
- sd->arrow_range=0;
- sd->nhealhp=sd->nhealsp=sd->nshealhp=sd->nshealsp=sd->nsshealhp=sd->nsshealsp=0;
- memset(sd->addele,0,sizeof(sd->addele));
- memset(sd->addrace,0,sizeof(sd->addrace));
- memset(sd->addsize,0,sizeof(sd->addsize));
- memset(sd->addele_,0,sizeof(sd->addele_));
- memset(sd->addrace_,0,sizeof(sd->addrace_));
- memset(sd->addsize_,0,sizeof(sd->addsize_));
- memset(sd->subele,0,sizeof(sd->subele));
- memset(sd->subrace,0,sizeof(sd->subrace));
- memset(sd->addeff,0,sizeof(sd->addeff));
- memset(sd->addeff2,0,sizeof(sd->addeff2));
- memset(sd->reseff,0,sizeof(sd->reseff));
- memset(&sd->special_state,0,sizeof(sd->special_state));
- memset(sd->weapon_coma_ele,0,sizeof(sd->weapon_coma_ele));
- memset(sd->weapon_coma_race,0,sizeof(sd->weapon_coma_race));
- memset(sd->weapon_atk,0,sizeof(sd->weapon_atk));
- memset(sd->weapon_atk_rate,0,sizeof(sd->weapon_atk_rate));
-
- sd->watk_ = 0; //“ñ“—¬—p(?)
- sd->watk_2 = 0;
- sd->atk_ele_ = 0;
- sd->star_ = 0;
- sd->overrefine_ = 0;
-
- sd->aspd_rate = 100;
- sd->speed_rate = 100;
- sd->hprecov_rate = 100;
- sd->sprecov_rate = 100;
- sd->critical_def = 0;
- sd->double_rate = 0;
- sd->near_attack_def_rate = sd->long_attack_def_rate = 0;
- sd->atk_rate = sd->matk_rate = 100;
- sd->ignore_def_ele = sd->ignore_def_race = 0;
- sd->ignore_def_ele_ = sd->ignore_def_race_ = 0;
- sd->ignore_mdef_ele = sd->ignore_mdef_race = 0;
- sd->arrow_cri = 0;
- sd->magic_def_rate = sd->misc_def_rate = 0;
- memset(sd->arrow_addele,0,sizeof(sd->arrow_addele));
- memset(sd->arrow_addrace,0,sizeof(sd->arrow_addrace));
- memset(sd->arrow_addsize,0,sizeof(sd->arrow_addsize));
- memset(sd->arrow_addeff,0,sizeof(sd->arrow_addeff));
- memset(sd->arrow_addeff2,0,sizeof(sd->arrow_addeff2));
- memset(sd->magic_addele,0,sizeof(sd->magic_addele));
- memset(sd->magic_addrace,0,sizeof(sd->magic_addrace));
- memset(sd->magic_subrace,0,sizeof(sd->magic_subrace));
- sd->perfect_hit = 0;
- sd->critical_rate = sd->hit_rate = sd->flee_rate = sd->flee2_rate = 100;
- sd->def_rate = sd->def2_rate = sd->mdef_rate = sd->mdef2_rate = 100;
- sd->def_ratio_atk_ele = sd->def_ratio_atk_ele_ = 0;
- sd->def_ratio_atk_race = sd->def_ratio_atk_race_ = 0;
- sd->get_zeny_num = 0;
- sd->add_damage_class_count = sd->add_damage_class_count_ = sd->add_magic_damage_class_count = 0;
- sd->add_def_class_count = sd->add_mdef_class_count = 0;
- sd->monster_drop_item_count = 0;
- memset(sd->add_damage_classrate,0,sizeof(sd->add_damage_classrate));
- memset(sd->add_damage_classrate_,0,sizeof(sd->add_damage_classrate_));
- memset(sd->add_magic_damage_classrate,0,sizeof(sd->add_magic_damage_classrate));
- memset(sd->add_def_classrate,0,sizeof(sd->add_def_classrate));
- memset(sd->add_mdef_classrate,0,sizeof(sd->add_mdef_classrate));
- memset(sd->monster_drop_race,0,sizeof(sd->monster_drop_race));
- memset(sd->monster_drop_itemrate,0,sizeof(sd->monster_drop_itemrate));
- sd->speed_add_rate = sd->aspd_add_rate = 100;
- sd->double_add_rate = sd->perfect_hit_add = sd->get_zeny_add_num = 0;
- sd->splash_range = sd->splash_add_range = 0;
- sd->autospell_id = sd->autospell_lv = sd->autospell_rate = 0;
- sd->hp_drain_rate = sd->hp_drain_per = sd->sp_drain_rate = sd->sp_drain_per = 0;
- sd->hp_drain_rate_ = sd->hp_drain_per_ = sd->sp_drain_rate_ = sd->sp_drain_per_ = 0;
- sd->short_weapon_damage_return = sd->long_weapon_damage_return = 0;
- sd->magic_damage_return = 0; //AppleGirl Was Here
- sd->random_attack_increase_add = sd->random_attack_increase_per = 0;
- sd->hp_drain_value = sd->hp_drain_value_ = sd->sp_drain_value = sd->sp_drain_value_ = 0;
- sd->unbreakable_equip = 0;
-
- sd->break_weapon_rate = sd->break_armor_rate = 0;
- sd->add_steal_rate = 0;
- sd->crit_atk_rate = 0;
- sd->no_regen = 0;
- sd->unstripable_equip = 0;
- sd->autospell2_id = sd->autospell2_lv = sd->autospell2_rate = 0;
- memset(sd->critaddrace,0,sizeof(sd->critaddrace));
- memset(sd->addeff3,0,sizeof(sd->addeff3));
- memset(sd->addeff3_type,0,sizeof(sd->addeff3_type));
- memset(sd->skillatk,0,sizeof(sd->skillatk));
- sd->add_damage_class_count = sd->add_damage_class_count_ = sd->add_magic_damage_class_count = 0;
- sd->add_def_class_count = sd->add_mdef_class_count = 0;
- sd->add_damage_class_count2 = 0;
- memset(sd->add_damage_classid,0,sizeof(sd->add_damage_classid));
- memset(sd->add_damage_classid_,0,sizeof(sd->add_damage_classid_));
- memset(sd->add_magic_damage_classid,0,sizeof(sd->add_magic_damage_classid));
- memset(sd->add_damage_classrate,0,sizeof(sd->add_damage_classrate));
- memset(sd->add_damage_classrate_,0,sizeof(sd->add_damage_classrate_));
- memset(sd->add_magic_damage_classrate,0,sizeof(sd->add_magic_damage_classrate));
- memset(sd->add_def_classid,0,sizeof(sd->add_def_classid));
- memset(sd->add_def_classrate,0,sizeof(sd->add_def_classrate));
- memset(sd->add_mdef_classid,0,sizeof(sd->add_mdef_classid));
- memset(sd->add_mdef_classrate,0,sizeof(sd->add_mdef_classrate));
- memset(sd->add_damage_classid2,0,sizeof(sd->add_damage_classid2));
- memset(sd->add_damage_classrate2,0,sizeof(sd->add_damage_classrate2));
- sd->sp_gain_value = 0;
- sd->ignore_def_mob = sd->ignore_def_mob_ = 0;
- sd->hp_loss_rate = sd->hp_loss_value = sd->hp_loss_type = 0;
- memset(sd->addrace2,0,sizeof(sd->addrace2));
- memset(sd->addrace2_,0,sizeof(sd->addrace2_));
- sd->hp_gain_value = sd->sp_drain_type = 0;
- memset(sd->subsize,0,sizeof(sd->subsize));
- memset(sd->unequip_losehp,0,sizeof(sd->unequip_losehp));
- memset(sd->unequip_losesp,0,sizeof(sd->unequip_losesp));
- memset(sd->subrace2,0,sizeof(sd->subrace2));
- memset(sd->expaddrace,0,sizeof(sd->expaddrace));
- memset(sd->sp_gain_race,0,sizeof(sd->sp_gain_race));
-
- if(!sd->disguiseflag && sd->disguise) {
- sd->disguise=0;
- clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
- clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield);
- clif_changelook(&sd->bl,LOOK_HEAD_BOTTOM,sd->status.head_bottom);
- clif_changelook(&sd->bl,LOOK_HEAD_TOP,sd->status.head_top);
- clif_changelook(&sd->bl,LOOK_HEAD_MID,sd->status.head_mid);
- clif_clearchar(&sd->bl, 9);
- pc_setpos(sd, sd->mapname, sd->bl.x, sd->bl.y, 3);
- }
-
- if (sd->status.guild_id > 0) {
- struct guild *g = guild_search(sd->status.guild_id);
- if (g && strcmp(sd->status.name,g->master)==0)
- sd->state.gmaster_flag = (int)g;
- }
-
- for(i=0;i<10;i++) {
- current_equip_item_index = index = sd->equip_index[i]; //We pass INDEX to current_equip_item_index - for EQUIP_SCRIPT (new cards solution) [Lupus]
- if(index < 0)
- continue;
- if(i == 9 && sd->equip_index[8] == index)
- continue;
- if(i == 5 && sd->equip_index[4] == index)
- continue;
- if(i == 6 && (sd->equip_index[5] == index || sd->equip_index[4] == index))
- continue;
-
- if(sd->inventory_data[index]) {
- if(sd->inventory_data[index]->type == 4) {
- if(sd->status.inventory[index].card[0]!=0x00ff && sd->status.inventory[index].card[0]!=0x00fe && sd->status.inventory[index].card[0]!=(short)0xff00) {
- int j;
- for(j=0;j<sd->inventory_data[index]->slot;j++){ // ƒJ?ƒh
- int c=sd->status.inventory[index].card[j];
- if(c>0){
- if(i == 8 && sd->status.inventory[index].equip == 0x20)
- sd->state.lr_flag = 1;
- run_script(itemdb_equipscript(c),0,sd->bl.id,0);
- sd->state.lr_flag = 0;
- }
- }
- }
- }
- else if(sd->inventory_data[index]->type==5){ // –h‹ï
- if(sd->status.inventory[index].card[0]!=0x00ff && sd->status.inventory[index].card[0]!=0x00fe && sd->status.inventory[index].card[0]!=(short)0xff00) {
- int j;
- for(j=0;j<sd->inventory_data[index]->slot;j++){ // ƒJ?ƒh
- int c=sd->status.inventory[index].card[j];
- if(c>0)
- run_script(itemdb_equipscript(c),0,sd->bl.id,0);
- }
- }
- }
- }
- }
- wele = sd->atk_ele;
- wele_ = sd->atk_ele_;
- def_ele = sd->def_ele;
- if(sd->status.pet_id > 0) {
- struct pet_data *pd=sd->pd;
- if((pd && battle_config.pet_status_support==1) && (battle_config.pet_equip_required==0 || (battle_config.pet_equip_required && pd->equip > 0))) {
- if(sd->status.pet_id > 0 && sd->petDB && sd->pet.intimate > 0 &&
- pd->state.skillbonus == 1) {
- pc_bonus(sd,pd->skillbonustype,pd->skillbonusval);
-// run_script(sd->petDB->script,0,sd->bl.id,0);
- }
- pele = sd->atk_ele;
- pdef_ele = sd->def_ele;
- sd->atk_ele = sd->def_ele = 0;
- }
- }
- memcpy(sd->paramcard,sd->parame,sizeof(sd->paramcard));
-
- // ?”õ•i‚É‚æ‚éƒXƒe?ƒ^ƒX?‰»‚Í‚±‚±‚Å?s
- for(i=0;i<10;i++) {
- current_equip_item_index = index = sd->equip_index[i]; //We pass INDEX to current_equip_item_index - for EQUIP_SCRIPT (new cards solution) [Lupus]
- if(index < 0)
- continue;
- if(i == 9 && sd->equip_index[8] == index)
- continue;
- if(i == 5 && sd->equip_index[4] == index)
- continue;
- if(i == 6 && (sd->equip_index[5] == index || sd->equip_index[4] == index))
- continue;
- if(sd->inventory_data[index]) {
- sd->def += sd->inventory_data[index]->def;
- if(sd->inventory_data[index]->type == 4) {
- int r,wlv = sd->inventory_data[index]->wlv;
- if(i == 8 && sd->status.inventory[index].equip == 0x20) {
- //“ñ“—¬—pƒf?ƒ^“ü—Í
- sd->watk_ += sd->inventory_data[index]->atk;
- sd->watk_2 = (r=sd->status.inventory[index].refine)* // ¸?U?—Í
- refinebonus[wlv][0];
- if( (r-=refinebonus[wlv][2])>0 ) // ‰ß?¸?ƒ{?ƒiƒX
- sd->overrefine_ = r*refinebonus[wlv][1];
-
- if(sd->status.inventory[index].card[0]==0x00ff){ // »‘¢•Ší
- sd->star_ = (sd->status.inventory[index].card[1]>>8); // ¯‚Ì‚©‚¯‚ç
- wele_= (sd->status.inventory[index].card[1]&0x0f); // ? «
- }
- sd->attackrange_ += sd->inventory_data[index]->range;
- sd->state.lr_flag = 1;
- run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0);
- sd->state.lr_flag = 0;
- }
- else { //“ñ“—¬•ŠíˆÈŠO
- sd->watk += sd->inventory_data[index]->atk;
- sd->watk2 += (r=sd->status.inventory[index].refine)* // ¸?U?—Í
- refinebonus[wlv][0];
- if( (r-=refinebonus[wlv][2])>0 ) // ‰ß?¸?ƒ{?ƒiƒX
- sd->overrefine += r*refinebonus[wlv][1];
-
- if(sd->status.inventory[index].card[0]==0x00ff){ // »‘¢•Ší
- sd->star += (sd->status.inventory[index].card[1]>>8); // ¯‚Ì‚©‚¯‚ç
- wele = (sd->status.inventory[index].card[1]&0x0f); // ? «
- }
- sd->attackrange += sd->inventory_data[index]->range;
- run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0);
- }
- }
- else if(sd->inventory_data[index]->type == 5) {
- sd->watk += sd->inventory_data[index]->atk;
- refinedef += sd->status.inventory[index].refine*refinebonus[0][0];
- run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0);
- }
- }
- }
-
- if(sd->equip_index[10] >= 0){ // –î
- index = sd->equip_index[10];
- if(sd->inventory_data[index]){ //‚Ü‚¾?«‚ª“ü‚Á‚Ä‚¢‚È‚¢
- sd->state.lr_flag = 2;
- run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0);
- sd->state.lr_flag = 0;
- sd->arrow_atk += sd->inventory_data[index]->atk;
- }
- }
- sd->def += (refinedef+50)/100;
-
- if(sd->attackrange < 1) sd->attackrange = 1;
- if(sd->attackrange_ < 1) sd->attackrange_ = 1;
- if(sd->attackrange < sd->attackrange_)
- sd->attackrange = sd->attackrange_;
- if(sd->status.weapon == 11)
- sd->attackrange += sd->arrow_range;
- if(wele > 0)
- sd->atk_ele = wele;
- if(wele_ > 0)
- sd->atk_ele_ = wele_;
- if(def_ele > 0)
- sd->def_ele = def_ele;
- if(battle_config.pet_status_support) {
- if(pele > 0 && !sd->atk_ele)
- sd->atk_ele = pele;
- if(pdef_ele > 0 && !sd->def_ele)
- sd->def_ele = pdef_ele;
- }
- sd->double_rate += sd->double_add_rate;
- sd->perfect_hit += sd->perfect_hit_add;
- sd->get_zeny_num += sd->get_zeny_add_num;
- sd->splash_range += sd->splash_add_range;
- if(sd->speed_add_rate != 100)
- sd->speed_rate += sd->speed_add_rate - 100;
- if(sd->aspd_add_rate != 100)
- sd->aspd_rate += sd->aspd_add_rate - 100;
-
- // •ŠíATKƒTƒCƒY•â³ (‰EŽè)
- sd->atkmods[0] = atkmods[0][sd->weapontype1];
- sd->atkmods[1] = atkmods[1][sd->weapontype1];
- sd->atkmods[2] = atkmods[2][sd->weapontype1];
- //•ŠíATKƒTƒCƒY•â³ (¶Žè)
- sd->atkmods_[0] = atkmods[0][sd->weapontype2];
- sd->atkmods_[1] = atkmods[1][sd->weapontype2];
- sd->atkmods_[2] = atkmods[2][sd->weapontype2];
-
- // jobƒ{?ƒiƒX•ª
- for(i=0;i<sd->status.job_level && i<MAX_LEVEL;i++){
- if(job_bonus[s_class.upper][s_class.job][i])
- sd->paramb[job_bonus[s_class.upper][s_class.job][i]-1]++;
- }
-
- if( (skill=pc_checkskill(sd,MC_INCCARRY))>0 ) // skill can be used with an item now, thanks to orn [Valaris]
- sd->max_weight += skill*2000;
-
- if( (skill=pc_checkskill(sd,AC_OWL))>0 ) // ‚Ó‚­‚낤‚Ì–Ú
- sd->paramb[4] += skill;
-
- if((skill=pc_checkskill(sd,BS_HILTBINDING))>0) { // Hilt binding gives +1 str +4 atk
- sd->paramb[0] ++;
- sd->base_atk += 4;
- }
- if((skill=pc_checkskill(sd,SA_DRAGONOLOGY))>0 ){ // Dragonology increases +1 int every 2 levels
- sd->paramb[3] += (int) ((skill+1)*0.5);
- }
-
- // ƒXƒe?ƒ^ƒX?‰»‚É‚æ‚éŠî–{ƒpƒ‰ƒ?ƒ^•â³
- if(sd->sc_count){
- if(sd->sc_data[SC_CONCENTRATE].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1){ // W’†—ÍŒüã
- sd->paramb[1]+= (sd->status.agi+sd->paramb[1]+sd->parame[1]-sd->paramcard[1])*(2+sd->sc_data[SC_CONCENTRATE].val1)/100;
- sd->paramb[4]+= (sd->status.dex+sd->paramb[4]+sd->parame[4]-sd->paramcard[4])*(2+sd->sc_data[SC_CONCENTRATE].val1)/100;
- }
- if(sd->sc_data[SC_INCREASEAGI].timer!=-1){ // ‘¬“x?‰Á
- sd->paramb[1]+= 2+sd->sc_data[SC_INCREASEAGI].val1;
- sd->speed -= sd->speed *25/100;
- }
- if(sd->sc_data[SC_DECREASEAGI].timer!=-1) { // ‘¬“xŒ¸­(agi‚Íbattle.c‚Å)
- sd->speed = sd->speed *125/100;
- sd->paramb[1] -= 2 + sd->sc_data[SC_DECREASEAGI].val1; // reduce agility [celest]
- }
- if(sd->sc_data[SC_CLOAKING].timer!=-1) {
- sd->critical_rate += 100; // critical increases
- sd->speed = sd->speed * (sd->sc_data[SC_CLOAKING].val3-sd->sc_data[SC_CLOAKING].val1*3) /100;
- }
- if(sd->sc_data[SC_CHASEWALK].timer!=-1) {
- sd->speed = sd->speed * sd->sc_data[SC_CHASEWALK].val3 /100; // slow down by chasewalk
- if(sd->sc_data[SC_CHASEWALK].val4)
- sd->paramb[0] += (1<<(sd->sc_data[SC_CHASEWALK].val1-1)); // increases strength after 10 seconds
- }
- if(sd->sc_data[SC_SLOWDOWN].timer!=-1)
- sd->speed = sd->speed*150/100;
- if(sd->sc_data[SC_SPEEDUP0].timer!=-1 && sd->sc_data[SC_INCREASEAGI].timer==-1)
- sd->speed -= sd->speed*25/100;
- if(sd->sc_data[SC_BLESSING].timer!=-1){ // ƒuƒŒƒbƒVƒ“ƒO
- sd->paramb[0]+= sd->sc_data[SC_BLESSING].val1;
- sd->paramb[3]+= sd->sc_data[SC_BLESSING].val1;
- sd->paramb[4]+= sd->sc_data[SC_BLESSING].val1;
- }
- if(sd->sc_data[SC_GLORIA].timer!=-1) // ƒOƒƒŠƒA
- sd->paramb[5]+= 30;
- if(sd->sc_data[SC_LOUD].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1) // ƒ‰ƒEƒhƒ{ƒCƒX
- sd->paramb[0]+= 4;
- if(sd->sc_data[SC_QUAGMIRE].timer!=-1){ // ƒNƒ@ƒOƒ}ƒCƒA
- //int agib = (sd->status.agi+sd->paramb[1]+sd->parame[1])*(sd->sc_data[SC_QUAGMIRE].val1*10)/100;
- //int dexb = (sd->status.dex+sd->paramb[4]+sd->parame[4])*(sd->sc_data[SC_QUAGMIRE].val1*10)/100;
- //sd->paramb[1]-= agib > 50 ? 50 : agib;
- //sd->paramb[4]-= dexb > 50 ? 50 : dexb;
- sd->paramb[1]-= sd->sc_data[SC_QUAGMIRE].val1*5;
- sd->paramb[4]-= sd->sc_data[SC_QUAGMIRE].val1*5;
- sd->speed = sd->speed*3/2;
- }
- if(sd->sc_data[SC_TRUESIGHT].timer!=-1){ // ƒgƒDƒ‹?ƒTƒCƒg
- sd->paramb[0]+= 5;
- sd->paramb[1]+= 5;
- sd->paramb[2]+= 5;
- sd->paramb[3]+= 5;
- sd->paramb[4]+= 5;
- sd->paramb[5]+= 5;
- }
- if(sd->sc_data[SC_MARIONETTE].timer!=-1){
- // skip partner checking -- should be handled in status_change_timer
- //struct map_session_data *psd = map_id2sd(sd->sc_data[SC_MARIONETTE2].val3);
- //if (psd) { // if partner is found
- sd->paramb[0]-= sd->status.str/2; // bonuses not included
- sd->paramb[1]-= sd->status.agi/2;
- sd->paramb[2]-= sd->status.vit/2;
- sd->paramb[3]-= sd->status.int_/2;
- sd->paramb[4]-= sd->status.dex/2;
- sd->paramb[5]-= sd->status.luk/2;
- //}
- }
- else if(sd->sc_data[SC_MARIONETTE2].timer!=-1){
- struct map_session_data *psd = map_id2sd(sd->sc_data[SC_MARIONETTE2].val3);
- if (psd) { // if partner is found
- sd->paramb[0] += sd->status.str+psd->status.str/2 > 99 ? 99-sd->status.str : psd->status.str/2;
- sd->paramb[1] += sd->status.agi+psd->status.agi/2 > 99 ? 99-sd->status.agi : psd->status.agi/2;
- sd->paramb[2] += sd->status.vit+psd->status.vit/2 > 99 ? 99-sd->status.vit : psd->status.vit/2;
- sd->paramb[3] += sd->status.int_+psd->status.int_/2 > 99 ? 99-sd->status.int_ : psd->status.int_/2;
- sd->paramb[4] += sd->status.dex+psd->status.dex/2 > 99 ? 99-sd->status.dex : psd->status.dex/2;
- sd->paramb[5] += sd->status.luk+psd->status.luk/2 > 99 ? 99-sd->status.luk : psd->status.luk/2;
- }
- }
- if(sd->sc_data[SC_GOSPEL].timer!=-1 && sd->sc_data[SC_GOSPEL].val4 == BCT_PARTY){
- if (sd->sc_data[SC_GOSPEL].val3 == 6) {
- sd->paramb[0]+= 2;
- sd->paramb[1]+= 2;
- sd->paramb[2]+= 2;
- sd->paramb[3]+= 2;
- sd->paramb[4]+= 2;
- sd->paramb[5]+= 2;
- }
- }
- // New guild skills - Celest
- if (sd->sc_data[SC_BATTLEORDERS].timer != -1) {
- sd->paramb[0]+= 5;
- sd->paramb[3]+= 5;
- sd->paramb[4]+= 5;
- }
- if (sd->sc_data[SC_GUILDAURA].timer != -1) {
- if (sd->sc_data[SC_GUILDAURA].val4 & 1<<0)
- sd->paramb[0] += 2;
- if (sd->sc_data[SC_GUILDAURA].val4 & 1<<1)
- sd->paramb[2] += 2;
- if (sd->sc_data[SC_GUILDAURA].val4 & 1<<2)
- sd->paramb[1] += 2;
- if (sd->sc_data[SC_GUILDAURA].val4 & 1<<3)
- sd->paramb[4] += 2;
- }
- }
-
- //1“x‚àŽ€‚ñ‚Å‚È‚¢Job70ƒXƒpƒmƒr‚É+10
- if(s_class.job == 23 && sd->die_counter == 0 && sd->status.job_level >= 70){
- sd->paramb[0]+= 15;
- sd->paramb[1]+= 15;
- sd->paramb[2]+= 15;
- sd->paramb[3]+= 15;
- sd->paramb[4]+= 15;
- sd->paramb[5]+= 15;
- }
- sd->paramc[0]=sd->status.str+sd->paramb[0]+sd->parame[0];
- sd->paramc[1]=sd->status.agi+sd->paramb[1]+sd->parame[1];
- sd->paramc[2]=sd->status.vit+sd->paramb[2]+sd->parame[2];
- sd->paramc[3]=sd->status.int_+sd->paramb[3]+sd->parame[3];
- sd->paramc[4]=sd->status.dex+sd->paramb[4]+sd->parame[4];
- sd->paramc[5]=sd->status.luk+sd->paramb[5]+sd->parame[5];
- for(i=0;i<6;i++)
- if(sd->paramc[i] < 0) sd->paramc[i] = 0;
-
- if (sd->sc_count) {
- if (sd->sc_data[SC_CURSE].timer!=-1)
- sd->paramc[5] = 0;
- }
-
- if(sd->status.weapon == 11 || sd->status.weapon == 13 || sd->status.weapon == 14) {
- str = sd->paramc[4];
- dex = sd->paramc[0];
- }
- else {
- str = sd->paramc[0];
- dex = sd->paramc[4];
- }
- dstr = str/10;
- sd->base_atk += str + dstr*dstr + dex/5 + sd->paramc[5]/5;
- sd->matk1 += sd->paramc[3]+(sd->paramc[3]/5)*(sd->paramc[3]/5);
- sd->matk2 += sd->paramc[3]+(sd->paramc[3]/7)*(sd->paramc[3]/7);
- if(sd->matk1 < sd->matk2) {
- int temp = sd->matk2;
- sd->matk2 = sd->matk1;
- sd->matk1 = temp;
- }
- sd->hit += sd->paramc[4] + sd->status.base_level;
- sd->flee += sd->paramc[1] + sd->status.base_level;
- sd->def2 += sd->paramc[2];
- sd->mdef2 += sd->paramc[3];
- sd->flee2 += sd->paramc[5]+10;
- sd->critical += (sd->paramc[5]*3)+10;
-
- if(sd->base_atk < 1)
- sd->base_atk = 1;
- if(sd->critical_rate != 100)
- sd->critical = (sd->critical*sd->critical_rate)/100;
- if(sd->critical < 10) sd->critical = 10;
- if(sd->hit_rate != 100)
- sd->hit = (sd->hit*sd->hit_rate)/100;
- if(sd->hit < 1) sd->hit = 1;
- if(sd->flee_rate != 100)
- sd->flee = (sd->flee*sd->flee_rate)/100;
- if(sd->flee < 1) sd->flee = 1;
- if(sd->flee2_rate != 100)
- sd->flee2 = (sd->flee2*sd->flee2_rate)/100;
- if(sd->flee2 < 10) sd->flee2 = 10;
- if(sd->def_rate != 100)
- sd->def = (sd->def*sd->def_rate)/100;
- if(sd->def < 0) sd->def = 0;
- if(sd->def2_rate != 100)
- sd->def2 = (sd->def2*sd->def2_rate)/100;
- if(sd->def2 < 1) sd->def2 = 1;
- if(sd->mdef_rate != 100)
- sd->mdef = (sd->mdef*sd->mdef_rate)/100;
- if(sd->mdef < 0) sd->mdef = 0;
- if(sd->mdef2_rate != 100)
- sd->mdef2 = (sd->mdef2*sd->mdef2_rate)/100;
- if(sd->mdef2 < 1) sd->mdef2 = 1;
-
- // “ñ“—¬ ASPD C³
- if (sd->status.weapon <= 16)
- sd->aspd += aspd_base[s_class.job][sd->status.weapon]-(sd->paramc[1]*4+sd->paramc[4])*aspd_base[s_class.job][sd->status.weapon]/1000;
- else
- sd->aspd += (
- (aspd_base[s_class.job][sd->weapontype1]-(sd->paramc[1]*4+sd->paramc[4])*aspd_base[s_class.job][sd->weapontype1]/1000) +
- (aspd_base[s_class.job][sd->weapontype2]-(sd->paramc[1]*4+sd->paramc[4])*aspd_base[s_class.job][sd->weapontype2]/1000)
- ) * 140 / 200;
-
- aspd_rate = sd->aspd_rate;
-
- //U?‘¬“x?‰Á
-
- if((skill=pc_checkskill(sd,AC_VULTURE))>0){ // ƒƒV‚Ì–Ú
- sd->hit += skill;
- if(sd->status.weapon == 11)
- sd->attackrange += skill;
- }
-
- if( (skill=pc_checkskill(sd,BS_WEAPONRESEARCH))>0) // •Ší?‹†‚Ì–½’†—¦?‰Á
- sd->hit += skill*2;
- if(sd->status.option&2 && (skill = pc_checkskill(sd,RG_TUNNELDRIVE))>0 ) // ƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒu // ƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒu
- sd->speed += (100-16*skill)*DEFAULT_WALK_SPEED/100;
- //sd->speed += (1.2*DEFAULT_WALK_SPEED - skill*9);
- if (pc_iscarton(sd) && (skill=pc_checkskill(sd,MC_PUSHCART))>0) // ƒJ?ƒg‚É‚æ‚鑬“x’ቺ
- sd->speed += (short) ((10-skill) * (DEFAULT_WALK_SPEED * 0.1));
- else if (pc_isriding(sd)) { // ƒyƒRƒyƒR?‚è‚É‚æ‚鑬“x?‰Á
- sd->speed -= (short) ((0.25 * DEFAULT_WALK_SPEED));
- sd->max_weight += 10000;
- }
- if((skill=pc_checkskill(sd,CR_TRUST))>0) { // ƒtƒFƒCƒX
- sd->status.max_hp += skill*200;
- sd->subele[6] += skill*5;
- }
- if((skill=pc_checkskill(sd,BS_SKINTEMPER))>0) {
- sd->subele[0] += skill;
- sd->subele[3] += skill*5;
- }
- if((skill=pc_checkskill(sd,SA_ADVANCEDBOOK))>0 )
- aspd_rate -= (int) (skill*0.5);
-
- bl=sd->status.base_level;
-
- sd->status.max_hp += (3500 + bl*hp_coefficient2[s_class.job] + hp_sigma_val[s_class.job][(bl > 0)? bl-1:0])/100 * (100 + sd->paramc[2])/100 + (sd->parame[2] - sd->paramcard[2]);
- if (s_class.upper==1) // [MouseJstr]
- sd->status.max_hp = sd->status.max_hp * 130/100;
- else if (s_class.upper==2)
- sd->status.max_hp = sd->status.max_hp * 70/100;
-
- if (sd->hprate <= 0)
- sd->hprate = 1;
- if(sd->hprate!=100)
- sd->status.max_hp = sd->status.max_hp*sd->hprate/100;
-
- if(sd->sc_count && sd->sc_data[SC_BERSERK].timer!=-1){ // ƒo?ƒT?ƒN
- sd->status.max_hp = sd->status.max_hp * 3;
- // sd->status.hp = sd->status.hp * 3;
- if(sd->status.max_hp > battle_config.max_hp) // removed negative max hp bug by Valaris
- sd->status.max_hp = battle_config.max_hp;
- if(sd->status.hp > battle_config.max_hp) // removed negative max hp bug by Valaris
- sd->status.hp = battle_config.max_hp;
- }
- if(s_class.job == 23 && sd->status.base_level >= 99){
- sd->status.max_hp = sd->status.max_hp + 2000;
- }
-
- if(sd->status.max_hp > battle_config.max_hp) // removed negative max hp bug by Valaris
- sd->status.max_hp = battle_config.max_hp;
- if(sd->status.max_hp <= 0) sd->status.max_hp = 1; // end
-
- // Å‘åSPŒvŽZ
- sd->status.max_sp += ((sp_coefficient[s_class.job] * bl) + 1000)/100 * (100 + sd->paramc[3])/100 + (sd->parame[3] - sd->paramcard[3]);
- if (s_class.upper==1) // [MouseJstr]
- sd->status.max_sp = sd->status.max_sp * 130/100;
- else if (s_class.upper==2)
- sd->status.max_sp = sd->status.max_sp * 70/100;
- if (sd->sprate <= 0)
- sd->sprate = 1;
- if(sd->sprate!=100)
- sd->status.max_sp = sd->status.max_sp*sd->sprate/100;
-
- if((skill=pc_checkskill(sd,HP_MEDITATIO))>0) // ƒƒfƒBƒeƒCƒeƒBƒI
- sd->status.max_sp += sd->status.max_sp*skill/100;
- if((skill=pc_checkskill(sd,HW_SOULDRAIN))>0) /* ƒ\ƒEƒ‹ƒhƒŒƒCƒ“ */
- sd->status.max_sp += sd->status.max_sp*2*skill/100;
-
- if(sd->status.max_sp < 0 || sd->status.max_sp > battle_config.max_sp)
- sd->status.max_sp = battle_config.max_sp;
-
- //Ž©‘R‰ñ•œHP
- sd->nhealhp = 1 + (sd->paramc[2]/5) + (sd->status.max_hp/200);
- if((skill=pc_checkskill(sd,SM_RECOVERY)) > 0) { /* HP‰ñ•œ—ÍŒüã */
- sd->nshealhp = skill*5 + (sd->status.max_hp*skill/500);
- if(sd->nshealhp > 0x7fff) sd->nshealhp = 0x7fff;
- }
- //Ž©‘R‰ñ•œSP
- sd->nhealsp = 1 + (sd->paramc[3]/6) + (sd->status.max_sp/100);
- if(sd->paramc[3] >= 120)
- sd->nhealsp += ((sd->paramc[3]-120)>>1) + 4;
- if((skill=pc_checkskill(sd,MG_SRECOVERY)) > 0) { /* SP‰ñ•œ—ÍŒüã */
- sd->nshealsp = skill*3 + (sd->status.max_sp*skill/500);
- if(sd->nshealsp > 0x7fff) sd->nshealsp = 0x7fff;
- }
-
- if((skill = pc_checkskill(sd,MO_SPIRITSRECOVERY)) > 0) {
- sd->nsshealhp = skill*4 + (sd->status.max_hp*skill/500);
- sd->nsshealsp = skill*2 + (sd->status.max_sp*skill/500);
- if(sd->nsshealhp > 0x7fff) sd->nsshealhp = 0x7fff;
- if(sd->nsshealsp > 0x7fff) sd->nsshealsp = 0x7fff;
- }
- if(sd->hprecov_rate != 100) {
- sd->nhealhp = sd->nhealhp*sd->hprecov_rate/100;
- if(sd->nhealhp < 1) sd->nhealhp = 1;
- }
- if(sd->sprecov_rate != 100) {
- sd->nhealsp = sd->nhealsp*sd->sprecov_rate/100;
- if(sd->nhealsp < 1) sd->nhealsp = 1;
- }
- /* if((skill=pc_checkskill(sd,HP_MEDITATIO)) > 0) { // f?fffBfefCfefBfI,I'SPR,A*,I',E`,¡©Z((c)¡®R¢¶n~.©«,E',(c),(c),e'
- sd->nhealsp += 3*skill*(sd->status.max_sp)/100;
- if(sd->nhealsp > 0x7fff) sd->nhealsp = 0x7fff;
- } Increase natural SP regen instead of colossal SP Recovery effect [DracoRPG]*/
-
- // Ží‘°‘Ï«i‚±‚ê‚Å‚¢‚¢‚ÌH ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“‚Æ“¯‚¶?—‚ª‚¢‚é‚©‚àj
- if( (skill=pc_checkskill(sd,SA_DRAGONOLOGY))>0 ){ // ƒhƒ‰ƒSƒmƒƒW?
- skill = skill*4;
- sd->addrace[9]+=skill;
- sd->addrace_[9]+=skill;
- sd->subrace[9]+=skill;
- sd->magic_addrace[9]+=skill;
- sd->magic_subrace[9]-=skill;
- }
-
- //Fleeã¸
- if( (skill=pc_checkskill(sd,TF_MISS))>0 ){ // ‰ñ”ð—¦?‰Á
- sd->flee += skill*((sd->status.class_==12 || sd->status.class_==17 || sd->status.class_==4013 || sd->status.class_==4018) ? 4 : 3);
- if((sd->status.class_==12 || sd->status.class_==4013) && (sd->sc_count && sd->sc_data[SC_CLOAKING].timer==-1))
- sd->speed -= (short)(skill*1.5/100 * DEFAULT_WALK_SPEED);
- }
- if( (skill=pc_checkskill(sd,MO_DODGE))>0 ) // Œ©Ø‚è
- sd->flee += (skill*3)>>1;
-
- // ƒXƒLƒ‹‚âƒXƒe?ƒ^ƒXˆÙí‚É‚æ‚é?‚è‚̃pƒ‰ƒ?ƒ^•â³
- if(sd->sc_count){
- // ATK/DEF?‰»Œ`
- if(sd->sc_data[SC_ANGELUS].timer!=-1) // ƒGƒ“ƒWƒFƒ‰ƒX
- sd->def2 = sd->def2*(110+5*sd->sc_data[SC_ANGELUS].val1)/100;
- if(sd->sc_data[SC_IMPOSITIO].timer!=-1) {// ƒCƒ“ƒ|ƒVƒeƒBƒIƒ}ƒkƒX
- sd->watk += sd->sc_data[SC_IMPOSITIO].val1*5;
- index = sd->equip_index[8];
- if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4)
- sd->watk_ += sd->sc_data[SC_IMPOSITIO].val1*5;
- }
- if(sd->sc_data[SC_PROVOKE].timer!=-1){ // ƒvƒƒ{ƒbƒN
- sd->def2 = sd->def2*(100-6*sd->sc_data[SC_PROVOKE].val1)/100;
- sd->base_atk = sd->base_atk*(100+2*sd->sc_data[SC_PROVOKE].val1)/100;
- sd->watk = sd->watk*(100+2*sd->sc_data[SC_PROVOKE].val1)/100;
- index = sd->equip_index[8];
- if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4)
- sd->watk_ = sd->watk_*(100+2*sd->sc_data[SC_PROVOKE].val1)/100;
- }
- if(sd->sc_data[SC_ENDURE].timer!=-1)
- sd->mdef2 += sd->sc_data[SC_ENDURE].val1;
- if(sd->sc_data[SC_MINDBREAKER].timer!=-1){ // ƒvƒƒ{ƒbƒN
- sd->mdef2 = sd->mdef2*(100-6*sd->sc_data[SC_MINDBREAKER].val1)/100;
- sd->matk1 = sd->matk1*(100+2*sd->sc_data[SC_MINDBREAKER].val1)/100;
- sd->matk2 = sd->matk2*(100+2*sd->sc_data[SC_MINDBREAKER].val1)/100;
- }
- if(sd->sc_data[SC_POISON].timer!=-1) // “Å?‘Ô
- sd->def2 = sd->def2*75/100;
- if(sd->sc_data[SC_CURSE].timer!=-1){
- sd->base_atk = sd->base_atk*75/100;
- sd->watk = sd->watk*75/100;
- index = sd->equip_index[8];
- if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4)
- sd->watk_ = sd->watk_*75/100;
- }
- if(sd->sc_data[SC_DRUMBATTLE].timer!=-1){ // ?‘¾ŒÛ‚Ì‹¿‚«
- sd->watk += sd->sc_data[SC_DRUMBATTLE].val2;
- sd->def += sd->sc_data[SC_DRUMBATTLE].val3;
- index = sd->equip_index[8];
- if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4)
- sd->watk_ += sd->sc_data[SC_DRUMBATTLE].val2;
- }
- if(sd->sc_data[SC_NIBELUNGEN].timer!=-1) { // ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö
- index = sd->equip_index[9];
- /*if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 3)
- sd->watk += sd->sc_data[SC_NIBELUNGEN].val3;
- index = sd->equip_index[8];
- if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 3)
- sd->watk_ += sd->sc_data[SC_NIBELUNGEN].val3;
- index = sd->equip_index[9];*/
- if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 4)
- sd->watk2 += sd->sc_data[SC_NIBELUNGEN].val3;
- index = sd->equip_index[8];
- if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 4)
- sd->watk_2 += sd->sc_data[SC_NIBELUNGEN].val3;
- }
-
- if(sd->sc_data[SC_VOLCANO].timer!=-1 && sd->def_ele==3){ // ƒ{ƒ‹ƒP?ƒm
- sd->watk += sd->sc_data[SC_VOLCANO].val3;
- }
-
- if(sd->sc_data[SC_SIGNUMCRUCIS].timer!=-1)
- sd->def = sd->def * (100 - sd->sc_data[SC_SIGNUMCRUCIS].val2)/100;
- if(sd->sc_data[SC_ETERNALCHAOS].timer!=-1) // ƒGƒ^?ƒiƒ‹ƒJƒIƒX
- sd->def=0;
-
- if(sd->sc_data[SC_CONCENTRATION].timer!=-1){ //ƒRƒ“ƒZƒ“ƒgƒŒ?ƒVƒ‡ƒ“
- sd->watk = sd->watk * (100 + 5*sd->sc_data[SC_CONCENTRATION].val1)/100;
- index = sd->equip_index[8];
- if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4)
- sd->watk_ = sd->watk * (100 + 5*sd->sc_data[SC_CONCENTRATION].val1)/100;
- sd->def = sd->def * (100 - 5*sd->sc_data[SC_CONCENTRATION].val1)/100;
- }
-
- if(sd->sc_data[SC_MAGICPOWER].timer!=-1){ //–‚–@—Í?•
- sd->matk1 = sd->matk1*(100+5*sd->sc_data[SC_MAGICPOWER].val1)/100;
- sd->matk2 = sd->matk2*(100+5*sd->sc_data[SC_MAGICPOWER].val1)/100;
- }
- if(sd->sc_data[SC_ATKPOT].timer!=-1)
- sd->watk += sd->sc_data[SC_ATKPOT].val1;
- if(sd->sc_data[SC_MATKPOT].timer!=-1){
- sd->matk1 += sd->sc_data[SC_MATKPOT].val1;
- sd->matk2 += sd->sc_data[SC_MATKPOT].val1;
- }
-
- // ASPD/ˆÚ“®‘¬“x?‰»Œn
- if(sd->sc_data[SC_TWOHANDQUICKEN].timer != -1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) // 2HQ
- aspd_rate -= 30;
- if(sd->sc_data[SC_ADRENALINE].timer != -1 && sd->sc_data[SC_TWOHANDQUICKEN].timer == -1 &&
- sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) { // ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…
- if(sd->sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penalty)
- aspd_rate -= 30;
- else
- aspd_rate -= 25;
- }
- if(sd->sc_data[SC_SPEARSQUICKEN].timer != -1 && sd->sc_data[SC_ADRENALINE].timer == -1 &&
- sd->sc_data[SC_TWOHANDQUICKEN].timer == -1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) // ƒXƒsƒAƒNƒBƒbƒPƒ“
- aspd_rate -= sd->sc_data[SC_SPEARSQUICKEN].val2;
- if(sd->sc_data[SC_ASSNCROS].timer!=-1 && // —[—z‚̃AƒTƒVƒ“ƒNƒƒX
- sd->sc_data[SC_TWOHANDQUICKEN].timer==-1 && sd->sc_data[SC_ADRENALINE].timer==-1 && sd->sc_data[SC_SPEARSQUICKEN].timer==-1 &&
- sd->sc_data[SC_DONTFORGETME].timer == -1)
- aspd_rate -= 5+sd->sc_data[SC_ASSNCROS].val1+sd->sc_data[SC_ASSNCROS].val2+sd->sc_data[SC_ASSNCROS].val3;
- if(sd->sc_data[SC_DONTFORGETME].timer!=-1){ // Ž„‚ð–Y‚ê‚È‚¢‚Å
- aspd_rate += sd->sc_data[SC_DONTFORGETME].val1*3 + sd->sc_data[SC_DONTFORGETME].val2 + (sd->sc_data[SC_DONTFORGETME].val3>>16);
- sd->speed= sd->speed*(100+sd->sc_data[SC_DONTFORGETME].val1*2 + sd->sc_data[SC_DONTFORGETME].val2 + (sd->sc_data[SC_DONTFORGETME].val3&0xffff))/100;
- }
- if( sd->sc_data[i=SC_SPEEDPOTION3].timer!=-1 ||
- sd->sc_data[i=SC_SPEEDPOTION2].timer!=-1 ||
- sd->sc_data[i=SC_SPEEDPOTION1].timer!=-1 ||
- sd->sc_data[i=SC_SPEEDPOTION0].timer!=-1) // ? ‘¬ƒ|?ƒVƒ‡ƒ“
- aspd_rate -= sd->sc_data[i].val2;
- if(sd->sc_data[SC_WINDWALK].timer!=-1 && sd->sc_data[SC_INCREASEAGI].timer==-1) //ƒEƒBƒ“ƒhƒEƒH?ƒNŽbÍLv*2%Œ¸ŽZ
- sd->speed -= sd->speed *(sd->sc_data[SC_WINDWALK].val1*2)/100;
- if(sd->sc_data[SC_CARTBOOST].timer!=-1) // ƒJ?ƒgƒu?ƒXƒg
- sd->speed -= (DEFAULT_WALK_SPEED * 20)/100;
- if(sd->sc_data[SC_BERSERK].timer!=-1) //ƒo?ƒT?ƒN’†‚ÍIA‚Æ“¯‚¶‚®‚ç‚¢‘¬‚¢H
- sd->speed -= sd->speed *25/100;
- if(sd->sc_data[SC_WEDDING].timer!=-1) //Œ‹¥’†‚Í?‚­‚Ì‚ª?‚¢
- sd->speed = 2*DEFAULT_WALK_SPEED;
-
- // HIT/FLEE?‰»Œn
- if(sd->sc_data[SC_WHISTLE].timer!=-1){ // Œû“J
- sd->flee += sd->flee * (sd->sc_data[SC_WHISTLE].val1
- +sd->sc_data[SC_WHISTLE].val2+(sd->sc_data[SC_WHISTLE].val3>>16))/100;
- sd->flee2+= (sd->sc_data[SC_WHISTLE].val1+sd->sc_data[SC_WHISTLE].val2+(sd->sc_data[SC_WHISTLE].val3&0xffff)) * 10;
- }
- if(sd->sc_data[SC_HUMMING].timer!=-1) // ƒnƒ~ƒ“ƒO
- sd->hit += (sd->sc_data[SC_HUMMING].val1*2+sd->sc_data[SC_HUMMING].val2
- +sd->sc_data[SC_HUMMING].val3) * sd->hit/100;
- if(sd->sc_data[SC_VIOLENTGALE].timer!=-1 && sd->def_ele==4){ // ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹
- sd->flee += sd->flee*sd->sc_data[SC_VIOLENTGALE].val3/100;
- }
- if(sd->sc_data[SC_BLIND].timer!=-1){ // ˆÃ?
- sd->hit -= sd->hit*25/100;
- sd->flee -= sd->flee*25/100;
- }
- if(sd->sc_data[SC_WINDWALK].timer!=-1) // ƒEƒBƒ“ƒhƒEƒH?ƒN
- sd->flee += sd->flee*(sd->sc_data[SC_WINDWALK].val2)/100;
- if(sd->sc_data[SC_SPIDERWEB].timer!=-1) //ƒXƒpƒCƒ_?ƒEƒFƒu
- sd->flee -= sd->flee*50/100;
- if(sd->sc_data[SC_TRUESIGHT].timer!=-1) //ƒgƒDƒ‹?ƒTƒCƒg
- sd->hit += 3*(sd->sc_data[SC_TRUESIGHT].val1);
- if(sd->sc_data[SC_CONCENTRATION].timer!=-1) //ƒRƒ“ƒZƒ“ƒgƒŒ?ƒVƒ‡ƒ“
- sd->hit += (10*(sd->sc_data[SC_CONCENTRATION].val1));
-
- // ‘Ï«
- if(sd->sc_data[SC_SIEGFRIED].timer!=-1){ // •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh
- sd->subele[1] += sd->sc_data[SC_SIEGFRIED].val2; // …
- sd->subele[2] += sd->sc_data[SC_SIEGFRIED].val2; // …
- sd->subele[3] += sd->sc_data[SC_SIEGFRIED].val2; // ‰Î
- sd->subele[4] += sd->sc_data[SC_SIEGFRIED].val2; // …
- sd->subele[5] += sd->sc_data[SC_SIEGFRIED].val2; // …
- sd->subele[6] += sd->sc_data[SC_SIEGFRIED].val2; // …
- sd->subele[7] += sd->sc_data[SC_SIEGFRIED].val2; // …
- sd->subele[8] += sd->sc_data[SC_SIEGFRIED].val2; // …
- sd->subele[9] += sd->sc_data[SC_SIEGFRIED].val2; // …
- }
- if(sd->sc_data[SC_PROVIDENCE].timer!=-1){ // ƒvƒƒ”ƒBƒfƒ“ƒX
- sd->subele[6] += sd->sc_data[SC_PROVIDENCE].val2; // ? ¹?«
- sd->subrace[6] += sd->sc_data[SC_PROVIDENCE].val2; // ? ?–‚
- }
-
- // ‚»‚Ì‘¼
- if(sd->sc_data[SC_APPLEIDUN].timer!=-1){ // ƒCƒhƒDƒ“‚Ì—ÑŒç
- sd->status.max_hp += ((5+sd->sc_data[SC_APPLEIDUN].val1*2+((sd->sc_data[SC_APPLEIDUN].val2+1)>>1)
- +sd->sc_data[SC_APPLEIDUN].val3/10) * sd->status.max_hp)/100;
- if(sd->status.max_hp < 0 || sd->status.max_hp > battle_config.max_hp)
- sd->status.max_hp = battle_config.max_hp;
- }
- if(sd->sc_data[SC_DELUGE].timer!=-1 && sd->def_ele==1){ // ƒfƒŠƒ…?ƒW
- sd->status.max_hp += sd->status.max_hp * deluge_eff[sd->sc_data[SC_DELUGE].val1-1]/100;
- if(sd->status.max_hp < 0 || sd->status.max_hp > battle_config.max_hp)
- sd->status.max_hp = battle_config.max_hp;
- }
- if(sd->sc_data[SC_SERVICE4U].timer!=-1) { // ƒT?ƒrƒXƒtƒH?ƒ†?
- sd->status.max_sp += sd->status.max_sp*(10+sd->sc_data[SC_SERVICE4U].val1+sd->sc_data[SC_SERVICE4U].val2
- +sd->sc_data[SC_SERVICE4U].val3)/100;
- if(sd->status.max_sp < 0 || sd->status.max_sp > battle_config.max_sp)
- sd->status.max_sp = battle_config.max_sp;
- sd->dsprate-=(10+sd->sc_data[SC_SERVICE4U].val1*3+sd->sc_data[SC_SERVICE4U].val2
- +sd->sc_data[SC_SERVICE4U].val3);
- if(sd->dsprate<0)sd->dsprate=0;
- }
-
- if(sd->sc_data[SC_FORTUNE].timer!=-1) // K‰^‚̃LƒX
- sd->critical += (10+sd->sc_data[SC_FORTUNE].val1+sd->sc_data[SC_FORTUNE].val2
- +sd->sc_data[SC_FORTUNE].val3)*10;
-
- if(sd->sc_data[SC_EXPLOSIONSPIRITS].timer!=-1){ // ”š—ô”g“®
- if(s_class.job==23)
- sd->critical += sd->sc_data[SC_EXPLOSIONSPIRITS].val1*100;
- else
- sd->critical += sd->sc_data[SC_EXPLOSIONSPIRITS].val2;
- }
-
- if(sd->sc_data[SC_STEELBODY].timer!=-1){ // ‹à„
- sd->def = 90;
- sd->mdef = 90;
- aspd_rate += 25;
- sd->speed = (sd->speed * 125) / 100;
- }
- if(sd->sc_data[SC_DEFENDER].timer != -1) {
- //sd->aspd += (550 - sd->sc_data[SC_DEFENDER].val1*50);
- aspd_rate += (25 - sd->sc_data[SC_DEFENDER].val1*5);
- sd->speed = (sd->speed * (155 - sd->sc_data[SC_DEFENDER].val1*5)) / 100;
- }
- if(sd->sc_data[SC_ENCPOISON].timer != -1)
- sd->addeff[4] += sd->sc_data[SC_ENCPOISON].val2;
-
- if( sd->sc_data[SC_DANCING].timer!=-1 ){ // ‰‰‘t/ƒ_ƒ“ƒXŽg—p’†
- sd->speed = (short) ((double)sd->speed * (6.- 0.4 * pc_checkskill(sd, ((s_class.job == 19) ? BA_MUSICALLESSON : DC_DANCINGLESSON))));
- //sd->speed*=4;
- sd->nhealsp = 0;
- sd->nshealsp = 0;
- sd->nsshealsp = 0;
- }
- if(sd->sc_data[SC_CURSE].timer!=-1)
- sd->speed += 450;
-
- if(sd->sc_data[SC_TRUESIGHT].timer!=-1) //ƒgƒDƒ‹?ƒTƒCƒg
- sd->critical += sd->critical*(sd->sc_data[SC_TRUESIGHT].val1)/100;
-
-/* if(sd->sc_data[SC_VOLCANO].timer!=-1) // ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“(?«‚Íbattle.c‚Å)
- sd->addeff[2]+=sd->sc_data[SC_VOLCANO].val2;//% of granting
- if(sd->sc_data[SC_DELUGE].timer!=-1) // ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“(?«‚Íbattle.c‚Å)
- sd->addeff[0]+=sd->sc_data[SC_DELUGE].val2;//% of granting
- */
- if(sd->sc_data[SC_BERSERK].timer!=-1) { //All Def/MDef reduced to 0 while in Berserk [DracoRPG]
- sd->def = sd->def2 = 0;
- sd->mdef = sd->mdef2 = 0;
- sd->flee -= sd->flee*50/100;
- aspd_rate -= 30;
- //sd->base_atk *= 3;
- }
- if(sd->sc_data[SC_KEEPING].timer!=-1)
- sd->def = 100;
- if(sd->sc_data[SC_BARRIER].timer!=-1)
- sd->mdef = 100;
-
- if(sd->sc_data[SC_JOINTBEAT].timer!=-1) { // Random break [DracoRPG]
- switch(sd->sc_data[SC_JOINTBEAT].val2) {
- case 1: //Ankle break
- sd->speed_rate += 50;
- break;
- case 2: //Wrist break
- sd->aspd_rate += 25;
- break;
- case 3: //Knee break
- sd->speed_rate += 30;
- sd->aspd_rate += 10;
- break;
- case 4: //Shoulder break
- sd->def2 -= sd->def2*50/100;
- break;
- case 5: //Waist break
- sd->def2 -= sd->def2*50/100;
- sd->base_atk -= sd->base_atk*25/100;
- break;
- }
- }
-
- if(sd->sc_data[SC_GOSPEL].timer!=-1) {
- if (sd->sc_data[SC_GOSPEL].val4 == BCT_PARTY){
- switch (sd->sc_data[SC_GOSPEL].val3)
- {
- case 4:
- sd->status.max_hp += sd->status.max_hp * 25 / 100;
- if(sd->status.max_hp > battle_config.max_hp)
- sd->status.max_hp = battle_config.max_hp;
- break;
- case 5:
- sd->status.max_sp += sd->status.max_sp * 25 / 100;
- if(sd->status.max_sp > battle_config.max_sp)
- sd->status.max_sp = battle_config.max_sp;
- break;
- case 11:
- sd->def += sd->def * 25 / 100;
- sd->def2 += sd->def2 * 25 / 100;
- break;
- case 12:
- sd->base_atk += sd->base_atk * 8 / 100;
- break;
- case 13:
- sd->flee += sd->flee * 5 / 100;
- break;
- case 14:
- sd->hit += sd->hit * 5 / 100;
- break;
- }
- } else if (sd->sc_data[SC_GOSPEL].val4 == BCT_ENEMY){
- switch (sd->sc_data[SC_GOSPEL].val3)
- {
- case 5:
- sd->def = 0;
- sd->def2 = 0;
- break;
- case 6:
- sd->base_atk = 0;
- sd->watk = 0;
- sd->watk2 = 0;
- break;
- case 7:
- sd->flee = 0;
- break;
- case 8:
- sd->speed_rate += 75;
- aspd_rate += 75;
- break;
- }
- }
- }
- // custom stats, since there's no info on how much it actually gives ^^; [Celest]
- if (sd->sc_data[SC_GUILDAURA].timer != -1) {
- if (sd->sc_data[SC_GUILDAURA].val4 & 1<<4) {
- sd->hit += 10;
- sd->flee += 10;
- }
- }
- }
-
- if (sd->speed_rate <= 0)
- sd->speed_rate = 1;
-
- if(sd->speed_rate != 100)
- sd->speed = sd->speed*sd->speed_rate/100;
- if(sd->speed < 1) sd->speed = 1;
- if(aspd_rate != 100)
- sd->aspd = sd->aspd*aspd_rate/100;
- if(pc_isriding(sd)) // ‹R•ºC—û
- sd->aspd = sd->aspd*(100 + 10*(5 - pc_checkskill(sd,KN_CAVALIERMASTERY)))/ 100;
- if(sd->aspd < battle_config.max_aspd) sd->aspd = battle_config.max_aspd;
- sd->amotion = sd->aspd;
- sd->dmotion = 800-sd->paramc[1]*4;
- if(sd->dmotion<400)
- sd->dmotion = 400;
- if(sd->skilltimer != -1 && (skill = pc_checkskill(sd,SA_FREECAST)) > 0) {
- sd->prev_speed = sd->speed;
- sd->speed = sd->speed*(175 - skill*5)/100;
- }
-
- if(sd->status.hp>sd->status.max_hp)
- sd->status.hp=sd->status.max_hp;
- if(sd->status.sp>sd->status.max_sp)
- sd->status.sp=sd->status.max_sp;
-
- if(first&4)
- return 0;
- if(first&3) {
- clif_updatestatus(sd,SP_SPEED);
- clif_updatestatus(sd,SP_MAXHP);
- clif_updatestatus(sd,SP_MAXSP);
- if(first&1) {
- clif_updatestatus(sd,SP_HP);
- clif_updatestatus(sd,SP_SP);
- }
- return 0;
- }
-
- if(b_class != sd->view_class) {
- clif_changelook(&sd->bl,LOOK_BASE,sd->view_class);
-#if PACKETVER < 4
- clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
- clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield);
-#else
- clif_changelook(&sd->bl,LOOK_WEAPON,0);
-#endif
- }
-
- if( memcmp(b_skill,sd->status.skill,sizeof(sd->status.skill)) || b_attackrange != sd->attackrange)
- clif_skillinfoblock(sd); // ƒXƒLƒ‹‘—M
-
- if(b_speed != sd->speed)
- clif_updatestatus(sd,SP_SPEED);
- if(b_weight != sd->weight)
- clif_updatestatus(sd,SP_WEIGHT);
- if(b_max_weight != sd->max_weight) {
- clif_updatestatus(sd,SP_MAXWEIGHT);
- pc_checkweighticon(sd);
- }
- for(i=0;i<6;i++)
- if(b_paramb[i] + b_parame[i] != sd->paramb[i] + sd->parame[i])
- clif_updatestatus(sd,SP_STR+i);
- if(b_hit != sd->hit)
- clif_updatestatus(sd,SP_HIT);
- if(b_flee != sd->flee)
- clif_updatestatus(sd,SP_FLEE1);
- if(b_aspd != sd->aspd)
- clif_updatestatus(sd,SP_ASPD);
- if(b_watk != sd->watk || b_base_atk != sd->base_atk)
- clif_updatestatus(sd,SP_ATK1);
- if(b_def != sd->def)
- clif_updatestatus(sd,SP_DEF1);
- if(b_watk2 != sd->watk2)
- clif_updatestatus(sd,SP_ATK2);
- if(b_def2 != sd->def2)
- clif_updatestatus(sd,SP_DEF2);
- if(b_flee2 != sd->flee2)
- clif_updatestatus(sd,SP_FLEE2);
- if(b_critical != sd->critical)
- clif_updatestatus(sd,SP_CRITICAL);
- if(b_matk1 != sd->matk1)
- clif_updatestatus(sd,SP_MATK1);
- if(b_matk2 != sd->matk2)
- clif_updatestatus(sd,SP_MATK2);
- if(b_mdef != sd->mdef)
- clif_updatestatus(sd,SP_MDEF1);
- if(b_mdef2 != sd->mdef2)
- clif_updatestatus(sd,SP_MDEF2);
- if(b_attackrange != sd->attackrange)
- clif_updatestatus(sd,SP_ATTACKRANGE);
- if(b_max_hp != sd->status.max_hp)
- clif_updatestatus(sd,SP_MAXHP);
- if(b_max_sp != sd->status.max_sp)
- clif_updatestatus(sd,SP_MAXSP);
- if(b_hp != sd->status.hp)
- clif_updatestatus(sd,SP_HP);
- if(b_sp != sd->status.sp)
- clif_updatestatus(sd,SP_SP);
-
-/* if(before.cart_num != before.cart_num || before.cart_max_num != before.cart_max_num ||
- before.cart_weight != before.cart_weight || before.cart_max_weight != before.cart_max_weight )
- clif_updatestatus(sd,SP_CARTINFO);*/
-
- //if(sd->status.hp<sd->status.max_hp>>2 && pc_checkskill(sd,SM_AUTOBERSERK)>0 &&
- if(sd->status.hp<sd->status.max_hp>>2 && sd->sc_data[SC_AUTOBERSERK].timer != -1 &&
- (sd->sc_data[SC_PROVOKE].timer==-1 || sd->sc_data[SC_PROVOKE].val2==0 ) && !pc_isdead(sd))
- // ƒI?ƒgƒo?ƒT?ƒN?“®
- status_change_start(&sd->bl,SC_PROVOKE,10,1,0,0,0,0);
-
- return 0;
-}
-
-/*==========================================
- * For quick calculating [Celest]
- *------------------------------------------
- */
-int status_calc_speed (struct map_session_data *sd)
-{
- int b_speed, skill;
- struct pc_base_job s_class;
-
- nullpo_retr(0, sd);
-
- s_class = pc_calc_base_job(sd->status.class_);
-
- b_speed = sd->speed;
- sd->speed = DEFAULT_WALK_SPEED ;
-
- if(sd->sc_count){
- if(sd->sc_data[SC_INCREASEAGI].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1){ // ‘¬“x?‰Á
- sd->speed -= sd->speed *25/100;
- }
- if(sd->sc_data[SC_DECREASEAGI].timer!=-1) {
- sd->speed = sd->speed *125/100;
- }
- if(sd->sc_data[SC_CLOAKING].timer!=-1) {
- sd->speed = sd->speed * (sd->sc_data[SC_CLOAKING].val3-sd->sc_data[SC_CLOAKING].val1*3) /100;
- }
- if(sd->sc_data[SC_CHASEWALK].timer!=-1) {
- sd->speed = sd->speed * sd->sc_data[SC_CHASEWALK].val3 /100;
- }
- if(sd->sc_data[SC_QUAGMIRE].timer!=-1){
- sd->speed = sd->speed*3/2;
- }
- if(sd->sc_data[SC_WINDWALK].timer!=-1 && sd->sc_data[SC_INCREASEAGI].timer==-1) {
- sd->speed -= sd->speed *(sd->sc_data[SC_WINDWALK].val1*2)/100;
- }
- if(sd->sc_data[SC_CARTBOOST].timer!=-1) {
- sd->speed -= (DEFAULT_WALK_SPEED * 20)/100;
- }
- if(sd->sc_data[SC_BERSERK].timer!=-1) {
- sd->speed -= sd->speed *25/100;
- }
- if(sd->sc_data[SC_WEDDING].timer!=-1) {
- sd->speed = 2*DEFAULT_WALK_SPEED;
- }
- if(sd->sc_data[SC_DONTFORGETME].timer!=-1){
- sd->speed= sd->speed*(100+sd->sc_data[SC_DONTFORGETME].val1*2 + sd->sc_data[SC_DONTFORGETME].val2 + (sd->sc_data[SC_DONTFORGETME].val3&0xffff))/100;
- }
- if(sd->sc_data[SC_STEELBODY].timer!=-1){
- sd->speed = (sd->speed * 125) / 100;
- }
- if(sd->sc_data[SC_DEFENDER].timer != -1) {
- sd->speed = (sd->speed * (155 - sd->sc_data[SC_DEFENDER].val1*5)) / 100;
- }
- if( sd->sc_data[SC_DANCING].timer!=-1 ){
- sd->speed = (int) ((double)sd->speed * (6.- 0.4 * pc_checkskill(sd, ((s_class.job == 19) ? BA_MUSICALLESSON : DC_DANCINGLESSON))));
- }
- if(sd->sc_data[SC_CURSE].timer!=-1)
- sd->speed += 450;
- if(sd->sc_data[SC_SLOWDOWN].timer!=-1)
- sd->speed = sd->speed*150/100;
- if(sd->sc_data[SC_SPEEDUP0].timer!=-1)
- sd->speed -= sd->speed*25/100;
- }
-
- if(sd->status.option&2 && (skill = pc_checkskill(sd,RG_TUNNELDRIVE))>0 )
- sd->speed += (100-16*skill)*DEFAULT_WALK_SPEED/100;
- if (pc_iscarton(sd) && (skill=pc_checkskill(sd,MC_PUSHCART))>0)
- sd->speed += (short) ((10-skill) * (DEFAULT_WALK_SPEED * 0.1));
- else if (pc_isriding(sd)) {
- sd->speed -= (short) ((0.25 * DEFAULT_WALK_SPEED));
- }
- if((skill=pc_checkskill(sd,TF_MISS))>0)
- if(s_class.job==12)
- sd->speed -= (short) (sd->speed *(skill*1.5)/100);
-
- if(sd->speed_rate != 100)
- sd->speed = sd->speed*sd->speed_rate/100;
- if(sd->speed < 1) sd->speed = 1;
-
- if(sd->skilltimer != -1 && (skill = pc_checkskill(sd,SA_FREECAST)) > 0) {
- sd->prev_speed = sd->speed;
- sd->speed = sd->speed*(175 - skill*5)/100;
- }
-
- if(b_speed != sd->speed)
- clif_updatestatus(sd,SP_SPEED);
-
- return 0;
-}
-
-/*==========================================
- * ‘ÎÛ‚ÌClass‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int status_get_class(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return ((struct mob_data *)bl)->class_;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->status.class_;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- return ((struct pet_data *)bl)->class_;
- else
- return 0;
-}
-/*==========================================
- * ‘ÎÛ‚Ì•ûŒü‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int status_get_dir(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return ((struct mob_data *)bl)->dir;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->dir;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- return ((struct pet_data *)bl)->dir;
- else
- return 0;
-}
-/*==========================================
- * ‘Îۂ̃Œƒxƒ‹‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int status_get_lv(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return ((struct mob_data *)bl)->level;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->status.base_level;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- return ((struct pet_data *)bl)->msd->pet.level;
- else
- return 0;
-}
-
-/*==========================================
- * ‘ÎÛ‚ÌŽË’ö‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int status_get_range(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return mob_db[((struct mob_data *)bl)->class_].range;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->attackrange;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- return mob_db[((struct pet_data *)bl)->class_].range;
- else
- return 0;
-}
-/*==========================================
- * ‘ÎÛ‚ÌHP‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int status_get_hp(struct block_list *bl)
-{
- nullpo_retr(1, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return ((struct mob_data *)bl)->hp;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->status.hp;
- else
- return 1;
-}
-/*==========================================
- * ‘ÎÛ‚ÌMHP‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int status_get_max_hp(struct block_list *bl)
-{
- nullpo_retr(1, bl);
-
- if(bl->type==BL_PC && ((struct map_session_data *)bl))
- return ((struct map_session_data *)bl)->status.max_hp;
- else {
- struct status_change *sc_data;
- int max_hp = 1;
-
- if(bl->type == BL_MOB) {
- struct mob_data *md;
- nullpo_retr(1, md = (struct mob_data *)bl);
- max_hp = mob_db[md->class_].max_hp;
-
- if(battle_config.mobs_level_up) // mobs leveling up increase [Valaris]
- max_hp += (md->level - mob_db[md->class_].lv) * status_get_vit(bl);
-
- if(mob_db[md->class_].mexp > 0) { //MVP Monsters
- if(battle_config.mvp_hp_rate != 100) {
- double hp = (double)max_hp * battle_config.mvp_hp_rate / 100.0;
- max_hp = (hp > 0x7FFFFFFF ? 0x7FFFFFFF : (int)hp);
- }
- }
- else { //Common MONSTERS
- if(battle_config.monster_hp_rate != 100) {
- double hp = (double)max_hp * battle_config.monster_hp_rate / 100.0;
- max_hp = (hp > 0x7FFFFFFF ? 0x7FFFFFFF : (int)hp);
- }
- }
- }
- else if(bl->type == BL_PET) {
- struct pet_data *pd;
- nullpo_retr(1, pd = (struct pet_data*)bl);
- max_hp = mob_db[pd->class_].max_hp;
-
- if(mob_db[pd->class_].mexp > 0) { //MVP Monsters
- if(battle_config.mvp_hp_rate != 100)
- max_hp = (max_hp * battle_config.mvp_hp_rate)/100;
- }
- else { //Common MONSTERS
- if(battle_config.monster_hp_rate != 100)
- max_hp = (max_hp * battle_config.monster_hp_rate)/100;
- }
- }
-
- sc_data = status_get_sc_data(bl);
- if(sc_data) {
- if(sc_data[SC_APPLEIDUN].timer != -1)
- max_hp += ((5 + sc_data[SC_APPLEIDUN].val1 * 2 + ((sc_data[SC_APPLEIDUN].val2 + 1) >> 1)
- + sc_data[SC_APPLEIDUN].val3 / 10) * max_hp)/100;
- if(sc_data[SC_GOSPEL].timer != -1 &&
- sc_data[SC_GOSPEL].val4 == BCT_PARTY &&
- sc_data[SC_GOSPEL].val3 == 4)
- max_hp += max_hp * 25 / 100;
- }
- if(max_hp < 1) max_hp = 1;
- return max_hp;
- }
- return 1;
-}
-/*==========================================
- * ‘ÎÛ‚ÌStr‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int status_get_str(struct block_list *bl)
-{
- int str = 0;
- nullpo_retr(0, bl);
-
- if (bl->type == BL_PC && ((struct map_session_data *)bl))
- return ((struct map_session_data *)bl)->paramc[0];
- else {
- struct status_change *sc_data;
- sc_data = status_get_sc_data(bl);
-
- if(bl->type == BL_MOB && ((struct mob_data *)bl)) {
- str = mob_db[((struct mob_data *)bl)->class_].str;
- if(battle_config.mobs_level_up) // mobs leveling up increase [Valaris]
- str += ((struct mob_data *)bl)->level - mob_db[((struct mob_data *)bl)->class_].lv;
- }
- else if(bl->type == BL_PET && ((struct pet_data *)bl))
- str = mob_db[((struct pet_data *)bl)->class_].str;
-
- if(sc_data) {
- if(sc_data[SC_LOUD].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1)
- str += 4;
- if( sc_data[SC_BLESSING].timer != -1){ // ƒuƒŒƒbƒVƒ“ƒO
- int race = status_get_race(bl);
- if(battle_check_undead(race,status_get_elem_type(bl)) || race == 6)
- str >>= 1; // ˆ« –‚/•sŽ€
- else str += sc_data[SC_BLESSING].val1; // ‚»‚Ì‘¼
- }
- if(sc_data[SC_TRUESIGHT].timer!=-1) // ƒgƒDƒ‹[ƒTƒCƒg
- str += 5;
- }
- }
- if(str < 0) str = 0;
- return str;
-}
-/*==========================================
- * ‘ÎÛ‚ÌAgi‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-
-int status_get_agi(struct block_list *bl)
-{
- int agi=0;
- nullpo_retr(0, bl);
-
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->paramc[1];
- else {
- struct status_change *sc_data;
- sc_data = status_get_sc_data(bl);
- if(bl->type == BL_MOB && (struct mob_data *)bl) {
- agi = mob_db[((struct mob_data *)bl)->class_].agi;
- if(battle_config.mobs_level_up) // increase of mobs leveling up [Valaris]
- agi += ((struct mob_data *)bl)->level - mob_db[((struct mob_data *)bl)->class_].lv;
- }
- else if(bl->type == BL_PET && (struct pet_data *)bl)
- agi = mob_db[((struct pet_data *)bl)->class_].agi;
-
- if(sc_data) {
- if(sc_data[SC_INCREASEAGI].timer!=-1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // ‘¬“x‘‰Á(PC‚Ípc.c‚Å)
- agi += 2 + sc_data[SC_INCREASEAGI].val1;
- if(sc_data[SC_CONCENTRATE].timer!=-1 && sc_data[SC_QUAGMIRE].timer == -1)
- agi += agi * (2 + sc_data[SC_CONCENTRATE].val1)/100;
- if(sc_data[SC_DECREASEAGI].timer!=-1) // ‘¬“xŒ¸­
- agi -= 2 + sc_data[SC_DECREASEAGI].val1;
- if(sc_data[SC_QUAGMIRE].timer!=-1 ) { // ƒNƒ@ƒOƒ}ƒCƒA
- //agi >>= 1;
- //int agib = agi*(sc_data[SC_QUAGMIRE].val1*10)/100;
- //agi -= agib > 50 ? 50 : agib;
- agi -= sc_data[SC_QUAGMIRE].val1*10;
- }
- if(sc_data[SC_TRUESIGHT].timer!=-1) // ƒgƒDƒ‹[ƒTƒCƒg
- agi += 5;
- }
- }
- if(agi < 0) agi = 0;
- return agi;
-}
-/*==========================================
- * ‘ÎÛ‚ÌVit‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int status_get_vit(struct block_list *bl)
-{
- int vit = 0;
- nullpo_retr(0, bl);
-
- if(bl->type == BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->paramc[2];
- else {
- struct status_change *sc_data;
- sc_data = status_get_sc_data(bl);
- if(bl->type == BL_MOB && (struct mob_data *)bl) {
- vit = mob_db[((struct mob_data *)bl)->class_].vit;
- if(battle_config.mobs_level_up) // increase from mobs leveling up [Valaris]
- vit += ((struct mob_data *)bl)->level - mob_db[((struct mob_data *)bl)->class_].lv;
- }
- else if(bl->type == BL_PET && (struct pet_data *)bl)
- vit = mob_db[((struct pet_data *)bl)->class_].vit;
- if(sc_data) {
- if(sc_data[SC_STRIPARMOR].timer != -1)
- vit = vit*60/100;
- if(sc_data[SC_TRUESIGHT].timer!=-1) // ƒgƒDƒ‹[ƒTƒCƒg
- vit += 5;
- }
- }
- if(vit < 0) vit = 0;
- return vit;
-}
-/*==========================================
- * ‘ÎÛ‚ÌInt‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int status_get_int(struct block_list *bl)
-{
- int int_=0;
- nullpo_retr(0, bl);
-
- if(bl->type == BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->paramc[3];
- else {
- struct status_change *sc_data;
- sc_data = status_get_sc_data(bl);
- if(bl->type == BL_MOB && (struct mob_data *)bl){
- int_ = mob_db[((struct mob_data *)bl)->class_].int_;
- if(battle_config.mobs_level_up) // increase from mobs leveling up [Valaris]
- int_ += ((struct mob_data *)bl)->level - mob_db[((struct mob_data *)bl)->class_].lv;
- }
- else if(bl->type == BL_PET && (struct pet_data *)bl)
- int_ = mob_db[((struct pet_data *)bl)->class_].int_;
-
- if(sc_data) {
- if(sc_data[SC_BLESSING].timer != -1){ // ƒuƒŒƒbƒVƒ“ƒO
- int race = status_get_race(bl);
- if(battle_check_undead(race,status_get_elem_type(bl)) || race == 6 )
- int_ >>= 1; // ˆ« –‚/•sŽ€
- else
- int_ += sc_data[SC_BLESSING].val1; // ‚»‚Ì‘¼
- }
- if(sc_data[SC_STRIPHELM].timer != -1)
- int_ = int_*60/100;
- if(sc_data[SC_TRUESIGHT].timer!=-1) // ƒgƒDƒ‹[ƒTƒCƒg
- int_ += 5;
- }
- }
- if(int_ < 0) int_ = 0;
- return int_;
-}
-/*==========================================
- * ‘ÎÛ‚ÌDex‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int status_get_dex(struct block_list *bl)
-{
- int dex = 0;
- nullpo_retr(0, bl);
-
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->paramc[4];
- else {
- struct status_change *sc_data;
- sc_data = status_get_sc_data(bl);
- if(bl->type == BL_MOB && (struct mob_data *)bl) {
- dex = mob_db[((struct mob_data *)bl)->class_].dex;
- if(battle_config.mobs_level_up) // increase from mobs leveling up [Valaris]
- dex += ((struct mob_data *)bl)->level - mob_db[((struct mob_data *)bl)->class_].lv;
- }
- else if(bl->type == BL_PET && (struct pet_data *)bl)
- dex = mob_db[((struct pet_data *)bl)->class_].dex;
-
- if(sc_data) {
- if(sc_data[SC_CONCENTRATE].timer!=-1 && sc_data[SC_QUAGMIRE].timer == -1)
- dex += dex*(2+sc_data[SC_CONCENTRATE].val1)/100;
- if(sc_data[SC_BLESSING].timer != -1){ // ƒuƒŒƒbƒVƒ“ƒO
- int race = status_get_race(bl);
- if(battle_check_undead(race,status_get_elem_type(bl)) || race == 6 )
- dex >>= 1; // ˆ« –‚/•sŽ€
- else dex += sc_data[SC_BLESSING].val1; // ‚»‚Ì‘¼
- }
- if(sc_data[SC_QUAGMIRE].timer!=-1) { // ƒNƒ@ƒOƒ}ƒCƒA
- // dex >>= 1;
- //int dexb = dex*(sc_data[SC_QUAGMIRE].val1*10)/100;
- //dex -= dexb > 50 ? 50 : dexb;
- dex -= sc_data[SC_QUAGMIRE].val1*10;
- }
- if(sc_data[SC_TRUESIGHT].timer!=-1) // ƒgƒDƒ‹[ƒTƒCƒg
- dex += 5;
- }
- }
- if(dex < 0) dex = 0;
- return dex;
-}
-/*==========================================
- * ‘ÎÛ‚ÌLuk‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int status_get_luk(struct block_list *bl)
-{
- int luk = 0;
- nullpo_retr(0, bl);
-
- if(bl->type == BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->paramc[5];
- else {
- struct status_change *sc_data;
- sc_data = status_get_sc_data(bl);
- if(bl->type == BL_MOB && (struct mob_data *)bl) {
- luk = mob_db[((struct mob_data *)bl)->class_].luk;
- if(battle_config.mobs_level_up) // increase from mobs leveling up [Valaris]
- luk += ((struct mob_data *)bl)->level - mob_db[((struct mob_data *)bl)->class_].lv;
- }
- else if(bl->type == BL_PET && (struct pet_data *)bl)
- luk = mob_db[((struct pet_data *)bl)->class_].luk;
- if(sc_data) {
- if(sc_data[SC_GLORIA].timer!=-1) // ƒOƒƒŠƒA(PC‚Ípc.c‚Å)
- luk += 30;
- if(sc_data[SC_TRUESIGHT].timer!=-1) // ƒgƒDƒ‹[ƒTƒCƒg
- luk += 5;
- if(sc_data[SC_CURSE].timer!=-1) // Žô‚¢
- luk = 0;
- }
- }
- if(luk < 0) luk = 0;
- return luk;
-}
-
-/*==========================================
- * ‘ÎÛ‚ÌFlee‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å1ˆÈã
- *------------------------------------------
- */
-int status_get_flee(struct block_list *bl)
-{
- int flee = 1;
- nullpo_retr(1, bl);
-
- if(bl->type == BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->flee;
- else {
- struct status_change *sc_data;
- sc_data = status_get_sc_data(bl);
- flee = status_get_agi(bl) + status_get_lv(bl);
-
- if(sc_data){
- if(sc_data[SC_WHISTLE].timer!=-1)
- flee += flee*(sc_data[SC_WHISTLE].val1+sc_data[SC_WHISTLE].val2
- +(sc_data[SC_WHISTLE].val3>>16))/100;
- if(sc_data[SC_BLIND].timer!=-1)
- flee -= flee*25/100;
- if(sc_data[SC_WINDWALK].timer!=-1) // ƒEƒBƒ“ƒhƒEƒH[ƒN
- flee += flee*(sc_data[SC_WINDWALK].val2)/100;
- if(sc_data[SC_SPIDERWEB].timer!=-1) //ƒXƒpƒCƒ_[ƒEƒFƒu
- flee -= flee*50/100;
- if(sc_data[SC_GOSPEL].timer!=-1) {
- if (sc_data[SC_GOSPEL].val4 == BCT_PARTY &&
- sc_data[SC_GOSPEL].val3 == 13)
- flee += flee*5/100;
- else if (sc_data[SC_GOSPEL].val4 == BCT_ENEMY &&
- sc_data[SC_GOSPEL].val3 == 7)
- flee = 0;
- }
- }
- }
- if(flee < 1) flee = 1;
- return flee;
-}
-/*==========================================
- * ‘ÎÛ‚ÌHit‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å1ˆÈã
- *------------------------------------------
- */
-int status_get_hit(struct block_list *bl)
-{
- int hit = 1;
- nullpo_retr(1, bl);
- if(bl->type == BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->hit;
- else {
- struct status_change *sc_data;
- sc_data = status_get_sc_data(bl);
- hit = status_get_dex(bl) + status_get_lv(bl);
-
- if(sc_data) {
- if(sc_data[SC_HUMMING].timer!=-1) //
- hit += hit*(sc_data[SC_HUMMING].val1*2+sc_data[SC_HUMMING].val2
- +sc_data[SC_HUMMING].val3)/100;
- if(sc_data[SC_BLIND].timer!=-1) // Žô‚¢
- hit -= hit*25/100;
- if(sc_data[SC_TRUESIGHT].timer!=-1) // ƒgƒDƒ‹[ƒTƒCƒg
- hit += 3*(sc_data[SC_TRUESIGHT].val1);
- if(sc_data[SC_CONCENTRATION].timer!=-1) //ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“
- hit += (hit*(10*(sc_data[SC_CONCENTRATION].val1)))/100;
- if(sc_data[SC_GOSPEL].timer!=-1 &&
- sc_data[SC_GOSPEL].val4 == BCT_PARTY &&
- sc_data[SC_GOSPEL].val3 == 14)
- hit += hit*5/100;
- if(sc_data[SC_EXPLOSIONSPIRITS].timer!=-1)
- hit += 20*sc_data[SC_EXPLOSIONSPIRITS].val1;
- }
- }
- if(hit < 1) hit = 1;
- return hit;
-}
-/*==========================================
- * ‘ÎÛ‚ÌŠ®‘S‰ñ”ð‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å1ˆÈã
- *------------------------------------------
- */
-int status_get_flee2(struct block_list *bl)
-{
- int flee2 = 1;
- nullpo_retr(1, bl);
-
- if(bl->type==BL_PC && (struct map_session_data *)bl){
- return ((struct map_session_data *)bl)->flee2;
- } else {
- struct status_change *sc_data;
- sc_data = status_get_sc_data(bl);
- flee2 = status_get_luk(bl)+1;
-
- if(sc_data) {
- if(sc_data[SC_WHISTLE].timer!=-1)
- flee2 += (sc_data[SC_WHISTLE].val1+sc_data[SC_WHISTLE].val2
- +(sc_data[SC_WHISTLE].val3&0xffff))*10;
- }
- }
- if(flee2 < 1) flee2 = 1;
- return flee2;
-}
-/*==========================================
- * ‘Îۂ̃NƒŠƒeƒBƒJƒ‹‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å1ˆÈã
- *------------------------------------------
- */
-int status_get_critical(struct block_list *bl)
-{
- int critical = 1;
- nullpo_retr(1, bl);
-
- if(bl->type == BL_PC && (struct map_session_data *)bl){
- return ((struct map_session_data *)bl)->critical;
- } else {
- struct status_change *sc_data;
- sc_data = status_get_sc_data(bl);
- critical = status_get_luk(bl)*3 + 1;
-
- if(sc_data) {
- if(sc_data[SC_FORTUNE].timer!=-1)
- critical += (10+sc_data[SC_FORTUNE].val1+sc_data[SC_FORTUNE].val2
- + sc_data[SC_FORTUNE].val3)*10;
- if(sc_data[SC_EXPLOSIONSPIRITS].timer!=-1)
- critical += sc_data[SC_EXPLOSIONSPIRITS].val2;
- if(sc_data[SC_TRUESIGHT].timer!=-1) //ƒgƒDƒ‹[ƒTƒCƒg
- critical += critical*sc_data[SC_TRUESIGHT].val1/100;
- }
- }
- if(critical < 1) critical = 1;
- return critical;
-}
-/*==========================================
- * base_atk‚̎擾
- * –ß‚è‚Í®”‚Å1ˆÈã
- *------------------------------------------
- */
-int status_get_baseatk(struct block_list *bl)
-{
- int batk = 1;
- nullpo_retr(1, bl);
-
- if(bl->type==BL_PC && (struct map_session_data *)bl) {
- batk = ((struct map_session_data *)bl)->base_atk; //ݒ肳‚ê‚Ä‚¢‚ébase_atk
- if (((struct map_session_data *)bl)->status.weapon < 16)
- batk += ((struct map_session_data *)bl)->weapon_atk[((struct map_session_data *)bl)->status.weapon];
- } else { //‚»‚êˆÈŠO‚È‚ç
- struct status_change *sc_data;
- int str,dstr;
- str = status_get_str(bl); //STR
- dstr = str/10;
- batk = dstr*dstr + str; //base_atk‚ðŒvŽZ‚·‚é
- sc_data = status_get_sc_data(bl);
-
- if(sc_data) { //ó‘ÔˆÙí‚ ‚è
- if(sc_data[SC_PROVOKE].timer!=-1) //PC‚Ńvƒƒ{ƒbƒN(SM_PROVOKE)ó‘Ô
- batk = batk*(100+2*sc_data[SC_PROVOKE].val1)/100; //base_atk‘‰Á
- if(sc_data[SC_CURSE].timer!=-1) //Žô‚í‚ê‚Ä‚¢‚½‚ç
- batk -= batk*25/100; //base_atk‚ª25%Œ¸­
- if(sc_data[SC_CONCENTRATION].timer!=-1) //ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“
- batk += batk*(5*sc_data[SC_CONCENTRATION].val1)/100;
- }
- }
- if(batk < 1) batk = 1; //base_atk‚ÍÅ’á‚Å‚à1
- return batk;
-}
-/*==========================================
- * ‘ÎÛ‚ÌAtk‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int status_get_atk(struct block_list *bl)
-{
- int atk = 0;
- nullpo_retr(0, bl);
-
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data*)bl)->watk;
- else {
- struct status_change *sc_data;
- sc_data=status_get_sc_data(bl);
-
- if(bl->type == BL_MOB && (struct mob_data *)bl)
- atk = mob_db[((struct mob_data*)bl)->class_].atk1;
- else if(bl->type == BL_PET && (struct pet_data *)bl)
- atk = mob_db[((struct pet_data*)bl)->class_].atk1;
-
- if(sc_data) {
- if(sc_data[SC_PROVOKE].timer!=-1)
- atk = atk*(100+2*sc_data[SC_PROVOKE].val1)/100;
- if(sc_data[SC_CURSE].timer!=-1)
- atk -= atk*25/100;
- if(sc_data[SC_CONCENTRATION].timer!=-1) //ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“
- atk += atk*(5*sc_data[SC_CONCENTRATION].val1)/100;
- if(sc_data[SC_EXPLOSIONSPIRITS].timer!=-1)
- atk += (1000*sc_data[SC_EXPLOSIONSPIRITS].val1);
- if(sc_data[SC_STRIPWEAPON].timer!=-1)
- atk -= atk*10/100;
-
- if(sc_data[SC_GOSPEL].timer!=-1) {
- if (sc_data[SC_GOSPEL].val4 == BCT_PARTY &&
- sc_data[SC_GOSPEL].val3 == 12)
- atk += atk*8/100;
- else if (sc_data[SC_GOSPEL].val4 == BCT_ENEMY &&
- sc_data[SC_GOSPEL].val3 == 6)
- atk = 0;
- }
- }
- }
- if(atk < 0) atk = 0;
- return atk;
-}
-/*==========================================
- * ‘Îۂ̶ŽèAtk‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int status_get_atk_(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl){
- int atk=((struct map_session_data*)bl)->watk_;
- return atk;
- }
- else
- return 0;
-}
-/*==========================================
- * ‘ÎÛ‚ÌAtk2‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int status_get_atk2(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data*)bl)->watk2;
- else {
- struct status_change *sc_data=status_get_sc_data(bl);
- int atk2=0;
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- atk2 = mob_db[((struct mob_data*)bl)->class_].atk2;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- atk2 = mob_db[((struct pet_data*)bl)->class_].atk2;
- if(sc_data) {
- if( sc_data[SC_IMPOSITIO].timer!=-1)
- atk2 += sc_data[SC_IMPOSITIO].val1*5;
- if( sc_data[SC_PROVOKE].timer!=-1 )
- atk2 = atk2*(100+2*sc_data[SC_PROVOKE].val1)/100;
- if( sc_data[SC_CURSE].timer!=-1 )
- atk2 -= atk2*25/100;
- if(sc_data[SC_DRUMBATTLE].timer!=-1)
- atk2 += sc_data[SC_DRUMBATTLE].val2;
- if(sc_data[SC_NIBELUNGEN].timer!=-1 && (status_get_element(bl)/10) >= 8 )
- atk2 += sc_data[SC_NIBELUNGEN].val3;
- if(sc_data[SC_STRIPWEAPON].timer!=-1)
- atk2 = atk2*sc_data[SC_STRIPWEAPON].val2/100;
- if(sc_data[SC_CONCENTRATION].timer!=-1) //ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“
- atk2 += atk2*(5*sc_data[SC_CONCENTRATION].val1)/100;
- if(sc_data[SC_EXPLOSIONSPIRITS].timer!=-1)
- atk2 += (1000*sc_data[SC_EXPLOSIONSPIRITS].val1);
- }
- if(atk2 < 0) atk2 = 0;
- return atk2;
- }
- return 0;
-}
-/*==========================================
- * ‘Îۂ̶ŽèAtk2‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int status_get_atk_2(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data*)bl)->watk_2;
- else
- return 0;
-}
-/*==========================================
- * ‘ÎÛ‚ÌMAtk1‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int status_get_matk1(struct block_list *bl)
-{
- int matk = 0;
- nullpo_retr(0, bl);
-
- if(bl->type == BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->matk1;
- else {
- struct status_change *sc_data;
- int int_ = status_get_int(bl);
- matk = int_+(int_/5)*(int_/5);
-
- sc_data = status_get_sc_data(bl);
- if(sc_data) {
- if(sc_data[SC_MINDBREAKER].timer!=-1)
- matk = matk*(100+2*sc_data[SC_MINDBREAKER].val1)/100;
- }
- }
- return matk;
-}
-/*==========================================
- * ‘ÎÛ‚ÌMAtk2‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int status_get_matk2(struct block_list *bl)
-{
- int matk = 0;
- nullpo_retr(0, bl);
-
- if(bl->type == BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->matk2;
- else {
- struct status_change *sc_data = status_get_sc_data(bl);
- int int_ = status_get_int(bl);
- matk = int_+(int_/7)*(int_/7);
-
- if(sc_data) {
- if(sc_data[SC_MINDBREAKER].timer!=-1)
- matk = matk*(100+2*sc_data[SC_MINDBREAKER].val1)/100;
- }
- }
- return matk;
-}
-/*==========================================
- * ‘ÎÛ‚ÌDef‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int status_get_def(struct block_list *bl)
-{
- struct status_change *sc_data;
- int def=0,skilltimer=-1,skillid=0;
-
- nullpo_retr(0, bl);
- sc_data=status_get_sc_data(bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl){
- def = ((struct map_session_data *)bl)->def;
- skilltimer = ((struct map_session_data *)bl)->skilltimer;
- skillid = ((struct map_session_data *)bl)->skillid;
- }
- else if(bl->type==BL_MOB && (struct mob_data *)bl) {
- def = mob_db[((struct mob_data *)bl)->class_].def;
- skilltimer = ((struct mob_data *)bl)->skilltimer;
- skillid = ((struct mob_data *)bl)->skillid;
- }
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- def = mob_db[((struct pet_data *)bl)->class_].def;
-
- if(def < 1000000) {
- if(sc_data) {
- //“€Œ‹AΉ»Žž‚͉EƒVƒtƒg
- if(sc_data[SC_FREEZE].timer != -1 || (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0))
- def >>= 1;
-
- if (bl->type != BL_PC) {
- //ƒL[ƒsƒ“ƒOŽž‚ÍDEF100
- if( sc_data[SC_KEEPING].timer!=-1)
- def = 100;
- //ƒvƒƒ{ƒbƒNŽž‚ÍŒ¸ŽZ
- if( sc_data[SC_PROVOKE].timer!=-1)
- def = (def*(100 - 6*sc_data[SC_PROVOKE].val1)+50)/100;
- //푾ŒÛ‚Ì‹¿‚«Žž‚͉ÁŽZ
- if( sc_data[SC_DRUMBATTLE].timer!=-1)
- def += sc_data[SC_DRUMBATTLE].val3;
- //“Å‚É‚©‚©‚Á‚Ä‚¢‚鎞‚ÍŒ¸ŽZ
- if(sc_data[SC_POISON].timer!=-1)
- def = def*75/100;
- //ƒXƒgƒŠƒbƒvƒV[ƒ‹ƒhŽž‚ÍŒ¸ŽZ
- if(sc_data[SC_STRIPSHIELD].timer!=-1)
- def = def*sc_data[SC_STRIPSHIELD].val2/100;
- //ƒVƒOƒiƒ€ƒNƒ‹ƒVƒXŽž‚ÍŒ¸ŽZ
- if(sc_data[SC_SIGNUMCRUCIS].timer!=-1)
- def = def * (100 - sc_data[SC_SIGNUMCRUCIS].val2)/100;
- //‰i‰“‚̬“׎ž‚ÍDEF0‚É‚È‚é
- if(sc_data[SC_ETERNALCHAOS].timer!=-1)
- def = 0;
- //ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“Žž‚ÍŒ¸ŽZ
- if( sc_data[SC_CONCENTRATION].timer!=-1)
- def = (def*(100 - 5*sc_data[SC_CONCENTRATION].val1))/100;
-
- if(sc_data[SC_GOSPEL].timer!=-1) {
- if (sc_data[SC_GOSPEL].val4 == BCT_PARTY &&
- sc_data[SC_GOSPEL].val3 == 11)
- def += def*25/100;
- else if (sc_data[SC_GOSPEL].val4 == BCT_ENEMY &&
- sc_data[SC_GOSPEL].val3 == 5)
- def = 0;
- }
- if(sc_data[SC_JOINTBEAT].timer!=-1) {
- if (sc_data[SC_JOINTBEAT].val2 == 4)
- def -= def*50/100;
- else if (sc_data[SC_JOINTBEAT].val2 == 5)
- def -= def*25/100;
- }
- }
- }
- //‰r¥’†‚͉r¥ŽžŒ¸ŽZ—¦‚ÉŠî‚¢‚ÄŒ¸ŽZ
- if(skilltimer != -1) {
- int def_rate = skill_get_castdef(skillid);
- if(def_rate != 0)
- def = (def * (100 - def_rate))/100;
- }
- }
- if(def < 0) def = 0;
- return def;
-}
-/*==========================================
- * ‘ÎÛ‚ÌMDef‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int status_get_mdef(struct block_list *bl)
-{
- struct status_change *sc_data;
- int mdef=0;
-
- nullpo_retr(0, bl);
- sc_data=status_get_sc_data(bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- mdef = ((struct map_session_data *)bl)->mdef;
- else if(bl->type==BL_MOB && (struct mob_data *)bl)
- mdef = mob_db[((struct mob_data *)bl)->class_].mdef;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- mdef = mob_db[((struct pet_data *)bl)->class_].mdef;
-
- if(mdef < 1000000) {
- if(sc_data) {
- //ƒoƒŠƒA[ó‘ÔŽž‚ÍMDEF100
- if(sc_data[SC_BARRIER].timer != -1)
- mdef = 100;
- //“€Œ‹AΉ»Žž‚Í1.25”{
- if(sc_data[SC_FREEZE].timer != -1 || (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0))
- mdef = mdef*125/100;
- if( sc_data[SC_MINDBREAKER].timer!=-1 && bl->type != BL_PC)
- mdef -= (mdef*6*sc_data[SC_MINDBREAKER].val1)/100;
- }
- }
- if(mdef < 0) mdef = 0;
- return mdef;
-}
-/*==========================================
- * ‘ÎÛ‚ÌDef2‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å1ˆÈã
- *------------------------------------------
- */
-int status_get_def2(struct block_list *bl)
-{
- int def2 = 1;
- nullpo_retr(1, bl);
-
- if(bl->type==BL_PC)
- return ((struct map_session_data *)bl)->def2;
- else {
- struct status_change *sc_data;
-
- if(bl->type==BL_MOB)
- def2 = mob_db[((struct mob_data *)bl)->class_].vit;
- else if(bl->type==BL_PET)
- def2 = mob_db[((struct pet_data *)bl)->class_].vit;
-
- sc_data = status_get_sc_data(bl);
- if(sc_data) {
- if(sc_data[SC_ANGELUS].timer != -1)
- def2 = def2*(110+5*sc_data[SC_ANGELUS].val1)/100;
- if(sc_data[SC_PROVOKE].timer!=-1)
- def2 = (def2*(100 - 6*sc_data[SC_PROVOKE].val1)+50)/100;
- if(sc_data[SC_POISON].timer!=-1)
- def2 = def2*75/100;
- //ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“Žž‚ÍŒ¸ŽZ
- if( sc_data[SC_CONCENTRATION].timer!=-1)
- def2 = def2*(100 - 5*sc_data[SC_CONCENTRATION].val1)/100;
-
- if(sc_data[SC_GOSPEL].timer!=-1) {
- if (sc_data[SC_GOSPEL].val4 == BCT_PARTY &&
- sc_data[SC_GOSPEL].val3 == 11)
- def2 += def2*25/100;
- else if (sc_data[SC_GOSPEL].val4 == BCT_ENEMY &&
- sc_data[SC_GOSPEL].val3 == 5)
- def2 = 0;
- }
- }
- }
- if(def2 < 1) def2 = 1;
- return def2;
-}
-/*==========================================
- * ‘ÎÛ‚ÌMDef2‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int status_get_mdef2(struct block_list *bl)
-{
- int mdef2 = 0;
- nullpo_retr(0, bl);
-
- if(bl->type == BL_PC)
- return ((struct map_session_data *)bl)->mdef2 + (((struct map_session_data *)bl)->paramc[2]>>1);
- else {
- struct status_change *sc_data = status_get_sc_data(bl);
- if(bl->type == BL_MOB)
- mdef2 = mob_db[((struct mob_data *)bl)->class_].int_ + (mob_db[((struct mob_data *)bl)->class_].vit>>1);
- else if(bl->type == BL_PET)
- mdef2 = mob_db[((struct pet_data *)bl)->class_].int_ + (mob_db[((struct pet_data *)bl)->class_].vit>>1);
- if(sc_data) {
- if(sc_data[SC_MINDBREAKER].timer!=-1)
- mdef2 -= (mdef2*6*sc_data[SC_MINDBREAKER].val1)/100;
- }
- }
- if(mdef2 < 0) mdef2 = 0;
- return mdef2;
-}
-/*==========================================
- * ‘ÎÛ‚ÌSpeed(ˆÚ“®‘¬“x)‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å1ˆÈã
- * Speed‚ͬ‚³‚¢‚Ù‚¤‚ªˆÚ“®‘¬“x‚ª‘¬‚¢
- *------------------------------------------
- */
-int status_get_speed(struct block_list *bl)
-{
- nullpo_retr(1000, bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->speed;
- else {
- struct status_change *sc_data=status_get_sc_data(bl);
- int speed = 1000;
- if(bl->type==BL_MOB && (struct mob_data *)bl) {
- speed = ((struct mob_data *)bl)->speed;
- if(battle_config.mobs_level_up) // increase from mobs leveling up [Valaris]
- speed-=((struct mob_data *)bl)->level - mob_db[((struct mob_data *)bl)->class_].lv;
- }
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- speed = ((struct pet_data *)bl)->msd->petDB->speed;
-
- if(sc_data) {
- //‘¬“x‘‰ÁŽž‚Í25%Œ¸ŽZ
- if(sc_data[SC_INCREASEAGI].timer!=-1)
- speed -= speed*25/100;
- //ƒEƒBƒ“ƒhƒEƒH[ƒNŽž‚ÍLv*2%Œ¸ŽZ
- else if(sc_data[SC_WINDWALK].timer!=-1)
- speed -= (speed*(sc_data[SC_WINDWALK].val1*2))/100;
- //‘¬“xŒ¸­Žž‚Í25%‰ÁŽZ
- if(sc_data[SC_DECREASEAGI].timer!=-1)
- speed = speed*125/100;
- //ƒNƒ@ƒOƒ}ƒCƒAŽž‚Í50%‰ÁŽZ
- if(sc_data[SC_QUAGMIRE].timer!=-1)
- speed = speed*3/2;
- //Ž„‚ð–Y‚ê‚È‚¢‚ÅcŽž‚͉ÁŽZ
- if(sc_data[SC_DONTFORGETME].timer!=-1)
- speed = speed*(100+sc_data[SC_DONTFORGETME].val1*2 + sc_data[SC_DONTFORGETME].val2 + (sc_data[SC_DONTFORGETME].val3&0xffff))/100;
- //‹à„Žž‚Í25%‰ÁŽZ
- if(sc_data[SC_STEELBODY].timer!=-1)
- speed = speed*125/100;
- //ƒfƒBƒtƒFƒ“ƒ_[Žž‚͉ÁŽZ
- if(sc_data[SC_DEFENDER].timer!=-1)
- speed = (speed * (155 - sc_data[SC_DEFENDER].val1*5)) / 100;
- //—x‚èó‘Ô‚Í4”{’x‚¢
- if(sc_data[SC_DANCING].timer!=-1 )
- speed *= 6;
- //Žô‚¢Žž‚Í450‰ÁŽZ
- if(sc_data[SC_CURSE].timer!=-1)
- speed = speed + 450;
- if(sc_data[SC_SLOWDOWN].timer!=-1)
- speed = speed*150/100;
- if(sc_data[SC_SPEEDUP0].timer!=-1)
- speed -= speed*25/100;
- if(sc_data[SC_GOSPEL].timer!=-1 &&
- sc_data[SC_GOSPEL].val4 == BCT_ENEMY &&
- sc_data[SC_GOSPEL].val3 == 8)
- speed = speed*125/100;
- if(sc_data[SC_JOINTBEAT].timer!=-1) {
- if (sc_data[SC_JOINTBEAT].val2 == 1)
- speed = speed*150/100;
- else if (sc_data[SC_JOINTBEAT].val2 == 3)
- speed = speed*130/100;
- }
- }
- if(speed < 1) speed = 1;
- return speed;
- }
-
- return 1000;
-}
-/*==========================================
- * ‘ÎÛ‚ÌaDelay(UŒ‚ŽžƒfƒBƒŒƒC)‚ð•Ô‚·(”Ä—p)
- * aDelay‚ͬ‚³‚¢‚Ù‚¤‚ªUŒ‚‘¬“x‚ª‘¬‚¢
- *------------------------------------------
- */
-int status_get_adelay(struct block_list *bl)
-{
- nullpo_retr(4000, bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- return (((struct map_session_data *)bl)->aspd<<1);
- else {
- struct status_change *sc_data=status_get_sc_data(bl);
- int adelay=4000,aspd_rate = 100,i;
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- adelay = mob_db[((struct mob_data *)bl)->class_].adelay;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- adelay = mob_db[((struct pet_data *)bl)->class_].adelay;
-
- if(sc_data) {
- //ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“Žg—pŽž‚ŃNƒ@ƒOƒ}ƒCƒA‚Å‚àŽ„‚ð–Y‚ê‚È‚¢‚Åc‚Å‚à‚È‚¢Žž‚Í3Š„Œ¸ŽZ
- if(sc_data[SC_TWOHANDQUICKEN].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // 2HQ
- aspd_rate -= 30;
- //ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…Žg—pŽž‚Ńc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“‚Å‚àƒNƒ@ƒOƒ}ƒCƒA‚Å‚àŽ„‚ð–Y‚ê‚È‚¢‚Åc‚Å‚à‚È‚¢Žž‚Í
- if(sc_data[SC_ADRENALINE].timer != -1 && sc_data[SC_TWOHANDQUICKEN].timer == -1 &&
- sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) { // ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…
- //Žg—pŽÒ‚ƃp[ƒeƒBƒƒ“ƒo[‚ÅŠi·‚ªo‚éÝ’è‚Å‚È‚¯‚ê‚Î3Š„Œ¸ŽZ
- if(sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penalty)
- aspd_rate -= 30;
- //‚»‚¤‚Å‚È‚¯‚ê‚Î2.5Š„Œ¸ŽZ
- else
- aspd_rate -= 25;
- }
- //ƒXƒsƒAƒNƒBƒbƒPƒ“Žž‚ÍŒ¸ŽZ
- if(sc_data[SC_SPEARSQUICKEN].timer != -1 && sc_data[SC_ADRENALINE].timer == -1 &&
- sc_data[SC_TWOHANDQUICKEN].timer == -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // ƒXƒsƒAƒNƒBƒbƒPƒ“
- aspd_rate -= sc_data[SC_SPEARSQUICKEN].val2;
- //—[“ú‚̃AƒTƒVƒ“ƒNƒƒXŽž‚ÍŒ¸ŽZ
- if(sc_data[SC_ASSNCROS].timer!=-1 && // —[—z‚̃AƒTƒVƒ“ƒNƒƒX
- sc_data[SC_TWOHANDQUICKEN].timer==-1 && sc_data[SC_ADRENALINE].timer==-1 && sc_data[SC_SPEARSQUICKEN].timer==-1 &&
- sc_data[SC_DONTFORGETME].timer == -1)
- aspd_rate -= 5+sc_data[SC_ASSNCROS].val1+sc_data[SC_ASSNCROS].val2+sc_data[SC_ASSNCROS].val3;
- //Ž„‚ð–Y‚ê‚È‚¢‚ÅcŽž‚͉ÁŽZ
- if(sc_data[SC_DONTFORGETME].timer!=-1) // Ž„‚ð–Y‚ê‚È‚¢‚Å
- aspd_rate += sc_data[SC_DONTFORGETME].val1*3 + sc_data[SC_DONTFORGETME].val2 + (sc_data[SC_DONTFORGETME].val3>>16);
- //‹à„Žž25%‰ÁŽZ
- if(sc_data[SC_STEELBODY].timer!=-1) // ‹à„
- aspd_rate += 25;
- //‘‘¬ƒ|[ƒVƒ‡ƒ“Žg—pŽž‚ÍŒ¸ŽZ
- if( sc_data[i=SC_SPEEDPOTION3].timer!=-1 || sc_data[i=SC_SPEEDPOTION2].timer!=-1 || sc_data[i=SC_SPEEDPOTION1].timer!=-1 || sc_data[i=SC_SPEEDPOTION0].timer!=-1)
- aspd_rate -= sc_data[i].val2;
- //ƒfƒBƒtƒFƒ“ƒ_[Žž‚͉ÁŽZ
- if(sc_data[SC_DEFENDER].timer != -1)
- aspd_rate += (25 - sc_data[SC_DEFENDER].val1*5);
- //adelay += (1100 - sc_data[SC_DEFENDER].val1*100);
- if(sc_data[SC_GOSPEL].timer!=-1 &&
- sc_data[SC_GOSPEL].val4 == BCT_ENEMY &&
- sc_data[SC_GOSPEL].val3 == 8)
- aspd_rate = aspd_rate*125/100;
- if(sc_data[SC_JOINTBEAT].timer!=-1) {
- if (sc_data[SC_JOINTBEAT].val2 == 2)
- aspd_rate = aspd_rate*125/100;
- else if (sc_data[SC_JOINTBEAT].val2 == 3)
- aspd_rate = aspd_rate*110/100;
- }
- }
- if(aspd_rate != 100)
- adelay = adelay*aspd_rate/100;
- if(adelay < battle_config.monster_max_aspd<<1) adelay = battle_config.monster_max_aspd<<1;
- return adelay;
- }
- return 4000;
-}
-int status_get_amotion(struct block_list *bl)
-{
- nullpo_retr(2000, bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->amotion;
- else {
- struct status_change *sc_data=status_get_sc_data(bl);
- int amotion=2000,aspd_rate = 100,i;
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- amotion = mob_db[((struct mob_data *)bl)->class_].amotion;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- amotion = mob_db[((struct pet_data *)bl)->class_].amotion;
-
- if(sc_data) {
- if(sc_data[SC_TWOHANDQUICKEN].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // 2HQ
- aspd_rate -= 30;
- if(sc_data[SC_ADRENALINE].timer != -1 && sc_data[SC_TWOHANDQUICKEN].timer == -1 &&
- sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) { // ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…
- if(sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penalty)
- aspd_rate -= 30;
- else
- aspd_rate -= 25;
- }
- if(sc_data[SC_SPEARSQUICKEN].timer != -1 && sc_data[SC_ADRENALINE].timer == -1 &&
- sc_data[SC_TWOHANDQUICKEN].timer == -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // ƒXƒsƒAƒNƒBƒbƒPƒ“
- aspd_rate -= sc_data[SC_SPEARSQUICKEN].val2;
- if(sc_data[SC_ASSNCROS].timer!=-1 && // —[—z‚̃AƒTƒVƒ“ƒNƒƒX
- sc_data[SC_TWOHANDQUICKEN].timer==-1 && sc_data[SC_ADRENALINE].timer==-1 && sc_data[SC_SPEARSQUICKEN].timer==-1 &&
- sc_data[SC_DONTFORGETME].timer == -1)
- aspd_rate -= 5+sc_data[SC_ASSNCROS].val1+sc_data[SC_ASSNCROS].val2+sc_data[SC_ASSNCROS].val3;
- if(sc_data[SC_DONTFORGETME].timer!=-1) // Ž„‚ð–Y‚ê‚È‚¢‚Å
- aspd_rate += sc_data[SC_DONTFORGETME].val1*3 + sc_data[SC_DONTFORGETME].val2 + (sc_data[SC_DONTFORGETME].val3>>16);
- if(sc_data[SC_STEELBODY].timer!=-1) // ‹à„
- aspd_rate += 25;
- if( sc_data[i=SC_SPEEDPOTION3].timer!=-1 || sc_data[i=SC_SPEEDPOTION2].timer!=-1 || sc_data[i=SC_SPEEDPOTION1].timer!=-1 || sc_data[i=SC_SPEEDPOTION0].timer!=-1)
- aspd_rate -= sc_data[i].val2;
- if(sc_data[SC_DEFENDER].timer != -1)
- aspd_rate += (25 - sc_data[SC_DEFENDER].val1*5);
- //amotion += (550 - sc_data[SC_DEFENDER].val1*50);
- }
- if(aspd_rate != 100)
- amotion = amotion*aspd_rate/100;
- if(amotion < battle_config.monster_max_aspd) amotion = battle_config.monster_max_aspd;
- return amotion;
- }
- return 2000;
-}
-int status_get_dmotion(struct block_list *bl)
-{
- int ret;
- struct status_change *sc_data;
-
- nullpo_retr(0, bl);
- sc_data = status_get_sc_data(bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl){
- ret=mob_db[((struct mob_data *)bl)->class_].dmotion;
- if(battle_config.monster_damage_delay_rate != 100)
- ret = ret*battle_config.monster_damage_delay_rate/400;
- }
- else if(bl->type==BL_PC && (struct map_session_data *)bl){
- ret=((struct map_session_data *)bl)->dmotion;
- if(battle_config.pc_damage_delay_rate != 100)
- ret = ret*battle_config.pc_damage_delay_rate/400;
- }
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- ret=mob_db[((struct pet_data *)bl)->class_].dmotion;
- else
- return 2000;
-
- if((sc_data && (sc_data[SC_ENDURE].timer!=-1 || sc_data[SC_BERSERK].timer!=-1)) ||
- (bl->type == BL_PC && ((struct map_session_data *)bl)->special_state.infinite_endure))
- ret=0;
-
- return ret;
-}
-int status_get_element(struct block_list *bl)
-{
- int ret = 20;
- struct status_change *sc_data;
-
- nullpo_retr(ret, bl);
- sc_data = status_get_sc_data(bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl) // 10‚̈ÊLv*2A‚P‚̈ʑ®«
- ret=((struct mob_data *)bl)->def_ele;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- ret=20+((struct map_session_data *)bl)->def_ele; // –hŒä‘®«Lv1
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- ret = mob_db[((struct pet_data *)bl)->class_].element;
-
- if(sc_data) {
- if( sc_data[SC_BENEDICTIO].timer!=-1 ) // ¹‘Ì~•Ÿ
- ret=26;
- if( sc_data[SC_FREEZE].timer!=-1 ) // “€Œ‹
- ret=21;
- if( sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0)
- ret=22;
- }
-
- return ret;
-}
-
-int status_get_attack_element(struct block_list *bl)
-{
- int ret = 0;
- struct status_change *sc_data=status_get_sc_data(bl);
-
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- ret=0;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- ret=((struct map_session_data *)bl)->atk_ele;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- ret=0;
-
- if(sc_data) {
- if( sc_data[SC_FROSTWEAPON].timer!=-1) // ƒtƒƒXƒgƒEƒFƒ|ƒ“
- ret=1;
- if( sc_data[SC_SEISMICWEAPON].timer!=-1) // ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“
- ret=2;
- if( sc_data[SC_FLAMELAUNCHER].timer!=-1) // ƒtƒŒ[ƒ€ƒ‰ƒ“ƒ`ƒƒ[
- ret=3;
- if( sc_data[SC_LIGHTNINGLOADER].timer!=-1) // ƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[
- ret=4;
- if( sc_data[SC_ENCPOISON].timer!=-1) // ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“
- ret=5;
- if( sc_data[SC_ASPERSIO].timer!=-1) // ƒAƒXƒyƒ‹ƒVƒI
- ret=6;
- }
-
- return ret;
-}
-int status_get_attack_element2(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl) {
- int ret = ((struct map_session_data *)bl)->atk_ele_;
- struct status_change *sc_data = ((struct map_session_data *)bl)->sc_data;
-
- if(sc_data) {
- if( sc_data[SC_FROSTWEAPON].timer!=-1) // ƒtƒƒXƒgƒEƒFƒ|ƒ“
- ret=1;
- if( sc_data[SC_SEISMICWEAPON].timer!=-1) // ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“
- ret=2;
- if( sc_data[SC_FLAMELAUNCHER].timer!=-1) // ƒtƒŒ[ƒ€ƒ‰ƒ“ƒ`ƒƒ[
- ret=3;
- if( sc_data[SC_LIGHTNINGLOADER].timer!=-1) // ƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[
- ret=4;
- if( sc_data[SC_ENCPOISON].timer!=-1) // ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“
- ret=5;
- if( sc_data[SC_ASPERSIO].timer!=-1) // ƒAƒXƒyƒ‹ƒVƒI
- ret=6;
- }
- return ret;
- }
- return 0;
-}
-int status_get_party_id(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->status.party_id;
- else if(bl->type==BL_MOB && (struct mob_data *)bl){
- struct mob_data *md=(struct mob_data *)bl;
- if( md->master_id>0 )
- return -md->master_id;
- return -md->bl.id;
- }
- else if(bl->type==BL_SKILL && (struct skill_unit *)bl)
- return ((struct skill_unit *)bl)->group->party_id;
- else
- return 0;
-}
-int status_get_guild_id(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->status.guild_id;
- else if(bl->type==BL_MOB && (struct mob_data *)bl)
- return ((struct mob_data *)bl)->class_;
- else if(bl->type==BL_SKILL && (struct skill_unit *)bl)
- return ((struct skill_unit *)bl)->group->guild_id;
- else
- return 0;
-}
-int status_get_race(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return mob_db[((struct mob_data *)bl)->class_].race;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return 7;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- return mob_db[((struct pet_data *)bl)->class_].race;
- else
- return 0;
-}
-int status_get_size(struct block_list *bl)
-{
- nullpo_retr(1, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return mob_db[((struct mob_data *)bl)->class_].size;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- return mob_db[((struct pet_data *)bl)->class_].size;
- else if(bl->type==BL_PC) {
- struct map_session_data *sd = (struct map_session_data *)bl;
- //if (pc_isriding(sd)) // fact or rumour?
- // return 2;
- if (pc_calc_upper(sd->status.class_) == 2)
- return 0;
- return 1;
- } else
- return 1;
-}
-int status_get_mode(struct block_list *bl)
-{
- nullpo_retr(0x01, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return mob_db[((struct mob_data *)bl)->class_].mode;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- return mob_db[((struct pet_data *)bl)->class_].mode;
- else
- return 0x01; // ‚Æ‚è‚ ‚¦‚¸“®‚­‚Æ‚¢‚¤‚±‚Æ‚Å1
-}
-
-int status_get_mexp(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return mob_db[((struct mob_data *)bl)->class_].mexp;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- return mob_db[((struct pet_data *)bl)->class_].mexp;
- else
- return 0;
-}
-int status_get_race2(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type == BL_MOB && (struct mob_data *)bl)
- return mob_db[((struct mob_data *)bl)->class_].race2;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- return mob_db[((struct pet_data *)bl)->class_].race2;
- else
- return 0;
-}
-int status_isdead(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type == BL_MOB && (struct mob_data *)bl)
- return ((struct mob_data *)bl)->state.state == MS_DEAD;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return pc_isdead((struct map_session_data *)bl);
- else
- return 0;
-}
-
-// StatusChangeŒn‚ÌŠ“¾
-struct status_change *status_get_sc_data(struct block_list *bl)
-{
- nullpo_retr(NULL, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return ((struct mob_data*)bl)->sc_data;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data*)bl)->sc_data;
- return NULL;
-}
-short *status_get_sc_count(struct block_list *bl)
-{
- nullpo_retr(NULL, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return &((struct mob_data*)bl)->sc_count;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return &((struct map_session_data*)bl)->sc_count;
- return NULL;
-}
-short *status_get_opt1(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return &((struct mob_data*)bl)->opt1;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return &((struct map_session_data*)bl)->opt1;
- else if(bl->type==BL_NPC && (struct npc_data *)bl)
- return &((struct npc_data*)bl)->opt1;
- return 0;
-}
-short *status_get_opt2(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return &((struct mob_data*)bl)->opt2;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return &((struct map_session_data*)bl)->opt2;
- else if(bl->type==BL_NPC && (struct npc_data *)bl)
- return &((struct npc_data*)bl)->opt2;
- return 0;
-}
-short *status_get_opt3(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return &((struct mob_data*)bl)->opt3;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return &((struct map_session_data*)bl)->opt3;
- else if(bl->type==BL_NPC && (struct npc_data *)bl)
- return &((struct npc_data*)bl)->opt3;
- return 0;
-}
-short *status_get_option(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return &((struct mob_data*)bl)->option;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return &((struct map_session_data*)bl)->status.option;
- else if(bl->type==BL_NPC && (struct npc_data *)bl)
- return &((struct npc_data*)bl)->option;
- return 0;
-}
-
-int status_get_sc_def(struct block_list *bl, int type)
-{
- int sc_def;
- nullpo_retr(0, bl);
-
- switch (type)
- {
- case SP_MDEF1: // mdef
- sc_def = 100 - (3 + status_get_mdef(bl) + status_get_luk(bl)/3);
- break;
- case SP_MDEF2: // int
- sc_def = 100 - (3 + status_get_int(bl) + status_get_luk(bl)/3);
- break;
- case SP_DEF1: // def
- sc_def = 100 - (3 + status_get_def(bl) + status_get_luk(bl)/3);
- break;
- case SP_DEF2: // vit
- sc_def = 100 - (3 + status_get_vit(bl) + status_get_luk(bl)/3);
- break;
- case SP_LUK: // luck
- sc_def = 100 - (3 + status_get_luk(bl));
- break;
-
- case SC_STONE:
- case SC_FREEZE:
- sc_def = 100 - (3 + status_get_mdef(bl) + status_get_luk(bl)/3);
- break;
- case SC_STAN:
- case SC_POISON:
- case SC_SILENCE:
- sc_def = 100 - (3 + status_get_vit(bl) + status_get_luk(bl)/3);
- break;
- case SC_SLEEP:
- case SC_CONFUSION:
- case SC_BLIND:
- sc_def = 100 - (3 + status_get_int(bl) + status_get_luk(bl)/3);
- break;
- case SC_CURSE:
- sc_def = 100 - (3 + status_get_luk(bl));
- break;
-
- default:
- sc_def = 100;
- break;
- }
-
- if(bl->type == BL_MOB) {
- struct mob_data *md = (struct mob_data *)bl;
- if (md && md->class_ == 1288)
- return 0;
- if (sc_def < 50)
- sc_def = 50;
- } else if(bl->type == BL_PC) {
- struct status_change* sc_data = status_get_sc_data(bl);
- if (sc_data && sc_data[SC_GOSPEL].timer != -1 &&
- sc_data[SC_GOSPEL].val4 == BCT_PARTY &&
- sc_data[SC_GOSPEL].val3 == 3)
- sc_def -= 25;
- }
-
- return (sc_def < 0) ? 0 : sc_def;
-}
-
-/*==========================================
- * ƒXƒe[ƒ^ƒXˆÙíŠJŽn
- *------------------------------------------
- */
-int status_change_start(struct block_list *bl,int type,int val1,int val2,int val3,int val4,int tick,int flag)
-{
- struct map_session_data *sd = NULL;
- struct status_change* sc_data;
- short *sc_count, *option, *opt1, *opt2, *opt3;
- int opt_flag = 0, calc_flag = 0,updateflag = 0, save_flag = 0, race, mode, elem, undead_flag;
- int scdef = 0;
- int type2 = type;
-
- nullpo_retr(0, bl);
- if(bl->type == BL_SKILL)
- return 0;
- if(bl->type == BL_MOB)
- if (status_isdead(bl)) return 0;
-
- nullpo_retr(0, sc_data=status_get_sc_data(bl));
- nullpo_retr(0, sc_count=status_get_sc_count(bl));
- nullpo_retr(0, option=status_get_option(bl));
- nullpo_retr(0, opt1=status_get_opt1(bl));
- nullpo_retr(0, opt2=status_get_opt2(bl));
- nullpo_retr(0, opt3=status_get_opt3(bl));
-
-
- race=status_get_race(bl);
- mode=status_get_mode(bl);
- elem=status_get_elem_type(bl);
- undead_flag=battle_check_undead(race,elem);
-
- if(type == SC_AETERNA && (sc_data[SC_STONE].timer != -1 || sc_data[SC_FREEZE].timer != -1) )
- return 0;
-
- switch(type){
- case SC_STONE:
- case SC_FREEZE:
- scdef=3+status_get_mdef(bl)+status_get_luk(bl)/3;
- break;
- case SC_STAN:
- case SC_SILENCE:
- case SC_POISON:
- case SC_DPOISON:
- scdef=3+status_get_vit(bl)+status_get_luk(bl)/3;
- break;
- case SC_SLEEP:
- case SC_BLIND:
- scdef=3+status_get_int(bl)+status_get_luk(bl)/3;
- break;
- case SC_CURSE:
- scdef=3+status_get_luk(bl);
- break;
-
-// case SC_CONFUSION:
- default:
- scdef=0;
- }
- if(scdef>=100)
- return 0;
- if(bl->type==BL_PC){
- sd=(struct map_session_data *)bl;
- if( sd && type == SC_ADRENALINE && !(skill_get_weapontype(BS_ADRENALINE)&(1<<sd->status.weapon)))
- return 0;
-
- if(SC_STONE<=type && type<=SC_BLIND){ /* ƒJ?ƒh‚É‚æ‚é‘Ï« */
- if( sd && sd->reseff[type-SC_STONE] > 0 && rand()%10000<sd->reseff[type-SC_STONE]){
- if(battle_config.battle_log)
- printf("PC %d skill_sc_start: card‚É‚æ‚éˆÙí‘Ï«?“®\n",sd->bl.id);
- return 0;
- }
- }
- }
- else if(bl->type == BL_MOB) {
- }
- else {
- if(battle_config.error_log)
- printf("status_change_start: neither MOB nor PC !\n");
- return 0;
- }
-
- if(type==SC_FREEZE && undead_flag && !(flag&1))
- return 0;
-
- if (type==SC_BLESSING && (bl->type==BL_PC || (!undead_flag && race!=6))) {
- if (sc_data[SC_CURSE].timer!=-1)
- status_change_end(bl,SC_CURSE,-1);
- if (sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0)
- status_change_end(bl,SC_STONE,-1);
- }
-
- if((type == SC_ADRENALINE || type == SC_WEAPONPERFECTION || type == SC_OVERTHRUST) &&
- sc_data[type].timer != -1 && sc_data[type].val2 && !val2)
- return 0;
-
- if(mode & 0x20 && (type==SC_STONE || type==SC_FREEZE ||
- type==SC_STAN || type==SC_SLEEP || type==SC_SILENCE || type==SC_QUAGMIRE || type == SC_DECREASEAGI || type == SC_SIGNUMCRUCIS || type == SC_PROVOKE ||
- (type == SC_BLESSING && (undead_flag || race == 6))) && !(flag&1)){
- /* ƒ{ƒX‚É‚Í?‚©‚È‚¢(‚½‚¾‚µƒJ?ƒh‚É‚æ‚é?‰Ê‚Í“K—p‚³‚ê‚é) */
- return 0;
- }
- if(type==SC_FREEZE || type==SC_STAN || type==SC_SLEEP)
- battle_stopwalking(bl,1);
-
- if(sc_data[type].timer != -1){ /* ‚·‚Å‚É“¯‚¶ˆÙí‚É‚È‚Á‚Ä‚¢‚éꇃ^ƒCƒ}‰ðœ */
- if(sc_data[type].val1 > val1 && type != SC_COMBO && type != SC_DANCING && type != SC_DEVOTION &&
- type != SC_SPEEDPOTION0 && type != SC_SPEEDPOTION1 && type != SC_SPEEDPOTION2 && type != SC_SPEEDPOTION3
- && type != SC_ATKPOT && type != SC_MATKPOT) // added atk and matk potions [Valaris]
- return 0;
-
- if ((type >=SC_STAN && type <= SC_BLIND) || type == SC_DPOISON)
- return 0;/* ?‚¬‘«‚µ‚ª‚Å‚«‚È‚¢?‘ÔˆÙí‚Å‚ ‚鎞‚Í?‘ÔˆÙí‚ðs‚í‚È‚¢ */
-
- (*sc_count)--;
- delete_timer(sc_data[type].timer, status_change_timer);
- sc_data[type].timer = -1;
- }
-
- // ƒNƒAƒOƒ}ƒCƒA/Ž„‚ð–Y‚ê‚È‚¢‚Å’†‚Í–³Œø‚ȃXƒLƒ‹
- if ((sc_data[SC_QUAGMIRE].timer!=-1 || sc_data[SC_DONTFORGETME].timer!=-1) &&
- (type==SC_CONCENTRATE || type==SC_INCREASEAGI ||
- type==SC_TWOHANDQUICKEN || type==SC_SPEARSQUICKEN ||
- type==SC_ADRENALINE || type==SC_LOUD || type==SC_TRUESIGHT ||
- type==SC_WINDWALK || type==SC_CARTBOOST || type==SC_ASSNCROS))
- return 0;
-
- switch(type){ /* ˆÙí‚ÌŽí—Þ‚²‚Æ‚Ì?— */
- case SC_PROVOKE: /* ƒvƒƒ{ƒbƒN */
- calc_flag = 1;
- if(tick <= 0) tick = 1000; /* (ƒI?ƒgƒo?ƒT?ƒN) */
- break;
- case SC_ENDURE: /* ƒCƒ“ƒfƒ…ƒA */
- if(tick <= 0) tick = 1000 * 60;
- calc_flag = 1; // for updating mdef
-#ifdef TWILIGHT
- val2 = 40; // [Celest]
-#else
- val2 = 7; // [Celest]
-#endif
- break;
- case SC_AUTOBERSERK:
- {
- tick = 60*1000;
- if (bl->type == BL_PC && sd->status.hp<sd->status.max_hp>>2 &&
- (sc_data[SC_PROVOKE].timer==-1 || sc_data[SC_PROVOKE].val2==0))
- status_change_start(bl,SC_PROVOKE,10,1,0,0,0,0);
- }
- break;
-
- case SC_CONCENTRATE: /* W’†—ÍŒüã */
- case SC_BLESSING: /* ƒuƒŒƒbƒVƒ“ƒO */
- case SC_ANGELUS: /* ƒAƒ“ƒ[ƒ‹ƒX */
- calc_flag = 1;
- break;
-
- case SC_INCREASEAGI: /* ‘¬“x㸠*/
- calc_flag = 1;
- if(sc_data[SC_DECREASEAGI].timer!=-1 )
- status_change_end(bl,SC_DECREASEAGI,-1);
- // the effect will still remain [celest]
-// if(sc_data[SC_WINDWALK].timer!=-1 ) /* ƒEƒCƒ“ƒhƒEƒH?ƒN */
-// status_change_end(bl,SC_WINDWALK,-1);
- break;
- case SC_DECREASEAGI: /* ‘¬“xŒ¸­ */
- if (bl->type == BL_PC) // Celest
- tick>>=1;
- calc_flag = 1;
- if(sc_data[SC_INCREASEAGI].timer!=-1 )
- status_change_end(bl,SC_INCREASEAGI,-1);
- if(sc_data[SC_ADRENALINE].timer!=-1 )
- status_change_end(bl,SC_ADRENALINE,-1);
- if(sc_data[SC_SPEARSQUICKEN].timer!=-1 )
- status_change_end(bl,SC_SPEARSQUICKEN,-1);
- if(sc_data[SC_TWOHANDQUICKEN].timer!=-1 )
- status_change_end(bl,SC_TWOHANDQUICKEN,-1);
- break;
- case SC_SIGNUMCRUCIS: /* ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX */
- calc_flag = 1;
-// val2 = 14 + val1;
- val2 = 10 + val1*2;
- tick = 600*1000;
- clif_emotion(bl,4);
- break;
- case SC_SLOWPOISON:
- if (sc_data[SC_POISON].timer == -1 && sc_data[SC_DPOISON].timer == -1)
- return 0;
- break;
- case SC_TWOHANDQUICKEN: /* 2HQ */
- if(sc_data[SC_DECREASEAGI].timer!=-1)
- return 0;
- *opt3 |= 1;
- calc_flag = 1;
- break;
- case SC_ADRENALINE: /* ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ… */
- if(sc_data[SC_DECREASEAGI].timer!=-1)
- return 0;
- if(bl->type == BL_PC)
- if(pc_checkskill(sd,BS_HILTBINDING)>0)
- tick += tick / 10;
- calc_flag = 1;
- break;
- case SC_WEAPONPERFECTION: /* ƒEƒFƒ|ƒ“ƒp?ƒtƒFƒNƒVƒ‡ƒ“ */
- if(bl->type == BL_PC)
- if(pc_checkskill(sd,BS_HILTBINDING)>0)
- tick += tick / 10;
- break;
- case SC_OVERTHRUST: /* ƒI?ƒo?ƒXƒ‰ƒXƒg */
- if(bl->type == BL_PC)
- if(pc_checkskill(sd,BS_HILTBINDING)>0)
- tick += tick / 10;
- *opt3 |= 2;
- break;
- case SC_MAXIMIZEPOWER: /* ƒ}ƒLƒVƒ}ƒCƒYƒpƒ?(SP‚ª1Œ¸‚鎞ŠÔ,val2‚É‚à) */
- if(bl->type == BL_PC)
- val2 = tick;
- else
- tick = 5000*val1;
- break;
- case SC_ENCPOISON: /* ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“ */
- calc_flag = 1;
- val2=(((val1 - 1) / 2) + 3)*100; /* “Å•t?Šm—¦ */
- skill_enchant_elemental_end(bl,SC_ENCPOISON);
- break;
- case SC_EDP: // [Celest]
- val2 = val1 + 2; /* –Ò“Å•t?Šm—¦(%) */
- calc_flag = 1;
- break;
- case SC_POISONREACT: /* ƒ|ƒCƒYƒ“ƒŠƒAƒNƒg */
- val2=val1/2 + val1%2; // [Celest]
- break;
- case SC_IMPOSITIO: /* ƒCƒ“ƒ|ƒVƒeƒBƒIƒ}ƒkƒX */
- calc_flag = 1;
- break;
- case SC_ASPERSIO: /* ƒAƒXƒyƒ‹ƒVƒI */
- skill_enchant_elemental_end(bl,SC_ASPERSIO);
- break;
- case SC_SUFFRAGIUM: /* ƒTƒtƒ‰ƒMƒ€ */
- case SC_BENEDICTIO: /* ¹? */
- case SC_MAGNIFICAT: /* ƒ}ƒOƒjƒtƒBƒJ?ƒg */
- case SC_AETERNA: /* ƒG?ƒeƒ‹ƒi */
- break;
- case SC_ENERGYCOAT: /* ƒGƒiƒW?ƒR?ƒg */
- *opt3 |= 4;
- break;
- case SC_MAGICROD:
- val2 = val1*20;
- break;
- case SC_KYRIE: /* ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“ */
- val2 = status_get_max_hp(bl) * (val1 * 2 + 10) / 100;/* ‘Ï‹v“x */
- val3 = (val1 / 2 + 5); /* ‰ñ? */
-// -- moonsoul (added to undo assumptio status if target has it)
- if(sc_data[SC_ASSUMPTIO].timer!=-1 )
- status_change_end(bl,SC_ASSUMPTIO,-1);
- break;
- case SC_MINDBREAKER:
- calc_flag = 1;
- if(tick <= 0) tick = 1000; /* (ƒI?ƒgƒo?ƒT?ƒN) */
- case SC_GLORIA: /* ƒOƒƒŠƒA */
- calc_flag = 1;
- break;
- case SC_LOUD: /* ƒ‰ƒEƒhƒ{ƒCƒX */
- calc_flag = 1;
- break;
- case SC_TRICKDEAD: /* Ž€‚ñ‚¾‚Ó‚è */
- if (bl->type == BL_PC) {
- pc_stopattack((struct map_session_data *)sd);
- }
- break;
- case SC_QUAGMIRE: /* ƒNƒ@ƒOƒ}ƒCƒA */
- calc_flag = 1;
- if(sc_data[SC_CONCENTRATE].timer!=-1 ) /* W’†—ÍŒüã‰ðœ */
- status_change_end(bl,SC_CONCENTRATE,-1);
- if(sc_data[SC_INCREASEAGI].timer!=-1 ) /* ‘¬“x㸉ðœ */
- status_change_end(bl,SC_INCREASEAGI,-1);
- if(sc_data[SC_TWOHANDQUICKEN].timer!=-1 )
- status_change_end(bl,SC_TWOHANDQUICKEN,-1);
- if(sc_data[SC_SPEARSQUICKEN].timer!=-1 )
- status_change_end(bl,SC_SPEARSQUICKEN,-1);
- if(sc_data[SC_ADRENALINE].timer!=-1 )
- status_change_end(bl,SC_ADRENALINE,-1);
- if(sc_data[SC_LOUD].timer!=-1 )
- status_change_end(bl,SC_LOUD,-1);
- if(sc_data[SC_TRUESIGHT].timer!=-1 ) /* ƒgƒDƒ‹?ƒTƒCƒg */
- status_change_end(bl,SC_TRUESIGHT,-1);
- if(sc_data[SC_WINDWALK].timer!=-1 ) /* ƒEƒCƒ“ƒhƒEƒH?ƒN */
- status_change_end(bl,SC_WINDWALK,-1);
- if(sc_data[SC_CARTBOOST].timer!=-1 ) /* ƒJ?ƒgƒu?ƒXƒg */
- status_change_end(bl,SC_CARTBOOST,-1);
- break;
- case SC_MAGICPOWER:
- calc_flag = 1;
- val2 = 1;
- break;
- case SC_SACRIFICE:
- val2 = 5;
- break;
- case SC_FLAMELAUNCHER: /* ƒtƒŒ?ƒ€ƒ‰ƒ“ƒ`ƒƒ? */
- skill_enchant_elemental_end(bl,SC_FLAMELAUNCHER);
- break;
- case SC_FROSTWEAPON: /* ƒtƒƒXƒgƒEƒFƒ|ƒ“ */
- skill_enchant_elemental_end(bl,SC_FROSTWEAPON);
- break;
- case SC_LIGHTNINGLOADER: /* ƒ‰ƒCƒgƒjƒ“ƒOƒ?ƒ_? */
- skill_enchant_elemental_end(bl,SC_LIGHTNINGLOADER);
- break;
- case SC_SEISMICWEAPON: /* ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“ */
- skill_enchant_elemental_end(bl,SC_SEISMICWEAPON);
- break;
- case SC_DEVOTION: /* ƒfƒBƒ{?ƒVƒ‡ƒ“ */
- calc_flag = 1;
- break;
- case SC_PROVIDENCE: /* ƒvƒƒ”ƒBƒfƒ“ƒX */
- calc_flag = 1;
- val2=val1*5;
- break;
- case SC_REFLECTSHIELD:
- val2=10+val1*3;
- break;
- case SC_STRIPWEAPON:
- if (val2==0) val2=90;
- break;
- case SC_STRIPSHIELD:
- if (val2==0) val2=85;
- break;
- case SC_STRIPARMOR:
- case SC_STRIPHELM:
- case SC_CP_WEAPON:
- case SC_CP_SHIELD:
- case SC_CP_ARMOR:
- case SC_CP_HELM:
- break;
-
- case SC_AUTOSPELL: /* ƒI?ƒgƒXƒyƒ‹ */
- val4 = 5 + val1*2;
- break;
-
- case SC_VOLCANO:
- calc_flag = 1;
- val3 = val1*10;
- //val4 = val1>=5?20: (val1==4?19: (val1==3?17: ( val1==2?14:10 ) ) );
- break;
- case SC_DELUGE:
- calc_flag = 1;
- //val3 = val1>=5?15: (val1==4?14: (val1==3?12: ( val1==2?9:5 ) ) );
- //val4 = val1>=5?20: (val1==4?19: (val1==3?17: ( val1==2?14:10 ) ) );
- if (sc_data[SC_FOGWALL].timer != -1 && sc_data[SC_BLIND].timer != -1)
- status_change_end(bl,SC_BLIND,-1);
- break;
- case SC_VIOLENTGALE:
- calc_flag = 1;
- val3 = val1*3;
- //val4 = val1>=5?20: (val1==4?19: (val1==3?17: ( val1==2?14:10 ) ) );
- break;
-
- case SC_SPEARSQUICKEN: /* ƒXƒsƒAƒNƒCƒbƒPƒ“ */
- calc_flag = 1;
- val2 = 20+val1;
- *opt3 |= 1;
- break;
- case SC_COMBO:
- break;
- case SC_BLADESTOP_WAIT: /* ”’nŽæ‚è(‘Ò‚¿) */
- break;
- case SC_BLADESTOP: /* ”’nŽæ‚è */
- if(val2==2) clif_bladestop((struct block_list *)val3,(struct block_list *)val4,1);
- *opt3 |= 32;
- break;
-
- case SC_LULLABY: /* ŽqŽç‰S */
- val2 = 11;
- break;
- case SC_RICHMANKIM:
- break;
- case SC_ETERNALCHAOS: /* ƒGƒ^?ƒiƒ‹ƒJƒIƒX */
- calc_flag = 1;
- break;
- case SC_DRUMBATTLE: /* ?‘¾ŒÛ‚Ì‹¿‚« */
- calc_flag = 1;
- val2 = (val1+1)*25;
- val3 = (val1+1)*2;
- break;
- case SC_NIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
- calc_flag = 1;
- //val2 = (val1+2)*50;
- val3 = (val1+2)*25;
- break;
- case SC_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
- break;
- case SC_INTOABYSS: /* [•£‚Ì’†‚É */
- break;
- case SC_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
- calc_flag = 1;
- val2 = 55 + val1*5;
- val3 = val1*10;
- break;
- case SC_DISSONANCE: /* •s‹¦˜a‰¹ */
- val2 = 10;
- break;
- case SC_WHISTLE: /* Œû“J */
- calc_flag = 1;
- break;
- case SC_ASSNCROS: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
- calc_flag = 1;
- break;
- case SC_POEMBRAGI: /* ƒuƒ‰ƒM‚ÌŽ */
- break;
- case SC_APPLEIDUN: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
- calc_flag = 1;
- break;
- case SC_UGLYDANCE: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX */
- val2 = 10;
- break;
- case SC_HUMMING: /* ƒnƒ~ƒ“ƒO */
- calc_flag = 1;
- break;
- case SC_DONTFORGETME: /* Ž„‚ð–Y‚ê‚È‚¢‚Å */
- calc_flag = 1;
- if(sc_data[SC_INCREASEAGI].timer!=-1 ) /* ‘¬“x㸉ðœ */
- status_change_end(bl,SC_INCREASEAGI,-1);
- if(sc_data[SC_TWOHANDQUICKEN].timer!=-1 )
- status_change_end(bl,SC_TWOHANDQUICKEN,-1);
- if(sc_data[SC_SPEARSQUICKEN].timer!=-1 )
- status_change_end(bl,SC_SPEARSQUICKEN,-1);
- if(sc_data[SC_ADRENALINE].timer!=-1 )
- status_change_end(bl,SC_ADRENALINE,-1);
- if(sc_data[SC_ASSNCROS].timer!=-1 )
- status_change_end(bl,SC_ASSNCROS,-1);
- if(sc_data[SC_TRUESIGHT].timer!=-1 ) /* ƒgƒDƒ‹?ƒTƒCƒg */
- status_change_end(bl,SC_TRUESIGHT,-1);
- if(sc_data[SC_WINDWALK].timer!=-1 ) /* ƒEƒCƒ“ƒhƒEƒH?ƒN */
- status_change_end(bl,SC_WINDWALK,-1);
- if(sc_data[SC_CARTBOOST].timer!=-1 ) /* ƒJ?ƒgƒu?ƒXƒg */
- status_change_end(bl,SC_CARTBOOST,-1);
- break;
- case SC_FORTUNE: /* K‰^‚̃LƒX */
- calc_flag = 1;
- break;
- case SC_SERVICE4U: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
- calc_flag = 1;
- break;
- case SC_MOONLIT:
- val2 = bl->id;
- break;
- case SC_DANCING: /* ƒ_ƒ“ƒX/‰‰‘t’† */
- calc_flag = 1;
- val3= tick / 1000;
- tick = 1000;
- break;
-
- case SC_EXPLOSIONSPIRITS: // ”š—ô”g“®
- calc_flag = 1;
- val2 = 75 + 25*val1;
- *opt3 |= 8;
- break;
- case SC_STEELBODY: // ‹à„
- calc_flag = 1;
- *opt3 |= 16;
- break;
- case SC_EXTREMITYFIST: /* ˆ¢C—…”e™€Œ */
- break;
- case SC_AUTOCOUNTER:
- val3 = val4 = 0;
- break;
-
- case SC_SPEEDPOTION0: /* ?‘¬ƒ|?ƒVƒ‡ƒ“ */
- case SC_SPEEDPOTION1:
- case SC_SPEEDPOTION2:
- case SC_SPEEDPOTION3:
- calc_flag = 1;
- tick = 1000 * tick;
- val2 = 5*(2+type-SC_SPEEDPOTION0);
- break;
-
- /* atk & matk potions [Valaris] */
- case SC_ATKPOT:
- case SC_MATKPOT:
- calc_flag = 1;
- tick = 1000 * tick;
- break;
- case SC_WEDDING: //Œ‹¥—p(Œ‹¥ˆßÖ‚É‚È‚Á‚Ä?‚­‚Ì‚ª?‚¢‚Æ‚©)
- {
- time_t timer;
-
- calc_flag = 1;
- tick = 10000;
- if(!val2)
- val2 = time(&timer);
- }
- break;
- case SC_NOCHAT: //ƒ`ƒƒƒbƒg‹ÖŽ~?‘Ô
- {
- time_t timer;
-
- if(!battle_config.muting_players)
- break;
-
- tick = 60000;
- if(!val2)
- val2 = time(&timer);
- updateflag = SP_MANNER;
- save_flag = 1; // celest
- }
- break;
- case SC_SELFDESTRUCTION: //Ž©”š
- clif_skillcasting(bl,bl->id, bl->id,0,0,331,skill_get_time(val2,val1));
- val3 = tick / 1000;
- tick = 1000;
- break;
-
- /* option1 */
- case SC_STONE: /* Ή» */
- if(!(flag&2)) {
- int sc_def = status_get_mdef(bl)*200;
- tick = tick - sc_def;
- }
- val3 = tick/1000;
- if(val3 < 1) val3 = 1;
- tick = 5000;
- val2 = 1;
- break;
- case SC_SLEEP: /* ‡–° */
- if(!(flag&2)) {
-// int sc_def = 100 - (status_get_int(bl) + status_get_luk(bl)/3);
-// tick = tick * sc_def / 100;
-// if(tick < 1000) tick = 1000;
- tick = 30000;//‡–°‚̓Xƒe?ƒ^ƒX‘Ï«‚É?‚í‚炸30•b
- }
- break;
- case SC_FREEZE: /* “€Œ‹ */
- if(!(flag&2)) {
- int sc_def = 100 - status_get_mdef(bl);
- tick = tick * sc_def / 100;
- }
- break;
- case SC_STAN: /* ƒXƒ^ƒ“ival2‚Ƀ~ƒŠ•bƒZƒbƒgj */
- if(!(flag&2)) {
- int sc_def = status_get_sc_def_vit(bl);
- tick = tick * sc_def / 100;
- }
- break;
-
- /* option2 */
- case SC_DPOISON: /* –Ò“Å */
- {
- int mhp = status_get_max_hp(bl);
- int hp = status_get_hp(bl);
- // MHP?1/4????????
- if (hp > mhp>>2) {
- if(bl->type == BL_PC) {
- int diff = mhp*10/100;
- if (hp - diff < mhp>>2)
- hp = hp - (mhp>>2);
- pc_heal((struct map_session_data *)bl, -hp, 0);
- } else if(bl->type == BL_MOB) {
- struct mob_data *md = (struct mob_data *)bl;
- hp -= mhp*15/100;
- if (hp > mhp>>2)
- md->hp = hp;
- else
- md->hp = mhp>>2;
- }
- }
- } // fall through
- case SC_POISON: /* “Å */
- calc_flag = 1;
- if(!(flag&2)) {
- int sc_def = 100 - (status_get_vit(bl) + status_get_luk(bl)/5);
- tick = tick * sc_def / 100;
- }
- val3 = tick/1000;
- if(val3 < 1) val3 = 1;
- tick = 1000;
- break;
- case SC_SILENCE: /* ’¾?iƒŒƒbƒNƒXƒfƒr?ƒij */
- if (sc_data && sc_data[SC_GOSPEL].timer!=-1) {
- skill_delunitgroup((struct skill_unit_group *)sc_data[SC_GOSPEL].val3);
- status_change_end(bl,SC_GOSPEL,-1);
- break;
- }
- if(!(flag&2)) {
- int sc_def = 100 - status_get_vit(bl);
- tick = tick * sc_def / 100;
- }
- break;
- case SC_CONFUSION:
- val2 = tick;
- tick = 100;
- clif_emotion(bl,1);
- if (sd) {
- pc_stop_walking (sd, 0);
- }
- break;
- case SC_BLIND: /* ˆÃ? */
- calc_flag = 1;
- if(!(flag&2)) {
- int sc_def = status_get_lv(bl)/10 + status_get_int(bl)/15;
- tick = 30000 - sc_def;
- }
- break;
- case SC_CURSE:
- calc_flag = 1;
- if(!(flag&2)) {
- int sc_def = 100 - status_get_vit(bl);
- tick = tick * sc_def / 100;
- }
- break;
-
- /* option */
- case SC_HIDING: /* ƒnƒCƒfƒBƒ“ƒO */
- calc_flag = 1;
- if(bl->type == BL_PC) {
- val2 = tick / 1000; /* Ž?ŽžŠÔ */
- tick = 1000;
- }
- break;
- case SC_CHASEWALK:
- case SC_CLOAKING: /* ƒNƒ?ƒLƒ“ƒO */
- if(bl->type == BL_PC) {
- calc_flag = 1; // [Celest]
- val2 = tick;
- val3 = type==SC_CLOAKING ? 130-val1*3 : 135-val1*5;
- }
- else
- tick = 5000*val1;
- break;
- case SC_SIGHT: /* ƒTƒCƒg/ƒ‹ƒAƒt */
- case SC_RUWACH:
- val2 = tick/250;
- tick = 10;
- break;
-
- /* ƒZ?ƒtƒeƒBƒEƒH?ƒ‹Aƒjƒ…?ƒ} */
- case SC_SAFETYWALL: case SC_PNEUMA:
- tick=((struct skill_unit *)val2)->group->limit;
- break;
-
- /* ƒAƒ“ƒNƒ‹ */
- case SC_ANKLE:
- break;
-
- /* ƒXƒLƒ‹‚¶‚á‚È‚¢/ŽžŠÔ‚É?ŒW‚µ‚È‚¢ */
- case SC_RIDING:
- calc_flag = 1;
- tick = 600*1000;
- break;
- case SC_FALCON:
- case SC_WEIGHT50:
- case SC_WEIGHT90:
- case SC_BROKNWEAPON:
- case SC_BROKNARMOR:
- tick=600*1000;
- break;
-
- case SC_AUTOGUARD:
- {
- int i,t;
- for(i=val2=0;i<val1;i++) {
- t = 5-(i>>1);
- val2 += (t < 0)? 1:t;
- }
- }
- break;
-
- case SC_DEFENDER:
- calc_flag = 1;
- val2 = 5 + val1*15;
- break;
-
- case SC_KEEPING:
- case SC_BARRIER:
- calc_flag = 1;
-
- case SC_HALLUCINATION:
- break;
-
- case SC_CONCENTRATION: /* ƒRƒ“ƒZƒ“ƒgƒŒ?ƒVƒ‡ƒ“ */
- *opt3 |= 1;
- calc_flag = 1;
- break;
-
- case SC_TENSIONRELAX: /* ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX */
- if(bl->type == BL_PC) {
- tick = 10000;
- } else return 0;
- break;
-
- case SC_AURABLADE: /* ƒI?ƒ‰ƒuƒŒ?ƒh */
- case SC_PARRYING: /* ƒpƒŠƒCƒ“ƒO */
-// case SC_ASSUMPTIO: /* */
-// case SC_HEADCRUSH: /* ƒwƒbƒhƒNƒ‰ƒbƒVƒ… */
-// case SC_JOINTBEAT: /* ƒWƒ‡ƒCƒ“ƒgƒr?ƒg */
-// case SC_MARIONETTE: /* ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ?ƒ‹ */
-
- //‚Æ‚è‚ ‚¦‚¸Žè?‚«
- break;
-
-// -- moonsoul (for new upper class related skill status effects)
-/*
- case SC_AURABLADE:
- val2 = val1*10;
- break;
- case SC_PARRYING:
- val2=val1*3;
- break;
- case SC_CONCENTRATION:
- calc_flag=1;
- val2=val1*10;
- val3=val1*5;
- break;
- case SC_TENSIONRELAX:
-// val2 = 10;
-// val3 = 15;
- break;
- case SC_BERSERK:
- calc_flag=1;
- break;
- case SC_ASSUMPTIO:
- if(sc_data[SC_KYRIE].timer!=-1 )
- status_change_end(bl,SC_KYRIE,-1);
- break;*/
-
- case SC_WINDWALK: /* ƒEƒCƒ“ƒhƒEƒH?ƒN */
- calc_flag = 1;
- val2 = (val1 / 2); //Flee㸗¦
- break;
-
- case SC_JOINTBEAT: // Random break [DracoRPG]
- calc_flag = 1;
- val2 = rand()%6 + 1;
- if (val2 == 6) status_change_start(bl,SC_BLEEDING,val1,0,0,0,skill_get_time2(type,val1),0);
- break;
-
- case SC_BERSERK: /* ƒo?ƒT?ƒN */
- if(sd){
- sd->status.hp = sd->status.max_hp * 3;
- sd->status.sp = 0;
- clif_updatestatus(sd,SP_HP);
- clif_updatestatus(sd,SP_SP);
- clif_status_change(bl,SC_INCREASEAGI,1); /* ƒAƒCƒRƒ“•\Ž¦ */
- sd->canregen_tick = gettick() + 300000;
- }
- *opt3 |= 128;
- tick = 10000;
- calc_flag = 1;
- break;
-
- case SC_ASSUMPTIO: /* ƒAƒXƒ€ƒvƒeƒBƒI */
- if(sc_data[SC_KYRIE].timer!=-1 )
- status_change_end(bl,SC_KYRIE,-1);
- break;
- *opt3 |= 2048;
- break;
-
- case SC_BASILICA: // [celest]
- break;
-
- case SC_GOSPEL:
- if (val4 == BCT_SELF) { // self effect
- int i;
- if (sd) {
- sd->canact_tick += tick;
- sd->canmove_tick += tick;
- }
- val2 = tick;
- tick = 1000;
- for (i=0; i<=26; i++) {
- if(sc_data[i].timer!=-1)
- status_change_end(bl,i,-1);
- }
- for (i=58; i<=62; i++) {
- if(sc_data[i].timer!=-1)
- status_change_end(bl,i,-1);
- }
- for (i=132; i<=136; i++) {
- if(sc_data[i].timer!=-1)
- status_change_end(bl,i,-1);
- }
- }
- break;
-
- case SC_MARIONETTE: /* ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ?ƒ‹ */
- case SC_MARIONETTE2:
- val2 = tick;
- if (!val3)
- return 0;
- tick = 1000;
- calc_flag = 1;
- *opt3 |= 1024;
- break;
-
- case SC_MELTDOWN: /* ƒƒ‹ƒgƒ_ƒEƒ“ */
- case SC_CARTBOOST: /* ƒJ?ƒgƒu?ƒXƒg */
- case SC_TRUESIGHT: /* ƒgƒDƒ‹?ƒTƒCƒg */
- case SC_SPIDERWEB: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
- calc_flag = 1;
- break;
-
- case SC_REJECTSWORD: /* ƒŠƒWƒFƒNƒgƒ\?ƒh */
- val2 = 3; //3‰ñU?‚𒵂˕Ԃ·
- break;
-
- case SC_MEMORIZE: /* ƒƒ‚ƒ‰ƒCƒY */
- val2 = 5; //‰ñ‰r¥‚ð1/3‚É‚·‚é
- break;
-
- case SC_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ? */
- break;
-
- case SC_FOGWALL:
- break;
-
- case SC_PRESERVE:
- break;
-
- case SC_BLEEDING:
- {
- // every 1 vit deducts 1 second
- val3 = tick - status_get_vit(bl) * 1000;
- // minimum 50 seconds
- if (val3 < 50000)
- val3 = 50000;
- val4 = 10000;
- tick = 1000;
- }
- break;
-
- case SC_SLOWDOWN:
- case SC_SPEEDUP0:
- calc_flag = 1;
- break;
-
- case SC_REGENERATION:
- val1 = 2;
- case SC_BATTLEORDERS:
- tick = 60000; // 1 minute
- calc_flag = 1;
- break;
-
- case SC_GUILDAURA:
- calc_flag = 1;
- tick = 1000;
- break;
-
- case SC_BABY:
- type2 = _SC_BABY;
- break;
-
- default:
- if(battle_config.error_log)
- printf("UnknownStatusChange [%d]\n", type);
- return 0;
- }
-
- if(bl->type==BL_PC &&
- (type<SC_SENDMAX || type==SC_PRESERVE || type==SC_BATTLEORDERS || type==SC_BABY))
- clif_status_change(bl,type2,1); /* ƒAƒCƒRƒ“•\Ž¦ */
-
- /* option‚Ì?X */
- switch(type){
- case SC_STONE:
- case SC_FREEZE:
- case SC_STAN:
- case SC_SLEEP:
- battle_stopattack(bl); /* U?’âŽ~ */
- skill_stop_dancing(bl,0); /* ‰‰‘t/ƒ_ƒ“ƒX‚Ì’†? */
- { /* “¯Žž‚ÉŠ|‚©‚ç‚È‚¢ƒXƒe?ƒ^ƒXˆÙí‚ð‰ðœ */
- int i;
- for(i = SC_STONE; i <= SC_SLEEP; i++){
- if(sc_data[i].timer != -1){
- (*sc_count)--;
- delete_timer(sc_data[i].timer, status_change_timer);
- sc_data[i].timer = -1;
- }
- }
- }
- if(type == SC_STONE)
- *opt1 = 6;
- else
- *opt1 = type - SC_STONE + 1;
- opt_flag = 1;
- break;
- case SC_POISON:
- case SC_CURSE:
- case SC_SILENCE:
- case SC_BLIND:
- *opt2 |= 1<<(type-SC_POISON);
- opt_flag = 1;
- break;
- case SC_DPOISON: // Žb’è‚œł̃GƒtƒFƒNƒg‚ðŽg—p
- *opt2 |= 1;
- opt_flag = 1;
- break;
- case SC_SIGNUMCRUCIS:
- *opt2 |= 0x40;
- opt_flag = 1;
- break;
- case SC_HIDING:
- case SC_CLOAKING:
- battle_stopattack(bl); /* U?’âŽ~ */
- *option |= ((type==SC_HIDING)?2:4);
- opt_flag =1 ;
- break;
- case SC_CHASEWALK:
- battle_stopattack(bl); /* U?’âŽ~ */
- *option |= 16388;
- opt_flag =1 ;
- break;
- case SC_SIGHT:
- *option |= 1;
- opt_flag = 1;
- break;
- case SC_RUWACH:
- *option |= 8192;
- opt_flag = 1;
- break;
- case SC_WEDDING:
- *option |= 4096;
- opt_flag = 1;
- }
-
- if(opt_flag) /* option‚Ì?X */
- clif_changeoption(bl);
-
- (*sc_count)++; /* ƒXƒe?ƒ^ƒXˆÙí‚Ì? */
-
- sc_data[type].val1 = val1;
- sc_data[type].val2 = val2;
- sc_data[type].val3 = val3;
- sc_data[type].val4 = val4;
- /* ƒ^ƒCƒ}?Ý’è */
- sc_data[type].timer = add_timer(
- gettick() + tick, status_change_timer, bl->id, type);
-
- if(bl->type==BL_PC && calc_flag)
- status_calc_pc(sd,0); /* ƒXƒe?ƒ^ƒXÄŒvŽZ */
-
- if(bl->type==BL_PC && save_flag)
- chrif_save(sd); // save the player status
-
- if(bl->type==BL_PC && updateflag)
- clif_updatestatus(sd,updateflag); /* ƒXƒe?ƒ^ƒX‚ðƒNƒ‰ƒCƒAƒ“ƒg‚É‘—‚é */
-
- return 0;
-}
-/*==========================================
- * ƒXƒe[ƒ^ƒXˆÙí‘S‰ðœ
- *------------------------------------------
- */
-int status_change_clear(struct block_list *bl,int type)
-{
- struct status_change* sc_data;
- short *sc_count, *option, *opt1, *opt2, *opt3;
- int i;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, sc_data = status_get_sc_data(bl));
- nullpo_retr(0, sc_count = status_get_sc_count(bl));
- nullpo_retr(0, option = status_get_option(bl));
- nullpo_retr(0, opt1 = status_get_opt1(bl));
- nullpo_retr(0, opt2 = status_get_opt2(bl));
- nullpo_retr(0, opt3 = status_get_opt3(bl));
-
- if (*sc_count == 0)
- return 0;
- for(i = 0; i < MAX_STATUSCHANGE; i++){
- if(sc_data[i].timer != -1){ /* ˆÙ킪‚ ‚é‚È‚çƒ^ƒCƒ}?‚ð휂·‚é */
- status_change_end(bl, i, -1);
- }
- }
- *sc_count = 0;
- *opt1 = 0;
- *opt2 = 0;
- *opt3 = 0;
- *option &= OPTION_MASK;
-
- if (night_flag == 1 && type == BL_PC && !map[bl->m].flag.indoors && // by [Yor]
- !map[bl->m].flag.indoors && battle_config.night_darkness_level <= 0) // [celest]
- *opt2 |= STATE_BLIND;
-
- if(!type || type&2)
- clif_changeoption(bl);
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒe[ƒ^ƒXˆÙíI—¹
- *------------------------------------------
- */
-int status_change_end( struct block_list* bl , int type,int tid )
-{
- struct status_change* sc_data;
- int opt_flag=0, calc_flag = 0;
- short *sc_count, *option, *opt1, *opt2, *opt3;
- int type2 = type;
-
- nullpo_retr(0, bl);
- if(bl->type!=BL_PC && bl->type!=BL_MOB) {
- if(battle_config.error_log)
- printf("status_change_end: neither MOB nor PC !\n");
- return 0;
- }
- nullpo_retr(0, sc_data = status_get_sc_data(bl));
- nullpo_retr(0, sc_count = status_get_sc_count(bl));
- nullpo_retr(0, option = status_get_option(bl));
- nullpo_retr(0, opt1 = status_get_opt1(bl));
- nullpo_retr(0, opt2 = status_get_opt2(bl));
- nullpo_retr(0, opt3 = status_get_opt3(bl));
-
- if ((*sc_count) > 0 && sc_data[type].timer != -1 && (sc_data[type].timer == tid || tid == -1)) {
-
- if (tid == -1) // ƒ^ƒCƒ}‚©‚çŒÄ‚΂ê‚Ä‚¢‚È‚¢‚È‚çƒ^ƒCƒ}íœ‚ð‚·‚é
- delete_timer(sc_data[type].timer,status_change_timer);
-
- /* ŠY?‚̈Ùí‚ð³í‚É?‚· */
- sc_data[type].timer=-1;
- (*sc_count)--;
-
- switch(type){ /* ˆÙí‚ÌŽí—Þ‚²‚Æ‚Ì?— */
- case SC_PROVOKE: /* ƒvƒƒ{ƒbƒN */
- case SC_ENDURE: // celest
- case SC_CONCENTRATE: /* W’†—ÍŒüã */
- case SC_BLESSING: /* ƒuƒŒƒbƒVƒ“ƒO */
- case SC_ANGELUS: /* ƒAƒ“ƒ[ƒ‹ƒX */
- case SC_INCREASEAGI: /* ‘¬“x㸠*/
- case SC_DECREASEAGI: /* ‘¬“xŒ¸­ */
- case SC_SIGNUMCRUCIS: /* ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX */
- case SC_HIDING:
- case SC_TWOHANDQUICKEN: /* 2HQ */
- case SC_ADRENALINE: /* ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ… */
- case SC_ENCPOISON: /* ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“ */
- case SC_IMPOSITIO: /* ƒCƒ“ƒ|ƒVƒeƒBƒIƒ}ƒkƒX */
- case SC_GLORIA: /* ƒOƒƒŠƒA */
- case SC_LOUD: /* ƒ‰ƒEƒhƒ{ƒCƒX */
- case SC_QUAGMIRE: /* ƒNƒ@ƒOƒ}ƒCƒA */
- case SC_PROVIDENCE: /* ƒvƒƒ”ƒBƒfƒ“ƒX */
- case SC_SPEARSQUICKEN: /* ƒXƒsƒAƒNƒCƒbƒPƒ“ */
- case SC_VOLCANO:
- case SC_DELUGE:
- case SC_VIOLENTGALE:
- case SC_ETERNALCHAOS: /* ƒGƒ^?ƒiƒ‹ƒJƒIƒX */
- case SC_DRUMBATTLE: /* ?‘¾ŒÛ‚Ì‹¿‚« */
- case SC_NIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
- case SC_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
- case SC_WHISTLE: /* Œû“J */
- case SC_ASSNCROS: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
- case SC_HUMMING: /* ƒnƒ~ƒ“ƒO */
- case SC_DONTFORGETME: /* Ž„‚ð–Y‚ê‚È‚¢‚Å */
- case SC_FORTUNE: /* K‰^‚̃LƒX */
- case SC_SERVICE4U: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
- case SC_EXPLOSIONSPIRITS: // ”š—ô”g“®
- case SC_STEELBODY: // ‹à„
- case SC_DEFENDER:
- case SC_SPEEDPOTION0: /* ?‘¬ƒ|?ƒVƒ‡ƒ“ */
- case SC_SPEEDPOTION1:
- case SC_SPEEDPOTION2:
- case SC_SPEEDPOTION3:
- case SC_APPLEIDUN: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
- case SC_RIDING:
- case SC_BLADESTOP_WAIT:
- case SC_CONCENTRATION: /* ƒRƒ“ƒZƒ“ƒgƒŒ?ƒVƒ‡ƒ“ */
- case SC_ASSUMPTIO: /* ƒAƒVƒƒƒ“ƒvƒeƒBƒI */
- case SC_WINDWALK: /* ƒEƒCƒ“ƒhƒEƒH?ƒN */
- case SC_TRUESIGHT: /* ƒgƒDƒ‹?ƒTƒCƒg */
- case SC_SPIDERWEB: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
- case SC_MAGICPOWER: /* –‚–@—Í?• */
- case SC_CHASEWALK:
- case SC_ATKPOT: /* attack potion [Valaris] */
- case SC_MATKPOT: /* magic attack potion [Valaris] */
- case SC_WEDDING: //Œ‹¥—p(Œ‹¥ˆßÖ‚É‚È‚Á‚Ä?‚­‚Ì‚ª?‚¢‚Æ‚©)
- case SC_MELTDOWN: /* ƒƒ‹ƒgƒ_ƒEƒ“ */
- case SC_MINDBREAKER: /* ƒ}ƒCƒ“ƒhƒuƒŒ[ƒJ[ */
- // Celest
- case SC_EDP:
- case SC_SLOWDOWN:
- case SC_SPEEDUP0:
- case SC_BATTLEORDERS:
- case SC_REGENERATION:
- case SC_GUILDAURA:
- calc_flag = 1;
- break;
- case SC_AUTOBERSERK:
- if (sc_data[SC_PROVOKE].timer != -1)
- status_change_end(bl,SC_PROVOKE,-1);
- break;
- case SC_BERSERK: /* ƒo?ƒT?ƒN */
- calc_flag = 1;
- clif_status_change(bl,SC_INCREASEAGI,0); /* ƒAƒCƒRƒ“Á‹Ž */
- break;
- case SC_DEVOTION: /* ƒfƒBƒ{?ƒVƒ‡ƒ“ */
- {
- struct map_session_data *md = map_id2sd(sc_data[type].val1);
- sc_data[type].val1=sc_data[type].val2=0;
- skill_devotion(md,bl->id);
- calc_flag = 1;
- }
- break;
- case SC_BLADESTOP:
- {
- struct status_change *t_sc_data = status_get_sc_data((struct block_list *)sc_data[type].val4);
- //•Ð•û‚ªØ‚ꂽ‚Ì‚Å‘ŠŽè‚Ì”’n?‘Ô‚ªØ‚ê‚Ä‚È‚¢‚Ì‚È‚ç‰ðœ
- if(t_sc_data && t_sc_data[SC_BLADESTOP].timer!=-1)
- status_change_end((struct block_list *)sc_data[type].val4,SC_BLADESTOP,-1);
-
- if(sc_data[type].val2==2)
- clif_bladestop((struct block_list *)sc_data[type].val3,(struct block_list *)sc_data[type].val4,0);
- }
- break;
- case SC_DANCING:
- {
- struct map_session_data *dsd;
- struct status_change *d_sc_data;
- if(sc_data[type].val4 && (dsd=map_id2sd(sc_data[type].val4))){
- d_sc_data = dsd->sc_data;
- //‡‘t‚Å‘ŠŽè‚ª‚¢‚éꇑŠŽè‚Ìval4‚ð0‚É‚·‚é
- if(d_sc_data && d_sc_data[type].timer!=-1)
- d_sc_data[type].val4=0;
- }
- }
- calc_flag = 1;
- break;
- case SC_NOCHAT: //ƒ`ƒƒƒbƒg‹ÖŽ~?‘Ô
- {
- struct map_session_data *sd=NULL;
- if(bl->type == BL_PC && (sd=(struct map_session_data *)bl)){
- if (sd->status.manner >= 0) // weeee ^^ [celest]
- sd->status.manner = 0;
- clif_updatestatus(sd,SP_MANNER);
- }
- }
- break;
- case SC_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ? */
- {
- struct block_list *src=map_id2bl(sc_data[type].val3);
- if(src && tid!=-1){
- //Ž©•ª‚Ƀ_ƒ?ƒW•Žü?3*3‚Ƀ_ƒ?ƒW
- skill_castend_damage_id(src, bl,sc_data[type].val2,sc_data[type].val1,gettick(),0 );
- }
- }
- break;
- case SC_SELFDESTRUCTION: /* Ž©”š */
- {
- //Ž©•ª‚̃_ƒ?ƒW‚Í0‚É‚µ‚Ä
- struct mob_data *md=NULL;
- if(bl->type == BL_MOB && (md=(struct mob_data*)bl))
- skill_castend_damage_id(bl, bl,sc_data[type].val2,sc_data[type].val1,gettick(),0 );
- }
- break;
- /* option1 */
- case SC_FREEZE:
- sc_data[type].val3 = 0;
- break;
-
- /* option2 */
- case SC_POISON: /* “Å */
- case SC_BLIND: /* ˆÃ? */
- case SC_CURSE:
- calc_flag = 1;
- break;
-
- // celest
- case SC_CONFUSION:
- {
- struct map_session_data *sd=NULL;
- if(bl->type == BL_PC && (sd=(struct map_session_data *)bl)){
- sd->next_walktime = -1;
- }
- }
- break;
-
- case SC_MARIONETTE: /* ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ?ƒ‹ */
- case SC_MARIONETTE2: /// Marionette target
- {
- // check for partner and end their marionette status as well
- int type2 = (type == SC_MARIONETTE) ? SC_MARIONETTE2 : SC_MARIONETTE;
- struct block_list *pbl = map_id2bl(sc_data[type].val3);
- if (pbl) {
- struct status_change* sc_data;
- if (*status_get_sc_count(pbl) > 0 &&
- (sc_data = status_get_sc_data(pbl)) &&
- sc_data[type2].timer != -1)
- status_change_end(pbl, type2, -1);
- }
- calc_flag = 1;
- }
- break;
-
- case SC_BABY:
- type2 = _SC_BABY;
- break;
- }
-
- if(bl->type==BL_PC &&
- (type<SC_SENDMAX || type==SC_PRESERVE || type==SC_BATTLEORDERS || type==SC_BABY))
- clif_status_change(bl,type2,0); /* ƒAƒCƒRƒ“Á‹Ž */
-
- switch(type){ /* ³í‚É?‚é‚Æ‚«‚È‚É‚©?—‚ª•K—v */
- case SC_STONE:
- case SC_FREEZE:
- case SC_STAN:
- case SC_SLEEP:
- *opt1 = 0;
- opt_flag = 1;
- break;
-
- case SC_POISON:
- if (sc_data[SC_DPOISON].timer != -1) //
- break; // DPOISON—p‚̃IƒvƒVƒ‡ƒ“
- *opt2 &= ~1; // ‚ª?—p‚É—pˆÓ‚³‚ꂽꇂɂÍ
- opt_flag = 1; // ‚±‚±‚Í휂·‚é
- break; //
- case SC_CURSE:
- case SC_SILENCE:
- case SC_BLIND:
- *opt2 &= ~(1<<(type-SC_POISON));
- opt_flag = 1;
- break;
- case SC_DPOISON:
- if (sc_data[SC_POISON].timer != -1) // DPOISON—p‚̃IƒvƒVƒ‡ƒ“‚ª
- break; // —pˆÓ‚³‚ꂽ‚çíœ
- *opt2 &= ~1; // “Å?‘Ô‰ðœ
- opt_flag = 1;
- break;
- case SC_SIGNUMCRUCIS:
- *opt2 &= ~0x40;
- opt_flag = 1;
- break;
-
- case SC_HIDING:
- case SC_CLOAKING:
- *option &= ~((type == SC_HIDING) ? 2 : 4);
- calc_flag = 1; // orn
- opt_flag = 1 ;
- break;
-
- case SC_CHASEWALK:
- *option &= ~16388;
- opt_flag = 1 ;
- break;
-
- case SC_SIGHT:
- *option &= ~1;
- opt_flag = 1;
- break;
- case SC_WEDDING: //Œ‹¥—p(Œ‹¥ˆßÖ‚É‚È‚Á‚Ä?‚­‚Ì‚ª?‚¢‚Æ‚©)
- *option &= ~4096;
- opt_flag = 1;
- break;
- case SC_RUWACH:
- *option &= ~8192;
- opt_flag = 1;
- break;
-
- //opt3
- case SC_TWOHANDQUICKEN: /* 2HQ */
- case SC_SPEARSQUICKEN: /* ƒXƒsƒAƒNƒCƒbƒPƒ“ */
- case SC_CONCENTRATION: /* ƒRƒ“ƒZƒ“ƒgƒŒ?ƒVƒ‡ƒ“ */
- *opt3 &= ~1;
- break;
- case SC_OVERTHRUST: /* ƒI?ƒo?ƒXƒ‰ƒXƒg */
- *opt3 &= ~2;
- break;
- case SC_ENERGYCOAT: /* ƒGƒiƒW?ƒR?ƒg */
- *opt3 &= ~4;
- break;
- case SC_EXPLOSIONSPIRITS: // ”š—ô”g“®
- *opt3 &= ~8;
- break;
- case SC_STEELBODY: // ‹à„
- *opt3 &= ~16;
- break;
- case SC_BLADESTOP: /* ”’nŽæ‚è */
- *opt3 &= ~32;
- break;
- case SC_BERSERK: /* ƒo?ƒT?ƒN */
- *opt3 &= ~128;
- break;
- case SC_MARIONETTE: /* ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ?ƒ‹ */
- case SC_MARIONETTE2:
- *opt3 &= ~1024;
- break;
- case SC_ASSUMPTIO: /* ƒAƒXƒ€ƒvƒeƒBƒI */
- *opt3 &= ~2048;
- break;
- }
-
- if (night_flag == 1 && (*opt2 & STATE_BLIND) == 0 && bl->type == BL_PC && // by [Yor]
- !map[bl->m].flag.indoors && battle_config.night_darkness_level <= 0) { // [celest]
- *opt2 |= STATE_BLIND;
- opt_flag = 1;
- }
-
- if(opt_flag) /* option‚Ì?X‚ð?‚¦‚é */
- clif_changeoption(bl);
-
- if (bl->type == BL_PC && calc_flag)
- status_calc_pc((struct map_session_data *)bl,0); /* ƒXƒe?ƒ^ƒXÄŒvŽZ */
- }
-
- return 0;
-}
-
-
-/*==========================================
- * ƒXƒe[ƒ^ƒXˆÙíI—¹ƒ^ƒCƒ}[
- *------------------------------------------
- */
-int status_change_timer(int tid, unsigned int tick, int id, int data)
-{
- int type = data;
- struct block_list *bl;
- struct map_session_data *sd=NULL;
- struct status_change *sc_data;
- //short *sc_count; //Žg‚Á‚Ä‚È‚¢H
-
-// security system to prevent forgetting timer removal
- int temp_timerid;
-
- bl=map_id2bl(id);
-#ifndef _WIN32
- nullpo_retr_f(0, bl, "id=%d data=%d",id,data);
-#endif
- nullpo_retr(0, sc_data=status_get_sc_data(bl));
-
- if(bl->type==BL_PC)
- nullpo_retr(0, sd=(struct map_session_data *)bl);
-
- //sc_count=status_get_sc_count(bl); //Žg‚Á‚Ä‚È‚¢H
-
- if(sc_data[type].timer != tid) {
- if(battle_config.error_log)
- printf("status_change_timer %d != %d\n",tid,sc_data[type].timer);
- return 0;
- }
-
- // security system to prevent forgetting timer removal
- // you shouldn't be that careless inside the switch here
- temp_timerid = sc_data[type].timer;
- sc_data[type].timer = -1;
-
- switch(type){ /* “ÁŽê‚È?—‚É‚È‚éê‡ */
- case SC_MAXIMIZEPOWER: /* ƒ}ƒLƒVƒ}ƒCƒYƒpƒ? */
- case SC_CLOAKING:
- if(sd){
- if( sd->status.sp > 0 ){ /* SPØ‚ê‚é‚Ü‚ÅŽ? */
- sd->status.sp--;
- clif_updatestatus(sd,SP_SP);
- sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
- sc_data[type].val2+tick, status_change_timer, bl->id, data);
- return 0;
- }
- }
- break;
-
- case SC_CHASEWALK:
- if(sd){
- int sp = 10+sc_data[SC_CHASEWALK].val1*2;
- if (map[sd->bl.m].flag.gvg) sp *= 5;
- if( sd->status.sp > sp){
- sd->status.sp -= sp; // update sp cost [Celest]
- clif_updatestatus(sd,SP_SP);
- sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
- sc_data[type].val2+tick, status_change_timer, bl->id, data);
- sc_data[SC_CHASEWALK].val4++;
- if (sc_data[SC_CHASEWALK].val4 > 3)
- sc_data[SC_CHASEWALK].val4 = 0;
- status_calc_pc (sd, 0);
- return 0;
- }
- }
- break;
-
- case SC_HIDING: /* ƒnƒCƒfƒBƒ“ƒO */
- if(sd){ /* SP‚ª‚ ‚Á‚ÄAŽžŠÔ§ŒÀ‚ÌŠÔ‚ÍŽ? */
- if( sd->status.sp > 0 && (--sc_data[type].val2)>0 ){
- if(sc_data[type].val2 % (sc_data[type].val1+3) ==0 ){
- sd->status.sp--;
- clif_updatestatus(sd,SP_SP);
- }
- sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
- 1000+tick, status_change_timer,
- bl->id, data);
- return 0;
- }
- }
- break;
-
- case SC_SIGHT: /* ƒTƒCƒg */
- case SC_RUWACH: /* ƒ‹ƒAƒt */
- {
- int range = 5;
- if ( type == SC_SIGHT ) range = 7;
- map_foreachinarea( status_change_timer_sub,
- bl->m, bl->x-range, bl->y-range, bl->x+range,bl->y+range,0,
- bl,type,tick);
-
- if( (--sc_data[type].val2)>0 ){
- sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
- 250+tick, status_change_timer,
- bl->id, data);
- return 0;
- }
- }
- break;
-
- case SC_SIGNUMCRUCIS: /* ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX */
- {
- int race = status_get_race(bl);
- if(race == 6 || battle_check_undead(race,status_get_elem_type(bl))) {
- sc_data[type].timer=add_timer(1000*600+tick,status_change_timer, bl->id, data );
- return 0;
- }
- }
- break;
-
- case SC_PROVOKE: /* ƒvƒƒ{ƒbƒN/ƒI?ƒgƒo?ƒT?ƒN */
- if(sc_data[type].val2!=0){ /* ƒI?ƒgƒo?ƒT?ƒNi‚P•b‚²‚Æ‚ÉHPƒ`ƒFƒbƒNj */
- if(sd && sd->status.hp>sd->status.max_hp>>2) /* ’âŽ~ */
- break;
- sc_data[type].timer=add_timer( 1000+tick,status_change_timer, bl->id, data );
- return 0;
- }
- break;
-
- case SC_ENDURE: /* ƒCƒ“ƒfƒ…ƒA */
- case SC_AUTOBERSERK: // Celest
- if(sd && sd->special_state.infinite_endure) {
-#ifdef TWILIGHT
- sc_data[type].timer=add_timer( 1000*600+tick,status_change_timer, bl->id, data );
-#else
- sc_data[type].timer=add_timer( 1000*60+tick,status_change_timer, bl->id, data );
-#endif
- //sc_data[type].val2=1;
- return 0;
- }
- break;
-
- case SC_DISSONANCE: /* •s‹¦˜a‰¹ */
- if( (--sc_data[type].val2)>0){
- struct skill_unit *unit=
- (struct skill_unit *)sc_data[type].val4;
- struct block_list *src;
- /*if(!unit || !unit->group)
- break;
- src=map_id2bl(unit->group->src_id);
- if(!src)
- break;*/
- nullpo_retb(unit);
- nullpo_retb(unit->group);
- nullpo_retb(src=map_id2bl(unit->group->src_id));
- skill_attack(BF_MISC,src,&unit->bl,bl,unit->group->skill_id,sc_data[type].val1,tick,0);
- if( (bl->type==BL_MOB) && (MS_DEAD==((struct mob_data *)bl)->state.state) )
- break;
- sc_data[type].timer=add_timer(skill_get_time2(unit->group->skill_id,unit->group->skill_lv)+tick,
- status_change_timer, bl->id, data );
- return 0;
- }
- break;
-
- case SC_LULLABY: /* ŽqŽç‰S */
- if( (--sc_data[type].val2)>0){
- struct skill_unit *unit=
- (struct skill_unit *)sc_data[type].val4;
- nullpo_retb(unit);
- nullpo_retb(unit->group);
- if(unit->group->src_id == bl->id)
- break;
- skill_additional_effect(bl,bl,unit->group->skill_id,sc_data[type].val1,BF_LONG|BF_SKILL|BF_MISC,tick);
- if (unit->group != 0)
- {
- sc_data[type].timer=add_timer(skill_get_time(unit->group->skill_id,unit->group->skill_lv)/10+tick,
- status_change_timer, bl->id, data );
- return 0;
- }// dont forget the brackets
- }
- break;
-
- case SC_STONE:
- if(sc_data[type].val2 != 0) {
- short *opt1 = status_get_opt1(bl);
- sc_data[type].val2 = 0;
- sc_data[type].val4 = 0;
- battle_stopwalking(bl,1);
- if(opt1) {
- *opt1 = 1;
- clif_changeoption(bl);
- }
- sc_data[type].timer=add_timer(1000+tick,status_change_timer, bl->id, data );
- return 0;
- }
- else if( (--sc_data[type].val3) > 0) {
- int hp = status_get_max_hp(bl);
- if((++sc_data[type].val4)%5 == 0 && status_get_hp(bl) > hp>>2) {
- hp = hp/100;
- if(hp < 1) hp = 1;
- if(sd)
- pc_heal(sd,-hp,0);
- else if(bl->type == BL_MOB){
- struct mob_data *md;
- if((md=((struct mob_data *)bl)) == NULL)
- break;
- md->hp -= hp;
- }
- }
- sc_data[type].timer=add_timer(1000+tick,status_change_timer, bl->id, data );
- return 0;
- }
- break;
-
- case SC_POISON:
- case SC_DPOISON:
- if (sc_data[SC_SLOWPOISON].timer == -1 && (--sc_data[type].val3) > 0) {
- int hp = status_get_max_hp(bl);
- if (type == SC_POISON && status_get_hp(bl) < hp>>2)
- break;
- if(sd) {
- hp = (type == SC_DPOISON) ? 3 + hp/50 : 3 + hp*3/200;
- pc_heal(sd, -hp, 0);
- } else if (bl->type == BL_MOB) {
- struct mob_data *md;
- nullpo_retr(0, md=(struct mob_data *)bl);
- hp = (type == SC_DPOISON) ? 3 + hp/100 : 3 + hp/200;
- md->hp -= hp;
- }
- }
- if (sc_data[type].val3 > 0)
- {
- sc_data[type].timer=add_timer(1000+tick,status_change_timer, bl->id, data );
- // hmm setting up a timer and breaking then to call status_change_end just right away?
- // I think you're missing brackets and a:
- return 0;
- }
- break;
-
- case SC_TENSIONRELAX: /* ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX */
- if(sd){ /* SP‚ª‚ ‚Á‚ÄAHP‚ª?ƒ^ƒ“‚Å‚È‚¯‚ê‚Î?? */
- if( sd->status.sp > 12 && sd->status.max_hp > sd->status.hp ){
-/* if(sc_data[type].val2 % (sc_data[type].val1+3) ==0 ){
- sd->status.sp -= 12;
- clif_updatestatus(sd,SP_SP);
- } */
- sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
- 10000+tick, status_change_timer,
- bl->id, data);
- return 0;
- }
- if(sd->status.max_hp <= sd->status.hp)
- {
- status_change_end(&sd->bl,SC_TENSIONRELAX,-1);
- // calling status_change_end then break and call it again might not be that what is necessary
- // or am I wrong?
- // so I just add brackets and a:
- return 0;
- }
- }
- break;
- case SC_BLEEDING: // [celest]
- // i hope i haven't interpreted it wrong.. which i might ^^;
- // Source:
- // - 10õ©ª´ªÈªËHPª¬Êõá´
- // - õóúìªÎªÞªÞ«µ?«Ðì¹ÔѪä«ê«í«°ª·ªÆªâ?ÍýªÏἪ¨ªÊª¤
- if((sc_data[type].val3 -= 1000) > 0) {
- if((sc_data[type].val4 -= 1000) > 0) {
- int hp = rand()%300+400;
- if(sd) {
- pc_heal(sd,-hp,0);
- sd->canmove_tick = tick+1000;
- }
- else if(bl->type == BL_MOB) {
- struct mob_data *md;
- nullpo_retr(0, md=(struct mob_data *)bl);
- md->hp -= hp;
- }
- }
- if (sd) {
- sd->canact_tick = tick+1000;
- }
-
- sc_data[type].timer=add_timer(1000+tick,status_change_timer, bl->id, data );
- // hmm setting up a timer and breaking then to call status_change_end just right away?
- // I think you're missing a:
- return 0;
- }
- break;
-
- /* ŽžŠÔØ‚ê–³‚µHH */
- case SC_AETERNA:
- case SC_TRICKDEAD:
- case SC_RIDING:
- case SC_FALCON:
- case SC_WEIGHT50:
- case SC_WEIGHT90:
- case SC_MAGICPOWER: /* –‚–@—Í?• */
- case SC_REJECTSWORD: /* ƒŠƒWƒFƒNƒgƒ\?ƒh */
- case SC_MEMORIZE: /* ƒƒ‚ƒ‰ƒCƒY */
- case SC_BROKNWEAPON:
- case SC_BROKNARMOR:
- case SC_SACRIFICE:
- sc_data[type].timer=add_timer( 1000*600+tick,status_change_timer, bl->id, data );
- return 0;
-
- case SC_DANCING: //ƒ_ƒ“ƒXƒXƒLƒ‹‚ÌŽžŠÔSPÁ”ï
- {
- int s=0;
- if(sd){
- if(sd->status.sp > 0 && (--sc_data[type].val3)>0){
- switch(sc_data[type].val1){
- case BD_RICHMANKIM: /* ƒjƒˆƒ‹ƒh‚̉ƒ 3•b‚ÉSP1 */
- case BD_DRUMBATTLEFIELD: /* ?‘¾ŒÛ‚Ì‹¿‚« 3•b‚ÉSP1 */
- case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö 3•b‚ÉSP1 */
- case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh 3•b‚ÉSP1 */
- case BA_DISSONANCE: /* •s‹¦˜a‰¹ 3•b‚ÅSP1 */
- case BA_ASSASSINCROSS: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX 3•b‚ÅSP1 */
- case DC_UGLYDANCE: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX 3•b‚ÅSP1 */
- s=3;
- break;
- case BD_LULLABY: /* ŽqŽç‰Ì 4•b‚ÉSP1 */
- case BD_ETERNALCHAOS: /* ‰i‰“‚̬“× 4•b‚ÉSP1 */
- case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ 4•b‚ÉSP1 */
- case DC_FORTUNEKISS: /* K‰^‚̃LƒX 4•b‚ÅSP1 */
- s=4;
- break;
- case BD_INTOABYSS: /* [•£‚Ì’†‚É 5•b‚ÉSP1 */
- case BA_WHISTLE: /* Œû“J 5•b‚ÅSP1 */
- case DC_HUMMING: /* ƒnƒ~ƒ“ƒO 5•b‚ÅSP1 */
- case BA_POEMBRAGI: /* ƒuƒ‰ƒM‚ÌŽ 5•b‚ÅSP1 */
- case DC_SERVICEFORYOU: /* ƒT?ƒrƒXƒtƒH?ƒ†? 5•b‚ÅSP1 */
- s=5;
- break;
- case BA_APPLEIDUN: /* ƒCƒhƒDƒ“‚Ì—ÑŒç 6•b‚ÅSP1 */
- s=6;
- break;
- case DC_DONTFORGETME: /* Ž„‚ð–Y‚ê‚È‚¢‚Åc 10•b‚ÅSP1 */
- case CG_MOONLIT: /* ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç 10•b‚ÅSP1H */
- s=10;
- break;
- }
- if(s && ((sc_data[type].val3 % s) == 0)){
- sd->status.sp--;
- clif_updatestatus(sd,SP_SP);
- }
- sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
- 1000+tick, status_change_timer,
- bl->id, data);
- return 0;
- }
- }
- }
- break;
- case SC_BERSERK: /* ƒo?ƒT?ƒN */
- if(sd){ /* HP‚ª100ˆÈã‚È‚ç?? */
- if( (sd->status.hp - sd->status.max_hp*5/100) > 100 ){ // 5% every 10 seconds [DracoRPG]
- sd->status.hp -= sd->status.max_hp*5/100; // changed to max hp [celest]
- clif_updatestatus(sd,SP_HP);
- sc_data[type].timer = add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
- 10000+tick, status_change_timer,
- bl->id, data);
- return 0;
- }
- }
- break;
- case SC_WEDDING: //Œ‹¥—p(Œ‹¥ˆßÖ‚É‚È‚Á‚Ä?‚­‚Ì‚ª?‚¢‚Æ‚©)
- if(sd){
- time_t timer;
- if(time(&timer) < ((sc_data[type].val2) + 3600)){ //1ŽžŠÔ‚½‚Á‚Ä‚¢‚È‚¢‚Ì‚Å??
- sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
- 10000+tick, status_change_timer,
- bl->id, data);
- return 0;
- }
- }
- break;
- case SC_NOCHAT: //ƒ`ƒƒƒbƒg‹ÖŽ~?‘Ô
- if(sd && battle_config.muting_players){
- time_t timer;
- if((++sd->status.manner) && time(&timer) < ((sc_data[type].val2) + 60*(0-sd->status.manner))){ //ŠJŽn‚©‚çstatus.manner•ª?‚Á‚Ä‚È‚¢‚Ì‚Å??
- clif_updatestatus(sd,SP_MANNER);
- sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è(60•b) */
- 60000+tick, status_change_timer,
- bl->id, data);
- return 0;
- }
- }
- break;
- case SC_SELFDESTRUCTION: /* Ž©”š */
- if(--sc_data[type].val3>0){
- struct mob_data *md;
- if(bl->type==BL_MOB && (md=(struct mob_data *)bl) && md->speed > 250){
- md->speed -= 250;
- md->next_walktime=tick;
- }
- sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
- 1000+tick, status_change_timer,
- bl->id, data);
- return 0;
- }
- break;
-
- case SC_SPLASHER:
- if (sc_data[type].val4 % 1000 == 0) {
- char timer[2];
- sprintf (timer, "%d", sc_data[type].val4/1000);
- clif_message(bl, timer);
- }
- if((sc_data[type].val4 -= 500) > 0) {
- sc_data[type].timer = add_timer(
- 500 + tick, status_change_timer,
- bl->id, data);
- return 0;
- }
- break;
-
- case SC_MARIONETTE: /* ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ?ƒ‹ */
- case SC_MARIONETTE2:
- {
- struct block_list *pbl = map_id2bl(sc_data[type].val3);
- if (pbl && battle_check_range(bl, pbl, 7) &&
- (sc_data[type].val2 -= 1000)>0) {
- sc_data[type].timer = add_timer(
- 1000 + tick, status_change_timer,
- bl->id, data);
- return 0;
- }
- }
- break;
-
- // Celest
- case SC_CONFUSION:
- {
- int i = 3000;
- //struct mob_data *md;
- if (sd) {
- pc_randomwalk (sd, gettick());
- sd->next_walktime = tick + (i=1000 + rand()%1000);
- } /*else if (bl->type==BL_MOB && (md=(struct mob_data *)bl) && md->mode&1 && mob_can_move(md)) {
- md->state.state=MS_WALK;
- if( DIFF_TICK(md->next_walktime,tick) > + 7000 &&
- (md->walkpath.path_len==0 || md->walkpath.path_pos>=md->walkpath.path_len) )
- md->next_walktime = tick + 3000*rand()%2000;
- mob_randomwalk(md,tick);
- }*/
- if ((sc_data[type].val2 -= 1000) > 0) {
- sc_data[type].timer = add_timer(
- i + tick, status_change_timer,
- bl->id, data);
- return 0;
- }
- }
- break;
-
- case SC_GOSPEL:
- {
- int calc_flag = 0;
- if (sc_data[type].val3 > 0) {
- sc_data[type].val3 = 0;
- calc_flag = 1;
- }
- if(sd && sc_data[type].val4 == BCT_SELF){
- int hp, sp;
- hp = (sc_data[type].val1 > 5) ? 45 : 30;
- sp = (sc_data[type].val1 > 5) ? 35 : 20;
- if(sd->status.hp - hp > 0 &&
- sd->status.sp - sp > 0){
- sd->status.hp -= hp;
- sd->status.sp -= sp;
- clif_updatestatus(sd,SP_HP);
- clif_updatestatus(sd,SP_SP);
- if ((sc_data[type].val2 -= 10000) > 0) {
- sc_data[type].timer = add_timer(
- 10000+tick, status_change_timer,
- bl->id, data);
- return 0;
- }
- }
- } else if (sd && sc_data[type].val4 == BCT_PARTY) {
- int i;
- switch ((i = rand() % 12)) {
- case 1: // heal between 100-1000
- {
- struct block_list tbl;
- int heal = rand() % 900 + 100;
- tbl.id = 0;
- tbl.m = bl->m;
- tbl.x = bl->x;
- tbl.y = bl->y;
- clif_skill_nodamage(&tbl,bl,AL_HEAL,heal,1);
- battle_heal(NULL,bl,heal,0,0);
- }
- break;
- case 2: // end negative status
- {
- int j;
- for (j=0; j<4; j++)
- if(sc_data[i + SC_POISON].timer!=-1) {
- status_change_end(bl,j,-1);
- break;
- }
- }
- break;
- case 3: // +25% resistance to negative status
- case 4: // +25% max hp
- case 5: // +25% max sp
- case 6: // +2 to all stats
- case 11: // +25% armor and vit def
- case 12: // +8% atk
- case 13: // +5% flee
- case 14: // +5% hit
- sc_data[type].val3 = i;
- if (i == 6 ||
- (i >= 11 && i <= 14))
- calc_flag = 1;
- break;
- case 7: // level 5 bless
- {
- struct block_list tbl;
- tbl.id = 0;
- tbl.m = bl->m;
- tbl.x = bl->x;
- tbl.y = bl->y;
- clif_skill_nodamage(&tbl,bl,AL_BLESSING,5,1);
- status_change_start(bl,SkillStatusChangeTable[AL_BLESSING],5,0,0,0,10000,0 );
- }
- break;
- case 8: // level 5 increase agility
- {
- struct block_list tbl;
- tbl.id = 0;
- tbl.m = bl->m;
- tbl.x = bl->x;
- tbl.y = bl->y;
- clif_skill_nodamage(&tbl,bl,AL_INCAGI,5,1);
- status_change_start(bl,SkillStatusChangeTable[AL_INCAGI],5,0,0,0,10000,0 );
- }
- break;
- case 9: // holy element to weapon
- {
- struct block_list tbl;
- tbl.id = 0;
- tbl.m = bl->m;
- tbl.x = bl->x;
- tbl.y = bl->y;
- clif_skill_nodamage(&tbl,bl,PR_ASPERSIO,1,1);
- status_change_start(bl,SkillStatusChangeTable[PR_ASPERSIO],1,0,0,0,10000,0 );
- }
- break;
- case 10: // holy element to armour
- {
- struct block_list tbl;
- tbl.id = 0;
- tbl.m = bl->m;
- tbl.x = bl->x;
- tbl.y = bl->y;
- clif_skill_nodamage(&tbl,bl,PR_BENEDICTIO,1,1);
- status_change_start(bl,SkillStatusChangeTable[PR_BENEDICTIO],1,0,0,0,10000,0 );
- }
- break;
- default:
- break;
- }
- } else if (sc_data[type].val4 == BCT_ENEMY) {
- int i;
- switch ((i = rand() % 8)) {
- case 1: // damage between 300-800
- case 2: // damage between 150-550 (ignore def)
- battle_damage(NULL, bl, rand() % 500,0); // temporary damage
- break;
- case 3: // random status effect
- {
- int effect[3] = {
- SC_CURSE,
- SC_BLIND,
- SC_POISON };
- status_change_start(bl,effect[rand()%3],1,0,0,0,10000,0 );
- }
- break;
- case 4: // level 10 provoke
- {
- struct block_list tbl;
- tbl.id = 0;
- tbl.m = bl->m;
- tbl.x = bl->x;
- tbl.y = bl->y;
- clif_skill_nodamage(&tbl,bl,SM_PROVOKE,1,1);
- status_change_start(bl,SkillStatusChangeTable[SM_PROVOKE],10,0,0,0,10000,0 );
- }
- break;
- case 5: // 0 def
- case 6: // 0 atk
- case 7: // 0 flee
- case 8: // -75% move speed and aspd
- sc_data[type].val3 = i;
- calc_flag = 1;
- break;
- default:
- break;
- }
- }
- if (sd && calc_flag)
- status_calc_pc (sd, 0);
- }
- break;
-
- case SC_GUILDAURA:
- {
- struct block_list *tbl = map_id2bl(sc_data[type].val2);
-
- if (tbl && battle_check_range(bl, tbl, 2)){
- sc_data[type].timer = add_timer(
- 1000 + tick, status_change_timer,
- bl->id, data);
- return 0;
- }// ugh, don't forget the brackets
- }
- break;
- }
-
- // default for all non-handled control paths
- // security system to prevent forgetting timer removal
-
- // if we reach this point we need the timer for the next call,
- // so restore it to have status_change_end handle a valid timer
- sc_data[type].timer = temp_timerid;
-
- return status_change_end( bl,type,tid );
-}
-
-/*==========================================
- * ƒXƒe[ƒ^ƒXˆÙíƒ^ƒCƒ}[”͈͈—
- *------------------------------------------
- */
-int status_change_timer_sub(struct block_list *bl, va_list ap )
-{
- struct block_list *src;
- int type;
- unsigned int tick;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, src=va_arg(ap,struct block_list*));
- type=va_arg(ap,int);
- tick=va_arg(ap,unsigned int);
-
- if(bl->type!=BL_PC && bl->type!=BL_MOB)
- return 0;
-
- switch( type ){
- case SC_SIGHT: /* ƒTƒCƒg */
- case SC_CONCENTRATE:
- if( (*status_get_option(bl))&6 ){
- status_change_end( bl, SC_HIDING, -1);
- status_change_end( bl, SC_CLOAKING, -1);
- }
- break;
- case SC_RUWACH: /* ƒ‹ƒAƒt */
- if( (*status_get_option(bl))&6 ){
- struct status_change *sc_data = status_get_sc_data(bl); // check whether the target is hiding/cloaking [celest]
- if (sc_data && (sc_data[SC_HIDING].timer != -1 || // if the target is using a special hiding, i.e not using normal hiding/cloaking, don't bother
- sc_data[SC_CLOAKING].timer != -1)) {
- status_change_end( bl, SC_HIDING, -1);
- status_change_end( bl, SC_CLOAKING, -1);
- }
- if(battle_check_target( src,bl, BCT_ENEMY ) > 0)
- skill_attack(BF_MAGIC,src,src,bl,AL_RUWACH,sc_data[type].val1,tick,0);
- }
- break;
- }
- return 0;
-}
-
-
-static int status_calc_sigma(void)
-{
- int i,j,k;
-
- for(i=0;i<MAX_PC_CLASS;i++) {
- memset(hp_sigma_val[i],0,sizeof(hp_sigma_val[i]));
- for(k=0,j=2;j<=MAX_LEVEL;j++) {
- k += hp_coefficient[i]*j + 50;
- k -= k%100;
- hp_sigma_val[i][j-1] = k;
- }
- }
- return 0;
-}
-
-int status_readdb(void) {
- int i,j,k;
- FILE *fp;
- char line[1024],*p;
-
- // JOB•â³?’l‚P
- fp=fopen("db/job_db1.txt","r");
- if(fp==NULL){
- printf("can't read db/job_db1.txt\n");
- return 1;
- }
- i=0;
- while(fgets(line, sizeof(line)-1, fp)){
- char *split[50];
- if(line[0]=='/' && line[1]=='/')
- continue;
- for(j=0,p=line;j<21 && p;j++){
- split[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
- if(j<21)
- continue;
- max_weight_base[i]=atoi(split[0]);
- hp_coefficient[i]=atoi(split[1]);
- hp_coefficient2[i]=atoi(split[2]);
- sp_coefficient[i]=atoi(split[3]);
- for(j=0;j<17;j++)
- aspd_base[i][j]=atoi(split[j+4]);
- i++;
-// -- moonsoul (below two lines added to accommodate high numbered new class ids)
- if(i==24)
- i=4001;
- if(i==MAX_PC_CLASS)
- break;
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/job_db1.txt");
- ShowStatus(tmp_output);
-
- // JOBƒ{?ƒiƒX
- memset(job_bonus,0,sizeof(job_bonus));
- fp=fopen("db/job_db2.txt","r");
- if(fp==NULL){
- printf("can't read db/job_db2.txt\n");
- return 1;
- }
- i=0;
- while(fgets(line, sizeof(line)-1, fp)){
- if(line[0]=='/' && line[1]=='/')
- continue;
- for(j=0,p=line;j<MAX_LEVEL && p;j++){
- if(sscanf(p,"%d",&k)==0)
- break;
- job_bonus[0][i][j]=k;
- job_bonus[2][i][j]=k; //—{ŽqE‚̃{?ƒiƒX‚Í•ª‚©‚ç‚È‚¢‚Ì‚Å?
- p=strchr(p,',');
- if(p) p++;
- }
- i++;
-// -- moonsoul (below two lines added to accommodate high numbered new class ids)
- if(i==24)
- i=4001;
- if(i==MAX_PC_CLASS)
- break;
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/job_db2.txt");
- ShowStatus(tmp_output);
-
- // JOBƒ{?ƒiƒX2 ?¶E—p
- fp=fopen("db/job_db2-2.txt","r");
- if(fp==NULL){
- printf("can't read db/job_db2-2.txt\n");
- return 1;
- }
- i=0;
- while(fgets(line, sizeof(line)-1, fp)){
- if(line[0]=='/' && line[1]=='/')
- continue;
- for(j=0,p=line;j<MAX_LEVEL && p;j++){
- if(sscanf(p,"%d",&k)==0)
- break;
- job_bonus[1][i][j]=k;
- p=strchr(p,',');
- if(p) p++;
- }
- i++;
- if(i==MAX_PC_CLASS)
- break;
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/job_db2-2.txt");
- ShowStatus(tmp_output);
-
- // ƒTƒCƒY•â³ƒe?ƒuƒ‹
- for(i=0;i<3;i++)
- for(j=0;j<20;j++)
- atkmods[i][j]=100;
- fp=fopen("db/size_fix.txt","r");
- if(fp==NULL){
- printf("can't read db/size_fix.txt\n");
- return 1;
- }
- i=0;
- while(fgets(line, sizeof(line)-1, fp)){
- char *split[20];
- if(line[0]=='/' && line[1]=='/')
- continue;
- if(atoi(line)<=0)
- continue;
- memset(split,0,sizeof(split));
- for(j=0,p=line;j<20 && p;j++){
- split[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
- for(j=0;j<20 && split[j];j++)
- atkmods[i][j]=atoi(split[j]);
- i++;
- }
- fclose(fp);
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/size_fix.txt");
- ShowStatus(tmp_output);
-
- // ¸?ƒf?ƒ^ƒe?ƒuƒ‹
- for(i=0;i<5;i++){
- for(j=0;j<10;j++)
- percentrefinery[i][j]=100;
- refinebonus[i][0]=0;
- refinebonus[i][1]=0;
- refinebonus[i][2]=10;
- }
- fp=fopen("db/refine_db.txt","r");
- if(fp==NULL){
- printf("can't read db/refine_db.txt\n");
- return 1;
- }
- i=0;
- while(fgets(line, sizeof(line)-1, fp)){
- char *split[16];
- if(line[0]=='/' && line[1]=='/')
- continue;
- if(atoi(line)<=0)
- continue;
- memset(split,0,sizeof(split));
- for(j=0,p=line;j<16 && p;j++){
- split[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
- refinebonus[i][0]=atoi(split[0]); // ¸?ƒ{?ƒiƒX
- refinebonus[i][1]=atoi(split[1]); // ‰ß?¸?ƒ{?ƒiƒX
- refinebonus[i][2]=atoi(split[2]); // ˆÀ‘S¸?ŒÀŠE
- for(j=0;j<10 && split[j];j++)
- percentrefinery[i][j]=atoi(split[j+3]);
- i++;
- }
- fclose(fp); //Lupus. close this file!!!
- sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/refine_db.txt");
- ShowStatus(tmp_output);
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ŠÖŒW‰Šú‰»ˆ—
- *------------------------------------------
- */
-int do_init_status(void)
-{
- add_timer_func_list(status_change_timer,"status_change_timer");
- status_readdb();
- status_calc_sigma();
- return 0;
-}
diff --git a/src/map/status.h b/src/map/status.h
deleted file mode 100644
index a07c47153..000000000
--- a/src/map/status.h
+++ /dev/null
@@ -1,271 +0,0 @@
-#ifndef _STATUS_H_
-#define _STATUS_H_
-
-enum { // struct map_session_data ‚Ì status_change‚Ì”Ô?ƒe?ƒuƒ‹
-// SC_SENDMAX–¢?‚̓Nƒ‰ƒCƒAƒ“ƒg‚Ö‚Ì’Ê’m‚ ‚èB
-// 2-2ŽŸE‚Ì’l‚Í‚È‚ñ‚©‚ß‚¿‚á‚­‚¿‚á‚Á‚Û‚¢‚Ì‚ÅŽb’èB‚½‚Ô‚ñ?X‚³‚ê‚Ü‚·B
- SC_SENDMAX = 128, // note: max is now 182, but we'll need to do alot of moving around
- SC_PROVOKE = 0,
- SC_ENDURE = 1,
- SC_TWOHANDQUICKEN = 2,
- SC_CONCENTRATE = 3,
- SC_HIDING = 4,
- SC_CLOAKING = 5,
- SC_ENCPOISON = 6,
- SC_POISONREACT = 7,
- SC_QUAGMIRE = 8,
- SC_ANGELUS = 9,
- SC_BLESSING = 10,
- SC_SIGNUMCRUCIS = 11,
- SC_INCREASEAGI = 12,
- SC_DECREASEAGI = 13,
- SC_SLOWPOISON = 14,
- SC_IMPOSITIO = 15,
- SC_SUFFRAGIUM = 16,
- SC_ASPERSIO = 17,
- SC_BENEDICTIO = 18,
- SC_KYRIE = 19,
- SC_MAGNIFICAT = 20,
- SC_GLORIA = 21,
- SC_AETERNA = 22,
- SC_ADRENALINE = 23,
- SC_WEAPONPERFECTION = 24,
- SC_OVERTHRUST = 25,
- SC_MAXIMIZEPOWER = 26,
- SC_RIDING = 27,
- SC_FALCON = 28,
- SC_TRICKDEAD = 29,
- SC_LOUD = 30,
- SC_ENERGYCOAT = 31,
- SC_BROKNARMOR = 32,
- SC_BROKNWEAPON = 33,
- SC_HALLUCINATION = 34,
- SC_WEIGHT50 = 35,
- SC_WEIGHT90 = 36,
- SC_SPEEDPOTION0 = 37,
- SC_SPEEDPOTION1 = 38,
- SC_SPEEDPOTION2 = 39,
- SC_SPEEDPOTION3 = 40,
- SC_SPEEDUP0 = 41, // for skill speedup
- SC_SPEEDUP1 = 42, // for skill speedup
-//-- 43-50
- SC_STRIPWEAPON = 50,
- SC_STRIPSHIELD = 51,
- SC_STRIPARMOR = 52,
- SC_STRIPHELM = 53,
- SC_CP_WEAPON = 54,
- SC_CP_SHIELD = 55,
- SC_CP_ARMOR = 56,
- SC_CP_HELM = 57,
- SC_AUTOGUARD = 58,
- SC_REFLECTSHIELD = 59,
- SC_DEVOTION = 60,
- SC_PROVIDENCE = 61,
- SC_DEFENDER = 62,
- SC_AUTOSPELL = 65,
- SC_SPEARSQUICKEN = 68,
-//-- 69-85
- SC_EXPLOSIONSPIRITS = 86,
- SC_STEELBODY = 87,
- SC_COMBO = 89,
- SC_FLAMELAUNCHER = 90,
- SC_FROSTWEAPON = 91,
- SC_LIGHTNINGLOADER = 92,
- SC_SEISMICWEAPON = 93,
-//-- 94-102
- SC_AURABLADE = 103, /* ƒI?ƒ‰ƒuƒŒ?ƒh */
- SC_PARRYING = 104, /* ƒpƒŠƒCƒ“ƒO */
- SC_CONCENTRATION = 105, /* ƒRƒ“ƒZƒ“ƒgƒŒ?ƒVƒ‡ƒ“ */
- SC_TENSIONRELAX = 106, /* ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX */
- SC_BERSERK = 107, /* ƒo?ƒT?ƒN */
-//-- 108, 109
- SC_ASSUMPTIO = 110, /* ƒAƒVƒƒƒ“ƒvƒeƒBƒI */
-//-- 111, 112
- SC_MAGICPOWER = 113, /* –‚–@—Í?• */
- SC_EDP = 114, /* ƒGƒtƒFƒNƒg‚ª”»–¾‚µ‚½‚çˆÚ“® */
- SC_TRUESIGHT = 115, /* ƒgƒDƒ‹?ƒTƒCƒg */
- SC_WINDWALK = 116, /* ƒEƒCƒ“ƒhƒEƒH?ƒN */
- SC_MELTDOWN = 117, /* ƒƒ‹ƒgƒ_ƒEƒ“ */
- SC_CARTBOOST = 118, /* ƒJ?ƒgƒu?ƒXƒg */
-//-- 119
- SC_REJECTSWORD = 120, /* ƒŠƒWƒFƒNƒgƒ\?ƒh */
- SC_MARIONETTE = 121, /* ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ?ƒ‹ */
- SC_MARIONETTE2 = 122, // Marionette target
-//-- 123
- SC_BLEEDING = 124, /* ƒwƒbƒhƒNƒ‰ƒbƒVƒ… */
- SC_JOINTBEAT = 125, /* ƒWƒ‡ƒCƒ“ƒgƒr?ƒg */
-//-- 126, 127
-
- SC_STONE = 128,
- SC_FREEZE = 129,
-// <-- 130 = a baby skill status?
- SC_STAN = 130,
- SC_SLEEP = 131,
-// <-- 132 = another baby skill?
- SC_POISON = 132,
- SC_CURSE = 133,
- SC_SILENCE = 134,
- SC_CONFUSION = 135,
- SC_BLIND = 136,
- SC_DIVINA = SC_SILENCE,
-//-- 137-139
- SC_SAFETYWALL = 140,
- SC_PNEUMA = 141,
-//-- 142
- SC_ANKLE = 143,
- SC_DANCING = 144,
- SC_KEEPING = 145,
- SC_BARRIER = 146,
-//-- 147,148
- SC_MAGICROD = 149,
- SC_SIGHT = 150,
- SC_RUWACH = 151,
- SC_AUTOCOUNTER = 152,
- SC_VOLCANO = 153,
- SC_DELUGE = 154,
- SC_VIOLENTGALE = 155,
- SC_BLADESTOP_WAIT = 156,
- SC_BLADESTOP = 157,
- SC_EXTREMITYFIST = 158,
-//-- 159
- SC_LULLABY =160,
- SC_RICHMANKIM =161,
- SC_ETERNALCHAOS =162,
- SC_DRUMBATTLE =163,
- SC_NIBELUNGEN =164,
- SC_ROKISWEIL =165,
- SC_INTOABYSS =166,
- SC_SIEGFRIED =167,
- SC_DISSONANCE =168,
- SC_WHISTLE =169,
- SC_ASSNCROS =170,
- SC_POEMBRAGI =171,
- SC_APPLEIDUN =172,
- SC_UGLYDANCE =173,
- SC_HUMMING =174,
- SC_DONTFORGETME =175,
- SC_FORTUNE =176,
- SC_SERVICE4U =177,
- SC_SPIDERWEB =180, /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
-// <-- 181 = unknown status
-// <-- 182 = unknown status
- SC_SACRIFICE =184, /* ƒTƒNƒŠƒtƒ@ƒCƒX */
- SC_WEDDING =187, //Œ‹¥—p(Œ‹¥ˆßÖ‚É‚È‚Á‚Ä?‚­‚Ì‚ª?‚¢‚Æ‚©)
- SC_NOCHAT =188, //ÔƒGƒ‚?‘Ô
- SC_SPLASHER =189, /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ? */
- SC_SELFDESTRUCTION =190, /* Ž©”š */
- SC_MEMORIZE =197, /* ƒƒ‚ƒ‰ƒCƒY */ // changed from 181 to 192
- SC_DPOISON =198, /* –Ò“Å */
-
-// Used by English Team
- SC_SLOWDOWN =45, // for skill slowdown
- SC_AUTOBERSERK =46,
- SC_SIGHTTRASHER =73,
- SC_BASILICA =102, // temporarily use this before an actual id is found [celest]
-
- SC_ENSEMBLE =159,
- SC_FOGWALL =178,
- SC_GOSPEL =179,
- SC_PRESERVE =181,
- SC_BATTLEORDERS =182,
- SC_MOONLIT =183,
- SC_ATKPOT =185, // [Valaris]
- SC_MATKPOT =186, // [Valaris]
- SC_MINDBREAKER =191,
- SC_SPELLBREAKER =192,
- SC_LANDPROTECTOR =193,
- SC_ADAPTATION =194,
- SC_CHASEWALK =195,
- SC_REGENERATION =196,
- SC_GUILDAURA =199,
- SC_BABY =200,
-
-// Icons
- _SC_BABY =200
-};
-extern int SkillStatusChangeTable[];
-
-extern int current_equip_item_index;
-
-// ƒpƒ‰ƒ[ƒ^Š“¾Œn battle.c ‚æ‚èˆÚ“®
-int status_get_class(struct block_list *bl);
-int status_get_dir(struct block_list *bl);
-int status_get_lv(struct block_list *bl);
-int status_get_range(struct block_list *bl);
-int status_get_hp(struct block_list *bl);
-int status_get_max_hp(struct block_list *bl);
-int status_get_str(struct block_list *bl);
-int status_get_agi(struct block_list *bl);
-int status_get_vit(struct block_list *bl);
-int status_get_int(struct block_list *bl);
-int status_get_dex(struct block_list *bl);
-int status_get_luk(struct block_list *bl);
-int status_get_hit(struct block_list *bl);
-int status_get_flee(struct block_list *bl);
-int status_get_def(struct block_list *bl);
-int status_get_mdef(struct block_list *bl);
-int status_get_flee2(struct block_list *bl);
-int status_get_def2(struct block_list *bl);
-int status_get_mdef2(struct block_list *bl);
-int status_get_baseatk(struct block_list *bl);
-int status_get_atk(struct block_list *bl);
-int status_get_atk2(struct block_list *bl);
-int status_get_speed(struct block_list *bl);
-int status_get_adelay(struct block_list *bl);
-int status_get_amotion(struct block_list *bl);
-int status_get_dmotion(struct block_list *bl);
-int status_get_element(struct block_list *bl);
-int status_get_attack_element(struct block_list *bl);
-int status_get_attack_element2(struct block_list *bl); //¶Žè•Ší‘®«Žæ“¾
-#define status_get_elem_type(bl) (status_get_element(bl)%10)
-#define status_get_elem_level(bl) (status_get_element(bl)/10/2)
-int status_get_party_id(struct block_list *bl);
-int status_get_guild_id(struct block_list *bl);
-int status_get_race(struct block_list *bl);
-int status_get_size(struct block_list *bl);
-int status_get_mode(struct block_list *bl);
-int status_get_mexp(struct block_list *bl);
-int status_get_race2(struct block_list *bl);
-
-struct status_change *status_get_sc_data(struct block_list *bl);
-short *status_get_sc_count(struct block_list *bl);
-short *status_get_opt1(struct block_list *bl);
-short *status_get_opt2(struct block_list *bl);
-short *status_get_opt3(struct block_list *bl);
-short *status_get_option(struct block_list *bl);
-
-int status_get_matk1(struct block_list *bl);
-int status_get_matk2(struct block_list *bl);
-int status_get_critical(struct block_list *bl);
-int status_get_atk_(struct block_list *bl);
-int status_get_atk_2(struct block_list *bl);
-int status_get_atk2(struct block_list *bl);
-
-int status_isdead(struct block_list *bl);
-
-int status_get_sc_def(struct block_list *bl, int type);
-#define status_get_sc_def_mdef(bl) (status_get_sc_def(bl, SP_MDEF1))
-#define status_get_sc_def_vit(bl) (status_get_sc_def(bl, SP_DEF2))
-#define status_get_sc_def_int(bl) (status_get_sc_def(bl, SP_MDEF2))
-#define status_get_sc_def_luk(bl) (status_get_sc_def(bl, SP_LUK))
-
-// ó‘ÔˆÙíŠÖ˜A skill.c ‚æ‚èˆÚ“®
-int status_change_start(struct block_list *bl,int type,int val1,int val2,int val3,int val4,int tick,int flag);
-int status_change_end( struct block_list* bl , int type,int tid );
-int status_change_timer(int tid, unsigned int tick, int id, int data);
-int status_change_timer_sub(struct block_list *bl, va_list ap );
-int status_change_clear(struct block_list *bl,int type);
-
-// ƒXƒe[ƒ^ƒXŒvŽZ pc.c ‚©‚番—£
-// pc_calcstatus
-int status_calc_pc(struct map_session_data* sd,int first);
-int status_calc_speed(struct map_session_data*); // [Celest]
-// int status_calc_skilltree(struct map_session_data *sd);
-int status_getrefinebonus(int lv,int type);
-int status_percentrefinery(struct map_session_data *sd,struct item *item);
-extern int percentrefinery[5][10];
-
-int status_readdb(void);
-int do_init_status(void);
-
-#endif
diff --git a/src/map/storage.c b/src/map/storage.c
deleted file mode 100644
index 82ecd9321..000000000
--- a/src/map/storage.c
+++ /dev/null
@@ -1,624 +0,0 @@
-// $Id: storage.c,v 1.3 2004/09/25 02:05:22 MouseJstr Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "../common/db.h"
-#include "../common/nullpo.h"
-#include "../common/malloc.h"
-
-#include "itemdb.h"
-#include "clif.h"
-#include "intif.h"
-#include "pc.h"
-#include "storage.h"
-#include "guild.h"
-#include "battle.h"
-#include "atcommand.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-static struct dbt *storage_db;
-static struct dbt *guild_storage_db;
-
-/*==========================================
- * ‘qŒÉ“àƒAƒCƒeƒ€ƒ\[ƒg
- *------------------------------------------
- */
-int storage_comp_item(const void *_i1, const void *_i2){
-struct item *i1=(struct item *)_i1;
-struct item *i2=(struct item *)_i2;
-
- if (i1->nameid == i2->nameid) {
- return 0;
- } else if (!(i1->nameid) || !(i1->amount)){
- return 1;
- } else if (!(i2->nameid) || !(i2->amount)){
- return -1;
- } else {
- return i1->nameid - i2->nameid;
- }
-}
-
-
-void sortage_sortitem(struct storage* stor){
- nullpo_retv(stor);
-
- qsort(stor->storage_, MAX_STORAGE, sizeof(struct item), storage_comp_item);
-}
-
-void sortage_gsortitem(struct guild_storage* gstor){
- nullpo_retv(gstor);
-
- qsort(gstor->storage_, MAX_GUILD_STORAGE, sizeof(struct item), storage_comp_item);
-}
-
-/*==========================================
- * ‰Šú‰»‚Æ‚©
- *------------------------------------------
- */
-int do_init_storage(void) // map.c::do_init()‚©‚çŒÄ‚΂ê‚é
-{
- storage_db=numdb_init();
- guild_storage_db=numdb_init();
- return 1;
-}
-static int guild_storage_db_final(void *key,void *data,va_list ap)
-{
- struct guild_storage *gstor=(struct guild_storage *) data;
- aFree(gstor);
- return 0;
-}
-static int storage_db_final(void *key,void *data,va_list ap)
-{
- struct storage *stor=(struct storage *) data;
- aFree(stor);
- return 0;
-}
-void do_final_storage(void) // by [MC Cameri]
-{
- if (storage_db)
- numdb_final(storage_db,storage_db_final);
- if (guild_storage_db)
- numdb_final(guild_storage_db,guild_storage_db_final);
-}
-
-struct storage *account2storage(int account_id)
-{
- struct storage *stor;
- stor=(struct storage *) numdb_search(storage_db,account_id);
- if(stor == NULL) {
- stor = (struct storage *) aCallocA(sizeof(struct storage), 1);
- if(stor == NULL){
- printf("storage: out of memory!\n");
- exit(0);
- }
- memset(stor,0,sizeof(struct storage));
- stor->account_id=account_id;
- numdb_insert(storage_db,stor->account_id,stor);
- }
- return stor;
-}
-
-// Just to ask storage, without creation
-struct storage *account2storage2(int account_id) {
- return (struct storage *) numdb_search(storage_db, account_id);
-}
-
-int storage_delete(int account_id)
-{
- struct storage *stor = (struct storage *) numdb_search(storage_db,account_id);
- if(stor) {
- numdb_erase(storage_db,account_id);
- aFree(stor);
- }
- return 0;
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚ðŠJ‚­
- *------------------------------------------
- */
-int storage_storageopen(struct map_session_data *sd)
-{
- struct storage *stor;
-
- nullpo_retr(0, sd);
-
- if(pc_isGM(sd) && pc_isGM(sd) < battle_config.gm_can_drop_lv) {
- clif_displaymessage(sd->fd, msg_txt(246));
- return 1;
- }
- if((stor = (struct storage *) numdb_search(storage_db,sd->status.account_id)) != NULL) {
- if (stor->storage_status == 0) {
- stor->storage_status = 1;
- sd->state.storage_flag = 0;
- clif_storageitemlist(sd,stor);
- clif_storageequiplist(sd,stor);
- clif_updatestorageamount(sd,stor);
- return 0;
- }
- } else
- intif_request_storage(sd->status.account_id);
-
- return 1;
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚ÖƒAƒCƒeƒ€’ljÁ
- *------------------------------------------
- */
-int storage_additem(struct map_session_data *sd,struct storage *stor,struct item *item_data,int amount)
-{
- struct item_data *data;
- int i;
-
- nullpo_retr(1, sd);
- nullpo_retr(1, stor);
- nullpo_retr(1, item_data);
-
- stor->dirty = 1;
-
- if(item_data->nameid <= 0 || amount <= 0)
- return 1;
- nullpo_retr(1, data = itemdb_search(item_data->nameid));
-
- i=MAX_STORAGE;
- if(!itemdb_isequip2(data)){
- // ‘•”õ•i‚Å‚Í‚È‚¢‚Ì‚ÅAŠùŠ—L•i‚È‚çŒÂ”‚̂ݕω»‚³‚¹‚é
- for(i=0;i<MAX_STORAGE;i++){
- if( compare_item (&stor->storage_[i], item_data)) {
- if(stor->storage_[i].amount+amount > MAX_AMOUNT)
- return 1;
- stor->storage_[i].amount+=amount;
- clif_storageitemadded(sd,stor,i,amount);
- break;
- }
- }
- }
- if(i>=MAX_STORAGE){
- // ‘•”õ•i‚©–¢Š—L•i‚¾‚Á‚½‚Ì‚Å‹ó‚«—“‚֒ljÁ
- for(i=0;i<MAX_STORAGE;i++){
- if(stor->storage_[i].nameid==0){
- memcpy(&stor->storage_[i],item_data,sizeof(stor->storage_[0]));
- stor->storage_[i].amount=amount;
- stor->storage_amount++;
- clif_storageitemadded(sd,stor,i,amount);
- clif_updatestorageamount(sd,stor);
- break;
- }
- }
- if(i>=MAX_STORAGE)
- return 1;
- }
-
- return 0;
-}
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉƒAƒCƒeƒ€‚ðŒ¸‚ç‚·
- *------------------------------------------
- */
-int storage_delitem(struct map_session_data *sd,struct storage *stor,int n,int amount)
-{
- nullpo_retr(1, sd);
- nullpo_retr(1, stor);
-
- if(stor->storage_[n].nameid==0 || stor->storage_[n].amount<amount)
- return 1;
-
- stor->storage_[n].amount-=amount;
- if(stor->storage_[n].amount==0){
- memset(&stor->storage_[n],0,sizeof(stor->storage_[0]));
- stor->storage_amount--;
- clif_updatestorageamount(sd,stor);
- }
- clif_storageitemremoved(sd,n,amount);
-
- stor->dirty = 1;
-
- return 0;
-}
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚Ö“ü‚ê‚é
- *------------------------------------------
- */
-int storage_storageadd(struct map_session_data *sd,int index,int amount)
-{
- struct storage *stor;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor=account2storage2(sd->status.account_id));
-
- if( (stor->storage_amount <= MAX_STORAGE) && (stor->storage_status == 1) ) { // storage not full & storage open
- if(index>=0 && index<MAX_INVENTORY) { // valid index
- if( (amount <= sd->status.inventory[index].amount) && (amount > 0) ) { //valid amount
-// log_tostorage(sd, index, 0);
- if(storage_additem(sd,stor,&sd->status.inventory[index],amount)==0)
- // remove item from inventory
- pc_delitem(sd,index,amount,0);
- } // valid amount
- }// valid index
- }// storage not full & storage open
-
- return 0;
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚©‚ço‚·
- *------------------------------------------
- */
-int storage_storageget(struct map_session_data *sd,int index,int amount)
-{
- struct storage *stor;
- int flag;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor=account2storage2(sd->status.account_id));
-
- if(stor->storage_status == 1) { // storage open
- if(index>=0 && index<MAX_STORAGE) { // valid index
- if( (amount <= stor->storage_[index].amount) && (amount > 0) ) { //valid amount
- if((flag = pc_additem(sd,&stor->storage_[index],amount)) == 0)
- storage_delitem(sd,stor,index,amount);
- else
- clif_additem(sd,0,0,flag);
-// log_fromstorage(sd, index, 0);
- } // valid amount
- }// valid index
- }// storage open
-
- return 0;
-}
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚ÖƒJ[ƒg‚©‚ç“ü‚ê‚é
- *------------------------------------------
- */
-int storage_storageaddfromcart(struct map_session_data *sd,int index,int amount)
-{
- struct storage *stor;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor=account2storage2(sd->status.account_id));
-
- if( (stor->storage_amount <= MAX_STORAGE) && (stor->storage_status == 1) ) { // storage not full & storage open
- if(index>=0 && index<MAX_INVENTORY) { // valid index
- if( (amount <= sd->status.cart[index].amount) && (amount > 0) ) { //valid amount
- if(storage_additem(sd,stor,&sd->status.cart[index],amount)==0)
- pc_cart_delitem(sd,index,amount,0);
- } // valid amount
- }// valid index
- }// storage not full & storage open
-
- return 0;
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚©‚çƒJ[ƒg‚Öo‚·
- *------------------------------------------
- */
-int storage_storagegettocart(struct map_session_data *sd,int index,int amount)
-{
- struct storage *stor;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor=account2storage2(sd->status.account_id));
-
- if(stor->storage_status == 1) { // storage open
- if(index>=0 && index<MAX_STORAGE) { // valid index
- if( (amount <= stor->storage_[index].amount) && (amount > 0) ) { //valid amount
- if(pc_cart_additem(sd,&stor->storage_[index],amount)==0){
- storage_delitem(sd,stor,index,amount);
- }
- } // valid amount
- }// valid index
- }// storage open
-
- return 0;
-}
-
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚ð•Â‚¶‚é
- *------------------------------------------
- */
-int storage_storageclose(struct map_session_data *sd)
-{
- struct storage *stor;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor=account2storage2(sd->status.account_id));
-
- stor->storage_status=0;
- sd->state.storage_flag = 0;
- clif_storageclose(sd);
-
- storage_storage_save(sd);
-
- sortage_sortitem(stor);
- return 0;
-}
-
-/*==========================================
- * ƒƒOƒAƒEƒgŽžŠJ‚¢‚Ä‚¢‚éƒJƒvƒ‰‘qŒÉ‚Ì•Û‘¶
- *------------------------------------------
- */
-int storage_storage_quit(struct map_session_data *sd)
-{
- struct storage *stor;
-
- nullpo_retr(0, sd);
-
- stor = (struct storage *) numdb_search(storage_db,sd->status.account_id);
- if(stor) {
- stor->storage_status = 0;
- storage_storage_save(sd);
- }
-
- return 0;
-}
-
-void storage_storage_dirty(struct map_session_data *sd)
-{
- struct storage *stor;
-
- stor=(struct storage *) numdb_search(storage_db,sd->status.account_id);
-
- if(stor)
- stor->dirty = 1;
-}
-
-int storage_storage_save(struct map_session_data *sd)
-{
- struct storage *stor;
-
- nullpo_retr(0, sd);
-
- stor=(struct storage *) numdb_search(storage_db,sd->status.account_id);
- if(stor && stor->dirty) {
- intif_send_storage(stor);
- stor->dirty = 0;
- }
-
- return 0;
-}
-
-struct guild_storage *guild2storage(int guild_id)
-{
- struct guild_storage *gs = NULL;
- if(guild_search(guild_id) != NULL) {
- gs=(struct guild_storage *) numdb_search(guild_storage_db,guild_id);
- if(gs == NULL) {
- gs = (struct guild_storage *) aCallocA(sizeof(struct guild_storage), 1);
- if(gs==NULL){
- printf("storage: out of memory!\n");
- exit(0);
- }
- gs->guild_id=guild_id;
- numdb_insert(guild_storage_db,gs->guild_id,gs);
- }
- }
- return gs;
-}
-
-int guild_storage_delete(int guild_id)
-{
- struct guild_storage *gstor = (struct guild_storage *) numdb_search(guild_storage_db,guild_id);
- if(gstor) {
- numdb_erase(guild_storage_db,guild_id);
- aFree(gstor);
- }
- return 0;
-}
-
-int storage_guild_storageopen(struct map_session_data *sd)
-{
- struct guild_storage *gstor;
-
- nullpo_retr(0, sd);
-
- if(sd->status.guild_id <= 0)
- return 2;
- if((gstor = (struct guild_storage *) numdb_search(guild_storage_db,sd->status.guild_id)) != NULL) {
- if(gstor->storage_status)
- return 1;
- gstor->storage_status = 1;
- sd->state.storage_flag = 1;
- clif_guildstorageitemlist(sd,gstor);
- clif_guildstorageequiplist(sd,gstor);
- clif_updateguildstorageamount(sd,gstor);
- return 0;
- }
- else {
- gstor = guild2storage(sd->status.guild_id);
- gstor->storage_status = 1;
- intif_request_guild_storage(sd->status.account_id,sd->status.guild_id);
- }
-
- return 0;
-}
-
-int guild_storage_additem(struct map_session_data *sd,struct guild_storage *stor,struct item *item_data,int amount)
-{
- struct item_data *data;
- int i;
-
- nullpo_retr(1, sd);
- nullpo_retr(1, stor);
- nullpo_retr(1, item_data);
- nullpo_retr(1, data = itemdb_search(item_data->nameid));
-
- if(item_data->nameid <= 0 || amount <= 0)
- return 1;
-
- i=MAX_GUILD_STORAGE;
- if(!itemdb_isequip2(data)){
- // ‘•”õ•i‚Å‚Í‚È‚¢‚Ì‚ÅAŠùŠ—L•i‚È‚çŒÂ”‚̂ݕω»‚³‚¹‚é
- for(i=0;i<MAX_GUILD_STORAGE;i++){
- if(compare_item(&stor->storage_[i], item_data)) {
- if(stor->storage_[i].amount+amount > MAX_AMOUNT)
- return 1;
- stor->storage_[i].amount+=amount;
- clif_guildstorageitemadded(sd,stor,i,amount);
- break;
- }
- }
- }
- if(i>=MAX_GUILD_STORAGE){
- // ‘•”õ•i‚©–¢Š—L•i‚¾‚Á‚½‚Ì‚Å‹ó‚«—“‚֒ljÁ
- for(i=0;i<MAX_GUILD_STORAGE;i++){
- if(stor->storage_[i].nameid==0){
- memcpy(&stor->storage_[i],item_data,sizeof(stor->storage_[0]));
- stor->storage_[i].amount=amount;
- stor->storage_amount++;
- clif_guildstorageitemadded(sd,stor,i,amount);
- clif_updateguildstorageamount(sd,stor);
- break;
- }
- }
- if(i>=MAX_GUILD_STORAGE)
- return 1;
- }
- return 0;
-}
-
-int guild_storage_delitem(struct map_session_data *sd,struct guild_storage *stor,int n,int amount)
-{
- nullpo_retr(1, sd);
- nullpo_retr(1, stor);
-
- if(stor->storage_[n].nameid==0 || stor->storage_[n].amount<amount)
- return 1;
-
- stor->storage_[n].amount-=amount;
- if(stor->storage_[n].amount==0){
- memset(&stor->storage_[n],0,sizeof(stor->storage_[0]));
- stor->storage_amount--;
- clif_updateguildstorageamount(sd,stor);
- }
- clif_storageitemremoved(sd,n,amount);
-
- return 0;
-}
-
-int storage_guild_storageadd(struct map_session_data *sd,int index,int amount)
-{
- struct guild_storage *stor;
-
- nullpo_retr(0, sd);
-
- if((stor=guild2storage(sd->status.guild_id)) != NULL) {
- if( (stor->storage_amount <= MAX_GUILD_STORAGE) && (stor->storage_status == 1) ) { // storage not full & storage open
- if(index>=0 && index<MAX_INVENTORY) { // valid index
- if( (amount <= sd->status.inventory[index].amount) && (amount > 0) ) { //valid amount
-// log_tostorage(sd, index, 1);
- if(guild_storage_additem(sd,stor,&sd->status.inventory[index],amount)==0)
- // remove item from inventory
- pc_delitem(sd,index,amount,0);
- } // valid amount
- }// valid index
- }// storage not full & storage open
- }
-
- return 0;
-}
-
-int storage_guild_storageget(struct map_session_data *sd,int index,int amount)
-{
- struct guild_storage *stor;
- int flag;
-
- nullpo_retr(0, sd);
-
- if((stor=guild2storage(sd->status.guild_id)) != NULL) {
- if(stor->storage_status == 1) { // storage open
- if(index>=0 && index<MAX_GUILD_STORAGE) { // valid index
- if( (amount <= stor->storage_[index].amount) && (amount > 0) ) { //valid amount
- if((flag = pc_additem(sd,&stor->storage_[index],amount)) == 0)
- guild_storage_delitem(sd,stor,index,amount);
- else
- clif_additem(sd,0,0,flag);
-// log_fromstorage(sd, index, 1);
- } // valid amount
- }// valid index
- }// storage open
- }
-
- return 0;
-}
-
-int storage_guild_storageaddfromcart(struct map_session_data *sd,int index,int amount)
-{
- struct guild_storage *stor;
-
- nullpo_retr(0, sd);
-
- if((stor=guild2storage(sd->status.guild_id)) != NULL) {
- if( (stor->storage_amount <= MAX_GUILD_STORAGE) && (stor->storage_status == 1) ) { // storage not full & storage open
- if(index>=0 && index<MAX_INVENTORY) { // valid index
- if( (amount <= sd->status.cart[index].amount) && (amount > 0) ) { //valid amount
- if(guild_storage_additem(sd,stor,&sd->status.cart[index],amount)==0)
- pc_cart_delitem(sd,index,amount,0);
- } // valid amount
- }// valid index
- }// storage not full & storage open
- }
-
- return 0;
-}
-
-int storage_guild_storagegettocart(struct map_session_data *sd,int index,int amount)
-{
- struct guild_storage *stor;
-
- nullpo_retr(0, sd);
-
- if((stor=guild2storage(sd->status.guild_id)) != NULL) {
- if(stor->storage_status == 1) { // storage open
- if(index>=0 && index<MAX_GUILD_STORAGE) { // valid index
- if( (amount <= stor->storage_[index].amount) && (amount > 0) ) { //valid amount
- if(pc_cart_additem(sd,&stor->storage_[index],amount)==0){
- guild_storage_delitem(sd,stor,index,amount);
- }
- } // valid amount
- }// valid index
- }// storage open
- }
-
- return 0;
-}
-
-int storage_guild_storageclose(struct map_session_data *sd)
-{
- struct guild_storage *stor;
-
- nullpo_retr(0, sd);
-
- if((stor=guild2storage(sd->status.guild_id)) != NULL) {
- intif_send_guild_storage(sd->status.account_id,stor);
- stor->storage_status = 0;
- sd->state.storage_flag = 0;
- sortage_gsortitem(stor);
- }
- clif_storageclose(sd);
-
- return 0;
-}
-
-int storage_guild_storage_quit(struct map_session_data *sd,int flag)
-{
- struct guild_storage *stor;
-
- nullpo_retr(0, sd);
-
- stor = (struct guild_storage *) numdb_search(guild_storage_db,sd->status.guild_id);
- if(stor) {
- if(!flag)
- intif_send_guild_storage(sd->status.account_id,stor);
- stor->storage_status = 0;
- sd->state.storage_flag = 0;
- }
-
- return 0;
-}
diff --git a/src/map/storage.h b/src/map/storage.h
deleted file mode 100644
index 7b2ac2cbe..000000000
--- a/src/map/storage.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// $Id: storage.h,v 1.3 2004/09/25 05:32:19 MouseJstr Exp $
-#ifndef _STORAGE_H_
-#define _STORAGE_H_
-
-#include "mmo.h"
-
-int storage_storageopen(struct map_session_data *sd);
-int storage_storageadd(struct map_session_data *sd,int index,int amount);
-int storage_storageget(struct map_session_data *sd,int index,int amount);
-int storage_storageaddfromcart(struct map_session_data *sd,int index,int amount);
-int storage_storagegettocart(struct map_session_data *sd,int index,int amount);
-int storage_storageclose(struct map_session_data *sd);
-int do_init_storage(void);
-void do_final_storage(void);
-struct storage *account2storage(int account_id);
-struct storage *account2storage2(int account_id);
-int storage_delete(int account_id);
-int storage_storage_quit(struct map_session_data *sd);
-int storage_storage_save(struct map_session_data *sd);
-void storage_storage_dirty(struct map_session_data *sd);
-
-struct guild_storage *guild2storage(int guild_id);
-int guild_storage_delete(int guild_id);
-int storage_guild_storageopen(struct map_session_data *sd);
-int guild_storage_additem(struct map_session_data *sd,struct guild_storage *stor,struct item *item_data,int amount);
-int guild_storage_delitem(struct map_session_data *sd,struct guild_storage *stor,int n,int amount);
-int storage_guild_storageadd(struct map_session_data *sd,int index,int amount);
-int storage_guild_storageget(struct map_session_data *sd,int index,int amount);
-int storage_guild_storageaddfromcart(struct map_session_data *sd,int index,int amount);
-int storage_guild_storagegettocart(struct map_session_data *sd,int index,int amount);
-int storage_guild_storageclose(struct map_session_data *sd);
-int storage_guild_storage_quit(struct map_session_data *sd,int flag);
-
-int storage_comp_item(const void *_i1, const void *_i2);
-//int storage_comp_item(const struct item* i1, const struct item* i2);
-void sortage_sortitem(struct storage* stor);
-void sortage_gsortitem(struct guild_storage* gstor);
-
-#endif
diff --git a/src/map/trade.c b/src/map/trade.c
deleted file mode 100644
index eb1d45ba2..000000000
--- a/src/map/trade.c
+++ /dev/null
@@ -1,389 +0,0 @@
-// $Id: trade.c 375 2005-03-04 21:33:31Z Yor $
-//#include <config.h>
-
-#include <stdio.h>
-#include <string.h>
-
-#include "../common/nullpo.h"
-#include "clif.h"
-#include "itemdb.h"
-#include "map.h"
-#include "trade.h"
-#include "pc.h"
-#include "npc.h"
-#include "battle.h"
-#include "chrif.h"
-#include "storage.h"
-#include "intif.h"
-#include "atcommand.h"
-#include "log.h"
-
-/*==========================================
- * Žæˆø—v¿‚ð‘ŠŽè‚É‘—‚é
- *------------------------------------------
- */
-void trade_traderequest(struct map_session_data *sd, int target_id) {
- struct map_session_data *target_sd;
-
- nullpo_retv(sd);
-
- if ((target_sd = map_id2sd(target_id)) != NULL) {
- if (!battle_config.invite_request_check) {
- if (target_sd->guild_invite > 0 || target_sd->party_invite > 0) {
- clif_tradestart(sd, 2); // ‘ŠŽè‚ÍPT—v¿’†‚©Guild—v¿’†
- return;
- }
- }
- if(pc_isGM(sd) && pc_isGM(target_sd) < battle_config.gm_can_drop_lv) {
- clif_displaymessage(sd->fd, msg_txt(246));
- trade_tradecancel(sd); // GM is not allowed to trade
- } else if ((target_sd->trade_partner != 0) || (sd->trade_partner != 0)) {
- trade_tradecancel(sd); // person is in another trade
- } else {
- if (!pc_isGM(sd) && (sd->bl.m != target_sd->bl.m ||
- (sd->bl.x - target_sd->bl.x <= -5 || sd->bl.x - target_sd->bl.x >= 5) ||
- (sd->bl.y - target_sd->bl.y <= -5 || sd->bl.y - target_sd->bl.y >= 5))) {
- clif_tradestart(sd, 0); // too far
- } else if (sd != target_sd) {
- target_sd->trade_partner = sd->status.account_id;
- sd->trade_partner = target_sd->status.account_id;
- clif_traderequest(target_sd, sd->status.name);
- }
- }
- } else {
- clif_tradestart(sd, 1); // character does not exist
- }
-}
-
-/*==========================================
- * Žæˆø—v¿
- *------------------------------------------
- */
-void trade_tradeack(struct map_session_data *sd, int type) {
- struct map_session_data *target_sd;
- struct storage *stor;
- nullpo_retv(sd);
-
- if ((target_sd = map_id2sd(sd->trade_partner)) != NULL) {
- clif_tradestart(target_sd, type);
- clif_tradestart(sd, type);
- if (type == 4) { // Cancel
- sd->deal_locked = 0;
- sd->trade_partner = 0;
- target_sd->deal_locked = 0;
- target_sd->trade_partner = 0;
- }
- if (sd->npc_id != 0)
- npc_event_dequeue(sd);
- if (target_sd->npc_id != 0)
- npc_event_dequeue(target_sd);
-
- //close STORAGE window if it's open. It protects from spooffing packets [Lupus]
- stor=account2storage2(sd->status.account_id);
- if(stor!=NULL && stor->storage_status == 1) {
- if (sd->state.storage_flag) //is it Guild Storage or Common
- storage_guild_storageclose(sd);
- else
- storage_storageclose(sd);
- }//END OF STORAGE CLOSE
- }
-}
-
-/*==========================================
- * Check here hacker for duplicate item in trade
- * normal client refuse to have 2 same types of item (except equipment) in same trade window
- * normal client authorise only no equiped item and only from inventory
- *------------------------------------------
- */
-int impossible_trade_check(struct map_session_data *sd) {
- struct item inventory[MAX_INVENTORY];
- char message_to_gm[200];
- int i, index;
-
- nullpo_retr(0, sd);
-
- // get inventory of player
- memcpy(&inventory, &sd->status.inventory, sizeof(struct item) * MAX_INVENTORY);
-
-/* remove this part: arrows can be trade and equiped
- // remove equiped items (they can not be trade)
- for (i = 0; i < MAX_INVENTORY; i++)
- if (inventory[i].nameid > 0 && inventory[i].equip)
- memset(&inventory[i], 0, sizeof(struct item));
-*/
-
- // check items in player inventory
- for(i = 0; i < 10; i++)
- if (sd->deal_item_amount[i] < 0) { // negativ? -> hack
-// printf("Negativ amount in trade, by hack!\n"); // normal client send cancel when we type negativ amount
- return -1;
- } else if (sd->deal_item_amount[i] > 0) {
- index = sd->deal_item_index[i] - 2;
- inventory[index].amount -= sd->deal_item_amount[i]; // remove item from inventory
-// printf("%d items left\n", inventory[index].amount);
- if (inventory[index].amount < 0) { // if more than the player have -> hack
-// printf("A player try to trade more items that he has: hack!\n");
- sprintf(message_to_gm, msg_txt(538), sd->status.name, sd->status.account_id); // Hack on trade: character '%s' (account: %d) try to trade more items that he has.
- intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, message_to_gm);
- sprintf(message_to_gm, msg_txt(539), sd->status.inventory[index].amount, sd->status.inventory[index].nameid, sd->status.inventory[index].amount - inventory[index].amount); // This player has %d of a kind of item (id: %d), and try to trade %d of them.
- intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, message_to_gm);
- // if we block people
- if (battle_config.ban_hack_trade < 0) {
- chrif_char_ask_name(-1, sd->status.name, 1, 0, 0, 0, 0, 0, 0); // type: 1 - block
- clif_setwaitclose(sd->fd); // forced to disconnect because of the hack
- // message about the ban
- sprintf(message_to_gm, msg_txt(540), battle_config.ban_spoof_namer); // This player has been definitivly blocked.
- // if we ban people
- } else if (battle_config.ban_hack_trade > 0) {
- chrif_char_ask_name(-1, sd->status.name, 2, 0, 0, 0, 0, battle_config.ban_hack_trade, 0); // type: 2 - ban (year, month, day, hour, minute, second)
- clif_setwaitclose(sd->fd); // forced to disconnect because of the hack
- // message about the ban
- sprintf(message_to_gm, msg_txt(507), battle_config.ban_spoof_namer); // This player has been banned for %d minute(s).
- } else {
- // message about the ban
- sprintf(message_to_gm, msg_txt(508)); // This player hasn't been banned (Ban option is disabled).
- }
- intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, message_to_gm);
- return 1;
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€’ljÁ
- *------------------------------------------
- */
-void trade_tradeadditem(struct map_session_data *sd, int index, int amount) {
- struct map_session_data *target_sd;
- int trade_i;
- int trade_weight = 0;
- int c;
-
- nullpo_retv(sd);
-
- if (((target_sd = map_id2sd(sd->trade_partner)) != NULL) && (sd->deal_locked < 1)){
- if (index < 2 || index >= MAX_INVENTORY + 2) {
- if (index == 0) {
- if (amount > 0 && amount <= MAX_ZENY && amount <= sd->status.zeny && // check amount
- (target_sd->status.zeny + amount) <= MAX_ZENY) { // fix positiv overflow
- sd->deal_zeny = amount;
- clif_tradeadditem(sd, target_sd, 0, amount);
- } else {
- if (amount != 0) {
- trade_tradecancel(sd);
- return;
- }
- }
- }
- } else if (amount > 0 && amount <= sd->status.inventory[index-2].amount) {
- for(trade_i = 0; trade_i < 10; trade_i++) {
- if (sd->deal_item_amount[trade_i] == 0) {
- trade_weight += sd->inventory_data[index-2]->weight * amount;
- if (target_sd->weight + trade_weight > target_sd->max_weight){
- clif_tradeitemok(sd, index, 1); // fail to add item -- the player was over weighted.
- amount = 0;
- } else {
- for(c = 0; c == trade_i - 1; c++) { // re-deal exploit protection [Valaris]
- if (sd->deal_item_index[c] == index) {
- trade_tradecancel(sd);
- return;
- }
- }
- sd->deal_item_index[trade_i] = index;
- sd->deal_item_amount[trade_i] += amount;
- if (impossible_trade_check(sd)) { // check exploit (trade more items that you have)
- trade_tradecancel(sd);
- return;
- }
- clif_tradeitemok(sd, index, 0); // success to add item
- clif_tradeadditem(sd, target_sd, index, amount);
- }
- break;
- } else {
- trade_weight += sd->inventory_data[sd->deal_item_index[trade_i]-2]->weight * sd->deal_item_amount[trade_i];
- }
- }
- }
- }
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€’ljÁŠ®—¹(ok‰Ÿ‚µ)
- *------------------------------------------
- */
-void trade_tradeok(struct map_session_data *sd) {
- struct map_session_data *target_sd;
- int trade_i;
-
- nullpo_retv(sd);
-
- // check items
- for(trade_i = 0; trade_i < 10; trade_i++) {
- if ((((sd->deal_item_index[trade_i]-2) >= 0) &&
- (sd->deal_item_amount[trade_i] > sd->status.inventory[sd->deal_item_index[trade_i]-2].amount)) ||
- (sd->deal_item_amount[trade_i] < 0)) {
- trade_tradecancel(sd);
- return;
- }
- }
-
- // check exploit (trade more items that you have)
- if (impossible_trade_check(sd)) {
- trade_tradecancel(sd);
- return;
- }
-
- // check zeny
- if (sd->deal_zeny < 0 || sd->deal_zeny > MAX_ZENY || sd->deal_zeny > sd->status.zeny) { // check amount
- trade_tradecancel(sd);
- return;
- }
-
- if ((target_sd = map_id2sd(sd->trade_partner)) != NULL) {
- sd->deal_locked = 1;
- clif_tradeitemok(sd, 0, 0);
- clif_tradedeal_lock(sd, 0);
- clif_tradedeal_lock(target_sd, 1);
- }
-}
-
-/*==========================================
- * ŽæˆøƒLƒƒƒ“ƒZƒ‹
- *------------------------------------------
- */
-void trade_tradecancel(struct map_session_data *sd) {
- struct map_session_data *target_sd;
- int trade_i;
-
- nullpo_retv(sd);
-
- if ((target_sd = map_id2sd(sd->trade_partner)) != NULL) {
- for(trade_i = 0; trade_i < 10; trade_i++) { // give items back (only virtual)
- if (sd->deal_item_amount[trade_i] != 0) {
- clif_additem(sd, sd->deal_item_index[trade_i] - 2, sd->deal_item_amount[trade_i], 0);
- sd->deal_item_index[trade_i] = 0;
- sd->deal_item_amount[trade_i] = 0;
- }
- if (target_sd->deal_item_amount[trade_i] != 0) {
- clif_additem(target_sd, target_sd->deal_item_index[trade_i] - 2, target_sd->deal_item_amount[trade_i], 0);
- target_sd->deal_item_index[trade_i] = 0;
- target_sd->deal_item_amount[trade_i] = 0;
- }
- }
- if (sd->deal_zeny) {
- clif_updatestatus(sd, SP_ZENY);
- sd->deal_zeny = 0;
- }
- if (target_sd->deal_zeny) {
- clif_updatestatus(target_sd, SP_ZENY);
- target_sd->deal_zeny = 0;
- }
- sd->deal_locked = 0;
- sd->trade_partner = 0;
- target_sd->deal_locked = 0;
- target_sd->trade_partner = 0;
- clif_tradecancelled(sd);
- clif_tradecancelled(target_sd);
- }
-}
-
-/*==========================================
- * Žæˆø‹–‘ø(trade‰Ÿ‚µ)
- *------------------------------------------
- */
-void trade_tradecommit(struct map_session_data *sd) {
- struct map_session_data *target_sd;
- int trade_i;
- int flag;
-
- nullpo_retv(sd);
-
- if ((target_sd = map_id2sd(sd->trade_partner)) != NULL) {
- if ((sd->deal_locked >= 1) && (target_sd->deal_locked >= 1)) { // both have pressed 'ok'
- if (sd->deal_locked < 2) { // set locked to 2
- sd->deal_locked = 2;
- }
- if (target_sd->deal_locked == 2) { // the other one pressed 'trade' too
- // check exploit (trade more items that you have)
- if (impossible_trade_check(sd)) {
- trade_tradecancel(sd);
- return;
- }
- // check exploit (trade more items that you have)
- if (impossible_trade_check(target_sd)) {
- trade_tradecancel(target_sd);
- return;
- }
- // check zenys value against hackers
- if (sd->deal_zeny >= 0 && sd->deal_zeny <= MAX_ZENY && sd->deal_zeny <= sd->status.zeny && // check amount
- (target_sd->status.zeny + sd->deal_zeny) <= MAX_ZENY && // fix positiv overflow
- target_sd->deal_zeny >= 0 && target_sd->deal_zeny <= MAX_ZENY && target_sd->deal_zeny <= target_sd->status.zeny && // check amount
- (sd->status.zeny + target_sd->deal_zeny) <= MAX_ZENY) { // fix positiv overflow
-
- // trade is accepted
- for(trade_i = 0; trade_i < 10; trade_i++) {
- if (sd->deal_item_amount[trade_i] != 0) {
- int n = sd->deal_item_index[trade_i] - 2;
-
- if (sd->status.inventory[n].amount < sd->deal_item_amount[trade_i])
- sd->deal_item_amount[trade_i] = sd->status.inventory[n].amount;
- log_trade(sd, target_sd, n, sd->deal_item_amount[trade_i]);
-
- flag = pc_additem(target_sd, &sd->status.inventory[n], sd->deal_item_amount[trade_i]);
- if (flag == 0)
- pc_delitem(sd, n, sd->deal_item_amount[trade_i], 1);
- else
- clif_additem(sd, n, sd->deal_item_amount[trade_i], 0);
- sd->deal_item_index[trade_i] = 0;
- sd->deal_item_amount[trade_i] = 0;
-
- }
- if (target_sd->deal_item_amount[trade_i] != 0) {
- int n = target_sd->deal_item_index[trade_i] - 2;
-
- if (target_sd->status.inventory[n].amount < target_sd->deal_item_amount[trade_i])
- target_sd->deal_item_amount[trade_i] = target_sd->status.inventory[n].amount;
-
- log_trade(target_sd, sd, n, target_sd->deal_item_amount[trade_i]);
- flag = pc_additem(sd, &target_sd->status.inventory[n], target_sd->deal_item_amount[trade_i]);
- if (flag == 0)
- pc_delitem(target_sd, n, target_sd->deal_item_amount[trade_i], 1);
- else
- clif_additem(target_sd, n, target_sd->deal_item_amount[trade_i], 0);
- target_sd->deal_item_index[trade_i] = 0;
- target_sd->deal_item_amount[trade_i] = 0;
- }
- }
- if (sd->deal_zeny) {
- sd->status.zeny -= sd->deal_zeny;
- target_sd->status.zeny += sd->deal_zeny;
- }
- if (target_sd->deal_zeny) {
- target_sd->status.zeny -= target_sd->deal_zeny;
- sd->status.zeny += target_sd->deal_zeny;
- }
- if (sd->deal_zeny || target_sd->deal_zeny) {
- clif_updatestatus(sd, SP_ZENY);
- sd->deal_zeny = 0;
- clif_updatestatus(target_sd, SP_ZENY);
- target_sd->deal_zeny = 0;
- }
- sd->deal_locked = 0;
- sd->trade_partner = 0;
- target_sd->deal_locked = 0;
- target_sd->trade_partner = 0;
- clif_tradecompleted(sd, 0);
- clif_tradecompleted(target_sd, 0);
- // save both player to avoid crash: they always have no advantage/disadvantage between the 2 players
- chrif_save(sd); // do pc_makesavestatus and save storage too
- chrif_save(target_sd); // do pc_makesavestatus and save storage too
- // zeny value was modified!!!! hacker with packet modified
- } else {
- trade_tradecancel(sd);
- }
- }
- }
- }
-}
diff --git a/src/map/trade.h b/src/map/trade.h
deleted file mode 100644
index 01cbce7eb..000000000
--- a/src/map/trade.h
+++ /dev/null
@@ -1,13 +0,0 @@
-// $Id: trade.h,v 1.2 2004/09/25 05:32:19 MouseJstr Exp $
-#ifndef _TRADE_H_
-#define _TRADE_H_
-
-#include "map.h"
-void trade_traderequest(struct map_session_data *sd,int target_id);
-void trade_tradeack(struct map_session_data *sd,int type);
-void trade_tradeadditem(struct map_session_data *sd,int index,int amount);
-void trade_tradeok(struct map_session_data *sd);
-void trade_tradecancel(struct map_session_data *sd);
-void trade_tradecommit(struct map_session_data *sd);
-
-#endif // _TRADE_H_
diff --git a/src/map/vending.c b/src/map/vending.c
deleted file mode 100644
index 2d3790596..000000000
--- a/src/map/vending.c
+++ /dev/null
@@ -1,175 +0,0 @@
-// $Id: vending.c,v 1.2 2004/09/25 05:32:19 MouseJstr Exp $
-#include <stdio.h>
-#include <string.h>
-
-#include "clif.h"
-#include "itemdb.h"
-#include "map.h"
-#include "vending.h"
-#include "pc.h"
-#include "skill.h"
-#include "battle.h"
-#include "nullpo.h"
-#include "log.h"
-
-/*==========================================
- * ˜I“X•Â½
- *------------------------------------------
-*/
-void vending_closevending(struct map_session_data *sd)
-{
-
- nullpo_retv(sd);
-
- sd->vender_id=0;
- clif_closevendingboard(&sd->bl,0);
-}
-
-/*==========================================
- * ˜I“XƒAƒCƒeƒ€ƒŠƒXƒg—v‹
- *------------------------------------------
- */
-void vending_vendinglistreq(struct map_session_data *sd,int id)
-{
- struct map_session_data *vsd;
-
- nullpo_retv(sd);
-
- if( (vsd=map_id2sd(id)) == NULL )
- return;
- if(vsd->vender_id==0)
- return;
- clif_vendinglist(sd,id,vsd->vending);
-}
-
-/*==========================================
- * ˜I“XƒAƒCƒeƒ€w“ü
- *------------------------------------------
- */
-void vending_purchasereq(struct map_session_data *sd,int len,int id,unsigned char *p)
-{
- int i, j, w, z, new_ = 0, blank, vend_list[12];
- short amount, index;
- struct map_session_data *vsd = map_id2sd(id);
-
- nullpo_retv(sd);
-
- blank = pc_inventoryblank(sd);
-
- if (vsd == NULL)
- return;
- if (vsd->vender_id == 0)
- return;
- if (vsd->vender_id == sd->bl.id)
- return;
- for(i = 0, w = z = 0; 8 + 4 * i < len; i++) {
- amount = *(short*)(p + 4 * i);
- index = *(short*)(p + 2 + 4 * i) - 2;
-
- if (amount < 0) return; // exploit
-/* for(j = 0; j < vsd->vend_num; j++)
- if (0 < vsd->vending[j].amount && amount <= vsd->vending[j].amount && vsd->vending[j].index == index)
- break;
-*/
-//ADD_start
- for(j = 0; j < vsd->vend_num; j++) {
- if (0 < vsd->vending[j].amount && vsd->vending[j].index == index) {
- if (amount > vsd->vending[j].amount || amount <= 0) {
- clif_buyvending(sd,index,vsd->vending[j].amount, 4);
- return;
- }
- if (amount <= vsd->vending[j].amount) break;
- }
- }
-//ADD_end
- if (j == vsd->vend_num)
- return; // ”„‚èØ‚ê
- vend_list[i] = j;
- z += vsd->vending[j].value * amount;
- if (z > sd->status.zeny){
- clif_buyvending(sd, index, amount, 1);
- return; // zeny•s‘«
- }
- w += itemdb_weight(vsd->status.cart[index].nameid) * amount;
- if (w + sd->weight > sd->max_weight) {
- clif_buyvending(sd, index, amount, 2);
- return; // d—Ê’´‰ß
- }
- switch(pc_checkadditem(sd, vsd->status.cart[index].nameid, amount)) {
- case ADDITEM_EXIST:
- break;
- case ADDITEM_NEW:
- new_++;
- if (new_ > blank)
- return; // Ží—Þ”’´‰ß
- break;
- case ADDITEM_OVERAMOUNT:
- return; // ƒAƒCƒeƒ€”’´‰ß
- }
- }
- if (z < 0 || z > MAX_ZENY) { // Zeny Bug Fixed by Darkchild
- clif_tradecancelled(sd);
- clif_tradecancelled(vsd);
- return;
- }
-
- pc_payzeny(sd, z);
- pc_getzeny(vsd, z);
- for(i = 0; 8 + 4 * i < len; i++) {
- amount = *(short*)(p + 4 *i);
- index = *(short*)(p + 2 + 4 * i) - 2;
- //if (amount < 0) break; // tested at start of the function
- pc_additem(sd,&vsd->status.cart[index],amount);
- vsd->vending[vend_list[i]].amount -= amount;
- pc_cart_delitem(vsd, index, amount, 0);
- clif_vendingreport(vsd, index, amount);
-
- //log added by Lupus
- if(log_config.vend > 0) {
- log_vend(sd,vsd, index, amount, z); // for Item + Zeny. log.
- //we log ZENY only with the 1st item. Then zero it for the rest items 8).
- z = 0;
- }
- }
-}
-
-/*==========================================
- * ˜I“XŠJÝ
- *------------------------------------------
- */
-void vending_openvending(struct map_session_data *sd,int len,char *message,int flag,unsigned char *p)
-{
- int i;
-
- nullpo_retv(sd);
-
- if(!pc_checkskill(sd,MC_VENDING) || !pc_iscarton(sd)) { // cart skill and cart check [Valaris]
- clif_skill_fail(sd,MC_VENDING,0,0);
- return;
- }
-
- if (flag) {
- for(i = 0; (85 + 8 * i < len) && (i < MAX_VENDING); i++) {
- sd->vending[i].index = *(short*)(p+8*i)-2;
- sd->vending[i].amount = *(short*)(p+2+8*i);
- sd->vending[i].value = *(int*)(p+4+8*i);
- if(sd->vending[i].value > battle_config.vending_max_value)
- sd->vending[i].value=battle_config.vending_max_value;
- else if(sd->vending[i].value == 0)
- sd->vending[i].value = 1000000; // auto set to 1 million [celest]
- // ƒJ[ƒg“à‚̃AƒCƒeƒ€”‚Ɣ̔„‚·‚éƒAƒCƒeƒ€”‚É‘Šˆá‚ª‚ ‚Á‚½‚ç’†Ž~
- if(pc_cartitem_amount(sd, sd->vending[i].index, sd->vending[i].amount) < 0 || sd->vending[i].value < 0) { // fixes by Valaris and fritz
- clif_skill_fail(sd, MC_VENDING, 0, 0);
- return;
- }
- }
- sd->vender_id = sd->bl.id;
- sd->vend_num = i;
- strcpy(sd->message,message);
- if (clif_openvending(sd,sd->vender_id,sd->vending) > 0)
- clif_showvendingboard(&sd->bl,message,0);
- else
- sd->vender_id = 0;
- }
-}
-
diff --git a/src/map/vending.h b/src/map/vending.h
deleted file mode 100644
index 41aa731bb..000000000
--- a/src/map/vending.h
+++ /dev/null
@@ -1,12 +0,0 @@
-// $Id: vending.h,v 1.2 2004/09/25 05:32:19 MouseJstr Exp $
-#ifndef _VENDING_H_
-#define _VENDING_H_
-
-#include "map.h"
-
-void vending_closevending(struct map_session_data *sd);
-void vending_openvending(struct map_session_data *sd,int len,char *message,int flag,unsigned char *p);
-void vending_vendinglistreq(struct map_session_data *sd,int id);
-void vending_purchasereq(struct map_session_data *sd,int len,int id,unsigned char *p);
-
-#endif // _VENDING_H_
diff --git a/src/tool/Makefile b/src/tool/Makefile
deleted file mode 100644
index bbf18cf98..000000000
--- a/src/tool/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-all:
- $(CC) -o adduser adduser.c
-
-clean:
- rm -f adduser
- rm -f *.exe
diff --git a/src/tool/adduser.c b/src/tool/adduser.c
deleted file mode 100644
index 1219540ab..000000000
--- a/src/tool/adduser.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- This program adds an user to account.txt
- Don't usr it When login-sever is working.
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-char *account_txt = "../save/account.txt";
-
-//-----------------------------------------------------
-// Function to suppress control characters in a string.
-//-----------------------------------------------------
-int remove_control_chars(unsigned char *str) {
- int i;
- int change = 0;
-
- for(i = 0; str[i]; i++) {
- if (str[i] < 32) {
- str[i] = '_';
- change = 1;
- }
- }
-
- return change;
-}
-
-int main(int argc, char *argv[]) {
-
- char username[24];
- char password[24];
- char sex[2];
-
- int next_id, id;
- char line[1024];
-
- // Check to see if account.txt exists.
- printf("Checking if '%s' file exists...\n", account_txt);
- FILE *FPaccin = fopen(account_txt, "r");
- if (FPaccin == NULL) {
- printf("'%s' file not found!\n", account_txt);
- printf("Run the setup wizard please.\n");
- exit(0);
- }
-
- next_id = 2000000;
- while(fgets(line, sizeof(line)-1, FPaccin)) {
- if (line[0] == '/' && line[1] == '/') { continue; }
- if (sscanf(line, "%d\t%%newid%%\n", &id) == 1) {
- if (next_id < id) {
- next_id = id;
- }
- } else {
- sscanf(line,"%i%[^ ]", &id);
- if (next_id <= id) {
- next_id = id +1;
- }
- }
- }
- close(FPaccin);
- printf("File exists.\n");
-
- printf("Don't create an account if the login-server is online!!!\n");
- printf("If the login-server is online, press ctrl+C now to stop this software.\n");
- printf("\n");
-
- strcpy(username, "");
- while (strlen(username) < 4 || strlen(username) > 23) {
- printf("Enter an username (4-23 characters): ");
- scanf("%s", &username);
- username[23] = 0;
- remove_control_chars(username);
- }
-
- strcpy(password, "");
- while (strlen(password) < 4 || strlen(password) > 23) {
- printf("Enter a password (4-23 characters): ");
- scanf("%s", &password);
- password[23] = 0;
- remove_control_chars(password);
- }
-
- strcpy(sex, "");
- while (strcmp(sex, "F") != 0 && strcmp(sex, "M") != 0) {
- printf("Enter a gender (M for male, F for female): ");
- scanf("%s", &sex);
- }
-
- FILE *FPaccout = fopen(account_txt, "r+");
- fseek(FPaccout, 0, SEEK_END);
- fprintf(FPaccout, "%i %s %s - %s -\r\n", next_id, username, password, sex);
- close(FPaccout);
-
- printf("Account added.\n");
-}
diff --git a/src/tool/backup b/src/tool/backup
deleted file mode 100644
index 939c7eee7..000000000
--- a/src/tool/backup
+++ /dev/null
@@ -1,100 +0,0 @@
-#!/usr/bin/perl
-
-##########################################################################
-# Athena—pƒf[ƒ^ƒoƒbƒNƒAƒbƒvƒc[ƒ‹
-#
-# @Athena‚ÌŠeŽíƒf[ƒ^ƒtƒ@ƒCƒ‹*.txt‚ðƒoƒbƒNƒAƒbƒv‚·‚éƒc[ƒ‹
-#
-#-------------------------------------------------------------------------
-# Ý’è•û–@
-# @ŽÀs‚·‚鎞‚̃JƒŒƒ“ƒgƒtƒHƒ‹ƒ_‚©‚ç‚̃f[ƒ^‚ւ̃pƒXAƒtƒ@ƒCƒ‹‚̃ŠƒXƒg‚ð
-# @³‚µ‚­Ý’肵‚Ü‚·BƒoƒbƒNƒAƒbƒvæ‚̃tƒHƒ‹ƒ_‚ÍŽ©“®ì¬‚³‚ê‚È‚¢‚Ì‚ÅA
-# @Ž©•ª‚Å쬂µ‚Ä‚¨‚­•K—v‚ª‚ ‚è‚Ü‚·B
-# @ƒtƒHƒ‹ƒ_‚ÌÅŒã‚Ìu/v‚ÍÈ—ª‚Å‚«‚Ü‚¹‚ñB
-#
-# @ƒtƒHƒ‹ƒ_‚͈ø”‚Å‚àŽw’è‚Å‚«‚Ü‚·B—á„./backup ../save/ ./backup_data/
-# @ƒtƒHƒ‹ƒ_‚ÌÅŒã‚Ìu/v‚ÍÈ—ª‚Å‚«‚Ü‚¹‚ñB
-#
-# @ŽÀs‚·‚é‚ƃoƒbƒNƒAƒbƒvæ‚̃tƒHƒ‹ƒ_‚ÖAƒtƒ@ƒCƒ‹–¼‚ÉŒ»Ý‚Ì“ú•t‚ÆŽž‚ð
-# @‚‚¯‚ătƒ@ƒCƒ‹‚ðƒRƒs[‚µ‚Ü‚·B
-#
-# * toolƒtƒHƒ‹ƒ_“à‚Ébackup_dataƒtƒHƒ‹ƒ_‚ð쬂µA
-# @ athena.sh‚Ì’†‚Éu./tool/backup ./save/ ./tool/backup_data/v
-# ‚Æ‚¢‚¤s‚ð’ljÁ‚·‚é‚ÆAathena‚ð‹N“®‚·‚邽‚тɃoƒbƒNƒAƒbƒv‚ªŽæ‚ê‚Ü‚·
-#
-# •œŒ³‚·‚é‚Æ‚«‚͈ø”‚Éu-r “ú•t‚ÆŽžv‚ðŽw’肵‚Ü‚·B
-# @‚Ü‚½‚»‚ÌŒã‚ë‚ɃtƒHƒ‹ƒ_‚ðŽw’è‚·‚邱‚Æ‚ào—ˆ‚Ü‚·
-# @—á‚P„ ./backup -r 200309191607
-# @—á‚Q„ ./backup -r 200309191607 ../save ./backup_data/
-# @‚±‚Ì—á‚Å‚Í2003/09/19‚Ì16:07•ª‚ɃoƒbƒNƒAƒbƒv‚µ‚½ƒf[ƒ^‚𕜌³‚µ‚Ä‚¢‚Ü‚·
-#
-# @•œŒ³‚·‚é‚Æ‚«AAthenaƒfƒBƒŒƒNƒgƒŠ‚É‚ ‚éƒf[ƒ^‚Í *.bak ‚É–¼‘O‚ð•ÏX‚µ‚Ä
-# @Žc‚µ‚Ä‚¢‚é‚Ì‚ÅA‚¢‚ç‚È‚¢ê‡‚Í rm *.bak ‚È‚Ç‚ÅÁ‚µ‚Ä‚­‚¾‚³‚¢B
-#
-##########################################################################
-
-$sdir="../save/"; #ƒoƒbƒNƒAƒbƒvŒ³(Athena‚̃fƒBƒŒƒNƒgƒŠ/save/)
-$tdir="./backup_data/"; #ƒoƒbƒNƒAƒbƒvæ
-
-@files=( #ƒtƒ@ƒCƒ‹‚̃ŠƒXƒg
- "account","athena","storage","party","guild","castle","pet"
-);
-
-
-#-------------------------------ݒ肱‚±‚Ü‚Å-----------------------------
-
-
-
-
-
-
-
-
-
-
-
-if($ARGV[0]=~/^\-r$/i || $ARGV[0]=~/\-\-(recover|restore)/i){
- #•œŒ³ˆ—
-
- $file=$ARGV[1];
- $sdir=$ARGV[2]||$sdir;
- $tdir=$ARGV[3]||$tdir;
- &restorecopy($_) foreach @files;
- exit(0);
-}
-
-#ƒoƒbƒNƒAƒbƒvˆ—
-$sdir=$ARGV[0]||$sdir;
-$tdir=$ARGV[1]||$tdir;
-
-unless( -d $tdir ){
- print "$0: \"$tdir\" : No such directory\n";
- exit(1);
-}
-
-(undef,$min,$hour,$day,$month,$year)=localtime;
-
-$file=sprintf("%04d%02d%02d%02d%02d",
- $year+1900, $month+1, $day, $hour, $min );
-
-&backupcopy($_) foreach @files;
-exit(0);
-
-sub backupcopy {
- my($name)= @_;
- system("cp $sdir$name.txt $tdir$name$file.txt");
-}
-
-sub restorecopy {
- my($name)= @_;
- unless( -f "$sdir$name.txt" ){
- printf("$0: \"$sdir$name.txt\" not found!\n");
- return 0;
- }
- unless( -f "$tdir$name$file.txt" ){
- printf("$0: \"$tdir$name$file.txt\" not found!\n");
- return 0;
- }
- rename "$sdir$name.txt","$sdir$name.bak";
- system("cp $tdir$name$file.txt $sdir$name.txt");
-}
diff --git a/src/tool/cgi/addaccount.cgi b/src/tool/cgi/addaccount.cgi
deleted file mode 100644
index 7d1788c48..000000000
--- a/src/tool/cgi/addaccount.cgi
+++ /dev/null
@@ -1,204 +0,0 @@
-#!/usr/bin/perl
-
-#=========================================================================
-# addaccount.cgi ver.1.00
-# ladmin‚ðƒ‰ƒbƒv‚µ‚½AƒAƒJƒEƒ“ƒg‚ð쬂·‚éCGIB
-# ladmin ver.1.04‚Å‚Ì“®ì‚ðŠm”FB
-#
-# ** Ý’è•û–@ **
-#
-# - ‰º‚Ì$ladmin•Ï”‚Éladmin‚ւ̃pƒX‚ðÝ’è‚·‚邱‚ÆB
-# - UNIXŒnOS‚ÅŽg—p‚·‚éꇂÍladmin‚Æ‹¤‚ɉüsƒR[ƒh‚ð•ÏŠ·‚·‚邱‚ÆA‚Ü‚½
-# ƒtƒ@ƒCƒ‹æ“ªs‚ðperl‚̳‚µ‚¢ƒpƒX‚É‚·‚邱‚ÆB—á> $ which perl
-# - ƒT[ƒo[ƒvƒƒOƒ‰ƒ€‚âƒuƒ‰ƒEƒU‚É‚æ‚Á‚Ä‚Í $cgiuri ‚É‚±‚̃tƒ@ƒCƒ‹‚Ö‚Ì
-# Š®‘S‚ÈURI‚ðƒZƒbƒg‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢ê‡‚à‚ ‚éB
-# - perl‚ɃpƒX‚ª’Ê‚Á‚Ä‚¢‚È‚¢ê‡‚Í $perl ‚ðperl‚ւ̳‚µ‚¢ƒpƒX‚É‚·‚邱‚ÆB
-# - ‘¼‚Í•’Ê‚ÌCGI‚Æ“¯‚¶‚Å‚·BiŽÀsŒ ‚âcgi-binƒtƒHƒ‹ƒ_‚È‚Çj
-#
-# ** ‚»‚Ì‘¼ **
-# addaccount.cgi ‚ðƒuƒ‰ƒEƒU‚ÅŠJ‚­‚ƃTƒ“ƒvƒ‹HTMLi‚»‚Ì‚Ü‚ÜŽg‚¦‚Ü‚·j‚ª
-# ŠJ‚«‚Ü‚·B‚Ü‚½A‚±‚Ìcgi‚̓uƒ‰ƒEƒU‚©‚ç‘—‚ç‚ê‚éAccept-Language‚ª
-# ja‚ÅŽn‚Ü‚Á‚Ä‚¢‚ê‚΃ƒbƒZ[ƒW‚̈ꕔ‚ð“ú–{Œê‚É•ÏŠ·‚µ‚Ü‚·B
-# (IE‚È‚çƒCƒ“ƒ^[ƒlƒbƒgƒIƒvƒVƒ‡ƒ“‚ÌŒ¾ŒêÝ’è‚ňê”Ôã‚É“ú–{Œê‚ð’u‚­)
-# ‚»‚êˆÈŠO‚Ìꇂ͉pŒê‚Ì‚Ü‚Üo—Í‚µ‚Ü‚·B
-#-------------------------------------------------------------------------
-
-my($ladmin) = "../ladmin"; # ladmin‚̃pƒX(‚¨‚»‚ç‚­•ÏX‚ª•K—v)
-
-my($cgiuri) = "./addaccount.cgi"; # ‚±‚̃tƒ@ƒCƒ‹‚ÌURI
-my($perl) = "perl"; # perl‚̃Rƒ}ƒ“ƒh–¼
-
-
-
-#--------------------------- ݒ肱‚±‚Ü‚Å --------------------------------
-
-
-
-
-
-
-use strict;
-use CGI;
-
-my($cgi)= new CGI;
-my(%langconv)=(
- 'Athena login-server administration tool.*' => '',
- 'logged on.*' => '',
-);
-
-# ----- “ú–{ŒêŠÂ‹«‚È‚ç•ÏŠ·ƒe[ƒuƒ‹‚ðƒZƒbƒg -----
-if($ENV{'HTTP_ACCEPT_LANGUAGE'}=~/^ja/){
- my(%tmp)=(
- 'Account \[(.+)\] is successfully created.*'
- => 'ƒAƒJƒEƒ“ƒg "$1" ‚ð쬂µ‚Ü‚µ‚½.',
- 'Account \[(.+)\] creation failed\. same account exists.*'
- => 'ƒAƒJƒEƒ“ƒg "$1" ‚ÍŠù‚É‘¶Ý‚µ‚Ü‚·.',
- 'Illeagal charactor found in UserID.*'
- => 'ID‚Ì’†‚É•s³‚È•¶Žš‚ª‚ ‚è‚Ü‚·.',
- 'Illeagal charactor found in Password.*'
- => 'Password‚Ì’†‚É•s³‚È•¶Žš‚ª‚ ‚è‚Ü‚·.',
- 'input UserID 4-24 bytes.'
- => 'ID‚Í”¼Šp4`24•¶Žš‚Å“ü—Í‚µ‚Ä‚­‚¾‚³‚¢.',
- 'input Password 4-24 bytes.'
- => 'Password‚Í”¼Šp4`24•¶Žš‚Å“ü—Í‚µ‚Ä‚­‚¾‚³‚¢.',
- 'Illeagal gender.*'
- => '«•Ê‚ª‚¨‚©‚µ‚¢‚Å‚·.',
- 'Cant connect to login server.*'
- => 'ƒƒOƒCƒ“ƒT[ƒo[‚ÉÚ‘±‚Å‚«‚Ü‚¹‚ñ.',
- 'login error.*'
- => 'ƒƒOƒCƒ“ƒT[ƒo[‚Ö‚ÌŠÇ—ŽÒŒ ŒÀƒƒOƒCƒ“‚ÉŽ¸”s‚µ‚Ü‚µ‚½',
- "Can't execute ladmin.*"
- => 'ladmin‚ÌŽÀs‚ÉŽ¸”s‚µ‚Ü‚µ‚½',
- 'UserID "(.+)" is already used.*'
- => 'ID "$1" ‚ÍŠù‚ÉŽg—p‚³‚ê‚Ä‚¢‚Ü‚·.',
- 'You can use UserID \"(.+)\".*'
- => 'ID "$1" ‚ÍŽg—p‰Â”\‚Å‚·.',
-
- 'account making' =>'ƒAƒJƒEƒ“ƒgì¬',
- '\>UserID' =>'>‚h‚c',
- '\>Password' =>'>ƒpƒXƒ[ƒh',
- '\>Gender' =>'>«•Ê',
- '\>Male' =>'>’j«',
- '\>Female' =>'>—«',
- '\"Make Account\"' =>'"ƒAƒJƒEƒ“ƒgì¬"',
- '\"Check UserID\"' =>'"ID‚̃`ƒFƒbƒN"',
- );
- map { $langconv{$_}=$tmp{$_}; } keys (%tmp);
-}
-
-# ----- ’ljÁ -----
-if( $cgi->param("addaccount") ){
- my($userid)= $cgi->param("userid");
- my($passwd)= $cgi->param("passwd");
- my($gender)= lc(substr($cgi->param("gender"),0,1));
- if(length($userid)<4 || length($userid)>24){
- HttpError("input UserID 4-24 bytes.");
- }
- if(length($passwd)<4 || length($passwd)>24){
- HttpError("input Password 4-24 bytes.");
- }
- if($userid=~/[^0-9A-Za-z\@\_\-\']/){
- HttpError("Illeagal charactor found in UserID.");
- }
- if($passwd=~/[\x00-\x1f\x80-\xff\']/){
- HttpError("Illeagal charactor found in Password.");
- }
- if($gender!~/[mf]/){
- HttpError("Gender error.");
- }
- open PIPE,"$perl $ladmin --add $userid $gender $passwd |"
- or HttpError("Can't execute ladmin.");
- my(@msg)=<PIPE>;
- close PIPE;
- HttpMsg(@msg);
-}
-# ----- ‘¶Ýƒ`ƒFƒbƒN -----
-elsif( $cgi->param("check") ){
- my($userid)= $cgi->param("userid");
- if(length($userid)<4 || length($userid)>24){
- HttpError("input UserID 4-24 bytes.");
- }
- if($userid=~/[^0-9A-Za-z\@\_\-\']/){
- HttpError("Illeagal charactor found in UserID.");
- }
- open PIPE,"$perl $ladmin --search --regex \\b$userid\\b |"
- or HttpError("Can't execute ladmin.");
- my(@msg)=<PIPE>;
- close PIPE;
- if(scalar(@msg)==6 && (split /[\s\0]+/,substr($msg[4],11,24))[0] eq $userid){
- HttpMsg("NG : UserID \"$userid\" is already used.");
- }elsif(scalar(@msg)==5){
- HttpMsg("OK : You can use UserID \"$userid\"");
- }
- HttpError("ladmin error ?\n---output---\n",@msg);
-}
-
-# ----- ƒtƒH[ƒ€ -----
-else{
- print LangConv( <<"EOM" );
-Content-type: text/html\n
-<html>
- <head>
- <title>Athena account making cgi</title>
- </head>
- <body>
- <h1>Athena account making cgi</h1>
- <form action="$cgiuri" method="post">
- <table border=2>
- <tr>
- <th>UserID</th>
- <td><input name="userid" size=24 maxlength=24></td>
- </tr>
- <tr>
- <th>Password</th>
- <td><input name="passwd" size=24 maxlength=24 type="password"></td>
- </tr>
- <tr>
- <th>Gender</th>
- <td>
- <input type="radio" name="gender" value="male">Male
- <input type="radio" name="gender" value="female">Female
- </td>
- </tr>
- <tr>
- <td colspan=2>
- <input type="submit" name="addaccount" value="Make Account">
- <input type="submit" name="check" value="Check UserID">
- </td>
- </tr>
- </table>
- </form>
- </body>
-</html>
-EOM
- exit;
-}
-
-sub LangConv {
- my(@lst)= @_;
- my($a,$b,@out)=();
- foreach $a(@lst){
- foreach $b(keys %langconv){
- $a=~s/$b/$langconv{$b}/g;
- my($rep1)=$1;
- $a=~s/\$1/$rep1/g;
- }
- push @out,$a;
- }
- return @out;
-}
-
-sub HttpMsg {
- my($msg)=join("", LangConv(@_));
- $msg=~s/\n/<br>\n/g;
- print LangConv("Content-type: text/html\n\n"),$msg;
- exit;
-}
-
-sub HttpError {
- my($msg)=join("", LangConv(@_));
- $msg=~s/\n/<br>\n/g;
- print LangConv("Content-type: text/html\n\n"),$msg;
- exit;
-}
-
diff --git a/src/tool/checkversion b/src/tool/checkversion
deleted file mode 100644
index 9e485d9a3..000000000
--- a/src/tool/checkversion
+++ /dev/null
@@ -1,85 +0,0 @@
-#!/usr/bin/perl -w
-
-##########################################################################
-# INFORMATION TOOL ABOUT THE SERVERS VERSION OF ATHENA
-#
-# By connection on a server, this software display the version of the
-# designed server.
-#-------------------------------------------------------------------------
-# Usages:
-# ./checkversion IP:port
-# ./checkversion IP port
-# perl checkversion IP:port
-# perl checkversion IP port
-#
-# note: default port: 6900
-#
-# When successfull, the software return the value 0.
-#
-##########################################################################
-
-#------------------------- start of configuration ------------------------
-
-$connecttimeout = 10; # Connection Timeout (in seconds)
-
-#-------------------------- End of configuration -------------------------
-
-use IO::Socket;
-
-unless($ARGV[0]) {
- print "USAGE: $0 server_ip:port\n";
- exit(1);
-}
-
-$server = $ARGV[0];
-$port = $ARGV[1];
-$port = $1 if ($server =~ s/:(\d+)//);
-$port ||= 6900;
-
-# Connection to the server
-my($so,$er) = ();
-eval{
- $so = IO::Socket::INET->new(
- PeerAddr=> $server,
- PeerPort=> $port,
- Proto => "tcp",
- Timeout => $connecttimeout) or $er = 1;
-};
-
-if($er || $@) {
- print "Can't not connect to server [$server:$port] !\n";
- exit(2);
-}
-
-# Request for the server version
-print $so pack("v",30000); # 0x7530
-$so->flush();
-
-# Receiving of the answer of the server
-if (read($so,$buf,10) < 10) {
- print "Invalid answer. It isn't an athena server or it is a too old version.\n";
- exit(5);
-}
-
-# Sending end of connection to the server
-print $so pack("v",30002); # 0x7532
-$so->flush();
-
-# Analyse of the answer
-my($ret,$maver,$miver,$rev,$dev,$mod,$type,$mdver) = unpack("v c6 v",$buf);
-
-if ($ret != 30001) { # 0x7531
- print "Invalid answer. It isn't an athena server or it is a too old version.\n";
- exit(6);
-}
-
-my(@stype) = ();
-foreach $i(0..3) {
- push @stype,(("login","char","inter","map")[$i]) if( $type & (1<<$i) );
-}
-print " ".join("/",@stype)." server [$server:$port].\n";
-printf " Athena version %s-%d.%d", ("stable","dev")[$dev], $maver,$miver;
-printf " revision %d",$rev if $rev;
-printf "%s%d\n",("","-mod")[$mod],$mdver;
-
-exit(0);
diff --git a/src/tool/convert.c b/src/tool/convert.c
deleted file mode 100644
index 16631c945..000000000
--- a/src/tool/convert.c
+++ /dev/null
@@ -1,296 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-#define RETCODE "\r\n"
-
-#define MAX_INVENTORY 100
-#define MAX_CART 100
-#define MAX_SKILL 350
-#define GLOBAL_REG_NUM 16
-
-struct item {
- int id;
- short nameid;
- short amount;
- short equip;
- char identify;
- char refine;
- char attribute;
- short card[4];
-};
-struct point{
- char map[16];
- short x,y;
-};
-struct skill {
- unsigned short id,lv,flag;
-};
-struct global_reg {
- char str[16];
- int value;
-};
-
-struct mmo_charstatus {
- int char_id;
- int account_id;
- int base_exp,job_exp,zeny;
-
- short class;
- short status_point,skill_point;
- short hp,max_hp,sp,max_sp;
- short option,karma,manner;
- short hair,hair_color,clothes_color;
- int party_id,guild_id,pet_id;
-
- short weapon,shield;
- short head_top,head_mid,head_bottom;
-
- char name[24];
- unsigned char base_level,job_level;
- unsigned char str,agi,vit,int_,dex,luk,char_num,sex;
-
- struct point last_point,save_point,memo_point[3];
- struct item inventory[MAX_INVENTORY],cart[MAX_CART];
- struct skill skill[MAX_SKILL];
- int global_reg_num;
- struct global_reg global_reg[GLOBAL_REG_NUM];
-};
-
-int mmo_char_tostr(char *str,struct mmo_charstatus *p)
-{
- int i;
- sprintf(str,"%d\t%d,%d\t%s\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
- "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
- "\t%s,%d,%d\t%s,%d,%d",
- p->char_id,p->account_id,p->char_num,p->name, //
- p->class,p->base_level,p->job_level,
- p->base_exp,p->job_exp,p->zeny,
- p->hp,p->max_hp,p->sp,p->max_sp,
- p->str,p->agi,p->vit,p->int_,p->dex,p->luk,
- p->status_point,p->skill_point,
- p->option,p->karma,p->manner, //
- p->party_id,p->guild_id,p->pet_id,
- p->hair,p->hair_color,p->clothes_color,
- p->weapon,p->shield,p->head_top,p->head_mid,p->head_bottom,
- p->last_point.map,p->last_point.x,p->last_point.y, //
- p->save_point.map,p->save_point.x,p->save_point.y
- );
- strcat(str,"\t");
- for(i=0;i<3;i++)
- if(p->memo_point[i].map[0]){
- sprintf(str+strlen(str),"%s,%d,%d",p->memo_point[i].map,p->memo_point[i].x,p->memo_point[i].y);
- }
- strcat(str,"\t");
- for(i=0;i<MAX_INVENTORY;i++)
- if(p->inventory[i].nameid){
- sprintf(str+strlen(str),"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ",
- p->inventory[i].id,p->inventory[i].nameid,p->inventory[i].amount,p->inventory[i].equip,
- p->inventory[i].identify,p->inventory[i].refine,p->inventory[i].attribute,
- p->inventory[i].card[0],p->inventory[i].card[1],p->inventory[i].card[2],p->inventory[i].card[3]);
- }
- strcat(str,"\t");
- for(i=0;i<MAX_CART;i++)
- if(p->cart[i].nameid){
- sprintf(str+strlen(str),"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ",
- p->cart[i].id,p->cart[i].nameid,p->cart[i].amount,p->cart[i].equip,
- p->cart[i].identify,p->cart[i].refine,p->cart[i].attribute,
- p->cart[i].card[0],p->cart[i].card[1],p->cart[i].card[2],p->cart[i].card[3]);
- }
- strcat(str,"\t");
- for(i=0;i<MAX_SKILL;i++)
- if(p->skill[i].id){
- sprintf(str+strlen(str),"%d,%d ",p->skill[i].id,p->skill[i].lv);
- }
- strcat(str,"\t");
- for(i=0;i<p->global_reg_num;i++)
- sprintf(str+strlen(str),"%s,%d ",p->global_reg[i].str,p->global_reg[i].value);
- strcat(str,"\t");
- return 0;
-}
-
-int mmo_char_fromstr(char *str,struct mmo_charstatus *p)
-{
- int tmp_int[256];
- int set,next,len,i;
-
- set=sscanf(str,"%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
- "\t%d,%d,%d\t%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
- "\t%[^,],%d,%d\t%[^,],%d,%d%n",
- &tmp_int[0],&tmp_int[1],&tmp_int[2],p->name, //
- &tmp_int[3],&tmp_int[4],&tmp_int[5],
- &tmp_int[6],&tmp_int[7],&tmp_int[8],
- &tmp_int[9],&tmp_int[10],&tmp_int[11],&tmp_int[12],
- &tmp_int[13],&tmp_int[14],&tmp_int[15],&tmp_int[16],&tmp_int[17],&tmp_int[18],
- &tmp_int[19],&tmp_int[20],
- &tmp_int[21],&tmp_int[22],&tmp_int[23], //
- &tmp_int[24],&tmp_int[25],
- &tmp_int[26],&tmp_int[27],&tmp_int[28],
- &tmp_int[29],&tmp_int[30],&tmp_int[31],&tmp_int[32],&tmp_int[33],
- p->last_point.map,&tmp_int[34],&tmp_int[35], //
- p->save_point.map,&tmp_int[36],&tmp_int[37],&next
- );
- p->char_id=tmp_int[0];
- p->account_id=tmp_int[1];
- p->char_num=tmp_int[2];
- p->class=tmp_int[3];
- p->base_level=tmp_int[4];
- p->job_level=tmp_int[5];
- p->base_exp=tmp_int[6];
- p->job_exp=tmp_int[7];
- p->zeny=tmp_int[8];
- p->hp=tmp_int[9];
- p->max_hp=tmp_int[10];
- p->sp=tmp_int[11];
- p->max_sp=tmp_int[12];
- p->str=tmp_int[13];
- p->agi=tmp_int[14];
- p->vit=tmp_int[15];
- p->int_=tmp_int[16];
- p->dex=tmp_int[17];
- p->luk=tmp_int[18];
- p->status_point=tmp_int[19];
- p->skill_point=tmp_int[20];
- p->option=tmp_int[21];
- p->karma=tmp_int[22];
- p->manner=tmp_int[23];
- p->party_id=tmp_int[24];
- p->guild_id=tmp_int[25];
- p->pet_id=0;
- p->hair=tmp_int[26];
- p->hair_color=tmp_int[27];
- p->clothes_color=tmp_int[28];
- p->weapon=tmp_int[29];
- p->shield=tmp_int[30];
- p->head_top=tmp_int[31];
- p->head_mid=tmp_int[32];
- p->head_bottom=tmp_int[33];
- p->last_point.x=tmp_int[34];
- p->last_point.y=tmp_int[35];
- p->save_point.x=tmp_int[36];
- p->save_point.y=tmp_int[37];
- if(set!=41)
- return 0;
- if(str[next]=='\n' || str[next]=='\r')
- return 1; // V‹Kƒf[ƒ^
- next++;
- for(i=0;str[next] && str[next]!='\t';i++){
- set=sscanf(str+next,"%[^,],%d,%d%n",p->memo_point[i].map,&tmp_int[0],&tmp_int[1],&len);
- if(set!=3)
- return 0;
- p->memo_point[i].x=tmp_int[0];
- p->memo_point[i].y=tmp_int[1];
- next+=len;
- if(str[next]==' ')
- next++;
- }
- next++;
- for(i=0;str[next] && str[next]!='\t';i++){
- set=sscanf(str+next,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
- &tmp_int[0],&tmp_int[1],&tmp_int[2],&tmp_int[3],
- &tmp_int[4],&tmp_int[5],&tmp_int[6],
- &tmp_int[7],&tmp_int[8],&tmp_int[9],&tmp_int[10],&len);
- if(set!=11)
- return 0;
- p->inventory[i].id=tmp_int[0];
- p->inventory[i].nameid=tmp_int[1];
- p->inventory[i].amount=tmp_int[2];
- p->inventory[i].equip=tmp_int[3];
- p->inventory[i].identify=tmp_int[4];
- p->inventory[i].refine=tmp_int[5];
- p->inventory[i].attribute=tmp_int[6];
- p->inventory[i].card[0]=tmp_int[7];
- p->inventory[i].card[1]=tmp_int[8];
- p->inventory[i].card[2]=tmp_int[9];
- p->inventory[i].card[3]=tmp_int[10];
- next+=len;
- if(str[next]==' ')
- next++;
- }
- next++;
- for(i=0;str[next] && str[next]!='\t';i++){
- set=sscanf(str+next,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
- &tmp_int[0],&tmp_int[1],&tmp_int[2],&tmp_int[3],
- &tmp_int[4],&tmp_int[5],&tmp_int[6],
- &tmp_int[7],&tmp_int[8],&tmp_int[9],&tmp_int[10],&len);
- if(set!=11)
- return 0;
- p->cart[i].id=tmp_int[0];
- p->cart[i].nameid=tmp_int[1];
- p->cart[i].amount=tmp_int[2];
- p->cart[i].equip=tmp_int[3];
- p->cart[i].identify=tmp_int[4];
- p->cart[i].refine=tmp_int[5];
- p->cart[i].attribute=tmp_int[6];
- p->cart[i].card[0]=tmp_int[7];
- p->cart[i].card[1]=tmp_int[8];
- p->cart[i].card[2]=tmp_int[9];
- p->cart[i].card[3]=tmp_int[10];
- next+=len;
- if(str[next]==' ')
- next++;
- }
- next++;
- for(i=0;str[next] && str[next]!='\t';i++){
- set=sscanf(str+next,"%d,%d%n",
- &tmp_int[0],&tmp_int[1],&len);
- if(set!=2)
- return 0;
- p->skill[tmp_int[0]].id=tmp_int[0];
- p->skill[tmp_int[0]].lv=tmp_int[1];
- next+=len;
- if(str[next]==' ')
- next++;
- }
- next++;
- for(i=0;str[next] && str[next]!='\t' && str[next]!='\n' && str[next]!='\r';i++){ //global_regŽÀ‘•ˆÈ‘O‚Ìathena.txtŒÝŠ·‚Ì‚½‚߈ꉞ'\n'ƒ`ƒFƒbƒN
- set=sscanf(str+next,"%[^,],%d%n",
- p->global_reg[i].str,&p->global_reg[i].value,&len);
- if(set!=2)
- return 0;
- next+=len;
- if(str[next]==' ')
- next++;
- }
- p->global_reg_num=i;
- return 1;
-}
-
-int mmo_char_convert(char *fname1,char *fname2)
-{
- char line[65536];
- int ret;
- struct mmo_charstatus char_dat;
- FILE *ifp,*ofp;
-
- ifp=fopen(fname1,"r");
- ofp=fopen(fname2,"w");
- if(ifp==NULL) {
- printf("file not found %s\n",fname1);
- return 0;
- }
- if(ofp==NULL) {
- printf("file open error %s\n",fname2);
- return 0;
- }
- while(fgets(line,65535,ifp)){
- memset(&char_dat,0,sizeof(struct mmo_charstatus));
- ret=mmo_char_fromstr(line,&char_dat);
- if(ret){
- mmo_char_tostr(line,&char_dat);
- fprintf(ofp,"%s" RETCODE,line);
- }
- }
- fcloseall();
- return 0;
-}
-
-int main(int argc,char *argv[])
-{
- if(argc < 3) {
- printf("Usage: convert <input filename> <output filename>\n");
- exit(0);
- }
- mmo_char_convert(argv[1],argv[2]);
-
- return 0;
-}
diff --git a/src/tool/getlogincount b/src/tool/getlogincount
deleted file mode 100644
index 45c6f81f6..000000000
--- a/src/tool/getlogincount
+++ /dev/null
@@ -1,122 +0,0 @@
-#!/usr/bin/perl -w
-
-##########################################################################
-# INFORMATION TOOL ABOUT THE # OF ONLINE PLAYERS ON ATHENA SERVERS
-#
-# By connection on the athena login-server, this software displays the
-# number of online players.
-#
-#-------------------------------------------------------------------------
-# Software usage:
-# Configure the IP, the port and a valid account of the server.
-# After, use at your choice:
-# ./getlogincount - display the number of online players on all servers.
-# ./getlogincount --premier or
-# ./getlogincount --first -- display the number of online players of the
-# first server in the received list.
-# ./getlogincount [servername] -- display the number of online players
-# of the specified server.
-#
-# If successfull, the software return the value 0.
-#
-##########################################################################
-
-#------------------------------ CONFIGURATION ----------------------------
-
-$loginserverip = "127.0.0.1"; # IP of the login-server
-$loginserverport = 6900; # port of the login-server
-$loginaccount = "s1"; # a valid account name
-$loginpasswd = "p1"; # the password of the valid account name
-
-$connecttimeout = 10; # Connection timeout (in seconds)
-
-#-------------------------------------------------------------------------
-
-use IO::Socket;
-
-my($sname) = $ARGV[0];
-if (!defined($sname)) {
- $sname = "";
-}
-
-# Connection to the login-server
-my($so,$er) = ();
-eval{
- $so = IO::Socket::INET->new(
- PeerAddr=> $loginserverip,
- PeerPort=> $loginserverport,
- Proto => "tcp",
- Timeout => $connecttimeout) or $er=1;
-};
-if($er || $@){
- print "Can't not connect to the login-server [${loginserverip}:$loginserverport] !\n";
- exit(2);
-}
-
-# Request to connect on login-server
-print $so pack("v V a24 a24 C",0x0064,9,$loginaccount,$loginpasswd,3);
-$so->flush();
-
-# Fail to connect
-if(unpack("v", &soread(\$so,2)) != 0x0069) {
- print "Login error.\n";
- exit(3);
-}
-
-# Get length of the received packet
-my($plen) = unpack("v",&soread(\$so,2))-4;
-
-# Suppress information of the account (we need only information about the servers)
-&soread(\$so,43);
-$plen -= 43;
-
-# Check about the number of online servers
-if ($plen < 32) {
- printf "No server is connected to login-server.\n";
- exit(1);
-}
-
-# Read information of the servers
-my(@slist) = ();
-for(;$plen > 0;$plen -= 32) {
- my($name,$count) = unpack("x6 a20 V",&soread(\$so,32));
- $name = substr($name,0,index($name,"\0"));
- push @slist, [ $name, $count ];
-}
-
-# Display the result
-if($sname eq "--first" || $sname eq "--premier") { # If we ask only for the first server
- printf "%-20s : %5d\n",$slist[0][0],$slist[0][1];
-} elsif ($sname eq "") { # If we ask for all servers
- foreach $i(@slist) {
- printf "%-20s : %5d\n",$i->[0],$i->[1];
- }
-} else { # If we ask for a specified server (by its name)
- my($flag) = 1;
- foreach $i(@slist) {
- if($i->[0] eq $sname) {
- printf "%-20s : %5d\n",$i->[0],$i->[1];
- $flag = 0;
- }
- }
- if($flag) { # If the server doesn't exist
- printf "The server [$sname] doesn't exist.\n";
- exit(1);
- }
-}
-
-# End of the software
-$so->shutdown(2);
-$so->close();
-exit(0);
-
-# Sub-function: get data from the socket
-sub soread {
- my($so,$len) = @_;
- my($sobuf);
- if(read($$so,$sobuf,$len) < $len) {
- print "Socket read error.\n";
- exit(5);
- }
- return $sobuf;
-};
diff --git a/src/tool/ladmin b/src/tool/ladmin
deleted file mode 100644
index d0c0be485..000000000
--- a/src/tool/ladmin
+++ /dev/null
@@ -1,3793 +0,0 @@
-#!/usr/bin/perl
-use POSIX;
-##########################################################################
-# EAthena login-server remote administration tool
-# New ladamin by [Yor]
-##########################################################################
-#-------------------------------INSTRUCTIONS------------------------------
-# Set the 4 variables below:
-# IP of the login server.
-# Port where the login-server listens incoming packets.
-# Password of administration (same of config_athena.conf).
-# Displayed language of the sofware (if not correct, english is used).
-# IMPORTANT:
-# Be sure that you authorize remote administration in login-server
-# (see login_athena.conf, 'admin_state' parameter)
-#-------------------------------------------------------------------------
-my($loginserverip) = "127.0.0.1"; # IP of login-server
-my($loginserverport) = 6900; # Port of login-server
-my($loginserveradminpassword) = "admin"; # Administration password
-my($connecttimeout) = 10; # Timeout of connection (in seconds)
-my($passenc) = 2; # Encoding type of the password
-my($defaultlanguage) = "E"; # Default language (F: Français/E: English)
- # (if it's not 'F', default is English)
-
-#-------------------------------------------------------------------------
-# LIST of COMMANDs that you can type at the prompt:
-# To use these commands you can only type only the first letters.
-# You must type a minimum of letters (you can not type 'a',
-# because ladmin doesn't know if it's for 'aide' or for 'add')
-# <Example> q <= quit, li <= list, pass <= passwd, etc.
-#
-# Note: every time you must give a account_name, you can use "" or '' (spaces can be included)
-#
-# aide/help/?
-# Display the description of the commands
-# aide/help/? [command]
-# Display the description of the specified command
-#
-# add <account_name> <sex> <password>
-# Create an account with the default email (a@a.com).
-# Concerning the sex, only the first letter is used (F or M).
-# The e-mail is set to a@a.com (default e-mail). It's like to have no e-mail.
-# When the password is omitted, the input is done without displaying of the pressed keys.
-# <example> add testname Male testpass
-#
-# ban/banish yyyy/mm/dd hh:mm:ss <account name>
-# Changes the final date of a banishment of an account.
-# Same command of banset, except that account_name is at end
-#
-# banadd <account_name> <modifier>
-# Adds or substracts time from the final date of a banishment of an account.
-# Modifier is done as follows:
-# Adjustment value (-1, 1, +1, etc...)
-# Modified element:
-# a or y: year
-# m: month
-# j or d: day
-# h: hour
-# mn: minute
-# s: second
-# <example> banadd testname +1m-2mn1s-6y
-# this example adds 1 month and 1 second, and substracts 2 minutes and 6 years at the same time.
-# NOTE: If you modify the final date of a non-banished account,
-# you fix the final date to (actual time +- adjustments)
-#
-# banset <account_name> yyyy/mm/dd [hh:mm:ss]
-# Changes the final date of a banishment of an account.
-# Default time: 23:59:59
-# banset <account_name> 0
-# Set a non-banished account (0 = unbanished).
-#
-# block <account name>
-# Set state 5 (You have been blocked by the GM Team) to an account.
-# Same command of state <account_name> 5.
-#
-# check <account_name> <password>
-# Check the validity of a password for an account
-# NOTE: Server will never sends back a password.
-# It's the only method you have to know if a password is correct.
-# The other method is to have a ('physical') access to the accounts file.
-#
-# create <account_name> <sex> <email> <password>
-# Like the 'add' command, but with e-mail moreover.
-# <example> create testname Male my@mail.com testpass
-#
-# del <account name>
-# Remove an account.
-# This order requires confirmation. After confirmation, the account is deleted.
-#
-# email <account_name> <email>
-# Modify the e-mail of an account.
-#
-# getcount
-# Give the number of players online on all char-servers.
-#
-# gm <account_name> [GM_level]
-# Modify the GM level of an account.
-# Default value remove GM level (GM level = 0).
-# <example> gm testname 80
-#
-# id <account name>
-# Give the id of an account.
-#
-# info <account_id>
-# Display complete information of an account.
-#
-# kami <message>
-# Sends a broadcast message on all map-server (in yellow).
-# kamib <message>
-# Sends a broadcast message on all map-server (in blue).
-#
-# language <language>
-# Change the language of displaying.
-#
-# list/ls [start_id [end_id]]
-# Display a list of accounts.
-# 'start_id', 'end_id': indicate end and start identifiers.
-# Research by name is not possible with this command.
-# <example> list 10 9999999
-#
-# listBan/lsBan [start_id [end_id]]
-# Like list/ls, but only for accounts with state or banished
-#
-# listGM/lsGM [start_id [end_id]]
-# Like list/ls, but only for GM accounts
-#
-# listOK/lsOK [start_id [end_id]]
-# Like list/ls, but only for accounts without state and not banished
-#
-# memo <account_name> <memo>
-# Modify the memo of an account.
-# 'memo': it can have until 253 characters (with spaces or not).
-#
-# name <account_id>
-# Give the name of an account.
-#
-# passwd <account_name> <new_password>
-# Change the password of an account.
-# When new password is omitted, the input is done without displaying of the pressed keys.
-#
-# quit/end/exit
-# End of the program of administration
-#
-# reloadGM
-# Reload GM configuration file
-#
-# search <expression>
-# Seek accounts.
-# Displays the accounts whose names correspond.
-# search -r/-e/--expr/--regex <expression>
-# Seek accounts by regular expression.
-# Displays the accounts whose names correspond.
-#
-# sex <account_name> <sex>
-# Modify the sex of an account.
-# <example> sex testname Male
-#
-# state <account_name> <new_state> <error_message_#7>
-# Change the state of an account.
-# 'new_state': state is the state of the packet 0x006a + 1. The possibilities are:
-# 0 = Account ok 6 = Your Game's EXE file is not the latest version
-# 1 = Unregistered ID 7 = You are Prohibited to log in until %s
-# 2 = Incorrect Password 8 = Server is jammed due to over populated
-# 3 = This ID is expired 9 = No MSG
-# 4 = Rejected from Server 100 = This ID has been totally erased
-# 5 = You have been blocked by the GM Team
-# all other values are 'No MSG', then use state 9 please.
-# 'error_message_#7': message of the code error 6 = Your are Prohibited to log in until %s (packet 0x006a)
-#
-# timeadd <account_name> <modifier>
-# Adds or substracts time from the validity limit of an account.
-# Modifier is done as follows:
-# Adjustment value (-1, 1, +1, etc...)
-# Modified element:
-# a or y: year
-# m: month
-# j or d: day
-# h: hour
-# mn: minute
-# s: second
-# <example> timeadd testname +1m-2mn1s-6y
-# this example adds 1 month and 1 second, and substracts 2 minutes and 6 years at the same time.
-# NOTE: You can not modify a unlimited validity limit.
-# If you want modify it, you want probably create a limited validity limit.
-# So, at first, you must set the validity limit to a date/time.
-#
-# timeset <account_name> yyyy/mm/dd [hh:mm:ss]
-# Changes the validity limit of an account.
-# Default time: 23:59:59
-# timeset <account_name> 0
-# Gives an unlimited validity limit (0 = unlimited).
-#
-# unban/unbanish <account name>
-# Unban an account.
-# Same command of banset 0.
-#
-# unblock <account name>
-# Set state 0 (Account ok) to an account.
-# Same command of state <account_name> 0.
-#
-# version
-# Display the version of the login-server.
-#
-# who <account name>
-# Displays complete information of an account.
-#
-#-------------------------------------------------------------------------
-# Possibilities to execute ladmin in command line by usage of the software with a parameter:
-# ./ladmin --mode param1 ...
-#
-# --makesymlink -- Create the symbolic links for a use in shell
-# --add <account_name> <sex> <password> -- Create an account with the default email (or -a)
-# --ban yyyy/mm/dd hh:mm:ss <account_name> -- Change the final date of a banishment of an account (or -b)
-# --banadd <account_name> <modifier> -- Add or substract time from the final date of a banishment of an account (or - ba)
-# --banset <account_name> yyyy/mm/dd [hh:mm:ss] -- Change the final date of a banishment of an account (or -bs)
-# --banset <account_name> 0 -- Unbanish an account (or -bs)
-# --block <account_name> -- Set state 5 to an account (or -bl)
-# --check <account_name> <password> -- Check the validity of a password for an account (or -check)
-# --create <account_name> <sex> <email> <password> -- Create an account with email (or -c)
-# --del <account_name> -- Remove an account (or -d)
-# --email <account_name> <email> -- Modify an email of an account (or -e)
-# --getcount -- Give the number of players online on all char-servers (or -g)
-# --gm <account_name> <GM_level> -- Change the GM level of an account (or -gm)
-# --id <account_name> -- Give the id of an account (or -i)
-# --info <account_id> -- Display complete information of an account (or -info)
-# --kami <message> -- Sends a broadcast message on all map-server (in yellow).
-# --kamib <message> -- Sends a broadcast message on all map-server (in blue).
-# --language <language> -- Change the language of displaying (-lang).
-# --list [First_id [Last_id]] -- Display a list of accounts (or -l)
-# --listBan [start_id [end_id]] -- Display a list of accounts with state or banished (or -lBan)
-# --listGM [First_id [Last_id]] -- Display a list of GM accounts (or -lGM)
-# --listOK [start_id [end_id]] -- Display a list of accounts without state and not banished (or -lOK)
-# --memo <account_name> <memo> -- Modify the memo of an account (or -e)
-# --name <account_id> -- Give the name of an account (or -n)
-# --passwd <account_name> <new_password> -- Change the password of an account (or -p)
-# --reloadGM -- Reload GM configuration file (or -r)
-# --search <expression> -- Seek accounts (or -s)
-# --search -e/-r/--expr/--regex <expression> -- Seek accounts by REGEX (or -s)
-# --sex <account_name> <sex> -- Change the sex of an account (or -sex)
-# --state <account_name> <new_state> <error_message_#7> -- Change the state of an account (or -t)
-# --timeadd <account_name> <modifier> -- Add or substract time from the validity limit of an account (or - ta)
-# --timeset <account_name> yyyy/mm/dd [hh:mm:ss] -- Change the validify limit of an account (or -ts)
-# --timeset <account_name> 0 -- Give a unlimited validity limit (or -ts)
-# --unban/unbanish <account_name> -- Unban an account (or -uba)
-# --unblock <account_name> -- Set state 0 to an account (or -ubl)
-# --version -- Display the version of the login-server (or -v)
-# --who <account_name> -- Display complete information of an account (or -w)
-#
-# <example> ./ladmin --addaccount testname Male testpass
-#
-#-------------------------------------------------------------------------
-# Possibilities to execute ladmin with symbolic links in Shell
-# To create the symbolic links, execute ladmin with the '-- makesymlink' option.
-#
-# addaccount <account_name> <sex> <password> -- Create an account with the default email
-# banaccount yyyy/mm/dd hh:mm:ss <account_name> -- Change the final date of a banishment of an account
-# banaddaccount <account_name> <modifier> -- Add or substract time from the final date of a banishment of an account
-# bansetaccount <account_name> yyyy/mm/dd [hh:mm:ss] -- Change the final date of a banishment of an account
-# bansetaccount <account_name> 0 -- Unbanish an account
-# blockaccount <account_name> -- Set state 5 (blocked by the GM Team) to an account
-# checkaccount <account_name> <password> -- Check the validity of a password for an account
-# createaccount <account_name> <sex> <email> <password> -- Create an account with email
-# delaccount <account_name> -- Remove an account
-# emailaccount <account_name> <email> -- Modify an email of an account
-# getcount -- Give the number of players online on all char-servers
-# gmaccount <account_name> <GM_level> -- Change the GM level of an account
-# idaccount <account_name> -- Give the id of an account
-# infoaccount <account_id> -- Display complete information of an account
-# kami <message> -- Sends a broadcast message on all map-server (in yellow).
-# kamib <message> -- Sends a broadcast message on all map-server (in blue).
-# ladminlanguage <language> -- Change the language of displaying.
-# listaccount [First_id [Last_id]] -- Display a list of accounts
-# listBanaccount [start_id [end_id]] -- Display a list of accounts with state or banished
-# listGMaccount [First_id [Last_id]] -- Display a list of GM accounts
-# listOKaccount [start_id [end_id]] -- Display a list of accounts without state and not banished
-# loginserverversion -- Display the version of the login-server
-# memoaccount <account_name> <memo> -- Modify the memo of an account
-# nameaccount <account_id> -- Give the name of an account
-# passwdaccount <account_name> <new_password> -- Change the password of an account
-# reloadGM -- Reload GM configuration file
-# searchaccount <expression> -- Seek accounts
-# searchaccount -e/-r/--expr/--regex <expression> -- Seek accounts by REGEX
-# sexaccount <account_name> <sex> -- Change the sex of an account (or -sex)
-# stateaccount <account_name> <new_state> <error_message_#7> -- Change the state of an account
-# timeaddaccount <account_name> <modifier> -- Add or substract time from the validity limit of an account
-# timesetaccount <account_name> yyyy/mm/dd [hh:mm:ss] -- Change the validify limit of an account
-# timesetaccount <account_name> 0 -- Give a unlimited validity limit
-# unbanaccount <account_name> -- Unban an account
-# unblockaccount <account_name> -- Set state 0 (Account ok) to an account
-# whoaccount <account_name> -- Display complete information of an account
-# <exemple> ./addaccount testname Male testpass
-#
-#-------------------------------------------------------------------------
-# About the encoding:
-#
-# The Digest::MD5 module is necessary to use the encrypted password system.
-# When the software cannot found the Digest::MD5 module,
-# encoding is automatically disabled ($passenc=0), which allows
-# to use this program in any cases.
-#
-#-------------------------------------------------------------------------
-# How to use ladmin with UNIX:
-#
-# You excecute ladmin as a standard command.
-# <Example of preparation to have an access to ladmin>
-# $ mv ladmin ladmin_org
-# $ nkf -eLu ladmin_org > ladmin
-# $ chmod 700 ladmin
-# <Example to start directly ladmin>
-# $ perl ladmin
-#
-##########################################################################
-
-
-use strict;
-use IO::Socket;
-use Term::ReadLine;
-eval { use POSIX qw(:termios_h); };
-eval { use Digest::MD5 qw(md5); } if $passenc;
-$passenc = 0 if($@);
-
-my($ver) = "1.00";
-
-# Start of termios
-my($termios, $orgterml, $termlecho, $termlnoecho) = ();
-eval{
- $termios = POSIX::Termios->new();
- $termios->getattr(fileno(STDIN));
- $orgterml = $termios->getlflag();
- $termlecho = ECHO | ECHOK | ICANON;
- $termlnoecho = $orgterml & ~$termlecho;
-};
-
-# Modification of termios for the displaying of passwords (no displays for pressed keys)
-sub cbreak() {
- if ($termios) {
- $termios->setlflag($termlnoecho);
- $termios->setcc(VTIME, 1);
- $termios->setattr(fileno(STDIN), TCSANOW);
- }
-}
-# Modification of termios to return at the normal displaying (after input of the passwords)
-sub cooked() {
- if ($termios) {
- $termios->setlflag($orgterml);
- $termios->setcc(VTIME,0);
- $termios->setattr(fileno(STDIN),TCSANOW);
- }
-}
-END{ cooked() }
-
-if ($defaultlanguage eq "F") {
- print "Outil d'administration à distance de eAthena V.$ver\n";
-} else {
- print "EAthena login-server administration tool V.$ver\n";
-}
-
-# Creation of the symbolic links for call of the program in line command of the shell
-if ($ARGV[0] eq "--makesymlink") {
- symlink $0, "loginserverversion";
- symlink $0, "addaccount";
- symlink $0, "banaccount";
- symlink $0, "banaddaccount";
- symlink $0, "bansetaccount";
- symlink $0, "blockaccount";
- symlink $0, "checkaccount";
- symlink $0, "createaccount";
- symlink $0, "delaccount";
- symlink $0, "emailaccount";
- symlink $0, "getcount";
- symlink $0, "gmaccount";
- symlink $0, "idaccount";
- symlink $0, "infoaccount";
- symlink $0, "kami";
- symlink $0, "kamib";
- symlink $0, "ladminlanguage";
- symlink $0, "listaccount";
- symlink $0, "listBanaccount";
- symlink $0, "listGMaccount";
- symlink $0, "listOKaccount";
- symlink $0, "memoaccount";
- symlink $0, "nameaccount";
- symlink $0, "passwdaccount";
- symlink $0, "reloadGM";
- symlink $0, "searchaccount";
- symlink $0, "sexaccount";
- symlink $0, "stateaccount";
- symlink $0, "timeaddaccount";
- symlink $0, "timesetaccount";
- symlink $0, "unbanaccount";
- symlink $0, "unblockaccount";
- symlink $0, "whoaccount";
- if ($defaultlanguage eq "F") {
- print "Liens symbliques créés.\n";
- } else {
- print "Symbolic links created.\n";
- }
- exit(0);
-}
-
-# Connection to the login-server
-my($so,$er) = ();
-eval{
- $so = IO::Socket::INET->new(
- PeerAddr=> $loginserverip,
- PeerPort=> $loginserverport,
-# Proto => "tcp",
- Timeout => $connecttimeout) or $er = 1;
-};
-if ($er || $@) {
- if ($defaultlanguage eq "F") {
- print "\nImpossible de se connecter au serveur de login [${loginserverip}:$loginserverport] !\n";
- } else {
- print "\nImpossible to have a connection with the login-server [${loginserverip}:$loginserverport] !\n";
- }
- print "$!\n"; # Displaying of the error
- exit(2);
-}
-
-# Sending the administration password
-if ($passenc == 0) {
- print $so pack("v2a24",0x7918,0,$loginserveradminpassword);
- $so->flush();
-} else {
- print $so pack("v",0x791a);
- $so->flush();
- my($buf) = readso(4);
- if (unpack("v",$buf) != 0x01dc) {
- if ($defaultlanguage eq "F") {
- print "Erreur au login (échec de la création de la clef md5).\n";
- } else {
- print "Error at login (failure of the md5 key creation).\n";
- }
- }
- $buf = readso(unpack("x2v",$buf)-4);
- my($md5bin) = md5(($passenc == 1) ? $buf.$loginserveradminpassword : $loginserveradminpassword.$buf);
- print $so pack("v2a16",0x7918,$passenc,$md5bin);
- $so->flush();
-}
-
-# Waiting of the server reply
-my($buf) = readso(3);
-
-if (unpack("v",$buf) != 0x7919 || unpack("x2c",$buf) != 0) {
- if ($defaultlanguage eq "F") {
- print "Erreur de login:\n";
- print " - mot de passe incorrect,\n";
- print " - système d'administration non activé, ou\n";
- print " - IP non autorisée.\n";
- } else {
- print "Error at login:\n";
- print " - incorrect password,\n";
- print " - administration system not activated, or\n";
- print " - unauthorised IP.\n";
- }
- quit();
- exit(4);
-}
-
-if ($defaultlanguage eq "F") {
- print "Connexion établie.\n";
-} else {
- print "Established connection.\n";
-}
-
-#-------------------------------------------------------------------------
-# Here are checked the command lines with arguments and symbolic links (no prompt)
-
-if ($0 =~ /addaccount$/ ||
- (($ARGV[0] eq "-a" || $ARGV[0] eq "--add") && ((shift @ARGV), 1))) {
- my($r) = addaccount($ARGV[0], $ARGV[1], $ARGV[2]);
- quit();
- exit($r);
-} elsif ($0 =~ /banaccount$/ || $0 =~ /banishaccount$/ ||
- (($ARGV[0] eq "-b" || $ARGV[0] eq "--ban" || $ARGV[0] eq "--banish") && ((shift @ARGV), 1))) {
- my($r) = bansetaccount($ARGV[1], $ARGV[2], $ARGV[0]);
- quit();
- exit($r);
-} elsif ($0 =~ /banaddaccount$/ ||
- (($ARGV[0] eq "-ba" || $ARGV[0] eq "--banadd") && ((shift @ARGV), 1))) {
- my($r) = banaddaccount($ARGV[0], $ARGV[1]);
- quit();
- exit($r);
-} elsif ($0 =~ /bansetaccount$/ ||
- (($ARGV[0] eq "-bs" || $ARGV[0] eq "--banset") && ((shift @ARGV), 1))) {
- my($r) = bansetaccount($ARGV[0], $ARGV[1], $ARGV[2]);
- quit();
- exit($r);
-} elsif ($0 =~ /blockaccount$/ ||
- (($ARGV[0] eq "-bl" || $ARGV[0] eq "--block") && ((shift @ARGV), 1))) {
- my($r) = changestate($ARGV[0], 5, "");
- quit();
- exit($r);
-} elsif ($0 =~ /checkaccount$/ ||
- (($ARGV[0] eq "-check" || $ARGV[0] eq "--check") && ((shift @ARGV), 1))) {
- my($r) = checkaccount($ARGV[0], $ARGV[1]);
- quit();
- exit($r);
-} elsif ($0 =~ /createaccount$/ ||
- (($ARGV[0] eq "-c" || $ARGV[0] eq "--create") && ((shift @ARGV), 1))) {
- my($r) = createaccount($ARGV[0], $ARGV[1], $ARGV[2], $ARGV[3]);
- quit();
- exit($r);
-} elsif ($0 =~ /delaccount$/ ||
- (($ARGV[0] eq "-d" || $ARGV[0] eq "--del") && ((shift @ARGV), 1))) {
- my($r) = delaccount($ARGV[0]);
- quit();
- exit($r);
-} elsif ($0 =~ /emailaccount$/ ||
- (($ARGV[0] eq "-e" || $ARGV[0] eq "--email") && ((shift @ARGV), 1))) {
- my($r) = changeemail($ARGV[0], $ARGV[1]);
- quit();
- exit($r);
-} elsif ($0 =~ /getcount$/ ||
- (($ARGV[0] eq "-g" || $ARGV[0] eq "--getcount") && ((shift @ARGV), 1))) {
- my($r) = getlogincount();
- quit();
- exit($r);
-} elsif ($0 =~ /gmaccount$/ ||
- (($ARGV[0] eq "-gm" || $ARGV[0] eq "--gm") && ((shift @ARGV), 1))) {
- my($r) = changegmlevel($ARGV[0], $ARGV[1]);
- quit();
- exit($r);
-} elsif ($0 =~ /id$/ ||
- (($ARGV[0] eq "-i" || $ARGV[0] eq "--id") && ((shift @ARGV), 1))) {
- my($r) = idaccount($ARGV[0]);
- quit();
- exit($r);
-} elsif ($0 =~ /infoaccount$/ ||
- (($ARGV[0] eq "-info" || $ARGV[0] eq "--info") && ((shift @ARGV), 1))) {
- my($r) = infoaccount($ARGV[0]);
- quit();
- exit($r);
-} elsif ($0 =~ /kami$/ ||
- (($ARGV[0] eq "-kami" || $ARGV[0] eq "--kami") && ((shift @ARGV), 1))) {
- my($r) = sendbroadcast(0, $ARGV[0]);
- quit();
- exit($r);
-} elsif ($0 =~ /kamib$/ ||
- (($ARGV[0] eq "-kamib" || $ARGV[0] eq "--kamib") && ((shift @ARGV), 1))) {
- my($r) = sendbroadcast(0x10, $ARGV[0]);
- quit();
- exit($r);
-} elsif ($0 =~ /ladminlanguage$/ ||
- (($ARGV[0] eq "-lang" || $ARGV[0] eq "--language") && ((shift @ARGV), 1))) {
- my($r) = changelanguage($ARGV[0]);
- quit();
- exit($r);
-} elsif ($0 =~ /listaccount$/ ||
- (($ARGV[0] eq "-l" || $ARGV[0] eq "--list") && ((shift @ARGV), 1))) {
- my($r) = listaccount(int($ARGV[0]), int($ARGV[1]), 0); # 0: to list all
- quit();
- exit($r);
-} elsif ($0 =~ /listBanaccount$/ ||
- (($ARGV[0] eq "-lBan" || $ARGV[0] eq "--listBan") && ((shift @ARGV), 1))) {
- my($r) = listaccount(int($ARGV[0]), int($ARGV[1]), 3); # 3: to list only accounts with state or banished
- quit();
- exit($r);
-} elsif ($0 =~ /listGMaccount$/ ||
- (($ARGV[0] eq "-lGM" || $ARGV[0] eq "--listGM") && ((shift @ARGV), 1))) {
- my($r) = listaccount(int($ARGV[0]), int($ARGV[1]), 1); # 1: to list only GM
- quit();
- exit($r);
-} elsif ($0 =~ /listOKaccount$/ ||
- (($ARGV[0] eq "-lOK" || $ARGV[0] eq "--listOK") && ((shift @ARGV), 1))) {
- my($r) = listaccount(int($ARGV[0]), int($ARGV[1]), 4); # 4: to list only accounts without state and not banished
- quit();
- exit($r);
-} elsif ($0 =~ /loginserverversion$/ ||
- (($ARGV[0] eq "-v" || $ARGV[0] eq "--version") && ((shift @ARGV), 1))) {
- my($r) = checkloginversion();
- quit();
- exit($r);
-} elsif ($0 =~ /memoaccount$/ ||
- (($ARGV[0] eq "-m" || $ARGV[0] eq "--memo") && ((shift @ARGV), 1))) {
- my($r) = changememo($ARGV[0], $ARGV[1]);
- quit();
- exit($r);
-} elsif ($0 =~ /nameaccount$/ ||
- (($ARGV[0] eq "-n" || $ARGV[0] eq "--name") && ((shift @ARGV), 1))) {
- my($r) = nameaccount(int($ARGV[0]));
- quit();
- exit($r);
-} elsif ($0 =~ /passwdaccount$/ ||
- (($ARGV[0] eq "-p" || $ARGV[0] eq "--passwd") && ((shift @ARGV), 1))) {
- my($r) = changepasswd($ARGV[0], $ARGV[1]);
- quit();
- exit($r);
-} elsif ($0 =~ /reloadGM$/ ||
- (($ARGV[0] eq "-r" || $ARGV[0] eq "--reloadGM") && ((shift @ARGV), 1))) {
- my($r) = reloadGM();
- quit();
- exit($r);
-} elsif ($0 =~ /searchaccount$/ ||
- (($ARGV[0] eq "-s" || $ARGV[0] eq "--search") && ((shift @ARGV), 1))) {
- my($r) = searchaccount($ARGV[0], $ARGV[1]);
- quit();
- exit($r);
-} elsif ($0 =~ /sexaccount$/ ||
- (($ARGV[0] eq "-sex" || $ARGV[0] eq "--sex") && ((shift @ARGV), 1))) {
- my($r) = changesex($ARGV[0], $ARGV[1]);
- quit();
- exit($r);
-} elsif ($0 =~ /stateaccount$/ ||
- (($ARGV[0] eq "-t" || $ARGV[0] eq "--state") && ((shift @ARGV), 1))) {
- my($r) = changestate($ARGV[0], $ARGV[1], $ARGV[2]);
- quit();
- exit($r);
-} elsif ($0 =~ /timeaddaccount$/ ||
- (($ARGV[0] eq "-ta" || $ARGV[0] eq "--timeadd") && ((shift @ARGV), 1))) {
- my($r) = timeaddaccount($ARGV[0], $ARGV[1]);
- quit();
- exit($r);
-} elsif ($0 =~ /timesetaccount$/ ||
- (($ARGV[0] eq "-ts" || $ARGV[0] eq "--timeset") && ((shift @ARGV), 1))) {
- my($r) = timesetaccount($ARGV[0], $ARGV[1], $ARGV[2]);
- quit();
- exit($r);
-} elsif ($0 =~ /unbanaccount$/ || $0 =~ /unbanishaccount$/ ||
- (($ARGV[0] eq "-uba" || $ARGV[0] eq "--unban" || $ARGV[0] eq "--unbanish") && ((shift @ARGV), 1))) {
- my($r) = bansetaccount($ARGV[0], 0, "");
- quit();
- exit($r);
-} elsif ($0 =~ /unblockaccount$/ ||
- (($ARGV[0] eq "-ubl" || $ARGV[0] eq "--unblock") && ((shift @ARGV), 1))) {
- my($r) = changestate($ARGV[0], 0, "");
- quit();
- exit($r);
-} elsif ($0 =~ /whoaccount$/ ||
- (($ARGV[0] eq "-w" || $ARGV[0] eq "--who") && ((shift @ARGV), 1))) {
- my($r) = whoaccount($ARGV[0]);
- quit();
- exit($r);
-}
-
-#-------------------------------------------------------------------------
-if ($defaultlanguage eq "F") {
- print "Lecture de la version du serveur de login...\n";
-} else {
- print "Reading of the version of the login-server...\n";
-}
-checkloginversion();
-
-# Set the prompt line
-my($term) = new Term::ReadLine "ladmin";
-
-# Here begin the infinite loop to read prompts
-while(1) {
- # Displaying of the prompt
- print "\n";
- if ($defaultlanguage eq "F") {
- printf "\033[32mPour afficher les commandes, tapez 'Entrée'.\033[0m\n";
- } else {
- printf "\033[32mTo list the commands, type 'enter'.\033[0m\n";
- }
- my($cmd) = $term->readline("ladmin> ");
- # split and recovery of the input
- chomp $cmd; # remove cariage return
- $cmd =~ s/\x1b\[\d*\w//g; # remove (esc)[(number)(1alpha) = screen control sequence
- $cmd =~ s/[\x00-\x1f]//g; # remove control char
- my($command, $parameters) = split /\s+/,$cmd,2; # extract command and parameters
- $command = lc($command); # command in lowercase
- my(@paramlist) = split /\s+/,$parameters; # get list of parameters
-
- if ($command eq "?" || $command eq "") {
- $command = "aide" if ($defaultlanguage eq "F");
- $command = "help" if ($defaultlanguage ne "F");
- }
-
- # Analyse of the command
- eval {
-# help
- if ("aide" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
- displayhelp("aide", $paramlist[0]);
- } elsif ("help" =~ /^\Q$command/) {
- displayhelp("help", $paramlist[0]);
-
-# general commands
- } elsif ("add" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(.*)/)) {
- addaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> <sex> <password>
- } elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
- addaccount($paramlist[0], $paramlist[1], ""); # <account_name> <sex> <password>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(.*)/)) {
- addaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> <sex> <password>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
- addaccount($paramlist[0], $paramlist[1], ""); # <account_name> <sex> <password>
- } else {
- @paramlist = split /\s+/,$parameters;
- addaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> <sex> <password>
- }
-
- } elsif ($command eq "ban" || ("banish" =~ /^\Q$command/ && length($command) >= 4)) {
- if (@paramlist = ($parameters =~ m/^(\S+)\s+(\S+)\s+"(.*)"/)) { # yyyy/mm/dd hh:mm:ss <account_name>
- bansetaccount($paramlist[2], $paramlist[0], $paramlist[1]); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } elsif (@paramlist = ($parameters =~ m/^(\S+)\s+(\S+)\s+'(.*)'/)) { # yyyy/mm/dd hh:mm:ss <account_name>
- bansetaccount($paramlist[2], $paramlist[0], $paramlist[1]); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } else {
- @paramlist = split /\s+/,$parameters,3; # yyyy/mm/dd hh:mm:ss <account_name>
- bansetaccount($paramlist[2], $paramlist[0], $paramlist[1]); # <account_name> yyyy/mm/dd [hh:mm:ss]
- }
-
- } elsif (("banadd" =~ /^\Q$command/ || $command eq "ba") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
- banaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
- banaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
- } else {
- @paramlist = split /\s+/,$parameters;
- banaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
- }
-
- } elsif (("banset" =~ /^\Q$command/ || $command eq "bs") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(\S+)/)) {
- bansetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
- bansetaccount($paramlist[0], $paramlist[1], "23:59:59"); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(\S+)/)) {
- bansetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
- bansetaccount($paramlist[0], $paramlist[1], "23:59:59"); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } else {
- @paramlist = split /\s+/,$parameters;
- bansetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
- }
-
- } elsif ("block" =~ /^\Q$command/ && length($command) >= 2) {
- if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
- changestate($paramlist[0], 5, ""); # <account_name> <new_state> <error_message_#7>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
- changestate($paramlist[0], 5, ""); # <account_name> <new_state> <error_message_#7>
- } else {
- @paramlist = split /\s+/,$parameters,1;
- changestate($paramlist[0], 5, ""); # <account_name> <new_state> <error_message_#7>
- }
-
- } elsif ("check" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(.*)/)) {
- checkaccount($paramlist[0], $paramlist[1]); # <account_name> <password>
- } elsif (@paramlist = ($parameters =~ m/^"(.*)"/)) {
- checkaccount($paramlist[0], ""); # <account_name> <password>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(.*)/)) {
- checkaccount($paramlist[0], $paramlist[1]); # <account_name> <password>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
- checkaccount($paramlist[0], ""); # <account_name> <password>
- } else {
- @paramlist = split /\s+/,$parameters;
- checkaccount($paramlist[0], $paramlist[1]); # <account_name> <password>
- }
-
- } elsif ("create" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(\S+)\s+(.*)/)) {
- createaccount($paramlist[0], $paramlist[1], $paramlist[2], $paramlist[3]); # <account_name> <sex> <email> <password>
- } elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(\S+)/)) {
- createaccount($paramlist[0], $paramlist[1], $paramlist[2], ""); # <account_name> <sex> <email> <password>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(\S+)\s+(.*)/)) {
- createaccount($paramlist[0], $paramlist[1], $paramlist[2], $paramlist[3]); # <account_name> <sex> <email> <password>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(\S+)/)) {
- createaccount($paramlist[0], $paramlist[1], $paramlist[2], ""); # <account_name> <sex> <email> <password>
- } else {
- @paramlist = split /\s+/,$parameters;
- createaccount($paramlist[0], $paramlist[1], $paramlist[2], $paramlist[3]); # <account_name> <sex> <email> <password>
- }
-
- } elsif ("del" =~ /^\Q$command/ || "delete" =~ /^\Q$command/) {
- if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
- delaccount($paramlist[0]); # <account_name>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
- delaccount($paramlist[0]); # <account_name>
- } else {
- @paramlist = split /\s+/,$parameters,1;
- delaccount($paramlist[0]); # <account_name>
- }
-
- } elsif ("email" =~ /^\Q$command/ && $command ne "e") { # check 1 letter command: 'email', 'end' or 'exit'?
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
- changeemail($paramlist[0], $paramlist[1]); # <account_name> <email>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
- changeemail($paramlist[0], $paramlist[1]); # <account_name> <email>
- } else {
- @paramlist = split /\s+/,$parameters;
- changeemail($paramlist[0], $paramlist[1]); # <account_name> <email>
- }
-
- } elsif ("getcount" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
- getlogincount();
-
- } elsif ("gm" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
- changegmlevel($paramlist[0], int($paramlist[1])); # <account_name> <GM_level>
- } elsif (@paramlist = ($parameters =~ m/^"(.*)"/)) {
- changegmlevel($paramlist[0], 0); # <account_name> <GM_level>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
- changegmlevel($paramlist[0], int($paramlist[1])); # <account_name> <GM_level>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
- changegmlevel($paramlist[0], 0); # <account_name> <GM_level>
- } else {
- @paramlist = split /\s+/,$parameters;
- changegmlevel($paramlist[0], int($paramlist[1])); # <account_name> <GM_level>
- }
-
- } elsif ("id" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
- if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
- idaccount($paramlist[0]); # <account_name>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
- idaccount($paramlist[0]); # <account_name>
- } else {
- @paramlist = split /\s+/,$parameters,1;
- idaccount($paramlist[0]); # <account_name>
- }
-
- } elsif ("info" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
- infoaccount(int($paramlist[0])); # <account_id>
-
- } elsif ($command eq "kami") { # check all letters command: 'kami' or 'kamib'?
- @paramlist = split /\s+/,$parameters,1;
- sendbroadcast(0, $paramlist[0]); # <type> <message>
-
- } elsif ($command eq "kamib") { # check all letters command: 'kami' or 'kamib'?
- @paramlist = split /\s+/,$parameters,1;
- sendbroadcast(0x10, $paramlist[0]); # <type> <message>
-
- } elsif ("language" =~ /^\Q$command/ && $command ne "l") { # check 1 letter command: 'list' or 'language'?
- changelanguage($paramlist[0]); # <language>
-
- } elsif (("list" =~ /^\Q$command/ || $command eq "ls") && $command ne "l") { # check 1 letter command: 'list' or 'language'?
- listaccount(int($paramlist[0]), int($paramlist[1]), 0); # [start_id [end_id]] 0: to list all
-
- } elsif (("listban" =~ /^\Q$command/ || $command eq "lsban") && $command ne "l") { # need to specificaly write Ban to have this list # check 1 letter command: 'list' or 'language'?
- listaccount(int($paramlist[0]), int($paramlist[1]), 3); # [start_id [end_id]] 3: to list only accounts with state or banished
-
- } elsif (("listgm" =~ /^\Q$command/ || $command eq "lsgm") && $command ne "l") { # need to specificaly write GM to have this list # check 1 letter command: 'list' or 'language'?
- listaccount(int($paramlist[0]), int($paramlist[1]), 1); # [start_id [end_id]] 1: to list only GM
-
- } elsif (("listok" =~ /^\Q$command/ || $command eq "lsok") && $command ne "l") { # need to specificaly write OK to have this list # check 1 letter command: 'list' or 'language'?
- listaccount(int($paramlist[0]), int($paramlist[1]), 4); # [start_id [end_id]] 4: to list only accounts without state and not banished
-
- } elsif ("memo" =~ /^\Q$command/) {
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(.*)/)) {
- changememo($paramlist[0], $paramlist[1]); # <account_name> <memo>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(.*)/)) {
- changememo($paramlist[0], $paramlist[1]); # <account_name> <memo>
- } else {
- @paramlist = split /\s+/,$parameters,2;
- changememo($paramlist[0], $paramlist[1]); # <account_name> <memo>
- }
-
- } elsif ("name" =~ /^\Q$command/) {
- nameaccount(int($paramlist[0])); # <account_id>
-
- } elsif ("passwd" =~ /^\Q$command/ || "password" =~ /^\Q$command/) {
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(.*)/)) {
- changepasswd($paramlist[0], $paramlist[1]); # <account_name> <new_password>
- } elsif (@paramlist = ($parameters =~ m/^"(.*)"/)) {
- changepasswd($paramlist[0], ""); # <account_name> <new_password>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(.*)/)) {
- changepasswd($paramlist[0], $paramlist[1]); # <account_name> <new_password>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
- changepasswd($paramlist[0], ""); # <account_name> <new_password>
- } else {
- @paramlist = split /\s+/,$parameters,2;
- changepasswd($paramlist[0], $paramlist[1]); # <account_name> <new_password>
- }
-
- } elsif ("reloadgm" =~ /^\Q$command/) {
- reloadGM();
-
- } elsif ("search" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
- $command ne "se") { # check 2 letters command: 'search' or 'sex'?
- if (@paramlist = ($parameters =~ m/^(-{1,2}[re]\S*)\s+(.*)/)) {
- searchaccount($paramlist[0], $paramlist[1]); # -r/-e/--expr/--regex <expression> | <expression>
- } else {
- @paramlist = split /\s+/,$parameters,1;
- searchaccount($paramlist[0], ""); # -r/-e/--expr/--regex <expression> | <expression>
- }
-
- } elsif ("sex" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
- $command ne "se") { # check 2 letters command: 'search' or 'sex'?
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
- changesex($paramlist[0], $paramlist[1]); # <account_name> <sex>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
- changesex($paramlist[0], $paramlist[1]); # <account_name> <sex>
- } else {
- @paramlist = split /\s+/,$parameters;
- changesex($paramlist[0], $paramlist[1]); # <account_name> <sex>
- }
-
- } elsif ("state" =~ /^\Q$command/ && $command ne "s") { # check 1 letter command: 'search', 'state' or 'sex'?
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\d+)\s+(.*)/)) {
- changestate($paramlist[0], int($paramlist[1]), $paramlist[2]); # <account_name> <new_state> <error_message_#7>
- } elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\d+)/)) {
- changestate($paramlist[0], int($paramlist[1]), ""); # <account_name> <new_state> <error_message_#7>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\d+)\s+(.*)/)) {
- changestate($paramlist[0], int($paramlist[1]), $paramlist[2]); # <account_name> <new_state> <error_message_#7>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\d+)/)) {
- changestate($paramlist[0], int($paramlist[1]), ""); # <account_name> <new_state> <error_message_#7>
- } else {
- @paramlist = split /\s+/,$parameters,3;
- changestate($paramlist[0], int($paramlist[1]), $paramlist[2]); # <account_name> <new_state> <error_message_#7>
- }
-
- } elsif (("timeadd" =~ /^\Q$command/ || $command eq "ta") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
- timeaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
- timeaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
- } else {
- @paramlist = split /\s+/,$parameters;
- timeaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
- }
-
- } elsif (("timeset" =~ /^\Q$command/ || $command eq "ts") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(\S+)/)) {
- timesetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
- timesetaccount($paramlist[0], $paramlist[1], "23:59:59"); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(\S+)/)) {
- timesetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
- timesetaccount($paramlist[0], $paramlist[1], "23:59:59"); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } else {
- @paramlist = split /\s+/,$parameters;
- timesetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
- }
-
- } elsif ($command eq "unban" || ("unbanish" =~ /^\Q$command/ && length($command) >= 4)) {
- if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
- bansetaccount($paramlist[0], 0, ""); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
- bansetaccount($paramlist[0], 0, ""); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } else {
- @paramlist = split /\s+/,$parameters,1;
- bansetaccount($paramlist[0], 0, ""); # <account_name> yyyy/mm/dd [hh:mm:ss]
- }
-
- } elsif ("unblock" =~ /^\Q$command/ && length($command) >= 4) {
- if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
- changestate($paramlist[0], 0, ""); # <account_name> <new_state> <error_message_#7>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
- changestate($paramlist[0], 0, ""); # <account_name> <new_state> <error_message_#7>
- } else {
- @paramlist = split /\s+/,$parameters,1;
- changestate($paramlist[0], 0, ""); # <account_name> <new_state> <error_message_#7>
- }
-
- } elsif ("version" =~ /^\Q$command/) {
- checkloginversion();
-
- } elsif ("who" =~ /^\Q$command/) {
- if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
- whoaccount($paramlist[0]); # <account_name>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
- whoaccount($paramlist[0]); # <account_name>
- } else {
- @paramlist = split /\s+/,$parameters,1;
- whoaccount($paramlist[0]); # <account_name>
- }
-
-# quit
- } elsif ("quit" =~ /^\Q$command/ ||
- (("end" =~ /^\Q$command/ || "exit" =~ /^\Q$command/) && $command ne "e")) { # check 1 letter command: 'email', 'end' or 'exit'?
- last;
-
-# unknown command
- } elsif ($command) {
- if ($defaultlanguage eq "F") {
- print "Commande inconnue [".$command."]\n";
- } else {
- print "Unknown command [".$command."]\n";
- }
- }
-# $term->addhistory($cmd) if $command;
- };
- if ($@) {
- if ($defaultlanguage eq "F") {
- print "Erreur [".$command."]\n$@";
- } else {
- print "Error [".$command."]\n$@";
- }
- }
-};
-
-# End of the software
-quit();
-
-if ($defaultlanguage eq "F") {
- print "Au revoir.\n";
-} else {
- print "Bye.\n";
-}
-exit(0);
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Displaying of the version of the login-server
-sub checkloginversion() {
- print $so pack("v",30000); # 0x7530
- $so->flush();
- $buf = readso(10);
- # Analyse du Packet
- my($ret, $maver, $miver, $rev, $dev, $mod, $type, $mdver) = unpack("vc6v", $buf);
- if ($ret != 30001) { #0x7531
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- exit(6);
- }
-
- print " Login-Server [$loginserverip:$loginserverport]\n";
- printf " eAthena version %s-%d.%d", ("stable", "dev")[$dev], $maver, $miver;
- printf " revision %d", $rev if $rev;
- printf "%s%d.\n", ("", "-mod")[$mod], $mdver;
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Displaying of the help
-sub displayhelp() {
- my($help, $receivedcommand) = @_;
-
- my($command) = lc($receivedcommand); # command in lowercase
-
- if ($command eq "") {
- $command = "not a command"; # any value that is not a command
- }
-
- if ($command eq "?") {
- $command = "aide" if ($defaultlanguage eq "F");
- $command = "help" if ($defaultlanguage ne "F");
- }
-
- if ($help eq "aide") {
- if ("aide" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
- printf "aide/help/?\n";
- printf " Affiche la description des commandes\n";
- printf "aide/help/? [commande]\n";
- printf " Affiche la description de la commande specifiée\n";
- } elsif ("help" =~ /^\Q$command/) {
- printf "aide/help/?\n";
- printf " Display the description of the commands\n";
- printf "aide/help/? [command]\n";
- printf " Display the description of the specified command\n";
- } elsif ("add" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
- printf "add <nomcompte> <sexe> <motdepasse>\n";
- printf " Crée un compte avec l'email par défaut (a\@a.com).\n";
- printf " Concernant le sexe, seule la première lettre compte (F ou M).\n";
- printf " L'e-mail est a\@a.com (e-mail par défaut). C'est comme n'avoir aucun e-mail.\n";
- printf " Lorsque motdepasse est omis, la saisie se fait sans que la frappe se voit.\n";
- printf " <exemple> add testname Male testpass\n";
- } elsif ($command eq "ban" || ("banish" =~ /^\Q$command/ && length($command) >= 4)) {
- printf "ban/banish aaaa/mm/jj hh:mm:ss <nomcompte>\n";
- printf " Change la date de fin de bannissement d'un compte.\n";
- printf " La différence avec banset est la position du nom du compte.\n";
- } elsif (("banadd" =~ /^\Q$command/ || $command eq "ba") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
- printf "banadd <nomcompte> <Modificateur>\n";
- printf " Ajoute ou soustrait du temps à la date de banissement d'un compte.\n";
- printf " Les modificateurs sont construits comme suit:\n";
- printf " Valeur d'ajustement (-1, 1, +1, etc...)\n";
- printf " Elément modifié:\n";
- printf " a ou y: année\n";
- printf " m: mois\n";
- printf " j ou d: jour\n";
- printf " h: heure\n";
- printf " mn: minute\n";
- printf " s: seconde\n";
- printf " <exemple> banadd testname +1m-2mn1s-6a\n";
- printf " Cette exemple ajoute 1 mois et une seconde, et soustrait 2 minutes\n";
- printf " et 6 ans dans le même temps.\n";
- printf "NOTE: Si vous modifez la date de banissement d'un compte non bani,\n";
- printf " vous indiquez comme date (le moment actuel +- les ajustements)\n";
- } elsif (("banset" =~ /^\Q$command/ || $command eq "bs") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
- printf "banset <nomcompte> aaaa/mm/jj [hh:mm:ss]\n";
- printf " Change la date de fin de bannissement d'un compte.\n";
- printf " Heure par défaut: 23:59:59\n";
- printf "banset <nomcompte> 0\n";
- printf " Débanni un compte (0 = de-banni).\n";
- } elsif ("block" =~ /^\Q$command/ && length($command) >= 2) {
- printf "block <nom compte>\n";
- printf " Place le status d'un compte à 5 (You have been blocked by the GM Team).\n";
- printf " La commande est l'équivalent de state <nom_compte> 5.\n";
- } elsif ("check" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
- printf "check <nomcompte> <motdepasse>\n";
- printf " Vérifie la validité d'un mot de passe pour un compte\n";
- printf " NOTE: Le serveur n'enverra jamais un mot de passe.\n";
- printf " C'est la seule méthode que vous possédez pour savoir\n";
- printf " si un mot de passe est le bon. L'autre méthode est\n";
- printf " d'avoir un accès ('physique') au fichier des comptes.\n";
- } elsif ("create" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
- printf "create <nomcompte> <sexe> <email> <motdepasse>\n";
- printf " Comme la commande add, mais avec l'e-mail en plus.\n";
- printf " <exemple> create testname Male mon\@mail.com testpass\n";
- } elsif ("del" =~ /^\Q$command/ || "delete" =~ /^\Q$command/) {
- printf "del <nomcompte>\n";
- printf " Supprime un compte.\n";
- printf " La commande demande confirmation. Après confirmation, le compte est détruit.\n";
- } elsif ("email" =~ /^\Q$command/ && $command ne "e") { # check 1 letter command: 'email', 'end' or 'exit'?
- printf "email <nomcompte> <email>\n";
- printf " Modifie l'e-mail d'un compte.\n";
- } elsif ("getcount" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
- printf "getcount\n";
- printf " Donne le nombre de joueurs en ligne par serveur de char.\n";
- } elsif ("gm" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
- printf "gm <nomcompte> [Niveau_GM]\n";
- printf " Modifie le niveau de GM d'un compte.\n";
- printf " Valeur par défaut: 0 (suppression du niveau de GM).\n";
- printf " <exemple> gm nomtest 80\n";
- } elsif ("id" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
- printf "id <nomcompte>\n";
- printf " Donne l'id d'un compte.\n";
- } elsif ("info" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
- printf "info <idcompte>\n";
- printf " Affiche les informations sur un compte.\n";
- } elsif ($command eq "kami") { # check all letters command: 'kami' or 'kamib'?
- printf "kami <message>\n";
- printf " Envoi un message général sur tous les serveurs de map (en jaune).\n";
- } elsif ($command eq "kamib") { # check all letters command: 'kami' or 'kamib'?
- printf "kamib <message>\n";
- printf " Envoi un message général sur tous les serveurs de map (en bleu).\n";
- } elsif ("language" =~ /^\Q$command/ && $command ne "l") { # check 1 letter command: 'list' or 'language'?
- printf("language <langue>\n");
- printf(" Change la langue d'affichage.\n");
- printf(" Langues possibles: 'Français' ou 'English'.\n");
- } elsif (("list" =~ /^\Q$command/ || $command eq "ls") && $command ne "l") { # check 1 letter command: 'list' or 'language'?
- printf "list/ls [Premier_id [Dernier_id]]\n";
- printf " Affiche une liste de comptes.\n";
- printf " 'Premier_id', 'Dernier_id': indique les identifiants de départ et de fin.\n";
- printf " La recherche par nom n'est pas possible avec cette commande.\n";
- printf " <example> list 10 9999999\n";
- } elsif (("listban" =~ /^\Q$command/ || $command eq "lsban") && $command ne "l") { # need to specificaly write Ban to have this list # check 1 letter command: 'list' or 'language'?
- printf "listBan/lsBan [Premier_id [Dernier_id]]\n";
- printf " Comme list/ls, mais seulement pour les comptes GM avec un statut ou bannis.\n";
- } elsif (("listgm" =~ /^\Q$command/ || $command eq "lsgm") && $command ne "l") { # need to specificaly write GM to have this list # check 1 letter command: 'list' or 'language'?
- printf "listGM/lsGM [Premier_id [Dernier_id]]\n";
- printf " Comme list/ls, mais seulement pour les comptes GM.\n";
- } elsif (("listok" =~ /^\Q$command/ || $command eq "lsok") && $command ne "l") { # need to specificaly write OK to have this list # check 1 letter command: 'list' or 'language'?
- printf "listOK/lsOK [Premier_id [Dernier_id]]\n";
- printf " Comme list/ls, mais seulement pour les comptes sans statut et non bannis.\n";
- } elsif ("memo" =~ /^\Q$command/) {
- printf "memo <nomcompte> <memo>\n";
- printf " Modifie le mémo d'un compte.\n";
- printf " 'memo': Il peut avoir jusqu'à 253 caractères (avec des espaces ou non).\n";
- } elsif ("name" =~ /^\Q$command/) {
- printf "name <idcompte>\n";
- printf " Donne le nom d'un compte.\n";
- } elsif ("passwd" =~ /^\Q$command/ || "password" =~ /^\Q$command/) {
- printf "passwd <nomcompte> <nouveaumotdepasse>\n";
- printf " Change le mot de passe d'un compte.\n";
- printf " Lorsque nouveaumotdepasse est omis,\n";
- printf " la saisie se fait sans que la frappe ne se voit.\n";
- } elsif ("reloadgm" =~ /^\Q$command/) {
- printf "reloadGM\n";
- printf " Reload GM configuration file\n";
- } elsif ("search" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
- $command ne "se") { # check 2 letters command: 'search' or 'sex'?
- printf "search <expression>\n";
- printf " Cherche des comptes.\n";
- printf " Affiche les comptes dont les noms correspondent.\n";
- printf "search -r/-e/--expr/--regex <expression>\n";
- printf " Cherche des comptes par expression regulière.\n";
- printf " Affiche les comptes dont les noms correspondent.\n";
- } elsif ("sex" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
- $command ne "se") { # check 2 letters command: 'search' or 'sex'?
- printf "sex <nomcompte> <sexe>\n";
- printf " Modifie le sexe d'un compte.\n";
- printf " <exemple> sex testname Male\n";
- } elsif ("state" =~ /^\Q$command/ && $command ne "s") { # check 1 letter command: 'search', 'state' or 'sex'?
- printf "state <nomcompte> <nouveaustatut> <message_erreur_7>\n";
- printf " Change le statut d'un compte.\n";
- printf " 'nouveaustatut': Le statut est le même que celui du packet 0x006a + 1.\n";
- printf " les possibilités sont:\n";
- printf " 0 = Compte ok\n";
- printf " 1 = Unregistered ID\n";
- printf " 2 = Incorrect Password\n";
- printf " 3 = This ID is expired\n";
- printf " 4 = Rejected from Server\n";
- printf " 5 = You have been blocked by the GM Team\n";
- printf " 6 = Your Game's EXE file is not the latest version\n";
- printf " 7 = You are Prohibited to log in until...\n";
- printf " 8 = Server is jammed due to over populated\n";
- printf " 9 = No MSG\n";
- printf " 100 = This ID has been totally erased\n";
- printf " all other values are 'No MSG', then use state 9 please.\n";
- printf " 'message_erreur_7': message du code erreur 6 =\n";
- printf " = Your are Prohibited to log in until... (packet 0x006a)\n";
- } elsif (("timeadd" =~ /^\Q$command/ || $command eq "ta") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
- printf "timeadd <nomcompte> <modificateur>\n";
- printf " Ajoute/soustrait du temps à la limite de validité d'un compte.\n";
- printf " Le modificateur est composé comme suit:\n";
- printf " Valeur modificatrice (-1, 1, +1, etc...)\n";
- printf " Elément modifié:\n";
- printf " a ou y: année\n";
- printf " m: mois\n";
- printf " j ou d: jour\n";
- printf " h: heure\n";
- printf " mn: minute\n";
- printf " s: seconde\n";
- printf " <exemple> timeadd testname +1m-2mn1s-6a\n";
- printf " Cette exemple ajoute 1 mois et une seconde, et soustrait 2 minutes\n";
- printf " et 6 ans dans le même temps.\n";
- printf "NOTE: Vous ne pouvez pas modifier une limite de validité illimitée. Si vous\n";
- printf " désirez le faire, c'est que vous voulez probablement créer un limite de\n";
- printf " validité limitée. Donc, en premier, fixé une limite de valitidé.\n";
- } elsif (("timeset" =~ /^\Q$command/ || $command eq "ts") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
- printf "timeset <nomcompte> aaaa/mm/jj [hh:mm:ss]\n";
- printf " Change la limite de validité d'un compte.\n";
- printf " Heure par défaut: 23:59:59\n";
- printf "timeset <nomcompte> 0\n";
- printf " Donne une limite de validité illimitée (0 = illimitée).\n";
- } elsif ($command eq "unban" || ("unbanish" =~ /^\Q$command/ && length($command) >= 4)) {
- printf "unban/unbanish <nom compte>\n";
- printf " Ote le banissement d'un compte.\n";
- printf " La commande est l'équivalent de banset <nom_compte> 0.\n";
- } elsif ("unblock" =~ /^\Q$command/ && length($command) >= 4) {
- printf "unblock <nom compte>\n";
- printf " Place le status d'un compte à 0 (Compte ok).\n";
- printf " La commande est l'équivalent de state <nom_compte> 0.\n";
- } elsif ("version" =~ /^\Q$command/) {
- printf "version\n";
- printf " Affiche la version du login-serveur.\n";
- } elsif ("who" =~ /^\Q$command/) {
- printf "who <nomcompte>\n";
- printf " Affiche les informations sur un compte.\n";
- } elsif ("quit" =~ /^\Q$command/ ||
- (("end" =~ /^\Q$command/ || "exit" =~ /^\Q$command/) && $command ne "e")) { # check 1 letter command: 'email', 'end' or 'exit'?\n";
- printf "quit/end/exit\n";
- printf " Fin du programme d'administration.\n";
- } else {
- if ($receivedcommand ne "") {
- printf "Commande inconnue [%s] pour l'aide. Affichage de toutes les commandes.\n", $receivedcommand;
- }
- print << "ENDOFAIDE";
- aide/help/? -- Affiche cet aide
- aide/help/? [commande] -- Affiche l'aide de la commande
- add <nomcompte> <sexe> <motdepasse> -- Crée un compte (sans email)
- ban/banish aaaa/mm/jj hh:mm:ss <nomcompte>-- Change la date finale de banismnt
- banadd/ba <nomcompte> <modificateur> -- Ajout/soustrait du temps à la
- exemple: ba moncompte +1m-2mn1s-2y date finale de banissement
- banset/bs <nomcompte> aaaa/mm/jj [hh:mm:ss] -- Change la date fin de banisemnt
- banset/bs <nomcompte> 0 -- Dé-banis un compte.
- block <nom compte> -- Mets le status d'un compte à 5 (blocked by the GM Team)
- check <nomcompte> <motdepasse> -- Vérifie un mot de passe d'un compte
- create <nomcompte> <sexe> <email> <motdepasse> -- Crée un compte (avec email)
- del <nomcompte> -- Supprime un compte
- email <nomcompte> <email> -- Modifie l'e-mail d'un compte
- getcount -- Donne le nb de joueurs en ligne
- gm <nomcompte> [Niveau_GM] -- Modifie le niveau de GM d'un compte
- id <nomcompte> -- Donne l'id d'un compte
- info <idcompte> -- Affiche les infos sur un compte
- kami <message> -- Envoi un message général (en jaune)
- kamib <message> -- Envoi un message général (en bleu)
- language <langue> -- Change la langue d'affichage.
- list/ls [Premier_id [Dernier_id] ] -- Affiche une liste de comptes
- listBan/lsBan [Premier_id [Dernier_id] ]-- Affiche une liste de comptes
- avec un statut ou bannis
- listGM/lsGM [Premier_id [Dernier_id] ] -- Affiche une liste de comptes GM
- listOK/lsOK [Premier_id [Dernier_id] ] -- Affiche une liste de comptes
- sans status et non bannis
- memo <nomcompte> <memo> -- Modifie le memo d'un compte
- name <idcompte> -- Donne le nom d'un compte
- passwd <nomcompte> <nouveaumotdepasse> -- Change le mot de passe d'un compte
- quit/end/exit -- Fin du programme d'administation
- reloadGM -- Recharger le fichier de config des GM
- search <expression> -- Cherche des comptes
- search -e/-r/--expr/--regex <expression> -- Cherche des comptes par REGEX
- sex <nomcompte> <sexe> -- Modifie le sexe d'un compte
- state <nomcompte> <nouveaustatut> <messageerr7> -- Change le statut d'1 compte
- timeadd/ta <nomcompte> <modificateur> -- Ajout/soustrait du temps à la
- exemple: ta moncompte +1m-2mn1s-2y limite de validité
- timeset/ts <nomcompte> aaaa/mm/jj [hh:mm:ss] -- Change la limite de validité
- timeset/ts <nomcompte> 0 -- limite de validité = illimitée
- unban/unbanish <nom compte> -- Ote le banissement d'un compte
- unblock <nom compte> -- Mets le status d'un compte à 0 (Compte ok)
- version -- Donne la version du login-serveur
- who <nomcompte> -- Affiche les infos sur un compte
-ENDOFAIDE
- printf(" Note: Pour les noms de compte avec des espaces, tapez \"<nom compte>\" (ou ').\n");
- }
- } else {
- if ("aide" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
- printf "aide/help/?\n";
- printf " Display the description of the commands\n";
- printf "aide/help/? [command]\n";
- printf " Display the description of the specified command\n";
- } elsif ("help" =~ /^\Q$command/) {
- printf "aide/help/?\n";
- printf " Display the description of the commands\n";
- printf "aide/help/? [command]\n";
- printf " Display the description of the specified command\n";
- } elsif ("add" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
- printf "add <account_name> <sex> <password>\n";
- printf " Create an account with the default email (a\@a.com).\n";
- printf " Concerning the sex, only the first letter is used (F or M).\n";
- printf " The e-mail is set to a\@a.com (default e-mail). It's like to have no e-mail.\n";
- printf " When the password is omitted,\n";
- printf " the input is done without displaying of the pressed keys.\n";
- printf " <example> add testname Male testpass\n";
- } elsif ($command eq "ban" || ("banish" =~ /^\Q$command/ && length($command) >= 4)) {
- printf "ban/banish yyyy/mm/dd hh:mm:ss <account_name>\n";
- printf " Changes the final date of a banishment of an account.\n";
- printf " The difference with banset is the position of the account name.\n";
- } elsif (("banadd" =~ /^\Q$command/ || $command eq "ba") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
- printf "banadd <account_name> <modifier>\n";
- printf " Adds or substracts time from the final date of a banishment of an account.\n";
- printf " Modifier is done as follows:\n";
- printf " Adjustment value (-1, 1, +1, etc...)\n";
- printf " Modified element:\n";
- printf " a or y: year\n";
- printf " m: month\n";
- printf " j or d: day\n";
- printf " h: hour\n";
- printf " mn: minute\n";
- printf " s: second\n";
- printf " <example> banadd testname +1m-2mn1s-6y\n";
- printf " this example adds 1 month and 1 second, and substracts 2 minutes\n";
- printf " and 6 years at the same time.\n";
- printf "NOTE: If you modify the final date of a non-banished account,\n";
- printf " you fix the final date to (actual time +- adjustments)\n";
- } elsif (("banset" =~ /^\Q$command/ || $command eq "bs") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
- printf "banset <account_name> yyyy/mm/dd [hh:mm:ss]\n";
- printf " Changes the final date of a banishment of an account.\n";
- printf " Default time: 23:59:59\n";
- printf "banset <account_name> 0\n";
- printf " Set a non-banished account (0 = unbanished).\n";
- } elsif ("block" =~ /^\Q$command/ && length($command) >= 2) {
- printf "block <account name>\n";
- printf " Set state 5 (You have been blocked by the GM Team) to an account.\n";
- printf " Same command of state <account_name> 5.\n";
- } elsif ("check" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
- printf "check <account_name> <password>\n";
- printf " Check the validity of a password for an account.\n";
- printf " NOTE: Server will never sends back a password.\n";
- printf " It's the only method you have to know if a password is correct.\n";
- printf " The other method is to have a ('physical') access to the accounts file.\n";
- } elsif ("create" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
- printf "create <account_name> <sex> <email> <password>\n";
- printf " Like the 'add' command, but with e-mail moreover.\n";
- printf " <example> create testname Male my\@mail.com testpass\n";
- } elsif ("del" =~ /^\Q$command/ || "delete" =~ /^\Q$command/) {
- printf "del <account_name>\n";
- printf " Remove an account.\n";
- printf " This order requires confirmation. After confirmation, the account is deleted.\n";
- } elsif ("email" =~ /^\Q$command/ && $command ne "e") { # check 1 letter command: 'email', 'end' or 'exit'?
- printf "email <account_name> <email>\n";
- printf " Modify the e-mail of an account.\n";
- } elsif ("getcount" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
- printf "getcount\n";
- printf " Give the number of players online on all char-servers.\n";
- } elsif ("gm" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
- printf "gm <account_name> [GM_level]\n";
- printf " Modify the GM level of an account.\n";
- printf " Default value remove GM level (GM level = 0).\n";
- printf " <example> gm testname 80\n";
- } elsif ("id" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
- printf "id <account_name>\n";
- printf " Give the id of an account.\n";
- } elsif ("info" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
- printf "info <account_id>\n";
- printf " Display complete information of an account.\n";
- } elsif ($command eq "kami") { # check all letters command: 'kami' or 'kamib'?
- printf "kami <message>\n";
- printf " Sends a broadcast message on all map-server (in yellow).\n";
- } elsif ($command eq "kamib") { # check all letters command: 'kami' or 'kamib'?
- printf "kamib <message>\n";
- printf " Sends a broadcast message on all map-server (in blue).\n";
- } elsif ("language" =~ /^\Q$command/ && $command ne "l") { # check 1 letter command: 'list' or 'language'?
- printf("language <language>\n");
- printf(" Change the language of displaying.\n");
- printf(" Possible languages: Français or English.\n");
- } elsif (("list" =~ /^\Q$command/ || $command eq "ls") && $command ne "l") { # check 1 letter command: 'list' or 'language'?
- printf "list/ls [start_id [end_id]]\n";
- printf " Display a list of accounts.\n";
- printf " 'start_id', 'end_id': indicate end and start identifiers.\n";
- printf " Research by name is not possible with this command.\n";
- printf " <example> list 10 9999999\n";
- } elsif (("listban" =~ /^\Q$command/ || $command eq "lsban") && $command ne "l") { # need to specificaly write Ban to have this list # check 1 letter command: 'list' or 'language'?
- printf "listBan/lsBan [start_id [end_id]]\n";
- printf " Like list/ls, but only for accounts with state or banished.\n";
- } elsif (("listgm" =~ /^\Q$command/ || $command eq "lsgm") && $command ne "l") { # need to specificaly write GM to have this list # check 1 letter command: 'list' or 'language'?
- printf "listGM/lsGM [start_id [end_id]]\n";
- printf " Like list/ls, but only for GM accounts.\n";
- } elsif (("listok" =~ /^\Q$command/ || $command eq "lsok") && $command ne "l") { # need to specificaly write OK to have this list # check 1 letter command: 'list' or 'language'?
- printf "listOK/lsOK [start_id [end_id]]\n";
- printf " Like list/ls, but only for accounts without state and not banished.\n";
- } elsif ("memo" =~ /^\Q$command/) {
- printf "memo <account_name> <memo>\n";
- printf " Modify the memo of an account.\n";
- printf " 'memo': it can have until 253 characters (with spaces or not).\n";
- } elsif ("name" =~ /^\Q$command/) {
- printf "name <account_id>\n";
- printf " Give the name of an account.\n";
- } elsif ("passwd" =~ /^\Q$command/ || "password" =~ /^\Q$command/) {
- printf "passwd <account_name> <new_password>\n";
- printf " Change the password of an account.\n";
- printf " When new password is omitted,\n";
- printf " the input is done without displaying of the pressed keys.\n";
- } elsif ("reloadgm" =~ /^\Q$command/) {
- printf "reloadGM\n";
- printf " Reload GM configuration file\n";
- } elsif ("search" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
- $command ne "se") { # check 2 letters command: 'search' or 'sex'?
- printf "search <expression>\n";
- printf " Seek accounts.\n";
- printf " Displays the accounts whose names correspond.\n";
- printf "search -r/-e/--expr/--regex <expression>\n";
- printf " Seek accounts by regular expression.\n";
- printf " Displays the accounts whose names correspond.\n";
- } elsif ("sex" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
- $command ne "se") { # check 2 letters command: 'search' or 'sex'?
- printf "sex <account_name> <sex>\n";
- printf " Modify the sex of an account.\n";
- printf " <example> sex testname Male\n";
- } elsif ("state" =~ /^\Q$command/ && $command ne "s") { # check 1 letter command: 'search', 'state' or 'sex'?
- printf "state <account_name> <new_state> <error_message_#7>\n";
- printf " Change the state of an account.\n";
- printf " 'new_state': state is the state of the packet 0x006a + 1.\n";
- printf " The possibilities are:\n";
- printf " 0 = Account ok\n";
- printf " 1 = Unregistered ID\n";
- printf " 2 = Incorrect Password\n";
- printf " 3 = This ID is expired\n";
- printf " 4 = Rejected from Server\n";
- printf " 5 = You have been blocked by the GM Team\n";
- printf " 6 = Your Game's EXE file is not the latest version\n";
- printf " 7 = You are Prohibited to log in until...\n";
- printf " 8 = Server is jammed due to over populated\n";
- printf " 9 = No MSG\n";
- printf " 100 = This ID has been totally erased\n";
- printf " all other values are 'No MSG', then use state 9 please.\n";
- printf " 'error_message_#7': message of the code error 6\n";
- printf " = Your are Prohibited to log in until... (packet 0x006a)\n";
- } elsif (("timeadd" =~ /^\Q$command/ || $command eq "ta") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
- printf "timeadd <account_name> <modifier>\n";
- printf " Adds or substracts time from the validity limit of an account.\n";
- printf " Modifier is done as follows:\n";
- printf " Adjustment value (-1, 1, +1, etc...)\n";
- printf " Modified element:\n";
- printf " a or y: year\n";
- printf " m: month\n";
- printf " j or d: day\n";
- printf " h: hour\n";
- printf " mn: minute\n";
- printf " s: second\n";
- printf " <example> timeadd testname +1m-2mn1s-6y\n";
- printf " this example adds 1 month and 1 second, and substracts 2 minutes\n";
- printf " and 6 years at the same time.\n";
- printf "NOTE: You can not modify a unlimited validity limit.\n";
- printf " If you want modify it, you want probably create a limited validity limit.\n";
- printf " So, at first, you must set the validity limit to a date/time.\n";
- } elsif (("timeset" =~ /^\Q$command/ || $command eq "ts") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
- printf "timeset <account_name> yyyy/mm/dd [hh:mm:ss]\n";
- printf " Changes the validity limit of an account.\n";
- printf " Default time: 23:59:59\n";
- printf "timeset <account_name> 0\n";
- printf " Gives an unlimited validity limit (0 = unlimited).\n";
- } elsif ($command eq "unban" || ("unbanish" =~ /^\Q$command/ && length($command) >= 4)) {
- printf "unban/unbanish <account name>\n";
- printf " Remove the banishment of an account.\n";
- printf " This command works like banset <account_name> 0.\n";
- } elsif ("unblock" =~ /^\Q$command/ && length($command) >= 4) {
- printf "unblock <account name>\n";
- printf " Set state 0 (Account ok) to an account.\n";
- printf " This command works like state <account_name> 0.\n";
- } elsif ("version" =~ /^\Q$command/) {
- printf "version\n";
- printf " Display the version of the login-server.\n";
- } elsif ("who" =~ /^\Q$command/) {
- printf "who <account_name>\n";
- printf " Displays complete information of an account.\n";
- } elsif ("quit" =~ /^\Q$command/ ||
- (("end" =~ /^\Q$command/ || "exit" =~ /^\Q$command/) && $command ne "e")) { # check 1 letter command: 'email', 'end' or 'exit'?\n";
- printf "quit/end/exit\n";
- printf " End of the program of administration.\n";
- } else {
- if ($receivedcommand ne "") {
- printf "Unknown command [%s] for help. Displaying of all commands.\n", $receivedcommand;
- }
- print << "ENDOFHELP";
- aide/help/? -- Display this help
- aide/help/? [command] -- Display the help of the command
- add <account_name> <sex> <password> -- Create an account with default email
- ban/banish yyyy/mm/dd hh:mm:ss <account_name> -- Change final date of a ban
- banadd/ba <account_name> <modifier> -- Add or substract time from the final
- example: ba apple +1m-2mn1s-2y date of a banishment of an account
- banset/bs <account_name> yyyy/mm/dd [hh:mm:ss] -- Change final date of a ban
- banset/bs <account_name> 0 -- Un-banish an account
- block <account name> -- Set state 5 (blocked by the GM Team) to an account
- check <account_name> <password> -- Check the validity of a password
- create <account_name> <sex> <email> <passwrd> -- Create an account with email
- del <account_name> -- Remove an account
- email <account_name> <email> -- Modify an email of an account
- getcount -- Give the number of players online
- gm <account_name> [GM_level] -- Modify the GM level of an account
- id <account_name> -- Give the id of an account
- info <account_id> -- Display all information of an account
- kami <message> -- Sends a broadcast message (in yellow)
- kamib <message> -- Sends a broadcast message (in blue)
- language <language> -- Change the language of displaying.
- list/ls [First_id [Last_id]] -- Display a list of accounts
- listBan/lsBan [First_id [Last_id]] -- Display a list of accounts
- with state or banished
- listGM/lsGM [First_id [Last_id]] -- Display a list of GM accounts
- listOK/lsOK [First_id [Last_id]] -- Display a list of accounts
- without state and not banished
- memo <account_name> <memo> -- Modify the memo of an account
- name <account_id> -- Give the name of an account
- passwd <account_name> <new_password> -- Change the password of an account
- quit/end/exit -- End of the program of administation
- reloadGM -- Reload GM configuration file
- search <expression> -- Seek accounts
- search -e/-r/--expr/--regex <expressn> -- Seek accounts by regular-expression
- sex <nomcompte> <sexe> -- Modify the sex of an account
- state <account_name> <new_state> <error_message_#7> -- Change the state
- timeadd/ta <account_name> <modifier> -- Add or substract time from the
- example: ta apple +1m-2mn1s-2y validity limit of an account
- timeset/ts <account_name> yyyy/mm/dd [hh:mm:ss] -- Change the validify limit
- timeset/ts <account_name> 0 -- Give a unlimited validity limit
- unban/unbanish <account name> -- Remove the banishment of an account
- unblock <account name> -- Set state 0 (Account ok) to an account
- version -- Gives the version of the login-server
- who <account_name> -- Display all information of an account
-ENDOFHELP
- printf(" Note: To use spaces in an account name, type \"<account name>\" (or ').\n");
- }
- }
-
- return 0;
-}
-#--------------------------------------------------------------------------
-
-# Sub-function: Displaying of the accounts list
-sub listaccount() {
- my($st, $ed, $listflag) = @_;
- my($i);
- my($n) = (0);
- # 0123456789 01 01234567890123456789012301234 012345 0123456789012345678901234567
- if ($defaultlanguage eq "F") {
- print " id_compte GM nom_utilisateur sexe count statut\n";
- } else {
- print "account_id GM user_name sex count state\n";
- }
- print "-------------------------------------------------------------------------------\n";
- while(1) {
- print $so pack("vV2", 0x7920, $st, $ed);
- $so->flush();
- $buf = readso(4);
- if (unpack("v", $buf) != 0x7921) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- exit(10);
- }
- my($len) = unpack("x2v", $buf);
- last if ($len <= 4);
- for($i = 4; $i < $len; $i += 38) {
- my(@dat) = unpack("VCa24cVV", readso(38));
- $st = $dat[0] + 1;
- if ($listflag == 0 ||
- ($listflag == 1 && $dat[1] > 0) || # check GM flag
- ($listflag == 3 && $dat[5] != 0) || # check with state or banished
- ($listflag == 4 && $dat[5] == 0)) { # check without state and not banished
- printf "%10d %2s %-24s%-5s %6d %-27s\n", $dat[0],
- ($dat[1] == 0 ? " " : $dat[1]),
- $dat[2],
- ($defaultlanguage eq "F" ? ("Femme","Male","Servr")[$dat[3]] : ("Femal","Male","Servr")[$dat[3]]),
- $dat[4],
- (($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
- "Unregistered ID",
- "Incorrect Password",
- "This ID is expired",
- "Rejected from Server",
- "Blocked by the GM Team", # You have been blocked by the GM Team
- "Your EXE file is too old", # Your Game's EXE file is not the latest version
- "Banishement or\n Prohibited to login until %s", # You are Prohibited to log in until %s
- "Server is over populated", # Server is jammed due to over populated
- "No MSG",
- "This ID is totally erased")[$dat[5] == 100 ? 10 : $dat[5]]; # This ID has been totally erased
- $n++;
- }
- }
- }
- if ($defaultlanguage eq "F") {
- if ($n == 0) {
- print "Aucun compte trouvé.\n";
- } elsif ($n == 1) {
- print "1 compte trouvé.\n";
- } else {
- print "$n comptes trouvés.\n";
- }
- } else {
- if ($n == 0) {
- print "No account found.\n";
- } elsif ($n == 1) {
- print "1 account found.\n";
- } else {
- print "$n accounts found.\n";
- }
- }
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: add an account with the default e-mail
-sub addaccount() {
- my($userid, $sex, $passwd) = @_;
- if ($userid eq "" || !defined($userid)) {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple> add nomtest Male motdepassetest\n";
- } else {
- print "Please input an account name.\n";
- print "<example> add testname Male testpass\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
-# if ($userid =~ /[^A-Za-z0-9\@-_]/) {
-# if ($defaultlanguage eq "F") {
-# print "Caractère interdit trouvé dans le nom du compte ".$`."[${&}]${'}\n";
-# } else {
-# print "Illegal character found in the account name ".$`."[${&}]${'}\n";
-# }
-# return 101;
-# }
- $sex = uc(substr($sex, 0, 1));
- if ($sex !~ /^[MF]$/) {
- if ($defaultlanguage eq "F") {
- print "Sexe incorrect [$sex]. Entrez M ou F svp.\n";
- } else {
- print "Illegal gender [$sex]. Please input M or F.\n";
- }
- return 103;
- }
- if ($passwd eq "") {
- return 108 if (($passwd = typepasswd()) eq "");
- }
- if (verify_password($passwd) == 0) {
- return 104;
- }
- print $so pack("va24a24a1a40", 0x7930, $userid, $passwd, $sex, "");
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7931) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 106;
- }
- $buf = readso(28);
- if (unpack("V", $buf) == -1 || unpack("V", $buf) == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Echec à la création du compte [$userid]. Un compte identique existe déjà.\n";
- } else {
- print "Account [$userid] creation failed. Same account already exists.\n";
- }
- return 107;
- } else {
- if ($defaultlanguage eq "F") {
- printf "Compte [$userid] créé avec succès [id: %d].\n", unpack("V",$buf);
- } else {
- printf "Account [$userid] is successfully created [id: %d].\n", unpack("V",$buf);
- }
- }
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: add an account with an e-mail
-sub createaccount() {
- my($userid, $sex, $email, $passwd) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple> create nomtest Male mon\@email.com motdepassetest\n";
- } else {
- print "Please input an account name.\n";
- print "<example> create testname Male my\@mail.com testpass\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
-# if ($userid =~ /[^A-Za-z0-9\@-_]/) {
-# if ($defaultlanguage eq "F") {
-# print "Caractère interdit trouvé dans le nom du compte ".$`."[${&}]${'}\n";
-# } else {
-# print "Illegal character found in the account name ".$`."[${&}]${'}\n";
-# }
-# return 101;
-# }
- $sex = uc(substr($sex, 0, 1));
- if ($sex !~ /^[MF]$/) {
- if ($defaultlanguage eq "F") {
- print "Sexe incorrect [$sex]. Entrez M ou F svp.\n";
- } else {
- print "Illegal gender [$sex]. Please input M or F.\n";
- }
- return 103;
- }
- if (length($email) < 3) {
- if ($defaultlanguage eq "F") {
- print "Email trop courte [$email]. Entrez une e-mail valide svp.\n";
- } else {
- print "Email is too short [$email]. Please input a valid e-mail.\n";
- }
- return 109;
- }
- if (length($email) > 39) {
- if ($defaultlanguage eq "F") {
- print "Email trop longue [$email]. Entrez une e-mail de 39 caractères maximum svp.\n";
- } else {
- print "Email is too long [$email]. Please input an e-mail with 39 bytes at the most.\n";
- }
- return 109;
- }
- if (verify_email($email) == 0) {
- if ($defaultlanguage eq "F") {
- print "Email incorrecte [$email]. Entrez une e-mail valide svp.\n";
- } else {
- print "Invalid email [$email]. Please input a valid e-mail.\n";
- }
- return 109;
- }
- if ($passwd eq "") {
- return 108 if (($passwd = typepasswd()) eq "");
- }
- if (verify_password($passwd) == 0) {
- return 104;
- }
- print $so pack("va24a24a1a40", 0x7930, $userid, $passwd, $sex, $email);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7931) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 106;
- }
- $buf = readso(28);
- if (unpack("V", $buf) == -1 || unpack("V", $buf) == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Echec à la création du compte [$userid]. Un compte identique existe déjà.\n";
- } else {
- print "Account [$userid] creation failed. Same account already exists.\n";
- }
- return 107;
- } else {
- if ($defaultlanguage eq "F") {
- printf "Compte [$userid] créé avec succès [id: %d].\n", unpack("V",$buf);
- } else {
- printf "Account [$userid] is successfully created [id: %d].\n", unpack("V",$buf);
- }
- }
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: deletion of an account
-sub delaccount() {
- my($userid) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple> del nomtestasupprimer\n";
- } else {
- print "Please input an account name.\n";
- print "<example> del testnametodelete\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
- if ($defaultlanguage eq "F") {
- print "** Etes-vous vraiment sûr de vouloir SUPPRIMER le compte [$userid]? (o/n) ";
- } else {
- print "** Are you really sure to DELETE account [$userid]? (y/n) ";
- }
- if (lc(substr(<STDIN>, 0, 1)) !~ /[oy]/) {
- if ($defaultlanguage eq "F") {
- print "Suppression annulée\n.";
- } else {
- print "Deletion canceled\n";
- }
- return 121;
- }
- print $so pack("va24", 0x7932, $userid);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7933) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 122;
- }
- $buf = readso(28);
- my($id2, $name) = unpack("Va24", $buf);
- while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
- chop($name);
- };
- if ($id2 == -1 || $id2 == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Echec de la suppression du compte [$userid]. Le compte n'existe pas.\n";
- } else {
- print "Account [$userid] deletion failed. Account doesn't exist.\n";
- }
- return 123;
- } else {
- if ($defaultlanguage eq "F") {
- print "Compte [$name][id: $id2] SUPPRIME avec succès.\n";
- } else {
- print "Account [$name][id: $id2] is successfully DELETED.\n";
- }
- }
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: modification of a password
-sub changepasswd() {
- my($userid, $passwd) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple> passwd nomtest nouveaumotdepasse\n";
- } else {
- print "Please input an account name.\n";
- print "<example> passwd testname newpassword\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
- if ($passwd eq "") {
- return 134 if (($passwd = typepasswd()) eq "");
- }
- if (verify_password($passwd) == 0) {
- return 131;
- }
- print $so pack("va24a24", 0x7934, $userid,$passwd);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7935) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 132;
- }
- $buf = readso(28);
- my($id2, $name) = unpack("Va24", $buf);
- while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
- chop($name);
- };
- if ($id2 == -1 || $id2 == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Echec de la modification du mot de passe du compte [$userid].\n";
- print "Le compte [$userid] n'existe pas.\n";
- } else {
- print "Account [$userid] password changing failed.\n";
- print "Account [$userid] doesn't exist.\n";
- }
- return 133;
- } else {
- if ($defaultlanguage eq "F") {
- print "Modification du mot de passe du compte [$name][id: $id2] réussie.\n";
- } else {
- print "Account [$name][id: $id2] password successfully changed.\n";
- }
- }
- return 130;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: modification of an account e-mail
-sub changeemail() {
- my($userid, $email) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple> email testname nouveauemail\n";
- } else {
- print "Please input an account name.\n";
- print "<example> email testname newemail\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
- if (length($email) < 3) {
- if ($defaultlanguage eq "F") {
- print "Email trop courte [$email]. Entrez une e-mail valide svp.\n";
- } else {
- print "Email is too short [$email]. Please input a valid e-mail.\n";
- }
- return 109;
- }
- if (length($email) > 39) {
- if ($defaultlanguage eq "F") {
- print "Email trop longue [$email]. Entrez une e-mail de 39 caractères maximum svp.\n";
- } else {
- print "Email is too long [$email]. Please input an e-mail with 39 bytes at the most.\n";
- }
- return 109;
- }
- if (verify_email($email) == 0) {
- if ($defaultlanguage eq "F") {
- print "Email incorrect [$email]. Entrez une e-mail valide svp.\n";
- } else {
- print "Invalid email [$email]. Please input a valid e-mail.\n";
- }
- return 109;
- }
- print $so pack("va24a40", 0x7940, $userid, $email);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7941) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 162;
- }
- $buf = readso(28);
- my($id2, $name) = unpack("Va24", $buf);
- while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
- chop($name);
- };
- if ($id2 == -1 || $id2 == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Echec de la modification de l'e-mail du compte [$userid].\n";
- print "Le compte [$userid] n'existe pas.\n";
- } else {
- print "Account [$userid] e-mail changing failed.\n";
- print "Account [$userid] doesn't exist.\n";
- }
- return 133;
- } else {
- if ($defaultlanguage eq "F") {
- print "Modification de l'e-mail du compte [$name][id: $id2] réussie.\n";
- } else {
- print "Account [$name][id: $id2] e-mail successfully changed.\n";
- }
- }
- return 160;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: search of accounts
-sub searchaccount() {
- my($p1, $p2) = @_;
- my($exp) = ("");
- if ($p1 eq "-e" || $p1 eq "-r" || $p1 eq "--regex" || $p1 eq "--expr") {
- if ($p2 eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez une expression régulière ou utilisez 'ls' pour avoir tous les comptes.\n";
- } else {
- print "Input a regular expression or use 'ls' to obtain all accounts.\n";
- }
- return 141;
- }
- $exp = $p2;
- } else {
- if ($p1 eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez une chaîne ou utilisez 'ls' pour avoir tous les comptes.\n";
- } else {
- print "Input a string or use 'ls' to obtain all accounts.\n";
- }
- return 141;
- }
- my($c) = 0;
- $exp = lc($p1);
- $exp =~ s/([\@])/\\$1/g;
- $c += $exp =~ s/([\-\[\]])/\\$1/g;
- $c += $exp =~ s/([\*\?])/.$1/g;
- $c += $exp =~ s/\\\[(.)\\\-(.)\\\]/[$1-$2]/g;
- $exp = "^$exp\$" if $c;
- }
- if (eval{ "" =~ /$exp/; }, $@) {
- if ($defaultlanguage eq "F") {
- print "Expression régulière non reconnue.\n";
- } else {
- print "Regular-Expression compiling failed.\n";
- }
- return 141;
- }
- my($i);
- my($n, $st) = (0, 0);
- # 0123456789 01 01234567890123456789012301234 012345 0123456789012345678901234567
- if ($defaultlanguage eq "F") {
- print " id_compte GM nom_utilisateur sexe count statut\n";
- } else {
- print "account_id GM user_name sex count state\n";
- }
- print "-------------------------------------------------------------------------------\n";
- while(1) {
- print $so pack("vV2", 0x7920, $st, 0);
- $so->flush();
- $buf = readso(4);
- if (unpack("v", $buf) != 0x7921) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- exit(10);
- }
- my($len) = unpack("x2v", $buf);
- last if ($len <= 4);
- for($i = 4; $i < $len; $i += 38) {
- my(@dat) = unpack("VCa24cVV", readso(38));
- $st = $dat[0] + 1;
- next if (lc($dat[2]) !~ /$exp/);
- printf "%10d %2s %-24s%-5s %6d %-27s\n", $dat[0],
- ($dat[1] == 0 ? " " : $dat[1]),
- $dat[2],
- ($defaultlanguage eq "F" ? ("Femme","Male","Servr")[$dat[3]] : ("Femal","Male","Servr")[$dat[3]]),
- $dat[4],
- (($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
- "Unregistered ID",
- "Incorrect Password",
- "This ID is expired",
- "Rejected from Server",
- "Blocked by the GM Team", # You have been blocked by the GM Team
- "Your EXE file is too old", # Your Game's EXE file is not the latest version
- "Banishement or\n Prohibited to login until %s", # You are Prohibited to log in until %s
- "Server is over populated", # Server is jammed due to over populated
- "No MSG",
- "This ID is totally erased")[$dat[5] == 100 ? 10 : $dat[5]]; # This ID has been totally erased
- $n++;
- }
- }
- if ($defaultlanguage eq "F") {
- if ($n == 0) {
- print "Aucun compte trouvé.\n";
- } elsif ($n == 1) {
- print "1 compte trouvé.\n";
- } else {
- print "$n comptes trouvés.\n";
- }
- } else {
- if ($n == 0) {
- print "No account found.\n";
- } elsif ($n == 1) {
- print "1 account found.\n";
- } else {
- print "$n accounts found.\n";
- }
- }
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: modify the sex of an account
-sub changesex() {
- my($userid, $sex) = @_;
- if ($userid eq "" || !defined($userid)) {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple> sex nomtest Male\n";
- } else {
- print "Please input an account name.\n";
- print "<example> sex testname Male\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
-# if ($userid =~ /[^A-Za-z0-9\@-_]/) {
-# if ($defaultlanguage eq "F") {
-# print "Caractère interdit trouvé dans le nom du compte ".$`."[${&}]${'}\n";
-# } else {
-# print "Illegal character found in the account name ".$`."[${&}]${'}\n";
-# }
-# return 101;
-# }
- $sex = uc(substr($sex, 0, 1));
- if ($sex !~ /^[MF]$/) {
- if ($defaultlanguage eq "F") {
- print "Sexe incorrect [$sex]. Entrez M ou F svp.\n";
- } else {
- print "Illegal gender [$sex]. Please input M or F.\n";
- }
- return 103;
- }
- print $so pack("va24a1", 0x793c, $userid, $sex);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x793d) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 152;
- }
- $buf = readso(28);
- my($id2, $name) = unpack("Va24", $buf);
- while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
- chop($name);
- };
- if ($id2 == -1 || $id2 == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Echec du changement du sexe du compte [$userid].\n";
- print "Le compte n'existe pas ou le sexe est déjà celui demandé.\n";
- } else {
- print "Account [$userid] sex changing failed.\n";
- print "Account doesn't exist or the sex is already the good sex.\n";
- }
- } else {
- if ($defaultlanguage eq "F") {
- print "Sexe du compte [$name][id: $id2] changé avec succès.\n";
- } else {
- print "Account [$name][id: $id2] sex successfully changed.\n";
- }
- }
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: modify the GM level of an account
-sub changegmlevel() {
- my($userid, $gm_level) = @_;
- if ($userid eq "" || !defined($userid)) {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple> gm nomtest 80\n";
- } else {
- print "Please input an account name.\n";
- print "<example> gm testname 80\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
-# if ($userid =~ /[^A-Za-z0-9\@-_]/) {
-# if ($defaultlanguage eq "F") {
-# print "Caractère interdit trouvé dans le nom du compte ".$`."[${&}]${'}\n";
-# } else {
-# print "Illegal character found in the account name ".$`."[${&}]${'}\n";
-# }
-# return 101;
-# }
- $gm_level = int($gm_level);
- if ($gm_level < 0 || $gm_level > 99) {
- if ($defaultlanguage eq "F") {
- print "Niveau de GM incorrect [$gm_level]. Entrez une valeur de 0 à 99 svp.\n";
- } else {
- print "Illegal GM level [$gm_level]. Please input a value from 0 to 99.\n";
- }
- return 103;
- }
- print $so pack("va24C", 0x793e, $userid, $gm_level);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x793f) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 152;
- }
- $buf = readso(28);
- my($id2, $name) = unpack("Va24", $buf);
- while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
- chop($name);
- };
- if ($id2 == -1 || $id2 == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Echec du changement du niveau de GM du compte [$userid].\n";
- print "Le compte n'existe pas, le niveau de GM est déjà celui demandé,\n";
- print "ou il est impossible de modifier le fichier des comptes GM.\n";
- } else {
- print "Account [$userid] GM level changing failed.\n";
- print "Account doesn't exist, the GM level is already the good GM level,\n";
- print "or it's impossible to modify the GM accounts file.\n";
- }
- } else {
- if ($defaultlanguage eq "F") {
- print "Niveau de GM du compte [$name][id: $id2] changé avec succès.\n";
- } else {
- print "Account [$name][id: $id2] GM level successfully changed.\n";
- }
- }
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Modification of a state
-sub changestate {
- my($userid, $s, $error_message) = @_;
- # Valid values: 0: ok, or value of the 0x006a packet + 1
- if ($s eq "" || (($s < 0 || $s > 9) && $s != 100)) {
- if ($defaultlanguage eq "F") {
- print "Entrez une des valeurs suivantes svp:\n";
- print " 0 = Compte ok 6 = Your Game's EXE file is not the latest version\n";
- } else {
- print "Please input one of these values:\n";
- print " 0 = Account ok 6 = Your Game's EXE file is not the latest version\n";
- }
- print " 1 = Unregistered ID 7 = You are Prohibited to log in until %s\n";
- print " 2 = Incorrect Password 8 = Server is jammed due to over populated\n";
- print " 3 = This ID is expired 9 = No MSG\n";
- print " 4 = Rejected from Server 100 = This ID has been totally erased\n";
- print " 5 = You have been blocked by the GM Team\n";
- if ($defaultlanguage eq "F") {
- print "<exemples> state nomtest 5\n";
- print " state nomtest 7 fin de votre ban\n";
- print " block <nom du compte>\n";
- print " unblock <nom du compte>\n";
- } else {
- print "<examples> state testname 5\n";
- print " state testname 7 end of your ban\n";
- print " block <account name>\n";
- print " unblock <account name>\n";
- }
- return 151;
- }
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemples> state nomtest 5\n";
- print " state nomtest 7 fin de votre ban\n";
- print " block <nom du compte>\n";
- print " unblock <nom du compte>\n";
- } else {
- print "Please input an account name.\n";
- print "<examples> state testname 5\n";
- print " state testname 7 end of your ban\n";
- print " block <account name>\n";
- print " unblock <account name>\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
- if ($s != 7) {
- $error_message = "-";
- } else {
- if (length($error_message) < 1) {
- if ($defaultlanguage eq "F") {
- print "Message d'erreur trop court. Entrez un message de 1-19 caractères.\n";
- } else {
- print "Error message is too short. Please input a message of 1-19 bytes.\n";
- }
- return 102;
- }
- if (length($error_message) > 19) {
- if ($defaultlanguage eq "F") {
- print "Message d'erreur trop long. Entrez un message de 1-19 caractères.\n";
- } else {
- print "Error message is too long. Please input a message of 1-19 bytes.\n";
- }
- return 102;
- }
- }
- print $so pack("va24Va20", 0x7936, $userid, $s, $error_message);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7937) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 152;
- }
- $buf = readso(32);
- my(@dat) = unpack("Va24V", $buf);
- while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
- chop($dat[1]);
- };
- if ($dat[0] != -1 && $dat[0] != 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Statut du compte [$dat[1]][id: $dat[0]] changé avec succès en [";
- } else {
- print "Account [$dat[1]][id: $dat[0]] state successfully changed in [";
- }
- print ((($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
- "Unregistered ID",
- "Incorrect Password",
- "This ID is expired",
- "Rejected from Server",
- "You have been blocked by the GM Team",
- "Your Game's EXE file is not the latest version",
- "You are Prohibited to log in until %s",
- "Server is jammed due to over populated",
- "No MSG",
- "This ID has been totally erased")[$dat[2] == 100 ? 10 : $dat[2]]);
- print "].\n";
- } else {
- if ($defaultlanguage eq "F") {
- print "Echec du changement du statut du compte [$userid]. Le compte n'existe pas.\n";
- } else {
- print "Account [$userid] state changing failed. Account doesn't exist.\n";
- }
- }
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Displaying of the number of online players
-sub getlogincount {
- # Request to the login-server
- print $so pack("v", 0x7938);
- $so->flush();
-
- $buf = readso(4);
- # Connection failed
- if (unpack("v", $buf) != 0x7939) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- exit(3);
- }
-
- # Get length of the received packet
- my($len) = unpack("x2v", $buf) - 4;
-
- # Read information of the servers
- if ($len < 1) {
- if ($defaultlanguage eq "F") {
- printf " Aucun serveur n'est connecté au login serveur.\n";
- } else {
- printf " No server is connected to the login-server.\n";
- }
- } else {
- my(@slist) = ();
- for(; $len > 0; $len -= 32) {
- my($name, $count) = unpack("x6 a20 V", readso(32));
- $name = substr($name, 0, index($name, "\0"));
- push @slist, [ $name, $count ];
- }
- # Displaying of result
- my($i);
- if ($defaultlanguage eq "F") {
- printf " Nombre de joueurs en ligne (serveur: nb):\n";
- } else {
- printf " Number of online players (server: number).\n";
- }
- foreach $i(@slist) {
- printf " %-20s : %5d\n", $i->[0], $i->[1];
- }
- }
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Modification of a memo field
-sub changememo {
- my($userid, $memo) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple> memo nomtest nouveau memo\n";
- } else {
- print "Please input an account name.\n";
- print "<example> memo testname new memo\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
- if (length($memo) > 254) {
- if ($defaultlanguage eq "F") {
- print "Mémo trop long (".length($memo)." caractères).\n";
- print "Entrez un mémo de 254 caractères maximum svp.\n";
- } else {
- print "Memo is too long (".length($memo)." characters).\n";
- print "Please input a memo of 254 bytes at the maximum.\n";
- }
- return 102;
- }
- if (length($memo) == 0) {
- print $so pack("va24v", 0x7942, $userid, 0);
- } else {
- print $so pack("va24va".length($memo), 0x7942, $userid, length($memo), $memo);
- }
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7943) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 152;
- }
- $buf = readso(28);
- my($id2, $name) = unpack("Va24", $buf);
- while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
- chop($name);
- };
- if ($id2 == -1 || $id2 == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Echec du changement du mémo du compte [$userid]. Le compte n'existe pas.\n";
- } else {
- print "Account [$userid] memo changing failed. Account doesn't exist.\n";
- }
- } else {
- if ($defaultlanguage eq "F") {
- print "Mémo du compte [$name][id: $id2] changé avec succès.\n";
- } else {
- print "Account [$name][id: $id2] memo successfully changed.\n";
- }
- }
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Request to obtain an account id
-sub idaccount() {
- my($userid) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple> id nomtest\n";
- } else {
- print "Please input an account name.\n";
- print "<example> id testname\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
- print $so pack("va24", 0x7944, $userid);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7945) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 122;
- }
- $buf = readso(28);
- my($id2, $name) = unpack("Va24", $buf);
- while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
- chop($name);
- };
- if ($id2 == -1 || $id2 == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Impossible de trouver l'id du compte [$userid]. Le compte n'existe pas.\n";
- } else {
- print "Unabled to find the account [$userid] id. Account doesn't exist.\n";
- }
- return 123;
- } else {
- if ($defaultlanguage eq "F") {
- print "Le compte [$name] a pour id: $id2.\n";
- } else {
- print "The account [$name] have the id: $id2.\n";
- }
- }
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Request to obtain an account name
-sub nameaccount() {
- my($id) = @_;
- if ($id < 0) {
- if ($defaultlanguage eq "F") {
- print "Entrez un id ayant une valeur positive svp.\n";
- } else {
- print "Please input a positive value for the id.\n";
- }
- return 136;
- }
- print $so pack("vV", 0x7946, $id);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7947) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 122;
- }
- $buf = readso(28);
- my($id2, $name) = unpack("Va24", $buf);
- while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
- chop($name);
- };
- if (length($name) == 0 || $name eq "") {
- if ($defaultlanguage eq "F") {
- print "Impossible de trouver le nom du compte [id: $id2]. Le compte n'existe pas.\n";
- } else {
- print "Unabled to find the account [id: $id2] name. Account doesn't exist.\n";
- }
- return 123;
- } else {
- if ($defaultlanguage eq "F") {
- print "Le compte [id: $id2] a pour nom: $name.\n";
- } else {
- print "The account [id: $id2] have the name: $name.\n";
- }
- }
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Set a validity limit of an account
-sub timesetaccount() {
- my($userid, $date, $time) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple>: timeset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n";
- print " timeset <nom_du_compte> 0 (0 = illimité)\n";
- printf " Heure par défaut [hh:mm:ss]: 23:59:59\n";
- } else {
- print "Please input an account name.\n";
- print "<example>: timeset <account_name> yyyy/mm/dd [hh:mm:ss]\n";
- print " timeset <account_name> 0 (0 = unlimited)\n";
- printf " Default time [hh:mm:ss]: 23:59:59\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
- my($year, $month, $day) = split(/[.\-\/]/, $date);
- my($hour, $minute, $second) = split(/:/, $time);
- if ($time eq "") {
- $hour = 23;
- $minute = 59;
- $second = 59;
- }
- my($timestamp);
- if ($year eq "" ||
- ($year != 0 && ($month eq "" || $day eq "" || $hour eq "" || $minute eq "" || $second eq ""))) {
- if ($defaultlanguage eq "F") {
- print "Entrez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n";
- } else {
- print "Please input 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n";
- }
- return 102;
- }
- if ($year == 0) {
- $timestamp = 0;
- } else {
- if ($year < 70) {
- $year = $year + 100;
- }
- if ($year >= 1900) {
- $year = $year - 1900;
- }
- if ($month < 1 || $month > 12) {
- if ($defaultlanguage eq "F") {
- print "Entrez un mois correct svp (entre 1 et 12).\n";
- } else {
- print "Please give a correct value for the month (from 1 to 12).\n";
- }
- return 102;
- }
- $month = $month - 1;
- if ($day < 1 || $day > 31) {
- if ($defaultlanguage eq "F") {
- print "Entrez un jour correct svp (entre 1 et 31).\n";
- } else {
- print "Please give a correct value for the day (from 1 to 31).\n";
- }
- return 102;
- }
- if ((($month == 3 || $month == 5 || $month == 8 || $month == 10) && $day > 30) ||
- ($month == 1 && $day > 29)) {
- if ($defaultlanguage eq "F") {
- print "Entrez un jour correct en fonction du mois svp.\n";
- } else {
- print "Please give a correct value for a day of this month.\n";
- }
- return 102;
- }
- if ($hour < 0 || $hour > 23) {
- if ($defaultlanguage eq "F") {
- print "Entrez une heure correcte svp (entre 0 et 23).\n";
- } else {
- print "Please give a correct value for the hour (from 0 to 23).\n";
- }
- return 102;
- }
- if ($minute < 0 || $minute > 59) {
- if ($defaultlanguage eq "F") {
- print "Entrez des minutes correctes svp (entre 0 et 59).\n";
- } else {
- print "Please give a correct value for the minutes (from 0 to 59).\n";
- }
- return 102;
- }
- if ($second < 0 || $second > 59) {
- if ($defaultlanguage eq "F") {
- print "Entrez des secondes correctes svp (entre 0 et 59).\n";
- } else {
- print "Please give a correct value for the seconds (from 0 to 59).\n";
- }
- return 102;
- }
- $timestamp = POSIX::mktime($second, $minute, $hour, $day, $month, $year, 0, 0, -1); # -1: no winter/summer time modification
- if ($timestamp == undef) {
- if ($defaultlanguage eq "F") {
- print "Date incorrecte.\n";
- print "Ajoutez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n";
- } else {
- print "Invalid date.\n";
- print "Please add 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n";
- }
- return 102;
- }
- }
-
- print $so pack("va24V", 0x7948, $userid, $timestamp);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7949) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 152;
- }
- $buf = readso(32);
- my(@dat) = unpack("Va24V", $buf);
- while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
- chop($dat[1]);
- };
- if ($dat[0] != -1 && $dat[0] != 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Limite de validité du compte [$dat[1]][id: $dat[0]] changée avec succès ".
- ($dat[2] == 0 ? "en [illimité].\n" : "pour être jusqu'au ".(POSIX::ctime($dat[2])));
- } else {
- print "Validity Limit of the account [$dat[1]][id: $dat[0]] successfully changed ".
- ($dat[2] == 0 ? "to [unlimited].\n" : "to be until ".(POSIX::ctime($dat[2])));
- }
- # localtime($dat[2]) is also possible to display instead of POSIX::ctime.
- } else {
- if ($defaultlanguage eq "F") {
- print "Echec du changement de la validité du compte [$userid]. Le compte n'existe pas.\n";
- } else {
- print "Account [$userid] validity limit changing failed. Account doesn't exist.\n";
- }
- }
-
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Add/substract time to the validity limit of an account
-sub timeaddaccount() {
- my($userid, $modif) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print " <exemple> timeadd nomtest +1m-2mn1s-6y\n";
- print " Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n";
- print " et 6 ans dans le même temps.\n";
- } else {
- print "Please input an account name.\n";
- print " <example> timeadd testname +1m-2mn1s-6y\n";
- print " this example adds 1 month and 1 second, and substracts 2 minutes\n";
- print " and 6 years at the same time.\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
- my($year, $month, $day) = (0, 0 ,0);
- my($hour, $minute, $second) = (0, 0 ,0);
-
- $modif = lc($modif);
- while (length($modif) > 0) {
- my($value) = int($modif);
- if ($value == 0) {
- $modif = substr($modif, 1);
- } else {
- if (substr($modif, 0, 1) =~ /[\-\+]/) {
- $modif = substr($modif, 1);
- }
- while (length($modif) > 0 && substr($modif, 0, 1) =~ /[0-9]/) {
- $modif = substr($modif, 1);
- }
- if (index($modif, "s") == 0) {
- $second = $value;
- $modif = substr($modif, 1);
- } elsif (index($modif, "mn") == 0) {
- $minute = $value;
- $modif = substr($modif, 2);
- } elsif (index($modif, "h") == 0) {
- $hour = $value;
- $modif = substr($modif, 1);
- } elsif (index($modif, "d") == 0 || index($modif, "j") == 0) {
- $day = $value;
- $modif = substr($modif, 1);
- } elsif (index($modif, "m") == 0) {
- $month = $value;
- $modif = substr($modif, 1);
- } elsif (index($modif, "y") == 0 || index($modif, "a") == 0) {
- $year = $value;
- $modif = substr($modif, 1);
- } else {
- $modif = substr($modif, 1);
- }
- }
- }
-
- if ($defaultlanguage eq "F") {
- print " année: $year\n";
- print " mois: $month\n";
- print " jour: $day\n";
- print " heure: $hour\n";
- print " minute: $minute\n";
- print " seconde: $second\n";
- } else {
- print " year: $year\n";
- print " month: $month\n";
- print " day: $day\n";
- print " hour: $hour\n";
- print " minute: $minute\n";
- print " second: $second\n";
- }
-
- if ($year == 0 && $month == 0 && $day == 0 && $hour == 0 && $minute == 0 && $second == 0) {
- if ($defaultlanguage eq "F") {
- print "Vous devez entrer un ajustement avec cette commande, svp:\n";
- print " Valeur d'ajustement (-1, 1, +1, etc...)\n";
- print " Element modifié:\n";
- print " a ou y: année\n";
- print " m: mois\n";
- print " j ou d: jour\n";
- print " h: heure\n";
- print " mn: minute\n";
- print " s: seconde\n";
- print " <exemple> timeadd nomtest +1m-2mn1s-6y\n";
- print " Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n";
- print " et 6 ans dans le même temps.\n";
- } else {
- print "Please give an adjustment with this command:\n";
- print " Adjustment value (-1, 1, +1, etc...)\n";
- print " Modified element:\n";
- print " a or y: year\n";
- print " m: month\n";
- print " j or d: day\n";
- print " h: hour\n";
- print " mn: minute\n";
- print " s: second\n";
- print " <example> timeadd testname +1m-2mn1s-6y\n";
- print " this example adds 1 month and 1 second, and substracts 2 minutes\n";
- print " and 6 years at the same time.\n";
- }
- return 137;
- }
- if ($year > 127 || $year < -127) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement d'années correct (de -127 à 127), svp.\n";
- } else {
- print "Please give a correct adjustment for the years (from -127 to 127).\n";
- }
- return 137;
- }
- if ($month > 255 || $month < -255) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement de mois correct (de -255 à 255), svp.\n";
- } else {
- print "Please give a correct adjustment for the months (from -255 to 255).\n";
- }
- return 137;
- }
- if ($day > 32767 || $day < -32767) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement de jours correct (de -32767 à 32767), svp.\n";
- } else {
- print "Please give a correct adjustment for the days (from -32767 to 32767).\n";
- }
- return 137;
- }
- if ($hour > 32767 || $hour < -32767) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement d'heures correct (de -32767 à 32767), svp.\n";
- } else {
- print "Please give a correct adjustment for the hours (from -32767 to 32767).\n";
- }
- return 137;
- }
- if ($minute > 32767 || $minute < -32767) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement de minutes correct (de -32767 à 32767), svp.\n";
- } else {
- print "Please give a correct adjustment for the minutes (from -32767 to 32767).\n";
- }
- return 137;
- }
- if ($second > 32767 || $second < -32767) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement de secondes correct (de -32767 à 32767), svp.\n";
- } else {
- print "Please give a correct adjustment for the seconds (from -32767 to 32767).\n";
- }
- return 137;
- }
-
- print $so pack("va24vvvvvv", 0x7950, $userid, $year, $month, $day, $hour, $minute, $second);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7951) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 152;
- }
- $buf = readso(32);
- my(@dat) = unpack("Va24V", $buf);
- while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
- chop($dat[1]);
- };
- if ($dat[0] == -1 || $dat[0] == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Echec du changement de la validité du compte [$userid]. Le compte n'existe pas.\n";
- } else {
- print "Account [$userid] validity limit changing failed. Account doesn't exist.\n";
- }
- } elsif ($dat[2] == 0) {
- if ($defaultlanguage eq "F") {
- print "Limite de validité du compte [$dat[1]][id: $dat[0]] inchangée.\n";
- print "Le compte a une validité illimitée ou\n";
- print "la modification est impossible avec les ajustements demandés.\n";
- } else {
- print "Validity limit of the account [$dat[1]][id: $dat[0]] unchanged.\n";
- print "The account have an unlimited validity limit or\n";
- print "the changing is impossible with the proposed adjustments.\n";
- }
- } else {
- if ($defaultlanguage eq "F") {
- print "Limite de validité du compte [$dat[1]][id: $dat[0]] changée avec succès ".
- ($dat[2] == 0 ? "en [illimité].\n" : "pour être jusqu'au ".(POSIX::ctime($dat[2])));
- } else {
- print "Validity limit of the account [$dat[1]][id: $dat[0]] successfully changed ".
- ($dat[2] == 0 ? "to [unlimited].\n" : "to be until ".(POSIX::ctime($dat[2])));
- }
- # localtime($dat[2]) is also possible to display instead of POSIX::ctime.
- }
-
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Set the final date of a banishment of an account
-sub bansetaccount() {
- my($userid, $date, $time) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple>: banset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n";
- print " banset <nom_du_compte> 0 (0 = dé-bani)\n";
- print " ban/banish aaaa/mm/jj hh:mm:ss <nom du compte>\n";
- print " unban/unbanish <nom du compte>\n";
- printf " Heure par défaut [hh:mm:ss]: 23:59:59\n";
- } else {
- print "Please input an account name.\n";
- print "<example>: banset <account_name> yyyy/mm/dd [hh:mm:ss]\n";
- print " banset <account_name> 0 (0 = un-banished)\n";
- print " ban/banish yyyy/mm/dd hh:mm:ss <account name>\n";
- print " unban/unbanish <account name>\n";
- printf " Default time [hh:mm:ss]: 23:59:59\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
- my($year, $month, $day) = split(/[.\-\/]/, $date);
- my($hour, $minute, $second) = split(/:/, $time);
- if ($time eq "") {
- $hour = 23;
- $minute = 59;
- $second = 59;
- }
- my($timestamp);
- if ($year eq "" ||
- ($year != 0 && ($month eq "" || $day eq "" || $hour eq "" || $minute eq "" || $second eq ""))) {
- if ($defaultlanguage eq "F") {
- print "Entrez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n";
- } else {
- print "Please input 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n";
- }
- return 102;
- }
- if ($year == 0) {
- $timestamp = 0;
- } else {
- if ($year < 70) {
- $year = $year + 100;
- }
- if ($year >= 1900) {
- $year = $year - 1900;
- }
- if ($month < 1 || $month > 12) {
- if ($defaultlanguage eq "F") {
- print "Entrez un mois correct svp (entre 1 et 12).\n";
- } else {
- print "Please give a correct value for the month (from 1 to 12).\n";
- }
- return 102;
- }
- $month = $month - 1;
- if ($day < 1 || $day > 31) {
- if ($defaultlanguage eq "F") {
- print "Entrez un jour correct svp (entre 1 et 31).\n";
- } else {
- print "Please give a correct value for the day (from 1 to 31).\n";
- }
- return 102;
- }
- if ((($month == 3 || $month == 5 || $month == 8 || $month == 10) && $day > 30) ||
- ($month == 1 && $day > 29)) {
- if ($defaultlanguage eq "F") {
- print "Entrez un jour correct en fonction du mois svp.\n";
- } else {
- print "Please give a correct value for a day of this month.\n";
- }
- return 102;
- }
- if ($hour < 0 || $hour > 23) {
- if ($defaultlanguage eq "F") {
- print "Entrez une heure correcte svp (entre 0 et 23).\n";
- } else {
- print "Please give a correct value for the hour (from 0 to 23).\n";
- }
- return 102;
- }
- if ($minute < 0 || $minute > 59) {
- if ($defaultlanguage eq "F") {
- print "Entrez des minutes correctes svp (entre 0 et 59).\n";
- } else {
- print "Please give a correct value for the minutes (from 0 to 59).\n";
- }
- return 102;
- }
- if ($second < 0 || $second > 59) {
- if ($defaultlanguage eq "F") {
- print "Entrez des secondes correctes svp (entre 0 et 59).\n";
- } else {
- print "Please give a correct value for the seconds (from 0 to 59).\n";
- }
- return 102;
- }
- $timestamp = POSIX::mktime($second, $minute, $hour, $day, $month, $year, 0, 0, -1); # -1: no winter/summer time modification
- if ($timestamp == undef) {
- if ($defaultlanguage eq "F") {
- print "Date incorrecte.\n";
- print "Ajoutez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n";
- } else {
- print "Invalid date.\n";
- print "Please add 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n";
- }
- return 102;
- }
- }
-
- print $so pack("va24V", 0x794a, $userid, $timestamp);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x794b) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 152;
- }
- $buf = readso(32);
- my(@dat) = unpack("Va24V", $buf);
- while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
- chop($dat[1]);
- };
- if ($dat[0] != -1 && $dat[0] != 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Date finale de banissement du compte [$dat[1]][id: $dat[0]] changée avec succès ".
- ($dat[2] == 0 ? "en [dé-bannie].\n" : "pour être jusqu'au ".(POSIX::ctime($dat[2])));
- } else {
- print "Final date of banishment of the account [$dat[1]][id: $dat[0]] successfully changed ".
- ($dat[2] == 0 ? "to [unbanished].\n" : "to be until ".(POSIX::ctime($dat[2])));
- }
- # localtime($dat[2]) is also possible to display instead of POSIX::ctime.
- } else {
- if ($defaultlanguage eq "F") {
- print "Echec du changement de la date finale de banissement du compte [$userid]. Le compte n'existe pas.\n";
- } else {
- print "Account [$userid] final date of banishment changing failed. Account doesn't exist.\n";
- }
- }
-
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Add/substract time to the final date of a banishment of an account
-sub banaddaccount() {
- my($userid, $modif) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print " <exemple> banadd nomtest +1m-2mn1s-6y\n";
- print " Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n";
- print " et 6 ans dans le même temps.\n";
- } else {
- print "Please input an account name.\n";
- print " <example> banadd testname +1m-2mn1s-6y\n";
- print " this example adds 1 month and 1 second, and substracts 2 minutes\n";
- print " and 6 years at the same time.\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
- my($year, $month, $day) = (0, 0 ,0);
- my($hour, $minute, $second) = (0, 0 ,0);
-
- $modif = lc($modif);
- while (length($modif) > 0) {
- my($value) = int($modif);
- if ($value == 0) {
- $modif = substr($modif, 1);
- } else {
- if (substr($modif, 0, 1) =~ /[\-\+]/) {
- $modif = substr($modif, 1);
- }
- while (length($modif) > 0 && substr($modif, 0, 1) =~ /[0-9]/) {
- $modif = substr($modif, 1);
- }
- if (index($modif, "s") == 0) {
- $second = $value;
- $modif = substr($modif, 1);
- } elsif (index($modif, "mn") == 0) {
- $minute = $value;
- $modif = substr($modif, 2);
- } elsif (index($modif, "h") == 0) {
- $hour = $value;
- $modif = substr($modif, 1);
- } elsif (index($modif, "d") == 0 || index($modif, "j") == 0) {
- $day = $value;
- $modif = substr($modif, 1);
- } elsif (index($modif, "m") == 0) {
- $month = $value;
- $modif = substr($modif, 1);
- } elsif (index($modif, "y") == 0 || index($modif, "a") == 0) {
- $year = $value;
- $modif = substr($modif, 1);
- } else {
- $modif = substr($modif, 1);
- }
- }
- }
-
- if ($defaultlanguage eq "F") {
- print " année: $year\n";
- print " mois: $month\n";
- print " jour: $day\n";
- print " heure: $hour\n";
- print " minute: $minute\n";
- print " seconde: $second\n";
- } else {
- print " year: $year\n";
- print " month: $month\n";
- print " day: $day\n";
- print " hour: $hour\n";
- print " minute: $minute\n";
- print " second: $second\n";
- }
-
- if ($year == 0 && $month == 0 && $day == 0 && $hour == 0 && $minute == 0 && $second == 0) {
- if ($defaultlanguage eq "F") {
- print "Vous devez entrer un ajustement avec cette commande, svp:\n";
- print " Valeur d'ajustement (-1, 1, +1, etc...)\n";
- print " Element modifié:\n";
- print " a ou y: année\n";
- print " m: mois\n";
- print " j ou d: jour\n";
- print " h: heure\n";
- print " mn: minute\n";
- print " s: seconde\n";
- print " <exemple> banadd nomtest +1m-2mn1s-6y\n";
- print " Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n";
- print " et 6 ans dans le même temps.\n";
- } else {
- print "Please give an adjustment with this command:\n";
- print " Adjustment value (-1, 1, +1, etc...)\n";
- print " Modified element:\n";
- print " a or y: year\n";
- print " m: month\n";
- print " j or d: day\n";
- print " h: hour\n";
- print " mn: minute\n";
- print " s: second\n";
- print " <example> banadd testname +1m-2mn1s-6y\n";
- print " this example adds 1 month and 1 second, and substracts 2 minutes\n";
- print " and 6 years at the same time.\n";
- }
- return 137;
- }
- if ($year > 127 || $year < -127) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement d'années correct (de -127 à 127), svp.\n";
- } else {
- print "Please give a correct adjustment for the years (from -127 to 127).\n";
- }
- return 137;
- }
- if ($month > 255 || $month < -255) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement de mois correct (de -255 à 255), svp.\n";
- } else {
- print "Please give a correct adjustment for the months (from -255 to 255).\n";
- }
- return 137;
- }
- if ($day > 32767 || $day < -32767) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement de jours correct (de -32767 à 32767), svp.\n";
- } else {
- print "Please give a correct adjustment for the days (from -32767 to 32767).\n";
- }
- return 137;
- }
- if ($hour > 32767 || $hour < -32767) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement d'heures correct (de -32767 à 32767), svp.\n";
- } else {
- print "Please give a correct adjustment for the hours (from -32767 to 32767).\n";
- }
- return 137;
- }
- if ($minute > 32767 || $minute < -32767) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement de minutes correct (de -32767 à 32767), svp.\n";
- } else {
- print "Please give a correct adjustment for the minutes (from -32767 to 32767).\n";
- }
- return 137;
- }
- if ($second > 32767 || $second < -32767) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement de secondes correct (de -32767 à 32767), svp.\n";
- } else {
- print "Please give a correct adjustment for the seconds (from -32767 to 32767).\n";
- }
- return 137;
- }
-
- print $so pack("va24vvvvvv", 0x794c, $userid, $year, $month, $day, $hour, $minute, $second);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x794d) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 152;
- }
- $buf = readso(32);
- my(@dat) = unpack("Va24V", $buf);
- while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
- chop($dat[1]);
- };
- if ($dat[0] == -1 || $dat[0] == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Echec du changement de la date finale de banissement du compte [$userid]. Le compte n'existe pas.\n";
- } else {
- print "Account [$userid] final date of banishment changing failed. Account doesn't exist.\n";
- }
- } else {
- if ($defaultlanguage eq "F") {
- print "Date finale de banissement du compte [$dat[1]][id: $dat[0]] changée avec succès ".
- ($dat[2] == 0 ? "en [dé-bannie].\n" : "pour être jusqu'au ".(POSIX::ctime($dat[2])));
- } else {
- print "Final date of banishment of the account [$dat[1]][id: $dat[0]] successfully changed ".
- ($dat[2] == 0 ? "to [unbanished].\n" : "to be until ".(POSIX::ctime($dat[2])));
- }
- # localtime($dat[2]) is also possible to display instead of POSIX::ctime.
- }
-
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Request to displaying information about an account (by its name)
-sub whoaccount() {
- my($userid) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple> who nomtest\n";
- } else {
- print "Please input an account name.\n";
- print "<example> who testname\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
-
- print $so pack("va24", 0x7952, $userid);
- $so->flush();
-
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7953) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 122;
- }
- my($id2, $GM_level, $name, $sex, $count, $status, $error_message, $last_login, $last_ip, $email, $validite, $ban_date, $memo_size) = unpack("VCa24cVVa20a24a16a40VVv", readso(148));
- my($memo) = "";
- if ($memo_size > 0) {
- $memo = unpack("a".$memo_size, readso($memo_size));
- }
- while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
- chop($name);
- };
- while (length($error_message) > 0 && substr($error_message, length($error_message)-1, 1) eq chr(0)) {
- chop($error_message);
- };
- while (length($last_login) > 0 && substr($last_login, length($last_login)-1, 1) eq chr(0)) {
- chop($last_login);
- };
- while (length($last_ip) > 0 && substr($last_ip, length($last_ip)-1, 1) eq chr(0)) {
- chop($last_ip);
- };
- while (length($email) > 0 && substr($email, length($email)-1, 1) eq chr(0)) {
- chop($email);
- };
- while (length($memo) > 0 && substr($memo, length($memo)-1, 1) eq chr(0)) {
- chop($memo);
- };
-
- if ($id2 == -1 || $id2 == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Impossible de trouver le compte [$userid]. Le compte n'existe pas.\n";
- } else {
- print "Unabled to find the account [$userid]. Account doesn't exist.\n";
- }
- return 123;
- } else {
- if ($defaultlanguage eq "F") {
- print "Le compte [$userid] a les caractéristiques suivantes:\n";
- } else {
- print "The account [$userid] is set with:\n";
- }
- if ($GM_level == 0) {
- print " Id: $id2 (non-GM)\n";
- } else {
- if ($defaultlanguage eq "F") {
- print " Id: $id2 (GM niveau $GM_level)\n";
- } else {
- print " Id: $id2 (GM level $GM_level)\n";
- }
- }
- if ($defaultlanguage eq "F") {
- print " Nom: '$name'\n";
- print " Sexe: ".("Femme", "Male", "Serveur")[$sex]."\n";
- } else {
- print " Name: '$name'\n";
- print " Sex: ".("Female", "Male", "Server")[$sex]."\n";
- }
- print " E-mail: $email\n";
- if ($status == 7) {
- print " Statut: 7 [You are Prohibited to log in until $error_message]\n";
- } else {
- print " Statut: $status [".(
- ($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
- "Unregistered ID",
- "Incorrect Password",
- "This ID is expired",
- "Rejected from Server",
- "You have been blocked by the GM Team",
- "Your Game's EXE file is not the latest version",
- "You are Prohibited to log in until %s",
- "Server is jammed due to over populated",
- "No MSG",
- "This ID is totally erased")[$status == 100 ? 10 : $status]."]\n";
- }
- if ($defaultlanguage eq "F") {
- print " Banissement: ".($ban_date == 0 ? "non banni.\n" : "jusqu'au ".(POSIX::ctime($ban_date)));
- print " Compteur: $count connexion".("s", "")[$count > 1 ? 0 : 1]."\n";
- print " Dernière connexion le: $last_login (ip: $last_ip)\n";
- print " Limite de validité: ".($validite == 0 ? "illimité.\n" : "jusqu'au ".(POSIX::ctime($validite)));
- } else {
- print " Banishment: ".($ban_date == 0 ? "not banished.\n" : "until ".(POSIX::ctime($ban_date)));
- print " Count: $count connection".("s", "")[$count > 1 ? 0 : 1]."\n";
- print " Last connection at: $last_login (ip: $last_ip)\n";
- print " Validity limit: ".($validite == 0 ? "unlimited.\n" : "until ".(POSIX::ctime($validite)));
- }
- print " Memo: '$memo'\n";
- }
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Request to displaying information about an account (by its id)
-sub infoaccount() {
- my($id) = @_;
- if ($id < 0) {
- if ($defaultlanguage eq "F") {
- print "Entrez un id ayant une valeur positive svp.\n";
- } else {
- print "Please input a positive value for the id.\n";
- }
- return 136;
- }
-
- print $so pack("vV", 0x7954, $id);
- $so->flush();
-
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7953) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 122;
- }
- my($id2, $GM_level, $name, $sex, $count, $status, $error_message, $last_login, $last_ip, $email, $validite, $ban_date, $memo_size) = unpack("VCa24cVVa20a24a16a40VVv", readso(148));
- my($memo) = "";
- if ($memo_size > 0) {
- $memo = unpack("a".$memo_size, readso($memo_size));
- }
- while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
- chop($name);
- };
- while (length($error_message) > 0 && substr($error_message, length($error_message)-1, 1) eq chr(0)) {
- chop($error_message);
- };
- while (length($last_login) > 0 && substr($last_login, length($last_login)-1, 1) eq chr(0)) {
- chop($last_login);
- };
- while (length($last_ip) > 0 && substr($last_ip, length($last_ip)-1, 1) eq chr(0)) {
- chop($last_ip);
- };
- while (length($email) > 0 && substr($email, length($email)-1, 1) eq chr(0)) {
- chop($email);
- };
- while (length($memo) > 0 && substr($memo, length($memo)-1, 1) eq chr(0)) {
- chop($memo);
- };
-
- if (length($name) == 0 || $name eq "") {
- if ($defaultlanguage eq "F") {
- print "Impossible de trouver le nom du compte [id: $id2]. Le compte n'existe pas.\n";
- } else {
- print "Unabled to find the account [id: $id2] name. Account doesn't exist.\n";
- }
- return 123;
- } else {
- if ($defaultlanguage eq "F") {
- print "Le compte [id: $id2] a les caractéristiques suivantes:\n";
- } else {
- print "The account [id: $id2] is set with:\n";
- }
- if ($GM_level == 0) {
- print " Id: $id2 (non-GM)\n";
- } else {
- if ($defaultlanguage eq "F") {
- print " Id: $id2 (GM niveau $GM_level)\n";
- } else {
- print " Id: $id2 (GM level $GM_level)\n";
- }
- }
- if ($defaultlanguage eq "F") {
- print " Nom: '$name'\n";
- print " Sexe: ".("Femme", "Male", "Serveur")[$sex]."\n";
- } else {
- print " Name: '$name'\n";
- print " Sex: ".("Female", "Male", "Server")[$sex]."\n";
- }
- print " E-mail: $email\n";
- if ($status == 7) {
- print " Statut: 7 [You are Prohibited to log in until $error_message]\n";
- } else {
- print " Statut: $status [".(
- ($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
- "Unregistered ID",
- "Incorrect Password",
- "This ID is expired",
- "Rejected from Server",
- "You have been blocked by the GM Team",
- "Your Game's EXE file is not the latest version",
- "You are Prohibited to log in until %s",
- "Server is jammed due to over populated",
- "No MSG",
- "This ID is totally erased")[$status == 100 ? 10 : $status]."]\n";
- }
- if ($defaultlanguage eq "F") {
- print " Banissement: ".($ban_date == 0 ? "non banni.\n" : "jusqu'au ".(POSIX::ctime($ban_date)));
- print " Compteur: $count connexion".("s", "")[$count > 1 ? 0 : 1]."\n";
- print " Dernière connexion le: $last_login (ip: $last_ip)\n";
- print " Limite de validité: ".($validite == 0 ? "illimité.\n" : "jusqu'au ".(POSIX::ctime($validite)));
- } else {
- print " Banishment: ".($ban_date == 0 ? "not banished.\n" : "until ".(POSIX::ctime($ban_date)));
- print " Count: $count connection".("s", "")[$count > 1 ? 0 : 1]."\n";
- print " Last connection at: $last_login (ip: $last_ip)\n";
- print " Validity limit: ".($validite == 0 ? "unlimited.\n" : "until ".(POSIX::ctime($validite)));
- }
- print " Memo: '$memo'\n";
- }
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Check the validity of a password
-# (Note: never send back a password with login-server!! security of passwords)
-sub checkaccount() {
- my($userid, $passwd) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple> check testname motdepasse\n";
- } else {
- print "Please input an account name.\n";
- print "<example> check testname password\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
- if ($passwd eq "") {
- return 134 if (($passwd = typepasswd()) eq "");
- }
- if (verify_password($passwd) == 0) {
- return 131;
- }
- print $so pack("va24a24", 0x793a, $userid,$passwd);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x793b) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 132;
- }
- $buf = readso(28);
- my($id2, $name) = unpack("Va24", $buf);
- while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
- chop($name);
- };
- if ($id2 == -1 || $id2 == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Le compte [$userid] n'existe pas ou le mot de passe est incorrect.\n";
- } else {
- print "The account [$userid] doesn't exist or the password is incorrect.\n";
- }
- return 133;
- } else {
- if ($defaultlanguage eq "F") {
- print "Le mot de passe donné correspond bien au compte [$name][id: $id2].\n";
- } else {
- print "The proposed password is correct for the account [$name][id: $id2].\n";
- }
- }
- return 130;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Request to login-server to reload GM configuration file
-sub reloadGM() {
- print $so pack("v", 0x7955);
- $so->flush();
- if ($defaultlanguage eq "F") {
- print "Demande de recharger le fichier de configuration des GM envoyée.\n";
- print "Vérifiez les comptes GM actuels (après rechargement):\n";
- } else {
- print "Request to reload the GM configuration file sended.\n";
- print "Check the actual GM accounts (after reloading):\n";
- }
- &listaccount(0, 0, 1); # 1: to list only GM
- return 180;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Send a broadcast message
-sub sendbroadcast() {
- my($type, $message) = @_;
- if ($message eq "" || length($message) == 0) {
- if ($defaultlanguage eq "F") {
- print "Entrez un message svp.\n";
- if ($type == 0) {
- print "<exemple> kami un message\n";
- } else {
- print "<exemple> kamib un message\n";
- }
- } else {
- print "Please input a message.\n";
- if ($type == 0) {
- print "<example> kami a message\n";
- } else {
- print "<example> kamib a message\n";
- }
- }
- return 136;
- }
-
- print $so pack("vvVa".length($message), 0x794e, $type, length($message), $message);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x794f) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 152;
- }
- $buf = readso(2);
- my($answer) = unpack("v", $buf);
- if ($answer == -1 || $answer == 65535) {
- if ($defaultlanguage eq "F") {
- print "Echec de l'envoi du message. Aucun server de char en ligne.\n";
- } else {
- print "Message sending failed. No online char-server.\n";
- }
- } else {
- if ($defaultlanguage eq "F") {
- print "Message transmis au server de logins avec succès.\n";
- } else {
- print "Message successfully sended to login-server.\n";
- }
- }
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Change language of displaying
-sub changelanguage() {
- my($language) = @_;
- if ($language eq "" || length($language) == 0) {
- if ($defaultlanguage == 'F') {
- printf("Entrez une langue svp.\n");
- printf("<exemple> language english\n");
- printf(" language français\n");
- } else {
- printf("Please input a language.\n");
- printf("<example> language english\n");
- printf(" language français\n");
- }
- return 136;
- }
-
- $language = uc(substr($language, 0, 1));
- if ($language =~ /^[EF]$/) {
- $defaultlanguage = $language;
- if ($defaultlanguage == 'F') {
- printf("Changement de la langue d'affichage en Français.\n");
- } else {
- printf("Displaying language changed to English.\n");
- }
- } else {
- if ($defaultlanguage == 'F') {
- printf("Langue non paramétrée (langues possibles: 'Français' ou 'English').\n");
- } else {
- printf("Undefined language (possible languages: Français or English).\n");
- }
- }
-
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: sending 'end of connection' packet
-sub quit() {
- print $so pack("v", 0x7532);
- $so->flush();
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Get datas from the socket
-sub readso() {
- my($len) = shift;
- my($buf);
- if (read($so, $buf, $len) < $len) {
- if ($defaultlanguage eq "F") {
- print "Erreur de lecture sur la Socket.\n";
- } else {
- print "Socket read error.\n";
- }
- exit(3);
- }
- return $buf;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Input of a password
-sub typepasswd {
- my($passwd1, $passwd2);
- cbreak();
- if ($defaultlanguage eq "F") {
- print "Entrez le mot de passe > "; $passwd1 = <STDIN>; chomp($passwd1); print "\n";
- print "Ré-entrez le mot de passe > "; $passwd2 = <STDIN>; chomp($passwd2); print "\n";
- } else {
- print "Type the password > "; $passwd1 = <STDIN>; chomp($passwd1); print "\n";
- print "Verify the password > "; $passwd2 = <STDIN>; chomp($passwd2); print "\n";
- }
- cooked();
- if ($passwd1 ne $passwd2) {
- if ($defaultlanguage eq "F") {
- print "Erreur de vérification du mot de passe: Saisissez le même mot de passe svp.\n";
- } else {
- print "Password verification failed. Please input same password.\n";
- }
- return "";
- }
- return $passwd1;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Return ordonal text of a number
-sub makeordinal {
- my($c) = shift;
- if ($defaultlanguage eq "F") {
- if ($c < 1) {
- return $c;
- }
- return $c.("er", "ème")[$c == 1 ? 0 : 1];
- } else {
- if ($c % 10 < 4 && $c % 10 != 0 && ($c < 10 || $c > 20)) {
- return $c.("st","nd","rd")[$c % 10 - 1];
- }
- return $c."th";
- }
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Test of the validity of an account name (return 0 if incorrect, and 1 if ok)
-sub verify_accountname {
- my($account_name) = @_; # Get the account_name
- if ($account_name =~ /[\x00-\x1f]/) { # remove control char
- my($c) = length($`) + 1;
- if ($defaultlanguage eq "F") {
- print "Caractère interdit trouvé dans le nom du compte (".makeordinal($c)." caractère).\n";
- } else {
- print "Illegal character found in the account name (".makeordinal($c)." character).\n";
- }
- return 0;
- }
- if (length($account_name) < 4) {
- if ($defaultlanguage eq "F") {
- print "Nom du compte trop court. Entrez un nom de compte de 4-23 caractères.\n";
- } else {
- print "Account name is too short. Please input an account name of 4-23 bytes.\n";
- }
- return 0;
- }
- if (length($account_name) > 23) {
- if ($defaultlanguage eq "F") {
- print "Nom du compte trop long. Entrez un nom de compte de 4-23 caractères.\n";
- } else {
- print "Account name is too long. Please input an account name of 4-23 bytes.\n";
- }
- return 0;
- }
- return 1;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Test of the validity of password (return 0 if incorrect, and 1 if ok)
-sub verify_password {
- my($password) = @_; # Get the password
- if ($password =~ /[\x00-\x1f]/) {
- my($c) = length($`) + 1;
- if ($defaultlanguage eq "F") {
- print "Caractère interdit trouvé dans le mot de passe (".makeordinal($c)." caractère).\n";
- } else {
- print "Illegal character found in the password (".makeordinal($c)." character).\n";
- }
- return 0;
- }
- if (length($password) < 4) {
- if ($defaultlanguage eq "F") {
- print "Mot de passe trop court. Entrez un mot de passe de 4-23 caractères.\n";
- } else {
- print "Password is too short. Please input a password of 4-23 bytes.\n";
- }
- return 0;
- }
- if (length($password) > 23) {
- if ($defaultlanguage eq "F") {
- print "Mot de passe trop long. Entrez un mot de passe de 4-23 caractères.\n";
- } else {
- print "Password is too long. Please input a password of 4-23 bytes.\n";
- }
- return 0;
- }
- return 1;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Test of the validity of an e-mail (return 0 if incorrect, and 1 if ok)
-sub verify_email {
- my($email) = @_; # Get the e-mail
- # To ignore a '.' before the @ (wanadoo, a provider, do that)
- $email =~ s/\.\@/\@/;
- # If the e-mail is void, it's not correct -> return 0
- if ($email eq '') {
- return(0);
- }
- # If the e-mail have no "@", it's not correct -> return 0
- if ($email !~ /\@/) {
- return(0);
- }
- # If the e-mail have a ",", a space, a tab or a ";", it's not correct -> return 0
- if ($email =~ /[\,|\s|\;]/) {
- return(0)
- };
- # IF
- # (the e-mail contains 2 "@", or ".." or "@." or starts or finishes by a ".")
- # OR IF
- # (the e-mail doesn't contain "@localhost" AND
- # - it doesn't contain characters followed by "@" itself followed by letters itself followed by "." and 2 or more letters
- # - or an IP address)
- # -> so, it's not good ! (finish !)
- if ($email =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)|(\.$)/ ||
- ($email !~ /^.+\@localhost$/ &&
- $email !~ /^.+\@\[?(\w|[-.])+\.[a-zA-Z]{2,3}|[0-9]{1,3}\]?$/)) {
- return(0); # non-valid email
- } else {
- # If not, the e-email address is correct
- return(1); # valid email
- }
-} \ No newline at end of file
diff --git a/src/tool/mapcheck.sh b/src/tool/mapcheck.sh
deleted file mode 100644
index 337884c43..000000000
--- a/src/tool/mapcheck.sh
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/sh
-echo "============================================"
-echo "= map server status checker... ="
-echo "============================================"
-./map-server.exe &
-sleep 40
-
-while [ 0 ]
-do
- pcpu=` top -n 1| grep map-server | awk '{print $9}' | awk 'BEGIN{FS="."} {print $1}' `
- if [ "$pcpu" -gt 80 ];then
- echo "============================================"
- echo "map server is more than 80% (now $pcpu%)"
- echo "============================================"
- ppid=` ps -a | grep map-server | awk '{print $1}' `
- kill $ppid
- ./map-server.exe &
- sleep 40
- else
- pmapct=` ps -a| grep map-server | wc -l `
- if [ "$pmapct" -eq 0 ];then
- echo "============================================"
- echo "map server is not running..."
- echo "restart map server..."
- echo "============================================"
- ./map-server.exe &
- sleep 40
- #echo "test"
- else
- echo "map server is ok (now $pcpu%)..."
- sleep 5
- fi
- fi
-done \ No newline at end of file
diff --git a/src/tool/mapchecker.sh b/src/tool/mapchecker.sh
deleted file mode 100644
index 7250c342e..000000000
--- a/src/tool/mapchecker.sh
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/bin/bash
-
-athena_dir="/home/athena/658/"
-
-while [ true ] ; do
-
-if [ ` ps fauxw | grep map-server | grep -v grep | wc -l ` -eq 0 ];then
- #echo `date` " -- map-server crashed - restarting"
- echo `date` " -- map-server crashed - restarting" >> /var/log/athena_status.log
- killall -9 map-server
- cd $athena_dir
- nohup ./map-server ./conf/map_athena.conf ./inter_athena.conf &
- sleep 240
- #sleep 40 #for fast pc's remove the "#" at the beginning of the line and delete the line above
-fi
-
-
-if [ ` ps fauxw | grep map-server | grep -v grep | awk '{print $3}' | awk 'BEGIN{FS="."} {print $1}' ` -gt 10 ];then
- #echo `date` " -- mapserver cpuload over 10 - restarting"
- echo `date` " -- mapserver cpuload over 10 - restarting" >> /var/log/athena_status.log
- killall -9 map-server
- cd $athena_dir
- nohup ./map-server ./conf/map_athena.conf ./inter_athena.conf &
- sleep 240
- #sleep 40 #for fast pc's remove the "#" at the beginning of the line and delete the line above
- #echo `date` " -- restarted"
- echo `date` " -- restarted" >> /var/log/athena_status.log
-fi
-
-if [ ` ps fauxw | grep char-server | grep -v grep | wc -l ` -eq 0 ];then
- #echo `date` " -- char server crashed - restarting"
- echo `date` " -- char server crashed - restarting" >> /var/log/athena_status.log
- killall -9 char-server
- cd $athena_dir
- nohup ./char-server ./conf/char_athena.conf ./conf/inter_athena.conf &
- #echo `date` " -- restarted"
- echo `date` " -- restarted" >> /var/log/athena_status.log
-
-fi
-
-if [ ` ps fauxw | grep login-server | grep -v grep | wc -l ` -eq 0 ];then
- #echo `date` " -- login server crashed - restarting"
- echo `date` " -- login server crashed - restarting" >> /var/log/athena_status.log
- killall -9 login-server
- cd $athena_dir
- nohup ./login-server ./conf/login_athena.conf &
- #echo `date` " -- restarted"
- echo `date` " -- restarted" >> /var/log/athena_status.log
-
-fi
-
-
-#echo `date` " -- everything is fine"
-echo `date` " -- everything is fine" >> /var/log/athena_status.log
-sleep 30
-done
diff --git a/src/txt-converter/char/Makefile b/src/txt-converter/char/Makefile
deleted file mode 100644
index 6b85a04db..000000000
--- a/src/txt-converter/char/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
-all: char-converter
-sql: char-converter
-
-COMMON_OBJ = ../../common/obj/core.o ../../common/obj/socket.o ../../common/obj/timer.o ../../common/obj/grfio.o ../../common/obj/db.o ../../common/obj/lock.o ../../common/obj/nullpo.o ../../common/obj/malloc.o ../../common/obj/showmsg.o ../../common/obj/strlib.o
-
-char-converter: char-converter.o $(COMMON_OBJ)
- $(CC) -o ../../../$@ $^ $(LIB_S)
-
-char-converter.o: char-converter.c char.h ../../common/strlib.h
-strlib.o: strlib.c ../../common/strlib.h
-clean:
- rm -f *.o ../../../char-converter
-
diff --git a/src/txt-converter/char/char-converter.c b/src/txt-converter/char/char-converter.c
deleted file mode 100644
index 217bf2b15..000000000
--- a/src/txt-converter/char/char-converter.c
+++ /dev/null
@@ -1,845 +0,0 @@
-// $Id: char-converter.c,v 1.1.1.1 2004/09/10 17:45:03 MagicalTux Exp $
-// original : char2.c 2003/03/14 11:58:35 Rev.1.5
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <netinet/in.h>
-#include <sys/time.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-#include <arpa/inet.h>
-
-
-#define STORAGE_MEMINC 16
-
-#include "char.h"
-#include "../../common/strlib.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-char pet_txt[256]="save/pet.txt";
-char storage_txt[256]="save/storage.txt";
-
-MYSQL mysql_handle;
-MYSQL_RES* sql_res ;
-MYSQL_ROW sql_row ;
-int sql_fields, sql_cnt;
-char tmp_sql[65535];
-
-int db_server_port = 3306;
-char db_server_ip[16] = "127.0.0.1";
-char db_server_id[32] = "ragnarok";
-char db_server_pw[32] = "ragnarok";
-char db_server_logindb[32] = "ragnarok";
-
-struct storage *storage_=NULL;
-
-struct mmo_map_server server[MAX_MAP_SERVERS];
-int server_fd[MAX_MAP_SERVERS];
-
-int login_fd;
-char userid[24];
-char passwd[24];
-char server_name[20];
-char login_ip_str[16];
-int login_port = 6900;
-char char_ip_str[16];
-int char_ip;
-int char_port = 6121;
-int char_maintenance;
-int char_new;
-char char_txt[256];
-
-char t_name[256];
-
-#define CHAR_STATE_WAITAUTH 0
-#define CHAR_STATE_AUTHOK 1
-struct char_session_data{
- int state;
- int account_id, login_id1, login_id2, sex;
- int found_char[9];
-};
-
-#define AUTH_FIFO_SIZE 256
-struct {
- int account_id, char_id, login_id1, char_pos, delflag, sex;
-} auth_fifo[AUTH_FIFO_SIZE];
-int auth_fifo_pos=0;
-
-int char_id_count=100000;
-struct mmo_charstatus *char_dat;
-int char_num, char_max;
-int max_connect_user=0;
-int autosave_interval=DEFAULT_AUTOSAVE_INTERVAL;
-
-// Ãʱâ À§Ä¡(conf ÆÄÀϷκÎÅÍ Àç¼³Á¤ °¡´É)
-struct point start_point={"new_1-1.gat", 53,111};
-
-
-
-int inter_pet_fromstr(char *str, struct s_pet *p)
-{
- int s;
- int tmp_int[16];
- char tmp_str[256];
-
- memset(p, 0, sizeof(struct s_pet));
-
-// printf("sscanf pet main info\n");
- s=sscanf(str,"%d, %d,%[^\t]\t%d, %d, %d, %d, %d, %d, %d, %d, %d", &tmp_int[0], &tmp_int[1], tmp_str, &tmp_int[2],
- &tmp_int[3], &tmp_int[4], &tmp_int[5], &tmp_int[6], &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10]);
-
- if(s!=12)
- return 1;
-
- p->pet_id = tmp_int[0];
- p->class_ = tmp_int[1];
- memcpy(p->name, tmp_str, 24);
- p->account_id = tmp_int[2];
- p->char_id = tmp_int[3];
- p->level = tmp_int[4];
- p->egg_id = tmp_int[5];
- p->equip = tmp_int[6];
- p->intimate = tmp_int[7];
- p->hungry = tmp_int[8];
- p->rename_flag = tmp_int[9];
- p->incuvate = tmp_int[10];
-
- if(p->hungry < 0)
- p->hungry = 0;
- else if(p->hungry > 100)
- p->hungry = 100;
- if(p->intimate < 0)
- p->intimate = 0;
- else if(p->intimate > 1000)
- p->intimate = 1000;
-
- return 0;
-}
-//---------------------------------------------------------
-int inter_pet_tosql(int pet_id, struct s_pet *p) {
- //`pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`)
-
- char tmp_sql[65535];
- MYSQL_RES* sql_res ;
- MYSQL_ROW sql_row ;
-
- jstrescapecpy (t_name, p->name);
- if(p->hungry < 0)
- p->hungry = 0;
- else if(p->hungry > 100)
- p->hungry = 100;
- if(p->intimate < 0)
- p->intimate = 0;
- else if(p->intimate > 1000)
- p->intimate = 1000;
- sprintf(tmp_sql,"SELECT * FROM `pet` WHERE `pet_id`='%d'",pet_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = mysql_fetch_row(sql_res); //row fetching
- if (!sql_row) //no row -> insert
- sprintf(tmp_sql,"INSERT INTO `pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) VALUES ('%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- p->pet_id, p->class_, t_name, p->account_id, p->char_id, p->level, p->egg_id,
- p->equip, p->intimate, p->hungry, p->rename_flag, p->incuvate);
- else //row reside -> updating
- sprintf(tmp_sql, "UPDATE `pet` SET `class`='%d',`name`='%s',`account_id`='%d',`char_id`='%d',`level`='%d',`egg_id`='%d',`equip`='%d',`intimate`='%d',`hungry`='%d',`rename_flag`='%d',`incuvate`='%d' WHERE `pet_id`='%d'",
- p->class_, t_name, p->account_id, p->char_id, p->level, p->egg_id,
- p->equip, p->intimate, p->hungry, p->rename_flag, p->incuvate, p->pet_id);
- mysql_free_result(sql_res) ; //resource free
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
-
- printf ("pet dump success! - %d:%s\n", pet_id, p->name);
-
- return 0;
-}
-
-int storage_tosql(int account_id,struct storage *p){
- // id -> DB dump
- // storage {`account_id`/`id`/`nameid`/`amount`/`equip`/`identify`/`refine`/`attribute`/`card0`/`card1`/`card2`/`card3`}
- int i,j;
-
- j=0;
-
- //printf ("starting storage dump to DB - id: %d\n", account_id);
-
- //delete old data.
- sprintf(tmp_sql,"DELETE FROM `storage` WHERE `account_id`='%d'",account_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
-
- //printf ("all storage item was deleted ok\n");
-
- for(i=0;i<MAX_STORAGE;i++) {
- //printf ("save storage num: %d (%d:%d)\n",i, p->storage_[i].nameid , p->storage_[i].amount);
-
- if( (p->storage_[i].nameid) && (p->storage_[i].amount) ){
- sprintf(tmp_sql,"INSERT INTO `storage` (`account_id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`,`card0`,`card1`,`card2`,`card3`,`broken`) VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- p->account_id, p->storage_[i].nameid, p->storage_[i].amount, p->storage_[i].equip,
- p->storage_[i].identify, p->storage_[i].refine, p->storage_[i].attribute,
- p->storage_[i].card[0], p->storage_[i].card[1], p->storage_[i].card[2], p->storage_[i].card[3], p->storage_[i].broken );
- //printf ("%s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- j++;
- }
- }
-
- printf ("storage dump to DB - id: %d (total: %d)\n", account_id, j);
- return 0;
-}
-// char to storage
-int storage_fromstr(char *str, struct storage *p)
-{
- int tmp_int[256];
- int set, next, len, i;
-
- set=sscanf(str,"%d, %d%n", &tmp_int[0], &tmp_int[1], &next);
- p->storage_amount=tmp_int[1];
-
- if(set!=2)
- return 0;
- if(str[next]=='\n' || str[next]=='\r')
- return 1;
- next++;
- for(i=0;str[next] && str[next]!='\t';i++){
- if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
- &tmp_int[4], &tmp_int[5], &tmp_int[6],
- &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &len) == 12) {
- p->storage_[i].id = tmp_int[0];
- p->storage_[i].nameid = tmp_int[1];
- p->storage_[i].amount = tmp_int[2];
- p->storage_[i].equip = tmp_int[3];
- p->storage_[i].identify = tmp_int[4];
- p->storage_[i].refine = tmp_int[5];
- p->storage_[i].attribute = tmp_int[6];
- p->storage_[i].card[0] = tmp_int[7];
- p->storage_[i].card[1] = tmp_int[8];
- p->storage_[i].card[2] = tmp_int[9];
- p->storage_[i].card[3] = tmp_int[10];
- p->storage_[i].broken = tmp_int[11];
- next += len;
- if (str[next] == ' ')
- next++;
- }
-
- else if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
- &tmp_int[4], &tmp_int[5], &tmp_int[6],
- &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &len) == 11) {
- p->storage_[i].id = tmp_int[0];
- p->storage_[i].nameid = tmp_int[1];
- p->storage_[i].amount = tmp_int[2];
- p->storage_[i].equip = tmp_int[3];
- p->storage_[i].identify = tmp_int[4];
- p->storage_[i].refine = tmp_int[5];
- p->storage_[i].attribute = tmp_int[6];
- p->storage_[i].card[0] = tmp_int[7];
- p->storage_[i].card[1] = tmp_int[8];
- p->storage_[i].card[2] = tmp_int[9];
- p->storage_[i].card[3] = tmp_int[10];
- p->storage_[i].broken = 0;
- next += len;
- if (str[next] == ' ')
- next++;
- }
-
- else return 0;
- }
- return 1;
-}
-
-/////////////////////////////////
-int mmo_char_fromstr(char *str, struct mmo_charstatus *p) {
- int tmp_int[256];
- int set, next, len, i;
-
- // initilialise character
- memset(p, '\0', sizeof(struct mmo_charstatus));
-
- // If it's not char structure of version 1008 and after
- if ((set = sscanf(str, "%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
- "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
- "\t%[^,],%d,%d\t%[^,],%d,%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], p->name, //
- &tmp_int[3], &tmp_int[4], &tmp_int[5],
- &tmp_int[6], &tmp_int[7], &tmp_int[8],
- &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12],
- &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18],
- &tmp_int[19], &tmp_int[20],
- &tmp_int[21], &tmp_int[22], &tmp_int[23], //
- &tmp_int[24], &tmp_int[25], &tmp_int[26],
- &tmp_int[27], &tmp_int[28], &tmp_int[29],
- &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
- p->last_point.map, &tmp_int[35], &tmp_int[36], //
- p->save_point.map, &tmp_int[37], &tmp_int[38], &tmp_int[39], &next)) != 43) {
- tmp_int[39] = 0; // partner id
- // If not char structure from version 384 to 1007
- if ((set = sscanf(str, "%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
- "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
- "\t%[^,],%d,%d\t%[^,],%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], p->name, //
- &tmp_int[3], &tmp_int[4], &tmp_int[5],
- &tmp_int[6], &tmp_int[7], &tmp_int[8],
- &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12],
- &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18],
- &tmp_int[19], &tmp_int[20],
- &tmp_int[21], &tmp_int[22], &tmp_int[23], //
- &tmp_int[24], &tmp_int[25], &tmp_int[26],
- &tmp_int[27], &tmp_int[28], &tmp_int[29],
- &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
- p->last_point.map, &tmp_int[35], &tmp_int[36], //
- p->save_point.map, &tmp_int[37], &tmp_int[38], &next)) != 42) {
- // It's char structure of a version before 384
- tmp_int[26] = 0; // pet id
- set = sscanf(str, "%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d"
- "\t%d,%d,%d\t%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
- "\t%[^,],%d,%d\t%[^,],%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], p->name, //
- &tmp_int[3], &tmp_int[4], &tmp_int[5],
- &tmp_int[6], &tmp_int[7], &tmp_int[8],
- &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12],
- &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18],
- &tmp_int[19], &tmp_int[20],
- &tmp_int[21], &tmp_int[22], &tmp_int[23], //
- &tmp_int[24], &tmp_int[25], //
- &tmp_int[27], &tmp_int[28], &tmp_int[29],
- &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
- p->last_point.map, &tmp_int[35], &tmp_int[36], //
- p->save_point.map, &tmp_int[37], &tmp_int[38], &next);
- set += 2;
- //printf("char: old char data ver.1\n");
- // Char structure of version 1007 or older
- } else {
- set++;
- //printf("char: old char data ver.2\n");
- }
- // Char structure of version 1008+
- } else {
- //printf("char: new char data ver.3\n");
- }
- if (set != 43)
- return 0;
-
- p->char_id = tmp_int[0];
- p->account_id = tmp_int[1];
- p->char_num = tmp_int[2];
- p->class_ = tmp_int[3];
- p->base_level = tmp_int[4];
- p->job_level = tmp_int[5];
- p->base_exp = tmp_int[6];
- p->job_exp = tmp_int[7];
- p->zeny = tmp_int[8];
- p->hp = tmp_int[9];
- p->max_hp = tmp_int[10];
- p->sp = tmp_int[11];
- p->max_sp = tmp_int[12];
- p->str = tmp_int[13];
- p->agi = tmp_int[14];
- p->vit = tmp_int[15];
- p->int_ = tmp_int[16];
- p->dex = tmp_int[17];
- p->luk = tmp_int[18];
- p->status_point = tmp_int[19];
- p->skill_point = tmp_int[20];
- p->option = tmp_int[21];
- p->karma = tmp_int[22];
- p->manner = tmp_int[23];
- p->party_id = tmp_int[24];
- p->guild_id = tmp_int[25];
- p->pet_id = tmp_int[26];
- p->hair = tmp_int[27];
- p->hair_color = tmp_int[28];
- p->clothes_color = tmp_int[29];
- p->weapon = tmp_int[30];
- p->shield = tmp_int[31];
- p->head_top = tmp_int[32];
- p->head_mid = tmp_int[33];
- p->head_bottom = tmp_int[34];
- p->last_point.x = tmp_int[35];
- p->last_point.y = tmp_int[36];
- p->save_point.x = tmp_int[37];
- p->save_point.y = tmp_int[38];
- p->partner_id = tmp_int[39];
-
- // Some checks
- for(i = 0; i < char_num; i++) {
- if (char_dat[i].char_id == p->char_id) {
- printf("\033[1;31mmmo_auth_init: ******Error: a character has an identical id to another.\n");
- printf(" character id #%d -> new character not readed.\n", p->char_id);
- printf(" Character saved in log file.\033[0m\n");
- return -1;
- } else if (strcmp(char_dat[i].name, p->name) == 0) {
- printf("\033[1;31mmmo_auth_init: ******Error: character name already exists.\n");
- printf(" character name '%s' -> new character not readed.\n", p->name);
- printf(" Character saved in log file.\033[0m\n");
- return -2;
- }
- }
-
- if (str[next] == '\n' || str[next] == '\r')
- return 1; // V‹Kƒf[ƒ^
-
- next++;
-
- for(i = 0; str[next] && str[next] != '\t'; i++) {
- set = sscanf(str+next, "%[^,],%d,%d%n", p->memo_point[i].map, &tmp_int[0], &tmp_int[1], &len);
- if (set != 3)
- return -3;
- p->memo_point[i].x = tmp_int[0];
- p->memo_point[i].y = tmp_int[1];
- next += len;
- if (str[next] == ' ')
- next++;
- }
-
- next++;
-
- for(i = 0; str[next] && str[next] != '\t'; i++) {
- if (sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
- &tmp_int[4], &tmp_int[5], &tmp_int[6],
- &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &len) == 12) {
- // do nothing, it's ok
- } else if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
- &tmp_int[4], &tmp_int[5], &tmp_int[6],
- &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &len) == 11) {
- tmp_int[11] = 0; // broken doesn't exist in this version -> 0
- } else // invalid structure
- return -4;
- p->inventory[i].id = tmp_int[0];
- p->inventory[i].nameid = tmp_int[1];
- p->inventory[i].amount = tmp_int[2];
- p->inventory[i].equip = tmp_int[3];
- p->inventory[i].identify = tmp_int[4];
- p->inventory[i].refine = tmp_int[5];
- p->inventory[i].attribute = tmp_int[6];
- p->inventory[i].card[0] = tmp_int[7];
- p->inventory[i].card[1] = tmp_int[8];
- p->inventory[i].card[2] = tmp_int[9];
- p->inventory[i].card[3] = tmp_int[10];
- p->inventory[i].broken = tmp_int[11];
- next += len;
- if (str[next] == ' ')
- next++;
- }
-
- next++;
-
- for(i = 0; str[next] && str[next] != '\t'; i++) {
- if (sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
- &tmp_int[4], &tmp_int[5], &tmp_int[6],
- &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &len) == 12) {
- // do nothing, it's ok
- } else if (sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
- &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3],
- &tmp_int[4], &tmp_int[5], &tmp_int[6],
- &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &len) == 11) {
- tmp_int[11] = 0; // broken doesn't exist in this version -> 0
- } else // invalid structure
- return -5;
- p->cart[i].id = tmp_int[0];
- p->cart[i].nameid = tmp_int[1];
- p->cart[i].amount = tmp_int[2];
- p->cart[i].equip = tmp_int[3];
- p->cart[i].identify = tmp_int[4];
- p->cart[i].refine = tmp_int[5];
- p->cart[i].attribute = tmp_int[6];
- p->cart[i].card[0] = tmp_int[7];
- p->cart[i].card[1] = tmp_int[8];
- p->cart[i].card[2] = tmp_int[9];
- p->cart[i].card[3] = tmp_int[10];
- p->cart[i].broken = tmp_int[11];
- next += len;
- if (str[next] == ' ')
- next++;
- }
-
- next++;
-
- for(i = 0; str[next] && str[next] != '\t'; i++) {
- set = sscanf(str + next, "%d,%d%n", &tmp_int[0], &tmp_int[1], &len);
- if (set != 2)
- return -6;
- p->skill[tmp_int[0]].id = tmp_int[0];
- p->skill[tmp_int[0]].lv = tmp_int[1];
- next += len;
- if (str[next] == ' ')
- next++;
- }
-
- next++;
-
- for(i = 0; str[next] && str[next] != '\t' && str[next] != '\n' && str[next] != '\r'; i++) { // global_regŽÀ‘•ˆÈ‘O‚Ìathena.txtŒÝŠ·‚Ì‚½‚߈ꉞ'\n'ƒ`ƒFƒbƒN
- set = sscanf(str + next, "%[^,],%d%n", p->global_reg[i].str, &p->global_reg[i].value, &len);
- if (set != 2) {
- // because some scripts are not correct, the str can be "". So, we must check that.
- // If it's, we must not refuse the character, but just this REG value.
- // Character line will have something like: nov_2nd_cos,9 ,9 nov_1_2_cos_c,1 (here, ,9 is not good)
- if (str[next] == ',' && sscanf(str + next, ",%d%n", &p->global_reg[i].value, &len) == 1)
- i--;
- else
- return -7;
- }
- next += len;
- if (str[next] == ' ')
- next++;
- }
- p->global_reg_num = i;
-
- return 1;
-}
-
-//==========================================================================================================
-int mmo_char_tosql(int char_id, struct mmo_charstatus *p){
- int i,save_flag;
-
- save_flag = char_id;
- printf("request save char data... (%d)\n",char_id);
-
- //`char`( `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`, //9
- //`str`,`agi`,`vit`,`int`,`dex`,`luk`, //15
- //`max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point`, //21
- //`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`, //27
- //`hair`,`hair_color`,`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`, //35
- //`last_map`,`last_x`,`last_y`,`save_map`,`save_x`,`save_y`)
- sprintf(tmp_sql ,"INSERT INTO `char` SET `char_id`='%d', `account_id`='%d', `char_num`='%d', `name`='%s', `class`='%d', `base_level`='%d', `job_level`='%d',"
- "`base_exp`='%d', `job_exp`='%d', `zeny`='%d',"
- "`max_hp`='%d',`hp`='%d',`max_sp`='%d',`sp`='%d',`status_point`='%d',`skill_point`='%d',"
- "`str`='%d',`agi`='%d',`vit`='%d',`int`='%d',`dex`='%d',`luk`='%d',"
- "`option`='%d',`karma`='%d',`manner`='%d',`party_id`='%d',`guild_id`='%d',`pet_id`='%d',"
- "`hair`='%d',`hair_color`='%d',`clothes_color`='%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', `partner_id` = '%d'",
- char_id,p->account_id,p->char_num,p->name,p->class_, 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->karma, p->manner, p->party_id, p->guild_id, p->pet_id,
- p->hair, p->hair_color, p->clothes_color,
- p->weapon, p->shield, p->head_top, p->head_mid, p->head_bottom,
- p->last_point.map, p->last_point.x, p->last_point.y,
- p->save_point.map, p->save_point.x, p->save_point.y, p->partner_id
- );
-
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- //`memo` (`memo_id`,`char_id`,`map`,`x`,`y`)
- sprintf(tmp_sql,"DELETE FROM `memo` WHERE `char_id`='%d'",char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `memo`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- //insert here.
- for(i=0;i<10;i++){
- if(p->memo_point[i].map[0]){
- sprintf(tmp_sql,"INSERT INTO `memo`(`char_id`,`map`,`x`,`y`) VALUES ('%d', '%s', '%d', '%d')",
- char_id, p->memo_point[i].map, p->memo_point[i].x, p->memo_point[i].y);
- if(mysql_query(&mysql_handle, tmp_sql) )
- printf("DB server Error (insert `memo`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- //`inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`)
- sprintf(tmp_sql,"DELETE FROM `inventory` WHERE `char_id`='%d'",char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `inventory`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- //insert here.
- for(i=0;i<MAX_INVENTORY;i++){
- if(p->inventory[i].nameid){
- sprintf(tmp_sql,"INSERT INTO `inventory`(`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`)"
- " VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- p->inventory[i].id, char_id,p->inventory[i].nameid, p->inventory[i].amount, p->inventory[i].equip,
- p->inventory[i].identify, p->inventory[i].refine, p->inventory[i].attribute,
- p->inventory[i].card[0], p->inventory[i].card[1], p->inventory[i].card[2], p->inventory[i].card[3], p->inventory[i].broken);
- if(mysql_query(&mysql_handle, tmp_sql) )
- printf("DB server Error (insert `inventory`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
-
- //`cart_inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`)
- sprintf (tmp_sql, "DELETE FROM `cart_inventory` WHERE `char_id`='%d'", char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `cart_inventory`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- //insert here.
- for(i=0;i<MAX_CART;i++){
- if(p->cart[i].nameid){
- sprintf(tmp_sql,"INSERT INTO `cart_inventory`(`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`)"
- " VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d' )",
- p->cart[i].id, char_id, p->cart[i].nameid, p->cart[i].amount, p->cart[i].equip,
- p->cart[i].identify, p->cart[i].refine, p->cart[i].attribute,
- p->cart[i].card[0], p->cart[i].card[1], p->cart[i].card[2], p->cart[i].card[3], p->cart[i].broken );
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (insert `cart_inventory`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- }
-
-
- //`skill` (`char_id`, `id`, `lv`)
- sprintf(tmp_sql,"DELETE FROM `skill` WHERE `char_id`='%d'",char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `skill`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- //insert here.
- for(i=0;i<MAX_SKILL;i++){
- if(p->skill[i].id){
- if (p->skill[i].id && p->skill[i].flag!=1) {
- sprintf(tmp_sql,"INSERT INTO `skill`(`char_id`,`id`, `lv`) VALUES ('%d', '%d', '%d')",
- char_id, p->skill[i].id, (p->skill[i].flag==0)?p->skill[i].lv:p->skill[i].flag-2);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (insert `skill`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- }
- }
- //`global_reg_value` (`char_id`, `str`, `value`)
- sprintf(tmp_sql,"DELETE FROM `global_reg_value` WHERE `char_id`='%d'",char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `global_reg_value`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- //insert here.
- for(i=0;i<p->global_reg_num;i++){
- if(p->global_reg[i].value !=0){
- sprintf(tmp_sql,"INSERT INTO `global_reg_value` (`char_id`, `str`, `value`) VALUES ('%d', '%s','%d')",
- char_id, p->global_reg[i].str, p->global_reg[i].value);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (insert `global_reg_value`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- }
-
- printf("saving char is done... (%d)\n",char_id);
- save_flag = 0;
-
- return 0;
-}
-//==========================================================================================================
-
-int mmo_char_init(void){
- char line[65536];
- struct s_pet *p;
- int ret;
- int i=0,set,tmp_int[2], c= 0;
- char input;
- FILE *fp;
-
-
- //DB connection initialized
- mysql_init(&mysql_handle);
- printf("Connect DB server.... (inter server)\n");
- if(!mysql_real_connect(&mysql_handle, db_server_ip, db_server_id, db_server_pw,
- db_server_logindb ,db_server_port, (char *)NULL, 0)) {
- //pointer check
- printf("%s\n",mysql_error(&mysql_handle));
- exit(1);
- }
- else {
- printf ("connect success! (inter server)\n");
- }
-
-
-
- printf("Warning : Make sure you backup your databases before continuing!\n");
- printf("\nDo you wish to convert your Character Database to SQL? (y/n) : ");
- input=getchar();
- if(input == 'y' || input == 'Y'){
- printf("\nConverting Character Database...\n");
- fp=fopen("save/athena.txt","r");
- char_dat = (struct mmo_charstatus*)malloc(sizeof(char_dat[0])*256);
- char_max=256;
- if(fp==NULL)
- return 0;
- while(fgets(line, 65535, fp)){
- if(char_num>=char_max){
- char_max+=256;
- char_dat = (struct mmo_charstatus*)realloc(char_dat, sizeof(char_dat[0]) *char_max);
- }
- memset(&char_dat[char_num], 0, sizeof(char_dat[0]));
- ret=mmo_char_fromstr(line, &char_dat[char_num]);
- if(ret){
- mmo_char_tosql(char_dat[char_num].char_id , &char_dat[char_num]);
- printf ("convert %d -> DB\n",char_dat[char_num].char_id);
- if(char_dat[char_num].char_id>=char_id_count)
- char_id_count=char_dat[char_num].char_id+1;
- char_num++;
- }
- }
- printf("char data convert end\n");
- fclose(fp);
- }
-
- while(getchar() != '\n');
- printf("\nDo you wish to convert your Storage Database to SQL? (y/n) : ");
- input=getchar();
- if(input == 'y' || input == 'Y') {
- printf("\nConverting Storage Database...\n");
- fp=fopen(storage_txt,"r");
- if(fp==NULL){
- printf("cant't read : %s\n",storage_txt);
- return 0;
- }
-
- while(fgets(line,65535,fp)){
- set=sscanf(line,"%d,%d",&tmp_int[0],&tmp_int[1]);
- if(set==2) {
- if(i==0){
- storage_ = (struct storage*)malloc(sizeof(struct storage));
- }else{
- storage_ = (struct storage*)realloc(storage_,sizeof(struct storage)*(i+1));
- }
- memset(&storage_[i],0,sizeof(struct storage));
- storage_[i].account_id=tmp_int[0];
- storage_fromstr(line,&storage_[i]);
- storage_tosql(tmp_int[0],&storage_[i]); //to sql. (dump)
- i++;
- }
- }
- fclose(fp);
- }
-
- while(getchar() != '\n');
- printf("\nDo you wish to convert your Pet Database to SQL? (y/n) : ");
- input=getchar();
- if(input == 'y' || input == 'Y') {
- printf("\nConverting Pet Database...\n");
- if( (fp=fopen(pet_txt,"r")) ==NULL )
- return 1;
-
- p = (struct s_pet*)malloc(sizeof(struct s_pet));
- while(fgets(line, sizeof(line), fp)){
- if(p==NULL){
- printf("int_pet: out of memory!\n");
- exit(0);
- }
- if(inter_pet_fromstr(line, p)==0 && p->pet_id>0){
- //pet dump
- inter_pet_tosql(p->pet_id,p);
- }else{
- printf("int_pet: broken data [%s] line %d\n", pet_txt, c);
- }
- c++;
- }
- fclose(fp);
- }
-
- return 0;
-}
-int inter_config_read(const char *cfgName) {
- int i;
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- printf ("Start reading interserver configuration: %s\n",cfgName);
-
- fp=fopen(cfgName,"r");
- if(fp==NULL){
- printf("File not found: %s\n", cfgName);
- return 1;
- }
- while(fgets(line, 1020, fp)){
- i=sscanf(line,"%[^:]:%s", w1, w2);
- if(i!=2)
- continue;
- if(strcmpi(w1,"storage_txt")==0){
- printf ("set storage_txt : %s\n",w2);
- strncpy(storage_txt, w2, sizeof(storage_txt));
- } else if(strcmpi(w1,"pet_txt")==0){
- printf ("set pet_txt : %s\n",w2);
- strncpy(pet_txt, w2, sizeof(pet_txt));
- }
- //add for DB connection
- else if(strcmpi(w1,"db_server_ip")==0){
- strcpy(db_server_ip, w2);
- printf ("set db_server_ip : %s\n",w2);
- }
- else if(strcmpi(w1,"db_server_port")==0){
- db_server_port=atoi(w2);
- printf ("set db_server_port : %s\n",w2);
- }
- else if(strcmpi(w1,"db_server_id")==0){
- strcpy(db_server_id, w2);
- printf ("set db_server_id : %s\n",w2);
- }
- else if(strcmpi(w1,"db_server_pw")==0){
- strcpy(db_server_pw, w2);
- printf ("set db_server_pw : %s\n",w2);
- }
- else if(strcmpi(w1,"db_server_logindb")==0){
- strcpy(db_server_logindb, w2);
- printf ("set db_server_logindb : %s\n",w2);
- //support the import command, just like any other config
- }else if(strcmpi(w1,"import")==0){
- inter_config_read(w2);
- }
- }
- fclose(fp);
-
- printf("Reading interserver configuration: Done\n");
-
- return 0;
-}
-
-int char_config_read(const char *cfgName) {
- int i;
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- printf ("Start reading char-server configuration: %s\n",cfgName);
-
- fp=fopen(cfgName,"r");
- if(fp==NULL){
- printf("File not found: %s\n", cfgName);
- return 1;
- }
-
- while(fgets(line, 1020, fp)){
- if(line[0] == '/' && line[1] == '/')
- continue;
-
- i=sscanf(line,"%[^:]:%s", w1, w2);
- if(i!=2)
- continue;
- if(strcmpi(w1,"char_txt")==0){
- printf ("set char_txt : %s\n",w2);
- strcpy(char_txt, w2);
- }
- }
- fclose(fp);
- printf("Reading configuration: Done\n");
-
- return 0;
-}
-
-int do_init(int argc, char **argv){
-
- char_config_read((argc>1)?argv[1]:CHAR_CONF_NAME);
- inter_config_read((argc>2)?argv[2]:INTER_CONF_NAME);
-
- mmo_char_init();
- printf ("Everything's been converted!\n");
- exit (0);
-}
-
-
diff --git a/src/txt-converter/char/char.h b/src/txt-converter/char/char.h
deleted file mode 100644
index e1d5c90dc..000000000
--- a/src/txt-converter/char/char.h
+++ /dev/null
@@ -1,39 +0,0 @@
-#include "../../common/core.h"
-#include "../../common/socket.h"
-#include "../../common/timer.h"
-#include "../common/mmo.h"
-#include "../common/inter.h"
-#include "../../common/version.h"
-#include "../../common/db.h"
-
-#ifndef _CHAR_H_
-#define _CHAR_H_
-
-#define MAX_MAP_SERVERS 30
-
-//#define CHAR_CONF_NAME "conf/char_athena.conf"
-
-#define UNKNOWN_CHAR_NAME "Unknown"
-
-#define DEFAULT_AUTOSAVE_INTERVAL 300*1000
-
-struct mmo_map_server{
- long ip;
- short port;
- int users;
- char map[MAX_MAP_PER_SERVER][16];
-};
-
-int mapif_sendall(char *buf,unsigned int len);
-int mapif_sendallwos(int fd,char *buf,unsigned int len);
-int mapif_send(int fd,char *buf,unsigned int len);
-
-extern int autosave_interval;
-
-#endif
-
-//#include "inter.h"
-#include "int_pet.h"
-#include "int_guild.h"
-#include "int_party.h"
-#include "int_storage.h"
diff --git a/src/txt-converter/char/int_guild.h b/src/txt-converter/char/int_guild.h
deleted file mode 100644
index 2ea85949a..000000000
--- a/src/txt-converter/char/int_guild.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef _INT_GUILD_H_
-#define _INT_GUILD_H_
-
-int inter_guild_init();
-int inter_guild_save();
-int inter_guild_parse_frommap(int fd);
-
-extern char guild_txt[256];
-
-#endif
diff --git a/src/txt-converter/char/int_party.h b/src/txt-converter/char/int_party.h
deleted file mode 100644
index 036db1af9..000000000
--- a/src/txt-converter/char/int_party.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef _INT_PARTY_H_
-#define _INT_PARTY_H_
-
-int inter_party_init();
-int inter_party_save();
-
-int inter_party_parse_frommap(int fd);
-
-extern char party_txt[256];
-
-#endif
diff --git a/src/txt-converter/char/int_pet.h b/src/txt-converter/char/int_pet.h
deleted file mode 100644
index 27ba4fc9d..000000000
--- a/src/txt-converter/char/int_pet.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef _INT_PET_H_
-#define _INT_PET_H_
-
-int inter_pet_init();
-int inter_pet_save();
-int inter_pet_delete(int pet_id);
-
-int inter_pet_parse_frommap(int fd);
-
-//extern char pet_txt[256];
-
-#endif
diff --git a/src/txt-converter/char/int_storage.h b/src/txt-converter/char/int_storage.h
deleted file mode 100644
index 3572ae5de..000000000
--- a/src/txt-converter/char/int_storage.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef _INT_STORAGE_H_
-#define _INT_STORAGE_H_
-
-int inter_storage_init();
-int inter_storage_save();
-
-int inter_storage_parse_frommap(int fd);
-
-//extern char storage_txt[256];
-
-#endif
diff --git a/src/txt-converter/common/inter.h b/src/txt-converter/common/inter.h
deleted file mode 100644
index 21c921d4a..000000000
--- a/src/txt-converter/common/inter.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef _INTER_H_
-#define _INTER_H_
-
-int inter_init(const char *file);
-int inter_save();
-int inter_parse_frommap(int fd);
-
-int inter_check_length(int fd,int length);
-
-#define INTER_CONF_NAME "conf/inter_athena.conf"
-
-
-//add include for DBMS(mysql)
-#include <mysql.h>
-
-extern MYSQL mysql_handle;
-extern char tmp_sql[65535];
-extern MYSQL_RES* sql_res ;
-extern MYSQL_ROW sql_row ;
-extern int sql_cnt;
-
-extern int db_server_port;
-extern char db_server_ip[16];
-extern char db_server_id[32];
-extern char db_server_pw[32];
-extern char db_server_logindb[32];
-
-#endif
diff --git a/src/txt-converter/common/mmo.h b/src/txt-converter/common/mmo.h
deleted file mode 100644
index 28462e99d..000000000
--- a/src/txt-converter/common/mmo.h
+++ /dev/null
@@ -1,280 +0,0 @@
-// Original : mmo.h 2003/03/14 12:07:02 Rev.1.7
-
-#ifndef _MMO_H_
-#define _MMO_H_
-
-#include <time.h>
-
-#ifdef CYGWIN
-// txt‚âlog‚È‚Ç‚Ì‘‚«o‚·ƒtƒ@ƒCƒ‹‚̉üsƒR[ƒh
-#define RETCODE "\r\n" // (CR/LFFWindowsŒn)
-#else
-#define RETCODE "\n" // (LFFUnixŒnj
-#endif
-
-#define FIFOSIZE_SERVERLINK 128*1024
-
-#define MAX_MAP_PER_SERVER 512
-#define MAX_INVENTORY 100
-#define MAX_AMOUNT 30000
-#define MAX_ZENY 1000000000 // 1G zeny
-#define MAX_CART 100
-#define MAX_SKILL 450
-#define GLOBAL_REG_NUM 96
-#define ACCOUNT_REG_NUM 16
-#define ACCOUNT_REG2_NUM 16
-#define DEFAULT_WALK_SPEED 150
-#define MIN_WALK_SPEED 0
-#define MAX_WALK_SPEED 1000
-#define MAX_STORAGE 300
-#define MAX_GUILD_STORAGE 1000
-#define MAX_PARTY 12
-#define MAX_GUILD 16+10*6 // increased max guild members to accomodate for +6 increase for extension levels [Lupus]
-#define MAX_GUILDPOSITION 20 // increased max guild positions to accomodate for all members [Valaris]
-#define MAX_GUILDEXPLUSION 32
-#define MAX_GUILDALLIANCE 16
-#define MAX_GUILDSKILL 15 // increased max guild skills because of new skills [Sara-chan]
-#define MAX_GUILDCASTLE 24 // increased to include novice castles [Valaris]
-#define MAX_GUILDLEVEL 50
-
-#define MIN_HAIR_STYLE 0
-#define MAX_HAIR_STYLE 20
-#define MIN_HAIR_COLOR 0
-#define MAX_HAIR_COLOR 9
-#define MIN_CLOTH_COLOR 0
-#define MAX_CLOTH_COLOR 4
-
-// for produce
-#define MIN_ATTRIBUTE 0
-#define MAX_ATTRIBUTE 4
-#define ATTRIBUTE_NORMAL 0
-#define MIN_STAR 0
-#define MAX_STAR 3
-
-#define MIN_PORTAL_MEMO 0
-#define MAX_PORTAL_MEMO 2
-
-#define MAX_STATUS_TYPE 5
-
-#define WEDDING_RING_M 2634
-#define WEDDING_RING_F 2635
-
-#define CHAR_CONF_NAME "conf/char_athena.conf"
-
-struct item {
- int id;
- short nameid;
- short amount;
- unsigned short equip;
- char identify;
- char refine;
- char attribute;
- short card[4];
- short broken;
-};
-struct point{
- char map[24];
- short x,y;
-};
-struct skill {
- unsigned short id,lv,flag;
-};
-struct global_reg {
- char str[32];
- int value;
-};
-struct s_pet {
- int account_id;
- int char_id;
- int pet_id;
- short class_;
- short level;
- short egg_id;//pet egg id
- short equip;//pet equip name_id
- short intimate;//pet friendly
- short hungry;//pet hungry
- char name[24];
- char rename_flag;
- char incuvate;
-};
-
-struct mmo_charstatus {
- int char_id;
- int account_id;
- int partner_id;
-
- int base_exp,job_exp,zeny;
-
- short class_;
- short status_point,skill_point;
- int hp,max_hp,sp,max_sp;
- short option,karma,manner;
- short hair,hair_color,clothes_color;
- int party_id,guild_id,pet_id;
-
- short weapon,shield;
- short head_top,head_mid,head_bottom;
-
- char name[24];
- unsigned char base_level,job_level;
- short str,agi,vit,int_,dex,luk;
- unsigned char char_num,sex;
-
- struct point last_point,save_point,memo_point[10];
- struct item inventory[MAX_INVENTORY],cart[MAX_CART];
- struct skill skill[MAX_SKILL];
- int global_reg_num;
- struct global_reg global_reg[GLOBAL_REG_NUM];
- int account_reg_num;
- struct global_reg account_reg[ACCOUNT_REG_NUM];
- int account_reg2_num;
- struct global_reg account_reg2[ACCOUNT_REG2_NUM];
-};
-
-struct storage {
- int account_id;
- short storage_status;
- short storage_amount;
- struct item storage_[MAX_STORAGE];
-};
-
-struct guild_storage {
- int guild_id;
- short storage_status;
- short storage_amount;
- struct item storage_[MAX_GUILD_STORAGE];
-};
-
-struct map_session_data;
-
-struct gm_account {
- int account_id;
- int level;
-};
-
-struct party_member {
- int account_id;
- char name[24],map[24];
- int leader,online,lv;
- struct map_session_data *sd;
-};
-struct party {
- int party_id;
- char name[24];
- int exp;
- int item;
- struct party_member member[MAX_PARTY];
-};
-
-struct guild_member {
- int account_id, char_id;
- short hair,hair_color,gender,class_,lv;
- int exp,exp_payper;
- short online,position;
- int rsv1,rsv2;
- char name[24];
- struct map_session_data *sd;
-};
-struct guild_position {
- char name[24];
- int mode;
- int exp_mode;
-};
-struct guild_alliance {
- int opposition;
- int guild_id;
- char name[24];
-};
-struct guild_explusion {
- char name[24];
- char mes[40];
- char acc[40];
- int account_id;
- int rsv1,rsv2,rsv3;
-};
-struct guild_skill {
- int id,lv;
-};
-struct guild {
- int guild_id;
- short guild_lv, connect_member, max_member, average_lv;
- int exp,next_exp,skill_point,castle_id;
- char name[24],master[24];
- struct guild_member member[MAX_GUILD];
- struct guild_position position[MAX_GUILDPOSITION];
- char mes1[60],mes2[120];
- int emblem_len,emblem_id;
- char emblem_data[2048];
- struct guild_alliance alliance[MAX_GUILDALLIANCE];
- struct guild_explusion explusion[MAX_GUILDEXPLUSION];
- struct guild_skill skill[MAX_GUILDSKILL];
-};
-struct guild_castle {
- int castle_id;
- char map_name[24];
- char castle_name[24];
- int guild_id;
- int economy;
- int defense;
- int triggerE;
- int triggerD;
- int nextTime;
- int payTime;
- int createTime;
- int visibleC;
- int visibleG0;
- int visibleG1;
- int visibleG2;
- int visibleG3;
- int visibleG4;
- int visibleG5;
- int visibleG6;
- int visibleG7;
- int Ghp0; // added Guardian HP [Valaris]
- int Ghp1;
- int Ghp2;
- int Ghp3;
- int Ghp4;
- int Ghp5;
- int Ghp6;
- int Ghp7;
- int GID0;
- int GID1;
- int GID2;
- int GID3;
- int GID4;
- int GID5;
- int GID6;
- int GID7; // end addition [Valaris]
-
-};
-struct square {
- int val1[5];
- int val2[5];
-};
-
-enum {
- GBI_EXP =1, // ƒMƒ‹ƒh‚ÌEXP
- GBI_GUILDLV =2, // ƒMƒ‹ƒh‚ÌLv
- GBI_SKILLPOINT =3, // ƒMƒ‹ƒh‚̃XƒLƒ‹ƒ|ƒCƒ“ƒg
- GBI_SKILLLV =4, // ƒMƒ‹ƒhƒXƒLƒ‹Lv
-
- GMI_POSITION =0, // ƒƒ“ƒo[‚Ì–ðE•ÏX
- GMI_EXP =1, // ƒƒ“ƒo[‚ÌEXP
-
-};
-
-#ifndef strcmpi
-#define strcmpi strcasecmp
-#endif
-#ifndef stricmp
-#define stricmp strcasecmp
-#endif
-#ifndef strncmpi
-#define strncmpi strncasecmp
-#endif
-#ifndef strnicmp
-#define strnicmp strncasecmp
-#endif
-
-#endif // _MMO_H_
diff --git a/src/txt-converter/login/Makefile b/src/txt-converter/login/Makefile
deleted file mode 100644
index 7158931d0..000000000
--- a/src/txt-converter/login/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-all: login-converter
-sql: login-converter
-
-COMMON_OBJ = ../../common/obj/core.o ../../common/obj/socket.o ../../common/obj/timer.o ../../common/obj/grfio.o ../../common/obj/db.o ../../common/obj/lock.o ../../common/obj/nullpo.o ../../common/obj/malloc.o ../../common/obj/showmsg.o ../../common/obj/strlib.o
-
-COMMON_H = ../../common/core.h ../../common/socket.h ../../common/timer.h ../../common/mmo.h ../../common/version.h ../../common/db.h ../../common/malloc.h ../../common/strlib.h
-
-login-converter: login-converter.o ../../login_sql/md5calc.o $(COMMON_OBJ)
- $(CC) -o ../../../$@ $^ $(LIB_S)
-login-converter.o: login-converter.c ../../login_sql/login.h ../../login_sql/md5calc.h $(COMMON_H)
-clean:
- rm -f *.o ../../../login-converter
diff --git a/src/txt-converter/login/login-converter.c b/src/txt-converter/login/login-converter.c
deleted file mode 100644
index d301e8db3..000000000
--- a/src/txt-converter/login/login-converter.c
+++ /dev/null
@@ -1,262 +0,0 @@
-// $Id: login-converter.c,v 1.1.1.1 2004/09/10 17:45:03 MagicalTux Exp $
-// original : login2.c 2003/01/28 02:29:17 Rev.1.1.1.1
-// login data file to mysql conversion utility.
-//
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <netinet/in.h>
-#include <sys/time.h>
-#include <time.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-#include <arpa/inet.h>
-
-#include <mysql.h>
-
-#include "../../common/core.h"
-#include "../../common/socket.h"
-#include "../../login/login.h"
-#include "../../common/mmo.h"
-#include "../../common/version.h"
-#include "../../common/db.h"
-#include "../common/inter.h"
-
-int account_id_count = START_ACCOUNT_NUM;
-int server_num;
-int new_account_flag = 0;
-int login_port = 6900;
-
-struct mmo_char_server server[MAX_SERVERS];
-int server_fd[MAX_SERVERS];
-
-#define AUTH_FIFO_SIZE 256
-struct {
- int account_id,login_id1,login_id2;
- int sex,delflag;
-} auth_fifo[AUTH_FIFO_SIZE];
-int auth_fifo_pos=0;
-struct auth_dat_ {
- int account_id, sex;
- char userid[24], pass[24], lastlogin[24];
- int logincount;
- int state; // packet 0x006a value + 1 (0: compte OK)
- char email[40]; // e-mail (by default: a@a.com)
- char error_message[20]; // Message of error code #6 = You are Prohibited to log in until %s (packet 0x006a)
- time_t ban_until_time; // # of seconds 1/1/1970 (timestamp): ban time limit of the account (0 = no ban)
- time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
- char last_ip[16]; // save of last IP of connection
- char memo[255]; // a memo field
- int account_reg2_num;
- struct global_reg account_reg2[ACCOUNT_REG2_NUM];
-} *auth_dat;
-int auth_num=0,auth_max=0;
-
-char login_account_id[256]="account_id";
-char login_userid[256]="userid";
-char login_user_pass[256]="user_pass";
-char login_db[256]="login";
-
-static struct dbt *gm_account_db;
-
-int db_server_port = 3306;
-char db_server_ip[16] = "127.0.0.1";
-char db_server_id[32] = "ragnarok";
-char db_server_pw[32] = "ragnarok";
-char db_server_logindb[32] = "ragnarok";
-
-int isGM(int account_id)
-{
- struct gm_account *p;
- p = (struct gm_account*)numdb_search(gm_account_db,account_id);
- if( p == NULL)
- return 0;
- return p->level;
-}
-
-int read_gm_account()
-{
- char line[8192];
- struct gm_account *p;
- FILE *fp;
- int c=0;
-
- gm_account_db = numdb_init();
-
- printf("Starting reading gm_account\n");
-
- if( (fp=fopen("conf/GM_account.txt","r"))==NULL )
- return 1;
- while(fgets(line,sizeof(line),fp)){
- if(line[0] == '/' || line[1] == '/' || line[2] == '/')
- continue;
-
- p = (struct gm_account*)malloc(sizeof(struct gm_account));
- if(p==NULL){
- printf("gm_account: out of memory!\n");
- exit(0);
- }
-
- if(sscanf(line,"%d %d",&p->account_id,&p->level) != 2 || p->level <= 0) {
- printf("gm_account: broken data [conf/GM_account.txt] line %d\n",c);
- continue;
- }
- else {
- if(p->level > 99)
- p->level = 99;
- numdb_insert(gm_account_db,p->account_id,p);
- c++;
- printf("GM ID: %d Level: %d\n",p->account_id,p->level);
- }
- }
- fclose(fp);
- printf("%d ID of gm_accounts read.\n",c);
- return 0;
-}
-
-int mmo_auth_init(void)
-{
- MYSQL mysql_handle;
- char tmpsql[1024];
- MYSQL_RES* sql_res ;
- MYSQL_ROW sql_row ;
- FILE *fp;
- int account_id, logincount, user_level, state, n, i;
- char line[2048], userid[2048], pass[2048], lastlogin[2048], sex, email[2048], error_message[2048], last_ip[2048], memo[2048];
- time_t ban_until_time;
- time_t connect_until_time;
- char t_uid[256];
-
- mysql_init(&mysql_handle);
- if(!mysql_real_connect(&mysql_handle, db_server_ip, db_server_id, db_server_pw,
- db_server_logindb ,db_server_port, (char *)NULL, 0)) {
- //pointer check
- printf("%s\n",mysql_error(&mysql_handle));
- exit(1);
- }
- else {
- printf ("Connect: Success!\n");
- }
- printf ("Convert start...\n");
-
-
- fp=fopen("save/account.txt","r");
- auth_dat = (struct auth_dat_*)malloc(sizeof(auth_dat[0])*256);
- auth_max=256;
- if(fp==NULL)
- return 0;
- while(fgets(line,1023,fp)!=NULL){
-
- if(line[0]=='/' && line[1]=='/')
- continue;
-
- i = sscanf(line, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d\t%d\t"
- "%[^\t]\t%[^\t]\t%ld\t%[^\t]\t%[^\t]\t%ld%n",
- &account_id, userid, pass, lastlogin, &sex, &logincount, &state,
- email, error_message, &connect_until_time, last_ip, memo, &ban_until_time, &n);
-
- sprintf(tmpsql, "SELECT `%s`,`%s`,`%s`,`lastlogin`,`logincount`,`sex`,`connect_until`,`last_ip`,`ban_until`,`state`"
- " FROM `%s` WHERE `%s`='%s'", login_account_id, login_userid, login_user_pass, login_db, login_userid, t_uid);
-
- if(mysql_query(&mysql_handle, tmpsql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- user_level = isGM(account_id);
- printf ("userlevel: %s (%d)- %d\n",userid, account_id, user_level);
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = mysql_fetch_row(sql_res); //row fetching
- if (!sql_row) //no row -> insert
- sprintf(tmpsql, "INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `lastlogin`, `sex`, `logincount`, `email`, `level`) VALUES (%d, '%s', '%s', '%s', '%c', %d, 'user@athena', %d);",account_id , userid, pass,lastlogin,sex,logincount, user_level);
- else //row reside -> updating
- sprintf(tmpsql, "UPDATE `login` SET `account_id`='%d', `userid`='%s', `user_pass`='%s', `lastlogin`='%s', `sex`='%c', `logincount`='%d', `email`='user@athena', `level`='%d'\nWHERE `account_id`='%d';",account_id , userid, pass,lastlogin,sex,logincount, user_level, account_id);
- printf ("Query: %s\n",tmpsql);
- mysql_free_result(sql_res) ; //resource free
- if(mysql_query(&mysql_handle, tmpsql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- }
- fclose(fp);
-
- printf ("Ñonvert end...\n");
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒgƒf??ƒx?ƒX‚Ì‘‚«ž‚Ý
-void nowork(void)
-{
- //null
-}
-
-int login_config_read(const char *cfgName){
- int i;
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- printf ("Start reading interserver configuration: %s\n",cfgName);
-
- fp=fopen(cfgName,"r");
- if(fp==NULL){
- printf("File not found: %s\n", cfgName);
- return 1;
- }
-
- while(fgets(line, 1020, fp)){
- if(line[0] == '/' && line[1] == '/')
- continue;
-
- i=sscanf(line,"%[^:]:%s", w1, w2);
- if(i!=2)
- continue;
-
- //add for DB connection
- if(strcmpi(w1,"db_server_ip")==0){
- strcpy(db_server_ip, w2);
- printf ("set db_server_ip : %s\n",w2);
- }
- else if(strcmpi(w1,"db_server_port")==0){
- db_server_port=atoi(w2);
- printf ("set db_server_port : %s\n",w2);
- }
- else if(strcmpi(w1,"db_server_id")==0){
- strcpy(db_server_id, w2);
- printf ("set db_server_id : %s\n",w2);
- }
- else if(strcmpi(w1,"db_server_pw")==0){
- strcpy(db_server_pw, w2);
- printf ("set db_server_pw : %s\n",w2);
- }
- else if(strcmpi(w1,"db_server_logindb")==0){
- strcpy(db_server_logindb, w2);
- printf ("set db_server_logindb : %s\n",w2);
- }
- //support the import command, just like any other config
- else if(strcmpi(w1,"import")==0){
- login_config_read(w2);
- }
- }
- fclose(fp);
- printf ("End reading interserver configuration...\n");
- return 0;
-}
-
-int do_init(int argc,char **argv)
-{
- char input;
- login_config_read( (argc>1)?argv[1]:INTER_CONF_NAME );
- read_gm_account();
-
- printf("\nWarning : Make sure you backup your databases before continuing!\n");
- printf("\nDo you wish to convert your Login Database to SQL? (y/n) : ");
- input=getchar();
- if(input == 'y' || input == 'Y')
- mmo_auth_init();
- printf ("Everything's been converted!\n");
- exit (0);
-}
-
-
diff --git a/src/webserver/Makefile b/src/webserver/Makefile
deleted file mode 100644
index 077b39980..000000000
--- a/src/webserver/Makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-all:
- #Generate framework...
- $(CC) -c parse.c
- $(CC) -c generate.c
- $(CC) -c htmlstyle.c
- $(CC) -c logs.c
-
- #Generate "pages"...
- cd pages && $(CC) -c about.c && cd ..
- cd pages && $(CC) -c sample.c && cd ..
- cd pages && $(CC) -c notdone.c && cd ..
-
- #Building the server...
- $(CC) -o webserver main.c parse.o generate.o htmlstyle.o \
- logs.o pages/about.o pages/sample.o pages/notdone.o
-
-clean:
- rm -f *.o
- rm -f pages/*.o
- rm -f webserver
diff --git a/src/webserver/doc/API.txt b/src/webserver/doc/API.txt
deleted file mode 100644
index c80f7bd44..000000000
--- a/src/webserver/doc/API.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-Here's the webserver API, so you can work on the webserver.
-
-My personal goal is to make this interface simple, so that coding it
-will be like coding in some scripting language...
-
-
-
-char *get_param(char in_string[500], char swhat[500]);
-
-This function simply returns various data from the query string.
- *Pass get_param NOTHING longer than 500 in length!
-
- What do I pass where in_string is?
- The query string.
-
- What do I pass where swhat is?
- One of two things...
- Either 0 for the path of the 'page'
- or you can pass it the param you wish to lookup.
-
-
-
-
-
-
-char *get_query(char *inquery);
-
-This function simply returns a query string from the raw server request.
-This is used once in main, I doubt you'll need it.
-
-
-
-
-
-void web_send(int sockin, char *in_data);
-
-Super easy way of sending data to a webpage!
-Simply put in the socket name and then the data.
-
- Ex:
- web_send(socket, "I like cheese!\n");
-
-
-
-
-char *html_header(char* title);
-Easy way to print the eAthena header for the server.
-
- Ex:
- web_send(sockethere, html_header("About"));
diff --git a/src/webserver/doc/README b/src/webserver/doc/README
deleted file mode 100644
index 0e94ff2ae..000000000
--- a/src/webserver/doc/README
+++ /dev/null
@@ -1,11 +0,0 @@
-This readme is intended for the programmers of eAthena.
-
-This webserver's apis are in API.txt.
-
-To make this simple, generate.c should handle most of the work this sever does
-in terms of what people see.
-
-When a request is made the server shoots it off to generate.c.
-
-You are welcome to create more functions used by generate.c to generate pages
-though, so don't feel limited by that one file.
diff --git a/src/webserver/generate.c b/src/webserver/generate.c
deleted file mode 100644
index ad050db4c..000000000
--- a/src/webserver/generate.c
+++ /dev/null
@@ -1,38 +0,0 @@
-
-void generate_page(char password[25], int sock_in, char *query, char *ip)
-{
- char *page = get_param(query, 0);
- char *ppass = get_param(query, "password");
-
-
- if ( (ppass == 0) || (strcmp(password, ppass) != 0) )
- {
- web_send(sock_in, html_header("Enter your password"));
- web_send(sock_in, "<H1>NOT LOGGED IN!</H1><form action=\"/\" method=\"GET\">\n");
- web_send(sock_in, "Enter your password:<br>\n<input type=\"text\" name=\"password\">\n");
- web_send(sock_in, "<input type=\"submit\" value=\"Login\">\n");
- }
- else
- {
-
-
- //To make this simple, we will have a bunch of if statements
- //that then shoot out data off into functions.
-
-
- //The 'index'
- if ( strcmp(page, "/") == 0 )
- generate_notdone(sock_in, query, ip);
-
-
- //About page:
- if ( strcmp(page, "/about.html") == 0 )
- generate_about(sock_in, query, ip);
-
-
- //Test page:
- if ( strcmp(page, "/testing/") == 0 )
- generate_sample(sock_in, query, ip);
-
- }
-}
diff --git a/src/webserver/htmlstyle.c b/src/webserver/htmlstyle.c
deleted file mode 100644
index c3a4b927a..000000000
--- a/src/webserver/htmlstyle.c
+++ /dev/null
@@ -1,51 +0,0 @@
-char output[10000];
-
-char *html_header(char *title)
-{
- memset(output, 0x0, 10000);
- char *text = "<body text=\"#000000\" bgcolor=\"#939393\" link=\"#0033FF\">\n"
- "<br><table width=\"92%\" cellspacing=\"1\" cellpadding=\"0\" border=\"0\"\n"
- "align=\"center\" class=\"bordercolor\"><tbody><tr><td class=\"bordercolor\" width=\"100%\">\n"
- "<table bgcolor=\"#ffffff\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n"
- "<tbody><tr><td><table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#ffffff\">\n"
- "<tbody><tr><img src=\"http://eathena.sourceforge.net/athena.jpg\" alt=\"Athena\">\n"
- "<td bgcolor=\"#ffffff\"></td></tr></tbody></table></td></tr></tbody></table>\n"
- "</td></tr><tr align=\"left\"><td class=\"bordercolor\"><table bgcolor=\"#c6c6c6\" width=\"100%\" cellspacing=\"0\"\n"
- "cellpadding=\"0\" style=\"text-align: left; margin-right: auto; margin-left: 0px;\">\n";
- "<tbody><tr><td width=\"100%\" align=\"center\"><table border=\"0\" width=\"100%\" cellpadding=\"3\"\n"
- "cellspacing=\"0\" bgcolor=\"#c6c6c6\" align=\"center\"><tbody><tr>"
- "<td valign=\"middle\" bgcolor=\"#c6c6c6\" align=\"center\"><a href=\"/cgi-bin/forum/YaBB.cgi\">"
- "<span style=\"text-decoration: underline;\"><span style=\"font-weight: bold;\">\n"
- "To the Forum</span></span></a><br></td></tr></tbody></table></td></tr></tbody>\n"
- "</table></td></tr><tr><td class=\"bordercolor\" align=\"center\">\n"
- "<table bgcolor=\"#ffffff\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\">\n"
- "<tbody><tr><td width=\"100%\" align=\"center\"><table border=\"0\" width=\"100%\" cellpadding=\"5\"\n"
- "cellspacing=\"0\" bgcolor=\"#ffffff\" align=\"center\"><tbody><tr>\n"
- "<td valign=\"middle\" bgcolor=\"#ffffff\" align=\"center\"><font size=\"2\" color=\"#6e94b7\">\n"
- "<b>Athena</b> &laquo; Portal &raquo;</font></td></tr></tbody></table></td></tr></tbody>"
- "</table></td></tr></tbody></table>\n";
-
- sprintf(output, "<title>%s</title>\n%s\n", title, text);
-
- return output;
-}
-
-
-
-char *html_start_form(char *location, char *action)
-{
- memset(output, 0x0, 10000);
- sprintf(output, "<form action=\"%s\" method=\"%s\">", location, action);
- return output;
-
-
-}
-
-
-char *html_end_forum(void)
-{
- return "</form>";
-}
-
-
-
diff --git a/src/webserver/logs.c b/src/webserver/logs.c
deleted file mode 100644
index 405b4882b..000000000
--- a/src/webserver/logs.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <time.h>
-
-void log_visit(char *query, char *ip)
-{
- time_t timer;
- timer=time(NULL);
- printf("%s - \"%s\" - %s", ip, query, asctime(localtime(&timer)));
-}
diff --git a/src/webserver/main.c b/src/webserver/main.c
deleted file mode 100644
index 59362558e..000000000
--- a/src/webserver/main.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/***************************************************************************
- description
- -------------------
- author : (C) 2004 by Michael J. Flickinger
- email : mjflick@cpan.org
-
- ***************************************************************************/
-
-/***************************************************************************
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- ***************************************************************************/
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <sys/wait.h>
-#include <signal.h>
-
-#define BLOG 10
-
-char *header = "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n";
-char recvin[500], password[25];
-int s_port;
-
-void sigchld_handler(int s)
-{
- while(wait(NULL) > 0);
-}
-
-int main(int argc, char **argv)
-{
- if (argc < 3)
- {
- printf("eAthena Web Server\n");
- printf("usage: %s [password] [port]\n", argv[0]);
- exit(0);
- }
-
- s_port = atoi(argv[2]);
-
- if ((s_port < 1) || (s_port > 65534))
- {
- printf("Error: The port you choose is not valid port.\n");
- exit(0);
- }
-
- if (strlen(argv[1]) > 25)
- {
- printf("Error: Your password is too long.\n");
- printf("It must be shorter than 25 characters.\n");
- exit(0);
- }
-
- memset(password, 0x0, 25);
- memcpy(password, argv[1], strlen(argv[1]));
-
- int sockfd, new_fd;
- struct sockaddr_in my_addr;
- struct sockaddr_in their_addr;
- int sin_size;
-
- struct sigaction sa;
-
- int yes=1;
-
- if ((sockfd = socket(AF_INET, SOCK_STREAM,0)) == -1)
- {
- perror("Darn, this is broken.");
- exit(0);
- }
-
- if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
- {
- perror("Error... :-(");
- }
-
- //Now we know we have a working socket. :-)
-
- my_addr.sin_family = AF_INET;
- my_addr.sin_port = htons(s_port);
- my_addr.sin_addr.s_addr = INADDR_ANY;
- memset(&(my_addr.sin_zero), '\0', 8);
-
- if ( bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
- {
- perror("can not bind to this port");
- exit(0);
- }
-
- if ( listen(sockfd, BLOG) == -1)
- {
- perror("can not listen on port");
- exit(0);
- }
-
- sa.sa_handler = sigchld_handler;
-
- sigemptyset(&sa.sa_mask);
- sa.sa_flags = SA_RESTART;
-
- if (sigaction(SIGCHLD, &sa, NULL) == -1)
- {
- perror("sigaction sucks");
- exit(0);
- }
-
- printf("The eAthena webserver is up and listening on port %i.\n", s_port);
-
- while(1)
- {
- sin_size = sizeof(struct sockaddr_in);
- new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
-
- if (!fork())
- {
- close(sockfd);
- memset(recvin, 0x0, 500);
- recv(new_fd, recvin, 500, 0);
- send(new_fd, header, strlen(header), 0);
- generate_page(password, new_fd, get_query(recvin), inet_ntoa(their_addr.sin_addr));
- log_visit(get_query(recvin), inet_ntoa(their_addr.sin_addr));
-
- close(new_fd);
- exit(0);
- }
- close(new_fd);
- }
-
- return 0;
-}
diff --git a/src/webserver/pages/about.c b/src/webserver/pages/about.c
deleted file mode 100644
index 2b0002ad8..000000000
--- a/src/webserver/pages/about.c
+++ /dev/null
@@ -1,6 +0,0 @@
-void generate_about(int sock_in, char *query, char *ip)
-{
-//printf("%s", html_header("About"));
- web_send(sock_in, html_header("About"));
- web_send(sock_in, "<center>eAthena Web Server!</center>\n");
-}
diff --git a/src/webserver/pages/notdone.c b/src/webserver/pages/notdone.c
deleted file mode 100644
index a6492e361..000000000
--- a/src/webserver/pages/notdone.c
+++ /dev/null
@@ -1,5 +0,0 @@
-void generate_notdone(int sock_in, char *query, char *ip)
-{
- web_send(sock_in, "<title>Not here!</title>\n");
- web_send(sock_in, "<h2><center>This page/feature is not done yet.</center>\n</h2>");
-}
diff --git a/src/webserver/pages/sample.c b/src/webserver/pages/sample.c
deleted file mode 100644
index be900a1bf..000000000
--- a/src/webserver/pages/sample.c
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-void generate_sample(int sock_in, char *query, char *ip)
-{
-
- char *name = get_param(query, "name");
-
- web_send(sock_in, "<title>SAMPLE</title>\n");
-
-
- //If a name was not entered...
- if ( name == '\0' )
- {
- web_send(sock_in, "<form action=\"/testing/\" method=\"GET\">\n");
- web_send(sock_in, "<input type=\"text\" name=\"name\">\n");
- web_send(sock_in, "<input type=\"submit\">\n");
- }
- else
- {
- web_send(sock_in, "Your name is: ");
- web_send(sock_in, get_param(query, "name"));
- }
-printf("OK!\n");
-}
diff --git a/src/webserver/parse.c b/src/webserver/parse.c
deleted file mode 100644
index 8e54a81de..000000000
--- a/src/webserver/parse.c
+++ /dev/null
@@ -1,135 +0,0 @@
-#include <stdlib.h>
-
-char filtered_query[2000];
-char rdata[500];
-char param_n[500];
-char param_d[500];
-
-
-char *get_query(char *inquery)
-{
- memset(filtered_query, 0x0, 2000);
- sscanf(inquery, "GET %s %[$]", filtered_query);
- return(filtered_query);
-}
-
-void web_send(int sockin, char *in_data)
-{
- send(sockin, in_data, strlen(in_data), 0);
-}
-
-
-//THIS IS BAD CODE BE CAREFULL WITH IT!
-//Watch out for buffer overflow...
-//When using please make sure to check the string size.
-
-//Also note:
-//I take no pride in this code, it is a really bad way of doing this...
-char *get_param(char in_string[500], char swhat[500])
-{
- int i = 0;
- int marker, iswitch, pint, dint;
- char flux[500];
- memset(flux, 0x0, 500);
-
- //Get the path of out "page"
- if (swhat == 0)
- {
- //while i is not equal to array size
- while (i != 500)
- {
- //if there is a question mark, halt!
- if (in_string[i] == '?')
- {
- i = 499;
- }
- else
- rdata[i] = in_string[i];
-
- i++;
- }
- return rdata;
- }
- else //so, we want a param...
- {
- //calculate where param begins
- while (i != 500)
- {
- if (in_string[i] == '?')
- {
- marker = i + 1;
- i = 499;
- }
- i++;
- }
-
- i = 0;
-
- //keep morons from trying to crash this
- if ((marker > 500)||(marker < 1))
- marker = 500;
-
- while(marker != 500)
- {
- if ((in_string[marker] != '&') && (in_string[marker] != '\0'))
- {
- flux[i] = in_string[marker];
- i++;
- }
- else
- {
-
- //we have a param, now we must dig through it
-
- //clear temp vars
- memset(param_n, 0x0, 500);
- memset(param_d, 0x0, 500);
- iswitch = 0;
- pint = 0;
- dint = 0;
- i = 0;
-
- //split result into param_n and param_d
- while(i != 500)
- {
- if ( (flux[i] != '=') && (flux[i] != '\0') )
- {
- if (iswitch == 0)
- {
- param_n[pint] = flux[i];
- pint++;
- }
- else
- {
- param_d[dint] = flux[i];
- dint++;
- }
- }
- else
- {
- iswitch = 1;
- }
- if (flux[i] == '\0')
- i = 499;
-
- i++;
- }
-
- if ( strcmp(param_n, swhat) == 0 )
- {
- return param_d;
- }
-
- i = 0;
- }
-
- if (in_string[marker] == '\0')
- {
- marker = 499;
- }
- marker++;
- }
- return 0;
- }
-}
-
diff --git a/src/zlib/FAQ b/src/zlib/FAQ
deleted file mode 100644
index 4f61f1094..000000000
--- a/src/zlib/FAQ
+++ /dev/null
@@ -1,337 +0,0 @@
-
- Frequently Asked Questions about zlib
-
-
-If your question is not there, please check the zlib home page
-http://www.zlib.org which may have more recent information.
-The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html
-
-
- 1. Is zlib Y2K-compliant?
-
- Yes. zlib doesn't handle dates.
-
- 2. Where can I get a Windows DLL version?
-
- The zlib sources can be compiled without change to produce a DLL.
- See the file win32/DLL_FAQ.txt in the zlib distribution.
- Pointers to the precompiled DLL are found in the zlib web site at
- http://www.zlib.org.
-
- 3. Where can I get a Visual Basic interface to zlib?
-
- See
- * http://www.dogma.net/markn/articles/zlibtool/zlibtool.htm
- * contrib/visual-basic.txt in the zlib distribution
- * win32/DLL_FAQ.txt in the zlib distribution
-
- 4. compress() returns Z_BUF_ERROR.
-
- Make sure that before the call of compress, the length of the compressed
- buffer is equal to the total size of the compressed buffer and not
- zero. For Visual Basic, check that this parameter is passed by reference
- ("as any"), not by value ("as long").
-
- 5. deflate() or inflate() returns Z_BUF_ERROR.
-
- Before making the call, make sure that avail_in and avail_out are not
- zero. When setting the parameter flush equal to Z_FINISH, also make sure
- that avail_out is big enough to allow processing all pending input.
- Note that a Z_BUF_ERROR is not fatal--another call to deflate() or
- inflate() can be made with more input or output space. A Z_BUF_ERROR
- may in fact be unavoidable depending on how the functions are used, since
- it is not possible to tell whether or not there is more output pending
- when strm.avail_out returns with zero.
-
- 6. Where's the zlib documentation (man pages, etc.)?
-
- It's in zlib.h for the moment, and Francis S. Lin has converted it to a
- web page zlib.html. Volunteers to transform this to Unix-style man pages,
- please contact us (zlib@gzip.org). Examples of zlib usage are in the files
- example.c and minigzip.c.
-
- 7. Why don't you use GNU autoconf or libtool or ...?
-
- Because we would like to keep zlib as a very small and simple
- package. zlib is rather portable and doesn't need much configuration.
-
- 8. I found a bug in zlib.
-
- Most of the time, such problems are due to an incorrect usage of
- zlib. Please try to reproduce the problem with a small program and send
- the corresponding source to us at zlib@gzip.org . Do not send
- multi-megabyte data files without prior agreement.
-
- 9. Why do I get "undefined reference to gzputc"?
-
- If "make test" produces something like
-
- example.o(.text+0x154): undefined reference to `gzputc'
-
- check that you don't have old files libz.* in /usr/lib, /usr/local/lib or
- /usr/X11R6/lib. Remove any old versions, then do "make install".
-
-10. I need a Delphi interface to zlib.
-
- See the contrib/delphi directory in the zlib distribution.
-
-11. Can zlib handle .zip archives?
-
- Not by itself, no. See the directory contrib/minizip in the zlib
- distribution.
-
-12. Can zlib handle .Z files?
-
- No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt
- the code of uncompress on your own.
-
-13. How can I make a Unix shared library?
-
- make clean
- ./configure -s
- make
-
-14. How do I install a shared zlib library on Unix?
-
- After the above, then:
-
- make install
-
- However, many flavors of Unix come with a shared zlib already installed.
- Before going to the trouble of compiling a shared version of zlib and
- trying to install it, you may want to check if it's already there! If you
- can #include <zlib.h>, it's there. The -lz option will probably link to it.
-
-15. I have a question about OttoPDF.
-
- We are not the authors of OttoPDF. The real author is on the OttoPDF web
- site: Joel Hainley, jhainley@myndkryme.com.
-
-16. Can zlib decode Flate data in an Adobe PDF file?
-
- Yes. See http://www.fastio.com/ (ClibPDF), or http://www.pdflib.com/ .
- To modify PDF forms, see http://sourceforge.net/projects/acroformtool/ .
-
-17. Why am I getting this "register_frame_info not found" error on Solaris?
-
- After installing zlib 1.1.4 on Solaris 2.6, running applications using zlib
- generates an error such as:
-
- ld.so.1: rpm: fatal: relocation error: file /usr/local/lib/libz.so:
- symbol __register_frame_info: referenced symbol not found
-
- The symbol __register_frame_info is not part of zlib, it is generated by
- the C compiler (cc or gcc). You must recompile applications using zlib
- which have this problem. This problem is specific to Solaris. See
- http://www.sunfreeware.com for Solaris versions of zlib and applications
- using zlib.
-
-18. Why does gzip give an error on a file I make with compress/deflate?
-
- The compress and deflate functions produce data in the zlib format, which
- is different and incompatible with the gzip format. The gz* functions in
- zlib on the other hand use the gzip format. Both the zlib and gzip
- formats use the same compressed data format internally, but have different
- headers and trailers around the compressed data.
-
-19. Ok, so why are there two different formats?
-
- The gzip format was designed to retain the directory information about
- a single file, such as the name and last modification date. The zlib
- format on the other hand was designed for in-memory and communication
- channel applications, and has a much more compact header and trailer and
- uses a faster integrity check than gzip.
-
-20. Well that's nice, but how do I make a gzip file in memory?
-
- You can request that deflate write the gzip format instead of the zlib
- format using deflateInit2(). You can also request that inflate decode
- the gzip format using inflateInit2(). Read zlib.h for more details.
-
- Note that you cannot specify special gzip header contents (e.g. a file
- name or modification date), nor will inflate tell you what was in the
- gzip header. If you need to customize the header or see what's in it,
- you can use the raw deflate and inflate operations and the crc32()
- function and roll your own gzip encoding and decoding. Read the gzip
- RFC 1952 for details of the header and trailer format.
-
-21. Is zlib thread-safe?
-
- Yes. However any library routines that zlib uses and any application-
- provided memory allocation routines must also be thread-safe. zlib's gz*
- functions use stdio library routines, and most of zlib's functions use the
- library memory allocation routines by default. zlib's Init functions allow
- for the application to provide custom memory allocation routines.
-
- Of course, you should only operate on any given zlib or gzip stream from a
- single thread at a time.
-
-22. Can I use zlib in my commercial application?
-
- Yes. Please read the license in zlib.h.
-
-23. Is zlib under the GNU license?
-
- No. Please read the license in zlib.h.
-
-24. The license says that altered source versions must be "plainly marked". So
- what exactly do I need to do to meet that requirement?
-
- You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h. In
- particular, the final version number needs to be changed to "f", and an
- identification string should be appended to ZLIB_VERSION. Version numbers
- x.x.x.f are reserved for modifications to zlib by others than the zlib
- maintainers. For example, if the version of the base zlib you are altering
- is "1.2.3.4", then in zlib.h you should change ZLIB_VERNUM to 0x123f, and
- ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3". You can also
- update the version strings in deflate.c and inftrees.c.
-
- For altered source distributions, you should also note the origin and
- nature of the changes in zlib.h, as well as in ChangeLog and README, along
- with the dates of the alterations. The origin should include at least your
- name (or your company's name), and an email address to contact for help or
- issues with the library.
-
- Note that distributing a compiled zlib library along with zlib.h and
- zconf.h is also a source distribution, and so you should change
- ZLIB_VERSION and ZLIB_VERNUM and note the origin and nature of the changes
- in zlib.h as you would for a full source distribution.
-
-25. Will zlib work on a big-endian or little-endian architecture, and can I
- exchange compressed data between them?
-
- Yes and yes.
-
-26. Will zlib work on a 64-bit machine?
-
- It should. It has been tested on 64-bit machines, and has no dependence
- on any data types being limited to 32-bits in length. If you have any
- difficulties, please provide a complete problem report to zlib@gzip.org
-
-27. Will zlib decompress data from the PKWare Data Compression Library?
-
- No. The PKWare DCL uses a completely different compressed data format
- than does PKZIP and zlib. However, you can look in zlib's contrib/blast
- directory for a possible solution to your problem.
-
-28. Can I access data randomly in a compressed stream?
-
- No, not without some preparation. If when compressing you periodically
- use Z_FULL_FLUSH, carefully write all the pending data at those points,
- and keep an index of those locations, then you can start decompression
- at those points. You have to be careful to not use Z_FULL_FLUSH too
- often, since it can significantly degrade compression.
-
-29. Does zlib work on MVS, OS/390, CICS, etc.?
-
- We don't know for sure. We have heard occasional reports of success on
- these systems. If you do use it on one of these, please provide us with
- a report, instructions, and patches that we can reference when we get
- these questions. Thanks.
-
-30. Is there some simpler, easier to read version of inflate I can look at
- to understand the deflate format?
-
- First off, you should read RFC 1951. Second, yes. Look in zlib's
- contrib/puff directory.
-
-31. Does zlib infringe on any patents?
-
- As far as we know, no. In fact, that was originally the whole point behind
- zlib. Look here for some more information:
-
- http://www.gzip.org/#faq11
-
-32. Can zlib work with greater than 4 GB of data?
-
- Yes. inflate() and deflate() will process any amount of data correctly.
- Each call of inflate() or deflate() is limited to input and output chunks
- of the maximum value that can be stored in the compiler's "unsigned int"
- type, but there is no limit to the number of chunks. Note however that the
- strm.total_in and strm_total_out counters may be limited to 4 GB. These
- counters are provided as a convenience and are not used internally by
- inflate() or deflate(). The application can easily set up its own counters
- updated after each call of inflate() or deflate() to count beyond 4 GB.
- compress() and uncompress() may be limited to 4 GB, since they operate in a
- single call. gzseek() and gztell() may be limited to 4 GB depending on how
- zlib is compiled. See the zlibCompileFlags() function in zlib.h.
-
- The word "may" appears several times above since there is a 4 GB limit
- only if the compiler's "long" type is 32 bits. If the compiler's "long"
- type is 64 bits, then the limit is 16 exabytes.
-
-33. Does zlib have any security vulnerabilities?
-
- The only one that we are aware of is potentially in gzprintf(). If zlib
- is compiled to use sprintf() or vsprintf(), then there is no protection
- against a buffer overflow of a 4K string space, other than the caller of
- gzprintf() assuring that the output will not exceed 4K. On the other
- hand, if zlib is compiled to use snprintf() or vsnprintf(), which should
- normally be the case, then there is no vulnerability. The ./configure
- script will display warnings if an insecure variation of sprintf() will
- be used by gzprintf(). Also the zlibCompileFlags() function will return
- information on what variant of sprintf() is used by gzprintf().
-
- If you don't have snprintf() or vsnprintf() and would like one, you can
- find a portable implementation here:
-
- http://www.ijs.si/software/snprintf/
-
- Note that you should be using the most recent version of zlib. Versions
- 1.1.3 and before were subject to a double-free vulnerability.
-
-34. Is there a Java version of zlib?
-
- Probably what you want is to use zlib in Java. zlib is already included
- as part of the Java SDK in the java.util.zip package. If you really want
- a version of zlib written in the Java language, look on the zlib home
- page for links: http://www.zlib.org/
-
-35. I get this or that compiler or source-code scanner warning when I crank it
- up to maximally-pedantic. Can't you guys write proper code?
-
- Many years ago, we gave up attempting to avoid warnings on every compiler
- in the universe. It just got to be a waste of time, and some compilers
- were downright silly. So now, we simply make sure that the code always
- works.
-
-36. Will zlib read the (insert any ancient or arcane format here) compressed
- data format?
-
- Probably not. Look in the comp.compression FAQ for pointers to various
- formats and associated software.
-
-37. How can I encrypt/decrypt zip files with zlib?
-
- zlib doesn't support encryption. The original PKZIP encryption is very weak
- and can be broken with freely available programs. To get strong encryption,
- use GnuPG, http://www.gnupg.org/ , which already includes zlib compression.
- For PKZIP compatible "encryption", look at http://www.info-zip.org/
-
-38. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings?
-
- "gzip" is the gzip format, and "deflate" is the zlib format. They should
- probably have called the second one "zlib" instead to avoid confusion
- with the raw deflate compressed data format. While the HTTP 1.1 RFC 2616
- correctly points to the zlib specification in RFC 1950 for the "deflate"
- transfer encoding, there have been reports of servers and browsers that
- incorrectly produce or expect raw deflate data per the deflate
- specficiation in RFC 1951, most notably Microsoft. So even though the
- "deflate" transfer encoding using the zlib format would be the more
- efficient approach (and in fact exactly what the zlib format was designed
- for), using the "gzip" transfer encoding is probably more reliable due to
- an unfortunate choice of name on the part of the HTTP 1.1 authors.
-
- Bottom line: use the gzip format for HTTP 1.1 encoding.
-
-39. Does zlib support the new "Deflate64" format introduced by PKWare?
-
- No. PKWare has apparently decided to keep that format proprietary, since
- they have not documented it as they have previous compression formats.
- In any case, the compression improvements are so modest compared to other
- more modern approaches, that it's not worth the effort to implement.
-
-40. Can you please sign these lengthy legal documents and fax them back to us
- so that we can use your software in our product?
-
- No. Go away. Shoo.
diff --git a/src/zlib/README b/src/zlib/README
deleted file mode 100644
index df95ae13f..000000000
--- a/src/zlib/README
+++ /dev/null
@@ -1,126 +0,0 @@
-ZLIB DATA COMPRESSION LIBRARY
-
-zlib 1.2.2 is a general purpose data compression library. All the code is
-thread safe. The data format used by the zlib library is described by RFCs
-(Request for Comments) 1950 to 1952 in the files
-http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format)
-and rfc1952.txt (gzip format). These documents are also available in other
-formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html
-
-All functions of the compression library are documented in the file zlib.h
-(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example
-of the library is given in the file example.c which also tests that the library
-is working correctly. Another example is given in the file minigzip.c. The
-compression library itself is composed of all source files except example.c and
-minigzip.c.
-
-To compile all files and run the test program, follow the instructions given at
-the top of Makefile. In short "make test; make install" should work for most
-machines. For Unix: "./configure; make test; make install" For MSDOS, use one
-of the special makefiles such as Makefile.msc. For VMS, use Make_vms.com or
-descrip.mms.
-
-Questions about zlib should be sent to <zlib@gzip.org>, or to Gilles Vollant
-<info@winimage.com> for the Windows DLL version. The zlib home page is
-http://www.zlib.org or http://www.gzip.org/zlib/ Before reporting a problem,
-please check this site to verify that you have the latest version of zlib;
-otherwise get the latest version and check whether the problem still exists or
-not.
-
-PLEASE read the zlib FAQ http://www.gzip.org/zlib/zlib_faq.html before asking
-for help.
-
-Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan. 1997
-issue of Dr. Dobb's Journal; a copy of the article is available in
-http://dogma.net/markn/articles/zlibtool/zlibtool.htm
-
-The changes made in version 1.2.2 are documented in the file ChangeLog.
-
-Unsupported third party contributions are provided in directory "contrib".
-
-A Java implementation of zlib is available in the Java Development Kit
-http://java.sun.com/j2se/1.4.2/docs/api/java/util/zip/package-summary.html
-See the zlib home page http://www.zlib.org for details.
-
-A Perl interface to zlib written by Paul Marquess <pmqs@cpan.org> is in the
-CPAN (Comprehensive Perl Archive Network) sites
-http://www.cpan.org/modules/by-module/Compress/
-
-A Python interface to zlib written by A.M. Kuchling <amk@amk.ca> is
-available in Python 1.5 and later versions, see
-http://www.python.org/doc/lib/module-zlib.html
-
-A zlib binding for TCL written by Andreas Kupries <a.kupries@westend.com> is
-availlable at http://www.oche.de/~akupries/soft/trf/trf_zip.html
-
-An experimental package to read and write files in .zip format, written on top
-of zlib by Gilles Vollant <info@winimage.com>, is available in the
-contrib/minizip directory of zlib.
-
-
-Notes for some targets:
-
-- For Windows DLL versions, please see win32/DLL_FAQ.txt
-
-- For 64-bit Irix, deflate.c must be compiled without any optimization. With
- -O, one libpng test fails. The test works in 32 bit mode (with the -n32
- compiler flag). The compiler bug has been reported to SGI.
-
-- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works
- when compiled with cc.
-
-- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is
- necessary to get gzprintf working correctly. This is done by configure.
-
-- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with
- other compilers. Use "make test" to check your compiler.
-
-- gzdopen is not supported on RISCOS, BEOS and by some Mac compilers.
-
-- For PalmOs, see http://palmzlib.sourceforge.net/
-
-- When building a shared, i.e. dynamic library on Mac OS X, the library must be
- installed before testing (do "make install" before "make test"), since the
- library location is specified in the library.
-
-
-Acknowledgments:
-
- The deflate format used by zlib was defined by Phil Katz. The deflate
- and zlib specifications were written by L. Peter Deutsch. Thanks to all the
- people who reported problems and suggested various improvements in zlib;
- they are too numerous to cite here.
-
-Copyright notice:
-
- (C) 1995-2004 Jean-loup Gailly and Mark Adler
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-
- Jean-loup Gailly Mark Adler
- jloup@gzip.org madler@alumni.caltech.edu
-
-If you use the zlib library in a product, we would appreciate *not*
-receiving lengthy legal documents to sign. The sources are provided
-for free but without warranty of any kind. The library has been
-entirely written by Jean-loup Gailly and Mark Adler; it does not
-include third-party code.
-
-If you redistribute modified sources, we would appreciate that you include
-in the file ChangeLog history information documenting your changes. Please
-read the FAQ for more information on the distribution of modified source
-versions.
diff --git a/src/zlib/adler32.c b/src/zlib/adler32.c
deleted file mode 100644
index 624a1696e..000000000
--- a/src/zlib/adler32.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* adler32.c -- compute the Adler-32 checksum of a data stream
- * Copyright (C) 1995-2003 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* @(#) $Id$ */
-
-#define ZLIB_INTERNAL
-#include "zlib.h"
-
-#define BASE 65521UL /* largest prime smaller than 65536 */
-#define NMAX 5552
-/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
-
-#define DO1(buf,i) {s1 += buf[i]; s2 += s1;}
-#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1);
-#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2);
-#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4);
-#define DO16(buf) DO8(buf,0); DO8(buf,8);
-
-#ifdef NO_DIVIDE
-# define MOD(a) \
- do { \
- if (a >= (BASE << 16)) a -= (BASE << 16); \
- if (a >= (BASE << 15)) a -= (BASE << 15); \
- if (a >= (BASE << 14)) a -= (BASE << 14); \
- if (a >= (BASE << 13)) a -= (BASE << 13); \
- if (a >= (BASE << 12)) a -= (BASE << 12); \
- if (a >= (BASE << 11)) a -= (BASE << 11); \
- if (a >= (BASE << 10)) a -= (BASE << 10); \
- if (a >= (BASE << 9)) a -= (BASE << 9); \
- if (a >= (BASE << 8)) a -= (BASE << 8); \
- if (a >= (BASE << 7)) a -= (BASE << 7); \
- if (a >= (BASE << 6)) a -= (BASE << 6); \
- if (a >= (BASE << 5)) a -= (BASE << 5); \
- if (a >= (BASE << 4)) a -= (BASE << 4); \
- if (a >= (BASE << 3)) a -= (BASE << 3); \
- if (a >= (BASE << 2)) a -= (BASE << 2); \
- if (a >= (BASE << 1)) a -= (BASE << 1); \
- if (a >= BASE) a -= BASE; \
- } while (0)
-#else
-# define MOD(a) a %= BASE
-#endif
-
-/* ========================================================================= */
-uLong ZEXPORT adler32(adler, buf, len)
- uLong adler;
- const Bytef *buf;
- uInt len;
-{
- unsigned long s1 = adler & 0xffff;
- unsigned long s2 = (adler >> 16) & 0xffff;
- int k;
-
- if (buf == Z_NULL) return 1L;
-
- while (len > 0) {
- k = len < NMAX ? (int)len : NMAX;
- len -= k;
- while (k >= 16) {
- DO16(buf);
- buf += 16;
- k -= 16;
- }
- if (k != 0) do {
- s1 += *buf++;
- s2 += s1;
- } while (--k);
- MOD(s1);
- MOD(s2);
- }
- return (s2 << 16) | s1;
-}
diff --git a/src/zlib/compress.c b/src/zlib/compress.c
deleted file mode 100644
index 24ef02919..000000000
--- a/src/zlib/compress.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/* compress.c -- compress a memory buffer
- * Copyright (C) 1995-2002 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* @(#) $Id$ */
-
-#define ZLIB_INTERNAL
-#include "zlib.h"
-
-/* ===========================================================================
- Compresses the source buffer into the destination buffer. The level
- parameter has the same meaning as in deflateInit. sourceLen is the byte
- length of the source buffer. Upon entry, destLen is the total size of the
- destination buffer, which must be at least 0.1% larger than sourceLen plus
- 12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
-
- compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
- memory, Z_BUF_ERROR if there was not enough room in the output buffer,
- Z_STREAM_ERROR if the level parameter is invalid.
-*/
-int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
- Bytef *dest;
- uLongf *destLen;
- const Bytef *source;
- uLong sourceLen;
- int level;
-{
- z_stream stream;
- int err;
-
- stream.next_in = (Bytef*)source;
- stream.avail_in = (uInt)sourceLen;
-#ifdef MAXSEG_64K
- /* Check for source > 64K on 16-bit machine: */
- if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
-#endif
- stream.next_out = dest;
- stream.avail_out = (uInt)*destLen;
- if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
-
- stream.zalloc = (alloc_func)0;
- stream.zfree = (free_func)0;
- stream.opaque = (voidpf)0;
-
- err = deflateInit(&stream, level);
- if (err != Z_OK) return err;
-
- err = deflate(&stream, Z_FINISH);
- if (err != Z_STREAM_END) {
- deflateEnd(&stream);
- return err == Z_OK ? Z_BUF_ERROR : err;
- }
- *destLen = stream.total_out;
-
- err = deflateEnd(&stream);
- return err;
-}
-
-/* ===========================================================================
- */
-int ZEXPORT compress (dest, destLen, source, sourceLen)
- Bytef *dest;
- uLongf *destLen;
- const Bytef *source;
- uLong sourceLen;
-{
- return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
-}
-
-/* ===========================================================================
- If the default memLevel or windowBits for deflateInit() is changed, then
- this function needs to be updated.
- */
-uLong ZEXPORT compressBound (sourceLen)
- uLong sourceLen;
-{
- return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11;
-}
diff --git a/src/zlib/crc32.c b/src/zlib/crc32.c
deleted file mode 100644
index b39c7e125..000000000
--- a/src/zlib/crc32.c
+++ /dev/null
@@ -1,333 +0,0 @@
-/* crc32.c -- compute the CRC-32 of a data stream
- * Copyright (C) 1995-2003 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- *
- * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster
- * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing
- * tables for updating the shift register in one step with three exclusive-ors
- * instead of four steps with four exclusive-ors. This results about a factor
- * of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.
- */
-
-/* @(#) $Id$ */
-
-/*
- Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore
- protection on the static variables used to control the first-use generation
- of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should
- first call get_crc_table() to initialize the tables before allowing more than
- one thread to use crc32().
- */
-
-#ifdef MAKECRCH
-# include <stdio.h>
-# ifndef DYNAMIC_CRC_TABLE
-# define DYNAMIC_CRC_TABLE
-# endif /* !DYNAMIC_CRC_TABLE */
-#endif /* MAKECRCH */
-
-#include "zutil.h" /* for STDC and FAR definitions */
-
-#define local static
-
-/* Find a four-byte integer type for crc32_little() and crc32_big(). */
-#ifndef NOBYFOUR
-# ifdef STDC /* need ANSI C limits.h to determine sizes */
-# include <limits.h>
-# define BYFOUR
-# if (UINT_MAX == 0xffffffffUL)
- typedef unsigned int u4;
-# else
-# if (ULONG_MAX == 0xffffffffUL)
- typedef unsigned long u4;
-# else
-# if (USHRT_MAX == 0xffffffffUL)
- typedef unsigned short u4;
-# else
-# undef BYFOUR /* can't find a four-byte integer type! */
-# endif
-# endif
-# endif
-# endif /* STDC */
-#endif /* !NOBYFOUR */
-
-/* Definitions for doing the crc four data bytes at a time. */
-#ifdef BYFOUR
-# define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \
- (((w)&0xff00)<<8)+(((w)&0xff)<<24))
- local unsigned long crc32_little OF((unsigned long,
- const unsigned char FAR *, unsigned));
- local unsigned long crc32_big OF((unsigned long,
- const unsigned char FAR *, unsigned));
-# define TBLS 8
-#else
-# define TBLS 1
-#endif /* BYFOUR */
-
-#ifdef DYNAMIC_CRC_TABLE
-
-local volatile int crc_table_empty = 1;
-local unsigned long FAR crc_table[TBLS][256];
-local void make_crc_table OF((void));
-#ifdef MAKECRCH
- local void write_table OF((FILE *, const unsigned long FAR *));
-#endif /* MAKECRCH */
-
-/*
- Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:
- x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
-
- Polynomials over GF(2) are represented in binary, one bit per coefficient,
- with the lowest powers in the most significant bit. Then adding polynomials
- is just exclusive-or, and multiplying a polynomial by x is a right shift by
- one. If we call the above polynomial p, and represent a byte as the
- polynomial q, also with the lowest power in the most significant bit (so the
- byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
- where a mod b means the remainder after dividing a by b.
-
- This calculation is done using the shift-register method of multiplying and
- taking the remainder. The register is initialized to zero, and for each
- incoming bit, x^32 is added mod p to the register if the bit is a one (where
- x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
- x (which is shifting right by one and adding x^32 mod p if the bit shifted
- out is a one). We start with the highest power (least significant bit) of
- q and repeat for all eight bits of q.
-
- The first table is simply the CRC of all possible eight bit values. This is
- all the information needed to generate CRCs on data a byte at a time for all
- combinations of CRC register values and incoming bytes. The remaining tables
- allow for word-at-a-time CRC calculation for both big-endian and little-
- endian machines, where a word is four bytes.
-*/
-local void make_crc_table()
-{
- unsigned long c;
- int n, k;
- unsigned long poly; /* polynomial exclusive-or pattern */
- /* terms of polynomial defining this crc (except x^32): */
- static volatile int first = 1; /* flag to limit concurrent making */
- static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
-
- /* See if another task is already doing this (not thread-safe, but better
- than nothing -- significantly reduces duration of vulnerability in
- case the advice about DYNAMIC_CRC_TABLE is ignored) */
- if (first) {
- first = 0;
-
- /* make exclusive-or pattern from polynomial (0xedb88320UL) */
- poly = 0UL;
- for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++)
- poly |= 1UL << (31 - p[n]);
-
- /* generate a crc for every 8-bit value */
- for (n = 0; n < 256; n++) {
- c = (unsigned long)n;
- for (k = 0; k < 8; k++)
- c = c & 1 ? poly ^ (c >> 1) : c >> 1;
- crc_table[0][n] = c;
- }
-
-#ifdef BYFOUR
- /* generate crc for each value followed by one, two, and three zeros,
- and then the byte reversal of those as well as the first table */
- for (n = 0; n < 256; n++) {
- c = crc_table[0][n];
- crc_table[4][n] = REV(c);
- for (k = 1; k < 4; k++) {
- c = crc_table[0][c & 0xff] ^ (c >> 8);
- crc_table[k][n] = c;
- crc_table[k + 4][n] = REV(c);
- }
- }
-#endif /* BYFOUR */
-
- crc_table_empty = 0;
- }
- else { /* not first */
- /* wait for the other guy to finish (not efficient, but rare) */
- while (crc_table_empty)
- ;
- }
-
-#ifdef MAKECRCH
- /* write out CRC tables to crc32.h */
- {
- FILE *out;
-
- out = fopen("crc32.h", "w");
- if (out == NULL) return;
- fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n");
- fprintf(out, " * Generated automatically by crc32.c\n */\n\n");
- fprintf(out, "local const unsigned long FAR ");
- fprintf(out, "crc_table[TBLS][256] =\n{\n {\n");
- write_table(out, crc_table[0]);
-# ifdef BYFOUR
- fprintf(out, "#ifdef BYFOUR\n");
- for (k = 1; k < 8; k++) {
- fprintf(out, " },\n {\n");
- write_table(out, crc_table[k]);
- }
- fprintf(out, "#endif\n");
-# endif /* BYFOUR */
- fprintf(out, " }\n};\n");
- fclose(out);
- }
-#endif /* MAKECRCH */
-}
-
-#ifdef MAKECRCH
-local void write_table(out, table)
- FILE *out;
- const unsigned long FAR *table;
-{
- int n;
-
- for (n = 0; n < 256; n++)
- fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n],
- n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", "));
-}
-#endif /* MAKECRCH */
-
-#else /* !DYNAMIC_CRC_TABLE */
-/* ========================================================================
- * Tables of CRC-32s of all single-byte values, made by make_crc_table().
- */
-#include "crc32.h"
-#endif /* DYNAMIC_CRC_TABLE */
-
-/* =========================================================================
- * This function can be used by asm versions of crc32()
- */
-const unsigned long FAR * ZEXPORT get_crc_table()
-{
-#ifdef DYNAMIC_CRC_TABLE
- if (crc_table_empty)
- make_crc_table();
-#endif /* DYNAMIC_CRC_TABLE */
- return (const unsigned long FAR *)crc_table;
-}
-
-/* ========================================================================= */
-#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8)
-#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1
-
-/* ========================================================================= */
-unsigned long ZEXPORT crc32(crc, buf, len)
- unsigned long crc;
- const unsigned char FAR *buf;
- unsigned len;
-{
- if (buf == Z_NULL) return 0UL;
-
-#ifdef DYNAMIC_CRC_TABLE
- if (crc_table_empty)
- make_crc_table();
-#endif /* DYNAMIC_CRC_TABLE */
-
-#ifdef BYFOUR
- if (sizeof(void *) == sizeof(ptrdiff_t)) {
- u4 endian;
-
- endian = 1;
- if (*((unsigned char *)(&endian)))
- return crc32_little(crc, buf, len);
- else
- return crc32_big(crc, buf, len);
- }
-#endif /* BYFOUR */
- crc = crc ^ 0xffffffffUL;
- while (len >= 8) {
- DO8;
- len -= 8;
- }
- if (len) do {
- DO1;
- } while (--len);
- return crc ^ 0xffffffffUL;
-}
-
-#ifdef BYFOUR
-
-/* ========================================================================= */
-#define DOLIT4 c ^= *buf4++; \
- c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \
- crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24]
-#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4
-
-/* ========================================================================= */
-local unsigned long crc32_little(crc, buf, len)
- unsigned long crc;
- const unsigned char FAR *buf;
- unsigned len;
-{
- register u4 c;
- register const u4 FAR *buf4;
-
- c = (u4)crc;
- c = ~c;
- while (len && ((ptrdiff_t)buf & 3)) {
- c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
- len--;
- }
-
- buf4 = (const u4 FAR *)buf;
- while (len >= 32) {
- DOLIT32;
- len -= 32;
- }
- while (len >= 4) {
- DOLIT4;
- len -= 4;
- }
- buf = (const unsigned char FAR *)buf4;
-
- if (len) do {
- c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
- } while (--len);
- c = ~c;
- return (unsigned long)c;
-}
-
-/* ========================================================================= */
-#define DOBIG4 c ^= *++buf4; \
- c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \
- crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24]
-#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4
-
-/* ========================================================================= */
-local unsigned long crc32_big(crc, buf, len)
- unsigned long crc;
- const unsigned char FAR *buf;
- unsigned len;
-{
- register u4 c;
- register const u4 FAR *buf4;
-
- c = REV((u4)crc);
- c = ~c;
- while (len && ((ptrdiff_t)buf & 3)) {
- c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
- len--;
- }
-
- buf4 = (const u4 FAR *)buf;
- buf4--;
- while (len >= 32) {
- DOBIG32;
- len -= 32;
- }
- while (len >= 4) {
- DOBIG4;
- len -= 4;
- }
- buf4++;
- buf = (const unsigned char FAR *)buf4;
-
- if (len) do {
- c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
- } while (--len);
- c = ~c;
- return (unsigned long)(REV(c));
-}
-
-#endif /* BYFOUR */
diff --git a/src/zlib/crc32.h b/src/zlib/crc32.h
deleted file mode 100644
index 8053b6117..000000000
--- a/src/zlib/crc32.h
+++ /dev/null
@@ -1,441 +0,0 @@
-/* crc32.h -- tables for rapid CRC calculation
- * Generated automatically by crc32.c
- */
-
-local const unsigned long FAR crc_table[TBLS][256] =
-{
- {
- 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,
- 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL,
- 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL,
- 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL,
- 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL,
- 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL,
- 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL,
- 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL,
- 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL,
- 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL,
- 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL,
- 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL,
- 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL,
- 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL,
- 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL,
- 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL,
- 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL,
- 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL,
- 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL,
- 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL,
- 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL,
- 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL,
- 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL,
- 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL,
- 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL,
- 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL,
- 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL,
- 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL,
- 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL,
- 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL,
- 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL,
- 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL,
- 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL,
- 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL,
- 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL,
- 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL,
- 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL,
- 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL,
- 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL,
- 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL,
- 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL,
- 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL,
- 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL,
- 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL,
- 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL,
- 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL,
- 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL,
- 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL,
- 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL,
- 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL,
- 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL,
- 0x2d02ef8dUL
-#ifdef BYFOUR
- },
- {
- 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL,
- 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL,
- 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL,
- 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL,
- 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL,
- 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL,
- 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL,
- 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL,
- 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL,
- 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL,
- 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL,
- 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL,
- 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL,
- 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL,
- 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL,
- 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL,
- 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL,
- 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL,
- 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL,
- 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL,
- 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL,
- 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL,
- 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL,
- 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL,
- 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL,
- 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL,
- 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL,
- 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL,
- 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL,
- 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL,
- 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL,
- 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL,
- 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL,
- 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL,
- 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL,
- 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL,
- 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL,
- 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL,
- 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL,
- 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL,
- 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL,
- 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL,
- 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL,
- 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL,
- 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL,
- 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL,
- 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL,
- 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL,
- 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL,
- 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL,
- 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL,
- 0x9324fd72UL
- },
- {
- 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL,
- 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL,
- 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL,
- 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL,
- 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL,
- 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL,
- 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL,
- 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL,
- 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL,
- 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL,
- 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL,
- 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL,
- 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL,
- 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL,
- 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL,
- 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL,
- 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL,
- 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL,
- 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL,
- 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL,
- 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL,
- 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL,
- 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL,
- 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL,
- 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL,
- 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL,
- 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL,
- 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL,
- 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL,
- 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL,
- 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL,
- 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL,
- 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL,
- 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL,
- 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL,
- 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL,
- 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL,
- 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL,
- 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL,
- 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL,
- 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL,
- 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL,
- 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL,
- 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL,
- 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL,
- 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL,
- 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL,
- 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL,
- 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL,
- 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL,
- 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL,
- 0xbe9834edUL
- },
- {
- 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL,
- 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL,
- 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL,
- 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL,
- 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL,
- 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL,
- 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL,
- 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL,
- 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL,
- 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL,
- 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL,
- 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL,
- 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL,
- 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL,
- 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL,
- 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL,
- 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL,
- 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL,
- 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL,
- 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL,
- 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL,
- 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL,
- 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL,
- 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL,
- 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL,
- 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL,
- 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL,
- 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL,
- 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL,
- 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL,
- 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL,
- 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL,
- 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL,
- 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL,
- 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL,
- 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL,
- 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL,
- 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL,
- 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL,
- 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL,
- 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL,
- 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL,
- 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL,
- 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL,
- 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL,
- 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL,
- 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL,
- 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL,
- 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL,
- 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL,
- 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL,
- 0xde0506f1UL
- },
- {
- 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL,
- 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL,
- 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL,
- 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL,
- 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL,
- 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL,
- 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL,
- 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL,
- 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL,
- 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL,
- 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL,
- 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL,
- 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL,
- 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL,
- 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL,
- 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL,
- 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL,
- 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL,
- 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL,
- 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL,
- 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL,
- 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL,
- 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL,
- 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL,
- 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL,
- 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL,
- 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL,
- 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL,
- 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL,
- 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL,
- 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL,
- 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL,
- 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL,
- 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL,
- 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL,
- 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL,
- 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL,
- 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL,
- 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL,
- 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL,
- 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL,
- 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL,
- 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL,
- 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL,
- 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL,
- 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL,
- 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL,
- 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL,
- 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL,
- 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL,
- 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL,
- 0x8def022dUL
- },
- {
- 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL,
- 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL,
- 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL,
- 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL,
- 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL,
- 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL,
- 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL,
- 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL,
- 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL,
- 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL,
- 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL,
- 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL,
- 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL,
- 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL,
- 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL,
- 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL,
- 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL,
- 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL,
- 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL,
- 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL,
- 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL,
- 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL,
- 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL,
- 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL,
- 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL,
- 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL,
- 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL,
- 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL,
- 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL,
- 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL,
- 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL,
- 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL,
- 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL,
- 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL,
- 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL,
- 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL,
- 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL,
- 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL,
- 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL,
- 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL,
- 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL,
- 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL,
- 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL,
- 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL,
- 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL,
- 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL,
- 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL,
- 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL,
- 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL,
- 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL,
- 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL,
- 0x72fd2493UL
- },
- {
- 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL,
- 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL,
- 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL,
- 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL,
- 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL,
- 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL,
- 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL,
- 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL,
- 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL,
- 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL,
- 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL,
- 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL,
- 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL,
- 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL,
- 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL,
- 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL,
- 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL,
- 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL,
- 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL,
- 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL,
- 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL,
- 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL,
- 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL,
- 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL,
- 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL,
- 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL,
- 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL,
- 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL,
- 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL,
- 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL,
- 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL,
- 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL,
- 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL,
- 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL,
- 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL,
- 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL,
- 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL,
- 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL,
- 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL,
- 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL,
- 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL,
- 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL,
- 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL,
- 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL,
- 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL,
- 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL,
- 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL,
- 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL,
- 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL,
- 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL,
- 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL,
- 0xed3498beUL
- },
- {
- 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL,
- 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL,
- 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL,
- 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL,
- 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL,
- 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL,
- 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL,
- 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL,
- 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL,
- 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL,
- 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL,
- 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL,
- 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL,
- 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL,
- 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL,
- 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL,
- 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL,
- 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL,
- 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL,
- 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL,
- 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL,
- 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL,
- 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL,
- 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL,
- 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL,
- 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL,
- 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL,
- 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL,
- 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL,
- 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL,
- 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL,
- 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL,
- 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL,
- 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL,
- 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL,
- 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL,
- 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL,
- 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL,
- 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL,
- 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL,
- 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL,
- 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL,
- 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL,
- 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL,
- 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL,
- 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL,
- 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL,
- 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL,
- 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL,
- 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL,
- 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL,
- 0xf10605deUL
-#endif
- }
-};
diff --git a/src/zlib/deflate.c b/src/zlib/deflate.c
deleted file mode 100644
index 0fc53bc1e..000000000
--- a/src/zlib/deflate.c
+++ /dev/null
@@ -1,1502 +0,0 @@
-/* deflate.c -- compress data using the deflation algorithm
- * Copyright (C) 1995-2004 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/*
- * ALGORITHM
- *
- * The "deflation" process depends on being able to identify portions
- * of the input text which are identical to earlier input (within a
- * sliding window trailing behind the input currently being processed).
- *
- * The most straightforward technique turns out to be the fastest for
- * most input files: try all possible matches and select the longest.
- * The key feature of this algorithm is that insertions into the string
- * dictionary are very simple and thus fast, and deletions are avoided
- * completely. Insertions are performed at each input character, whereas
- * string matches are performed only when the previous match ends. So it
- * is preferable to spend more time in matches to allow very fast string
- * insertions and avoid deletions. The matching algorithm for small
- * strings is inspired from that of Rabin & Karp. A brute force approach
- * is used to find longer strings when a small match has been found.
- * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze
- * (by Leonid Broukhis).
- * A previous version of this file used a more sophisticated algorithm
- * (by Fiala and Greene) which is guaranteed to run in linear amortized
- * time, but has a larger average cost, uses more memory and is patented.
- * However the F&G algorithm may be faster for some highly redundant
- * files if the parameter max_chain_length (described below) is too large.
- *
- * ACKNOWLEDGEMENTS
- *
- * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and
- * I found it in 'freeze' written by Leonid Broukhis.
- * Thanks to many people for bug reports and testing.
- *
- * REFERENCES
- *
- * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".
- * Available in http://www.ietf.org/rfc/rfc1951.txt
- *
- * A description of the Rabin and Karp algorithm is given in the book
- * "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
- *
- * Fiala,E.R., and Greene,D.H.
- * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595
- *
- */
-
-/* @(#) $Id$ */
-
-#include "deflate.h"
-
-const char deflate_copyright[] =
- " deflate 1.2.2 Copyright 1995-2004 Jean-loup Gailly ";
-/*
- If you use the zlib library in a product, an acknowledgment is welcome
- in the documentation of your product. If for some reason you cannot
- include such an acknowledgment, I would appreciate that you keep this
- copyright string in the executable of your product.
- */
-
-/* ===========================================================================
- * Function prototypes.
- */
-typedef enum {
- need_more, /* block not completed, need more input or more output */
- block_done, /* block flush performed */
- finish_started, /* finish started, need only more output at next deflate */
- finish_done /* finish done, accept no more input or output */
-} block_state;
-
-typedef block_state (*compress_func) OF((deflate_state *s, int flush));
-/* Compression function. Returns the block state after the call. */
-
-local void fill_window OF((deflate_state *s));
-local block_state deflate_stored OF((deflate_state *s, int flush));
-local block_state deflate_fast OF((deflate_state *s, int flush));
-#ifndef FASTEST
-local block_state deflate_slow OF((deflate_state *s, int flush));
-#endif
-local void lm_init OF((deflate_state *s));
-local void putShortMSB OF((deflate_state *s, uInt b));
-local void flush_pending OF((z_streamp strm));
-local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size));
-#ifndef FASTEST
-#ifdef ASMV
- void match_init OF((void)); /* asm code initialization */
- uInt longest_match OF((deflate_state *s, IPos cur_match));
-#else
-local uInt longest_match OF((deflate_state *s, IPos cur_match));
-#endif
-#endif
-local uInt longest_match_fast OF((deflate_state *s, IPos cur_match));
-
-#ifdef DEBUG
-local void check_match OF((deflate_state *s, IPos start, IPos match,
- int length));
-#endif
-
-/* ===========================================================================
- * Local data
- */
-
-#define NIL 0
-/* Tail of hash chains */
-
-#ifndef TOO_FAR
-# define TOO_FAR 4096
-#endif
-/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */
-
-#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
-/* Minimum amount of lookahead, except at the end of the input file.
- * See deflate.c for comments about the MIN_MATCH+1.
- */
-
-/* Values for max_lazy_match, good_match and max_chain_length, depending on
- * the desired pack level (0..9). The values given below have been tuned to
- * exclude worst case performance for pathological files. Better values may be
- * found for specific files.
- */
-typedef struct config_s {
- ush good_length; /* reduce lazy search above this match length */
- ush max_lazy; /* do not perform lazy search above this match length */
- ush nice_length; /* quit search above this match length */
- ush max_chain;
- compress_func func;
-} config;
-
-#ifdef FASTEST
-local const config configuration_table[2] = {
-/* good lazy nice chain */
-/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */
-/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */
-#else
-local const config configuration_table[10] = {
-/* good lazy nice chain */
-/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */
-/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */
-/* 2 */ {4, 5, 16, 8, deflate_fast},
-/* 3 */ {4, 6, 32, 32, deflate_fast},
-
-/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */
-/* 5 */ {8, 16, 32, 32, deflate_slow},
-/* 6 */ {8, 16, 128, 128, deflate_slow},
-/* 7 */ {8, 32, 128, 256, deflate_slow},
-/* 8 */ {32, 128, 258, 1024, deflate_slow},
-/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */
-#endif
-
-/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4
- * For deflate_fast() (levels <= 3) good is ignored and lazy has a different
- * meaning.
- */
-
-#define EQUAL 0
-/* result of memcmp for equal strings */
-
-#ifndef NO_DUMMY_DECL
-struct static_tree_desc_s {int dummy;}; /* for buggy compilers */
-#endif
-
-/* ===========================================================================
- * Update a hash value with the given input byte
- * IN assertion: all calls to to UPDATE_HASH are made with consecutive
- * input characters, so that a running hash key can be computed from the
- * previous key instead of complete recalculation each time.
- */
-#define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)
-
-
-/* ===========================================================================
- * Insert string str in the dictionary and set match_head to the previous head
- * of the hash chain (the most recent string with same hash key). Return
- * the previous length of the hash chain.
- * If this file is compiled with -DFASTEST, the compression level is forced
- * to 1, and no hash chains are maintained.
- * IN assertion: all calls to to INSERT_STRING are made with consecutive
- * input characters and the first MIN_MATCH bytes of str are valid
- * (except for the last MIN_MATCH-1 bytes of the input file).
- */
-#ifdef FASTEST
-#define INSERT_STRING(s, str, match_head) \
- (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
- match_head = s->head[s->ins_h], \
- s->head[s->ins_h] = (Pos)(str))
-#else
-#define INSERT_STRING(s, str, match_head) \
- (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
- match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \
- s->head[s->ins_h] = (Pos)(str))
-#endif
-
-/* ===========================================================================
- * Initialize the hash table (avoiding 64K overflow for 16 bit systems).
- * prev[] will be initialized on the fly.
- */
-#define CLEAR_HASH(s) \
- s->head[s->hash_size-1] = NIL; \
- zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));
-
-/* ========================================================================= */
-int ZEXPORT deflateInit_(strm, level, version, stream_size)
- z_streamp strm;
- int level;
- const char *version;
- int stream_size;
-{
- return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,
- Z_DEFAULT_STRATEGY, version, stream_size);
- /* To do: ignore strm->next_in if we use it as window */
-}
-
-/* ========================================================================= */
-int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
- version, stream_size)
- z_streamp strm;
- int level;
- int method;
- int windowBits;
- int memLevel;
- int strategy;
- const char *version;
- int stream_size;
-{
- deflate_state *s;
- int wrap = 1;
- static const char my_version[] = ZLIB_VERSION;
-
- ushf *overlay;
- /* We overlay pending_buf and d_buf+l_buf. This works since the average
- * output size for (length,distance) codes is <= 24 bits.
- */
-
- if (version == Z_NULL || version[0] != my_version[0] ||
- stream_size != sizeof(z_stream)) {
- return Z_VERSION_ERROR;
- }
- if (strm == Z_NULL) return Z_STREAM_ERROR;
-
- strm->msg = Z_NULL;
- if (strm->zalloc == (alloc_func)0) {
- strm->zalloc = zcalloc;
- strm->opaque = (voidpf)0;
- }
- if (strm->zfree == (free_func)0) strm->zfree = zcfree;
-
-#ifdef FASTEST
- if (level != 0) level = 1;
-#else
- if (level == Z_DEFAULT_COMPRESSION) level = 6;
-#endif
-
- if (windowBits < 0) { /* suppress zlib wrapper */
- wrap = 0;
- windowBits = -windowBits;
- }
-#ifdef GZIP
- else if (windowBits > 15) {
- wrap = 2; /* write gzip wrapper instead */
- windowBits -= 16;
- }
-#endif
- if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||
- windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
- strategy < 0 || strategy > Z_RLE) {
- return Z_STREAM_ERROR;
- }
- if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */
- s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state));
- if (s == Z_NULL) return Z_MEM_ERROR;
- strm->state = (struct internal_state FAR *)s;
- s->strm = strm;
-
- s->wrap = wrap;
- s->w_bits = windowBits;
- s->w_size = 1 << s->w_bits;
- s->w_mask = s->w_size - 1;
-
- s->hash_bits = memLevel + 7;
- s->hash_size = 1 << s->hash_bits;
- s->hash_mask = s->hash_size - 1;
- s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);
-
- s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));
- s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos));
- s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos));
-
- s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
-
- overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
- s->pending_buf = (uchf *) overlay;
- s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L);
-
- if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
- s->pending_buf == Z_NULL) {
- s->status = FINISH_STATE;
- strm->msg = (char*)ERR_MSG(Z_MEM_ERROR);
- deflateEnd (strm);
- return Z_MEM_ERROR;
- }
- s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
- s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
-
- s->level = level;
- s->strategy = strategy;
- s->method = (Byte)method;
-
- return deflateReset(strm);
-}
-
-/* ========================================================================= */
-int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)
- z_streamp strm;
- const Bytef *dictionary;
- uInt dictLength;
-{
- deflate_state *s;
- uInt length = dictLength;
- uInt n;
- IPos hash_head = 0;
-
- if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL ||
- strm->state->wrap == 2 ||
- (strm->state->wrap == 1 && strm->state->status != INIT_STATE))
- return Z_STREAM_ERROR;
-
- s = strm->state;
- if (s->wrap)
- strm->adler = adler32(strm->adler, dictionary, dictLength);
-
- if (length < MIN_MATCH) return Z_OK;
- if (length > MAX_DIST(s)) {
- length = MAX_DIST(s);
-#ifndef USE_DICT_HEAD
- dictionary += dictLength - length; /* use the tail of the dictionary */
-#endif
- }
- zmemcpy(s->window, dictionary, length);
- s->strstart = length;
- s->block_start = (long)length;
-
- /* Insert all strings in the hash table (except for the last two bytes).
- * s->lookahead stays null, so s->ins_h will be recomputed at the next
- * call of fill_window.
- */
- s->ins_h = s->window[0];
- UPDATE_HASH(s, s->ins_h, s->window[1]);
- for (n = 0; n <= length - MIN_MATCH; n++) {
- INSERT_STRING(s, n, hash_head);
- }
- if (hash_head) hash_head = 0; /* to make compiler happy */
- return Z_OK;
-}
-
-/* ========================================================================= */
-int ZEXPORT deflateReset (strm)
- z_streamp strm;
-{
- deflate_state *s;
-
- if (strm == Z_NULL || strm->state == Z_NULL ||
- strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) {
- return Z_STREAM_ERROR;
- }
-
- strm->total_in = strm->total_out = 0;
- strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */
- strm->data_type = Z_UNKNOWN;
-
- s = (deflate_state *)strm->state;
- s->pending = 0;
- s->pending_out = s->pending_buf;
-
- if (s->wrap < 0) {
- s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */
- }
- s->status = s->wrap ? INIT_STATE : BUSY_STATE;
- strm->adler =
-#ifdef GZIP
- s->wrap == 2 ? crc32(0L, Z_NULL, 0) :
-#endif
- adler32(0L, Z_NULL, 0);
- s->last_flush = Z_NO_FLUSH;
-
- _tr_init(s);
- lm_init(s);
-
- return Z_OK;
-}
-
-/* ========================================================================= */
-int ZEXPORT deflatePrime (strm, bits, value)
- z_streamp strm;
- int bits;
- int value;
-{
- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
- strm->state->bi_valid = bits;
- strm->state->bi_buf = (ush)(value & ((1 << bits) - 1));
- return Z_OK;
-}
-
-/* ========================================================================= */
-int ZEXPORT deflateParams(strm, level, strategy)
- z_streamp strm;
- int level;
- int strategy;
-{
- deflate_state *s;
- compress_func func;
- int err = Z_OK;
-
- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
- s = strm->state;
-
-#ifdef FASTEST
- if (level != 0) level = 1;
-#else
- if (level == Z_DEFAULT_COMPRESSION) level = 6;
-#endif
- if (level < 0 || level > 9 || strategy < 0 || strategy > Z_RLE) {
- return Z_STREAM_ERROR;
- }
- func = configuration_table[s->level].func;
-
- if (func != configuration_table[level].func && strm->total_in != 0) {
- /* Flush the last buffer: */
- err = deflate(strm, Z_PARTIAL_FLUSH);
- }
- if (s->level != level) {
- s->level = level;
- s->max_lazy_match = configuration_table[level].max_lazy;
- s->good_match = configuration_table[level].good_length;
- s->nice_match = configuration_table[level].nice_length;
- s->max_chain_length = configuration_table[level].max_chain;
- }
- s->strategy = strategy;
- return err;
-}
-
-/* =========================================================================
- * For the default windowBits of 15 and memLevel of 8, this function returns
- * a close to exact, as well as small, upper bound on the compressed size.
- * They are coded as constants here for a reason--if the #define's are
- * changed, then this function needs to be changed as well. The return
- * value for 15 and 8 only works for those exact settings.
- *
- * For any setting other than those defaults for windowBits and memLevel,
- * the value returned is a conservative worst case for the maximum expansion
- * resulting from using fixed blocks instead of stored blocks, which deflate
- * can emit on compressed data for some combinations of the parameters.
- *
- * This function could be more sophisticated to provide closer upper bounds
- * for every combination of windowBits and memLevel, as well as wrap.
- * But even the conservative upper bound of about 14% expansion does not
- * seem onerous for output buffer allocation.
- */
-uLong ZEXPORT deflateBound(strm, sourceLen)
- z_streamp strm;
- uLong sourceLen;
-{
- deflate_state *s;
- uLong destLen;
-
- /* conservative upper bound */
- destLen = sourceLen +
- ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11;
-
- /* if can't get parameters, return conservative bound */
- if (strm == Z_NULL || strm->state == Z_NULL)
- return destLen;
-
- /* if not default parameters, return conservative bound */
- s = strm->state;
- if (s->w_bits != 15 || s->hash_bits != 8 + 7)
- return destLen;
-
- /* default settings: return tight bound for that case */
- return compressBound(sourceLen);
-}
-
-/* =========================================================================
- * Put a short in the pending buffer. The 16-bit value is put in MSB order.
- * IN assertion: the stream state is correct and there is enough room in
- * pending_buf.
- */
-local void putShortMSB (s, b)
- deflate_state *s;
- uInt b;
-{
- put_byte(s, (Byte)(b >> 8));
- put_byte(s, (Byte)(b & 0xff));
-}
-
-/* =========================================================================
- * Flush as much pending output as possible. All deflate() output goes
- * through this function so some applications may wish to modify it
- * to avoid allocating a large strm->next_out buffer and copying into it.
- * (See also read_buf()).
- */
-local void flush_pending(strm)
- z_streamp strm;
-{
- unsigned len = strm->state->pending;
-
- if (len > strm->avail_out) len = strm->avail_out;
- if (len == 0) return;
-
- zmemcpy(strm->next_out, strm->state->pending_out, len);
- strm->next_out += len;
- strm->state->pending_out += len;
- strm->total_out += len;
- strm->avail_out -= len;
- strm->state->pending -= len;
- if (strm->state->pending == 0) {
- strm->state->pending_out = strm->state->pending_buf;
- }
-}
-
-/* ========================================================================= */
-int ZEXPORT deflate (strm, flush)
- z_streamp strm;
- int flush;
-{
- int old_flush; /* value of flush param for previous deflate call */
- deflate_state *s;
-
- if (strm == Z_NULL || strm->state == Z_NULL ||
- flush > Z_FINISH || flush < 0) {
- return Z_STREAM_ERROR;
- }
- s = strm->state;
-
- if (strm->next_out == Z_NULL ||
- (strm->next_in == Z_NULL && strm->avail_in != 0) ||
- (s->status == FINISH_STATE && flush != Z_FINISH)) {
- ERR_RETURN(strm, Z_STREAM_ERROR);
- }
- if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR);
-
- s->strm = strm; /* just in case */
- old_flush = s->last_flush;
- s->last_flush = flush;
-
- /* Write the header */
- if (s->status == INIT_STATE) {
-#ifdef GZIP
- if (s->wrap == 2) {
- put_byte(s, 31);
- put_byte(s, 139);
- put_byte(s, 8);
- put_byte(s, 0);
- put_byte(s, 0);
- put_byte(s, 0);
- put_byte(s, 0);
- put_byte(s, 0);
- put_byte(s, s->level == 9 ? 2 :
- (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?
- 4 : 0));
- put_byte(s, 255);
- s->status = BUSY_STATE;
- strm->adler = crc32(0L, Z_NULL, 0);
- }
- else
-#endif
- {
- uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;
- uInt level_flags;
-
- if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2)
- level_flags = 0;
- else if (s->level < 6)
- level_flags = 1;
- else if (s->level == 6)
- level_flags = 2;
- else
- level_flags = 3;
- header |= (level_flags << 6);
- if (s->strstart != 0) header |= PRESET_DICT;
- header += 31 - (header % 31);
-
- s->status = BUSY_STATE;
- putShortMSB(s, header);
-
- /* Save the adler32 of the preset dictionary: */
- if (s->strstart != 0) {
- putShortMSB(s, (uInt)(strm->adler >> 16));
- putShortMSB(s, (uInt)(strm->adler & 0xffff));
- }
- strm->adler = adler32(0L, Z_NULL, 0);
- }
- }
-
- /* Flush as much pending output as possible */
- if (s->pending != 0) {
- flush_pending(strm);
- if (strm->avail_out == 0) {
- /* Since avail_out is 0, deflate will be called again with
- * more output space, but possibly with both pending and
- * avail_in equal to zero. There won't be anything to do,
- * but this is not an error situation so make sure we
- * return OK instead of BUF_ERROR at next call of deflate:
- */
- s->last_flush = -1;
- return Z_OK;
- }
-
- /* Make sure there is something to do and avoid duplicate consecutive
- * flushes. For repeated and useless calls with Z_FINISH, we keep
- * returning Z_STREAM_END instead of Z_BUF_ERROR.
- */
- } else if (strm->avail_in == 0 && flush <= old_flush &&
- flush != Z_FINISH) {
- ERR_RETURN(strm, Z_BUF_ERROR);
- }
-
- /* User must not provide more input after the first FINISH: */
- if (s->status == FINISH_STATE && strm->avail_in != 0) {
- ERR_RETURN(strm, Z_BUF_ERROR);
- }
-
- /* Start a new block or continue the current one.
- */
- if (strm->avail_in != 0 || s->lookahead != 0 ||
- (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {
- block_state bstate;
-
- bstate = (*(configuration_table[s->level].func))(s, flush);
-
- if (bstate == finish_started || bstate == finish_done) {
- s->status = FINISH_STATE;
- }
- if (bstate == need_more || bstate == finish_started) {
- if (strm->avail_out == 0) {
- s->last_flush = -1; /* avoid BUF_ERROR next call, see above */
- }
- return Z_OK;
- /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
- * of deflate should use the same flush parameter to make sure
- * that the flush is complete. So we don't have to output an
- * empty block here, this will be done at next call. This also
- * ensures that for a very small output buffer, we emit at most
- * one empty block.
- */
- }
- if (bstate == block_done) {
- if (flush == Z_PARTIAL_FLUSH) {
- _tr_align(s);
- } else { /* FULL_FLUSH or SYNC_FLUSH */
- _tr_stored_block(s, (char*)0, 0L, 0);
- /* For a full flush, this empty block will be recognized
- * as a special marker by inflate_sync().
- */
- if (flush == Z_FULL_FLUSH) {
- CLEAR_HASH(s); /* forget history */
- }
- }
- flush_pending(strm);
- if (strm->avail_out == 0) {
- s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */
- return Z_OK;
- }
- }
- }
- Assert(strm->avail_out > 0, "bug2");
-
- if (flush != Z_FINISH) return Z_OK;
- if (s->wrap <= 0) return Z_STREAM_END;
-
- /* Write the trailer */
-#ifdef GZIP
- if (s->wrap == 2) {
- put_byte(s, (Byte)(strm->adler & 0xff));
- put_byte(s, (Byte)((strm->adler >> 8) & 0xff));
- put_byte(s, (Byte)((strm->adler >> 16) & 0xff));
- put_byte(s, (Byte)((strm->adler >> 24) & 0xff));
- put_byte(s, (Byte)(strm->total_in & 0xff));
- put_byte(s, (Byte)((strm->total_in >> 8) & 0xff));
- put_byte(s, (Byte)((strm->total_in >> 16) & 0xff));
- put_byte(s, (Byte)((strm->total_in >> 24) & 0xff));
- }
- else
-#endif
- {
- putShortMSB(s, (uInt)(strm->adler >> 16));
- putShortMSB(s, (uInt)(strm->adler & 0xffff));
- }
- flush_pending(strm);
- /* If avail_out is zero, the application will call deflate again
- * to flush the rest.
- */
- if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */
- return s->pending != 0 ? Z_OK : Z_STREAM_END;
-}
-
-/* ========================================================================= */
-int ZEXPORT deflateEnd (strm)
- z_streamp strm;
-{
- int status;
-
- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
-
- status = strm->state->status;
- if (status != INIT_STATE && status != BUSY_STATE &&
- status != FINISH_STATE) {
- return Z_STREAM_ERROR;
- }
-
- /* Deallocate in reverse order of allocations: */
- TRY_FREE(strm, strm->state->pending_buf);
- TRY_FREE(strm, strm->state->head);
- TRY_FREE(strm, strm->state->prev);
- TRY_FREE(strm, strm->state->window);
-
- ZFREE(strm, strm->state);
- strm->state = Z_NULL;
-
- return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;
-}
-
-/* =========================================================================
- * Copy the source state to the destination state.
- * To simplify the source, this is not supported for 16-bit MSDOS (which
- * doesn't have enough memory anyway to duplicate compression states).
- */
-int ZEXPORT deflateCopy (dest, source)
- z_streamp dest;
- z_streamp source;
-{
-#ifdef MAXSEG_64K
- return Z_STREAM_ERROR;
-#else
- deflate_state *ds;
- deflate_state *ss;
- ushf *overlay;
-
-
- if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) {
- return Z_STREAM_ERROR;
- }
-
- ss = source->state;
-
- *dest = *source;
-
- ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));
- if (ds == Z_NULL) return Z_MEM_ERROR;
- dest->state = (struct internal_state FAR *) ds;
- *ds = *ss;
- ds->strm = dest;
-
- ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
- ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos));
- ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos));
- overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2);
- ds->pending_buf = (uchf *) overlay;
-
- if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||
- ds->pending_buf == Z_NULL) {
- deflateEnd (dest);
- return Z_MEM_ERROR;
- }
- /* following zmemcpy do not work for 16-bit MSDOS */
- zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));
- zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos));
- zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos));
- zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
-
- ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
- ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush);
- ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize;
-
- ds->l_desc.dyn_tree = ds->dyn_ltree;
- ds->d_desc.dyn_tree = ds->dyn_dtree;
- ds->bl_desc.dyn_tree = ds->bl_tree;
-
- return Z_OK;
-#endif /* MAXSEG_64K */
-}
-
-/* ===========================================================================
- * Read a new buffer from the current input stream, update the adler32
- * and total number of bytes read. All deflate() input goes through
- * this function so some applications may wish to modify it to avoid
- * allocating a large strm->next_in buffer and copying from it.
- * (See also flush_pending()).
- */
-local int read_buf(strm, buf, size)
- z_streamp strm;
- Bytef *buf;
- unsigned size;
-{
- unsigned len = strm->avail_in;
-
- if (len > size) len = size;
- if (len == 0) return 0;
-
- strm->avail_in -= len;
-
- if (strm->state->wrap == 1) {
- strm->adler = adler32(strm->adler, strm->next_in, len);
- }
-#ifdef GZIP
- else if (strm->state->wrap == 2) {
- strm->adler = crc32(strm->adler, strm->next_in, len);
- }
-#endif
- zmemcpy(buf, strm->next_in, len);
- strm->next_in += len;
- strm->total_in += len;
-
- return (int)len;
-}
-
-/* ===========================================================================
- * Initialize the "longest match" routines for a new zlib stream
- */
-local void lm_init (s)
- deflate_state *s;
-{
- s->window_size = (ulg)2L*s->w_size;
-
- CLEAR_HASH(s);
-
- /* Set the default configuration parameters:
- */
- s->max_lazy_match = configuration_table[s->level].max_lazy;
- s->good_match = configuration_table[s->level].good_length;
- s->nice_match = configuration_table[s->level].nice_length;
- s->max_chain_length = configuration_table[s->level].max_chain;
-
- s->strstart = 0;
- s->block_start = 0L;
- s->lookahead = 0;
- s->match_length = s->prev_length = MIN_MATCH-1;
- s->match_available = 0;
- s->ins_h = 0;
-#ifdef ASMV
- match_init(); /* initialize the asm code */
-#endif
-}
-
-#ifndef FASTEST
-/* ===========================================================================
- * Set match_start to the longest match starting at the given string and
- * return its length. Matches shorter or equal to prev_length are discarded,
- * in which case the result is equal to prev_length and match_start is
- * garbage.
- * IN assertions: cur_match is the head of the hash chain for the current
- * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
- * OUT assertion: the match length is not greater than s->lookahead.
- */
-#ifndef ASMV
-/* For 80x86 and 680x0, an optimized version will be provided in match.asm or
- * match.S. The code will be functionally equivalent.
- */
-local uInt longest_match(s, cur_match)
- deflate_state *s;
- IPos cur_match; /* current match */
-{
- unsigned chain_length = s->max_chain_length;/* max hash chain length */
- register Bytef *scan = s->window + s->strstart; /* current string */
- register Bytef *match; /* matched string */
- register int len; /* length of current match */
- int best_len = s->prev_length; /* best match length so far */
- int nice_match = s->nice_match; /* stop if match long enough */
- IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
- s->strstart - (IPos)MAX_DIST(s) : NIL;
- /* Stop when cur_match becomes <= limit. To simplify the code,
- * we prevent matches with the string of window index 0.
- */
- Posf *prev = s->prev;
- uInt wmask = s->w_mask;
-
-#ifdef UNALIGNED_OK
- /* Compare two bytes at a time. Note: this is not always beneficial.
- * Try with and without -DUNALIGNED_OK to check.
- */
- register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
- register ush scan_start = *(ushf*)scan;
- register ush scan_end = *(ushf*)(scan+best_len-1);
-#else
- register Bytef *strend = s->window + s->strstart + MAX_MATCH;
- register Byte scan_end1 = scan[best_len-1];
- register Byte scan_end = scan[best_len];
-#endif
-
- /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
- * It is easy to get rid of this optimization if necessary.
- */
- Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
-
- /* Do not waste too much time if we already have a good match: */
- if (s->prev_length >= s->good_match) {
- chain_length >>= 2;
- }
- /* Do not look for matches beyond the end of the input. This is necessary
- * to make deflate deterministic.
- */
- if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
-
- Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
-
- do {
- Assert(cur_match < s->strstart, "no future");
- match = s->window + cur_match;
-
- /* Skip to next match if the match length cannot increase
- * or if the match length is less than 2:
- */
-#if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
- /* This code assumes sizeof(unsigned short) == 2. Do not use
- * UNALIGNED_OK if your compiler uses a different size.
- */
- if (*(ushf*)(match+best_len-1) != scan_end ||
- *(ushf*)match != scan_start) continue;
-
- /* It is not necessary to compare scan[2] and match[2] since they are
- * always equal when the other bytes match, given that the hash keys
- * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
- * strstart+3, +5, ... up to strstart+257. We check for insufficient
- * lookahead only every 4th comparison; the 128th check will be made
- * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
- * necessary to put more guard bytes at the end of the window, or
- * to check more often for insufficient lookahead.
- */
- Assert(scan[2] == match[2], "scan[2]?");
- scan++, match++;
- do {
- } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
- *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
- *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
- *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
- scan < strend);
- /* The funny "do {}" generates better code on most compilers */
-
- /* Here, scan <= window+strstart+257 */
- Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
- if (*scan == *match) scan++;
-
- len = (MAX_MATCH - 1) - (int)(strend-scan);
- scan = strend - (MAX_MATCH-1);
-
-#else /* UNALIGNED_OK */
-
- if (match[best_len] != scan_end ||
- match[best_len-1] != scan_end1 ||
- *match != *scan ||
- *++match != scan[1]) continue;
-
- /* The check at best_len-1 can be removed because it will be made
- * again later. (This heuristic is not always a win.)
- * It is not necessary to compare scan[2] and match[2] since they
- * are always equal when the other bytes match, given that
- * the hash keys are equal and that HASH_BITS >= 8.
- */
- scan += 2, match++;
- Assert(*scan == *match, "match[2]?");
-
- /* We check for insufficient lookahead only every 8th comparison;
- * the 256th check will be made at strstart+258.
- */
- do {
- } while (*++scan == *++match && *++scan == *++match &&
- *++scan == *++match && *++scan == *++match &&
- *++scan == *++match && *++scan == *++match &&
- *++scan == *++match && *++scan == *++match &&
- scan < strend);
-
- Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
-
- len = MAX_MATCH - (int)(strend - scan);
- scan = strend - MAX_MATCH;
-
-#endif /* UNALIGNED_OK */
-
- if (len > best_len) {
- s->match_start = cur_match;
- best_len = len;
- if (len >= nice_match) break;
-#ifdef UNALIGNED_OK
- scan_end = *(ushf*)(scan+best_len-1);
-#else
- scan_end1 = scan[best_len-1];
- scan_end = scan[best_len];
-#endif
- }
- } while ((cur_match = prev[cur_match & wmask]) > limit
- && --chain_length != 0);
-
- if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
- return s->lookahead;
-}
-#endif /* ASMV */
-#endif /* FASTEST */
-
-/* ---------------------------------------------------------------------------
- * Optimized version for level == 1 or strategy == Z_RLE only
- */
-local uInt longest_match_fast(s, cur_match)
- deflate_state *s;
- IPos cur_match; /* current match */
-{
- register Bytef *scan = s->window + s->strstart; /* current string */
- register Bytef *match; /* matched string */
- register int len; /* length of current match */
- register Bytef *strend = s->window + s->strstart + MAX_MATCH;
-
- /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
- * It is easy to get rid of this optimization if necessary.
- */
- Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
-
- Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
-
- Assert(cur_match < s->strstart, "no future");
-
- match = s->window + cur_match;
-
- /* Return failure if the match length is less than 2:
- */
- if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1;
-
- /* The check at best_len-1 can be removed because it will be made
- * again later. (This heuristic is not always a win.)
- * It is not necessary to compare scan[2] and match[2] since they
- * are always equal when the other bytes match, given that
- * the hash keys are equal and that HASH_BITS >= 8.
- */
- scan += 2, match += 2;
- Assert(*scan == *match, "match[2]?");
-
- /* We check for insufficient lookahead only every 8th comparison;
- * the 256th check will be made at strstart+258.
- */
- do {
- } while (*++scan == *++match && *++scan == *++match &&
- *++scan == *++match && *++scan == *++match &&
- *++scan == *++match && *++scan == *++match &&
- *++scan == *++match && *++scan == *++match &&
- scan < strend);
-
- Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
-
- len = MAX_MATCH - (int)(strend - scan);
-
- if (len < MIN_MATCH) return MIN_MATCH - 1;
-
- s->match_start = cur_match;
- return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead;
-}
-
-#ifdef DEBUG
-/* ===========================================================================
- * Check that the match at match_start is indeed a match.
- */
-local void check_match(s, start, match, length)
- deflate_state *s;
- IPos start, match;
- int length;
-{
- /* check that the match is indeed a match */
- if (zmemcmp(s->window + match,
- s->window + start, length) != EQUAL) {
- fprintf(stderr, " start %u, match %u, length %d\n",
- start, match, length);
- do {
- fprintf(stderr, "%c%c", s->window[match++], s->window[start++]);
- } while (--length != 0);
- z_error("invalid match");
- }
- if (z_verbose > 1) {
- fprintf(stderr,"\\[%d,%d]", start-match, length);
- do { putc(s->window[start++], stderr); } while (--length != 0);
- }
-}
-#else
-# define check_match(s, start, match, length)
-#endif /* DEBUG */
-
-/* ===========================================================================
- * Fill the window when the lookahead becomes insufficient.
- * Updates strstart and lookahead.
- *
- * IN assertion: lookahead < MIN_LOOKAHEAD
- * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
- * At least one byte has been read, or avail_in == 0; reads are
- * performed for at least two bytes (required for the zip translate_eol
- * option -- not supported here).
- */
-local void fill_window(s)
- deflate_state *s;
-{
- register unsigned n, m;
- register Posf *p;
- unsigned more; /* Amount of free space at the end of the window. */
- uInt wsize = s->w_size;
-
- do {
- more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
-
- /* Deal with !@#$% 64K limit: */
- if (sizeof(int) <= 2) {
- if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
- more = wsize;
-
- } else if (more == (unsigned)(-1)) {
- /* Very unlikely, but possible on 16 bit machine if
- * strstart == 0 && lookahead == 1 (input done a byte at time)
- */
- more--;
- }
- }
-
- /* If the window is almost full and there is insufficient lookahead,
- * move the upper half to the lower one to make room in the upper half.
- */
- if (s->strstart >= wsize+MAX_DIST(s)) {
-
- zmemcpy(s->window, s->window+wsize, (unsigned)wsize);
- s->match_start -= wsize;
- s->strstart -= wsize; /* we now have strstart >= MAX_DIST */
- s->block_start -= (long) wsize;
-
- /* Slide the hash table (could be avoided with 32 bit values
- at the expense of memory usage). We slide even when level == 0
- to keep the hash table consistent if we switch back to level > 0
- later. (Using level 0 permanently is not an optimal usage of
- zlib, so we don't care about this pathological case.)
- */
- n = s->hash_size;
- p = &s->head[n];
- do {
- m = *--p;
- *p = (Pos)(m >= wsize ? m-wsize : NIL);
- } while (--n);
-
- n = wsize;
-#ifndef FASTEST
- p = &s->prev[n];
- do {
- m = *--p;
- *p = (Pos)(m >= wsize ? m-wsize : NIL);
- /* If n is not on any hash chain, prev[n] is garbage but
- * its value will never be used.
- */
- } while (--n);
-#endif
- more += wsize;
- }
- if (s->strm->avail_in == 0) return;
-
- /* If there was no sliding:
- * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
- * more == window_size - lookahead - strstart
- * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
- * => more >= window_size - 2*WSIZE + 2
- * In the BIG_MEM or MMAP case (not yet supported),
- * window_size == input_size + MIN_LOOKAHEAD &&
- * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
- * Otherwise, window_size == 2*WSIZE so more >= 2.
- * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
- */
- Assert(more >= 2, "more < 2");
-
- n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
- s->lookahead += n;
-
- /* Initialize the hash value now that we have some input: */
- if (s->lookahead >= MIN_MATCH) {
- s->ins_h = s->window[s->strstart];
- UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
-#if MIN_MATCH != 3
- Call UPDATE_HASH() MIN_MATCH-3 more times
-#endif
- }
- /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
- * but this is not important since only literal bytes will be emitted.
- */
-
- } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
-}
-
-/* ===========================================================================
- * Flush the current block, with given end-of-file flag.
- * IN assertion: strstart is set to the end of the current match.
- */
-#define FLUSH_BLOCK_ONLY(s, eof) { \
- _tr_flush_block(s, (s->block_start >= 0L ? \
- (charf *)&s->window[(unsigned)s->block_start] : \
- (charf *)Z_NULL), \
- (ulg)((long)s->strstart - s->block_start), \
- (eof)); \
- s->block_start = s->strstart; \
- flush_pending(s->strm); \
- Tracev((stderr,"[FLUSH]")); \
-}
-
-/* Same but force premature exit if necessary. */
-#define FLUSH_BLOCK(s, eof) { \
- FLUSH_BLOCK_ONLY(s, eof); \
- if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \
-}
-
-/* ===========================================================================
- * Copy without compression as much as possible from the input stream, return
- * the current block state.
- * This function does not insert new strings in the dictionary since
- * uncompressible data is probably not useful. This function is used
- * only for the level=0 compression option.
- * NOTE: this function should be optimized to avoid extra copying from
- * window to pending_buf.
- */
-local block_state deflate_stored(s, flush)
- deflate_state *s;
- int flush;
-{
- /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
- * to pending_buf_size, and each stored block has a 5 byte header:
- */
- ulg max_block_size = 0xffff;
- ulg max_start;
-
- if (max_block_size > s->pending_buf_size - 5) {
- max_block_size = s->pending_buf_size - 5;
- }
-
- /* Copy as much as possible from input to output: */
- for (;;) {
- /* Fill the window as much as possible: */
- if (s->lookahead <= 1) {
-
- Assert(s->strstart < s->w_size+MAX_DIST(s) ||
- s->block_start >= (long)s->w_size, "slide too late");
-
- fill_window(s);
- if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more;
-
- if (s->lookahead == 0) break; /* flush the current block */
- }
- Assert(s->block_start >= 0L, "block gone");
-
- s->strstart += s->lookahead;
- s->lookahead = 0;
-
- /* Emit a stored block if pending_buf will be full: */
- max_start = s->block_start + max_block_size;
- if (s->strstart == 0 || (ulg)s->strstart >= max_start) {
- /* strstart == 0 is possible when wraparound on 16-bit machine */
- s->lookahead = (uInt)(s->strstart - max_start);
- s->strstart = (uInt)max_start;
- FLUSH_BLOCK(s, 0);
- }
- /* Flush if we may have to slide, otherwise block_start may become
- * negative and the data will be gone:
- */
- if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) {
- FLUSH_BLOCK(s, 0);
- }
- }
- FLUSH_BLOCK(s, flush == Z_FINISH);
- return flush == Z_FINISH ? finish_done : block_done;
-}
-
-/* ===========================================================================
- * Compress as much as possible from the input stream, return the current
- * block state.
- * This function does not perform lazy evaluation of matches and inserts
- * new strings in the dictionary only for unmatched strings or for short
- * matches. It is used only for the fast compression options.
- */
-local block_state deflate_fast(s, flush)
- deflate_state *s;
- int flush;
-{
- IPos hash_head = NIL; /* head of the hash chain */
- int bflush; /* set if current block must be flushed */
-
- for (;;) {
- /* Make sure that we always have enough lookahead, except
- * at the end of the input file. We need MAX_MATCH bytes
- * for the next match, plus MIN_MATCH bytes to insert the
- * string following the next match.
- */
- if (s->lookahead < MIN_LOOKAHEAD) {
- fill_window(s);
- if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
- return need_more;
- }
- if (s->lookahead == 0) break; /* flush the current block */
- }
-
- /* Insert the string window[strstart .. strstart+2] in the
- * dictionary, and set hash_head to the head of the hash chain:
- */
- if (s->lookahead >= MIN_MATCH) {
- INSERT_STRING(s, s->strstart, hash_head);
- }
-
- /* Find the longest match, discarding those <= prev_length.
- * At this point we have always match_length < MIN_MATCH
- */
- if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) {
- /* To simplify the code, we prevent matches with the string
- * of window index 0 (in particular we have to avoid a match
- * of the string with itself at the start of the input file).
- */
-#ifdef FASTEST
- if ((s->strategy < Z_HUFFMAN_ONLY) ||
- (s->strategy == Z_RLE && s->strstart - hash_head == 1)) {
- s->match_length = longest_match_fast (s, hash_head);
- }
-#else
- if (s->strategy < Z_HUFFMAN_ONLY) {
- s->match_length = longest_match (s, hash_head);
- } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) {
- s->match_length = longest_match_fast (s, hash_head);
- }
-#endif
- /* longest_match() or longest_match_fast() sets match_start */
- }
- if (s->match_length >= MIN_MATCH) {
- check_match(s, s->strstart, s->match_start, s->match_length);
-
- _tr_tally_dist(s, s->strstart - s->match_start,
- s->match_length - MIN_MATCH, bflush);
-
- s->lookahead -= s->match_length;
-
- /* Insert new strings in the hash table only if the match length
- * is not too large. This saves time but degrades compression.
- */
-#ifndef FASTEST
- if (s->match_length <= s->max_insert_length &&
- s->lookahead >= MIN_MATCH) {
- s->match_length--; /* string at strstart already in table */
- do {
- s->strstart++;
- INSERT_STRING(s, s->strstart, hash_head);
- /* strstart never exceeds WSIZE-MAX_MATCH, so there are
- * always MIN_MATCH bytes ahead.
- */
- } while (--s->match_length != 0);
- s->strstart++;
- } else
-#endif
- {
- s->strstart += s->match_length;
- s->match_length = 0;
- s->ins_h = s->window[s->strstart];
- UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
-#if MIN_MATCH != 3
- Call UPDATE_HASH() MIN_MATCH-3 more times
-#endif
- /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
- * matter since it will be recomputed at next deflate call.
- */
- }
- } else {
- /* No match, output a literal byte */
- Tracevv((stderr,"%c", s->window[s->strstart]));
- _tr_tally_lit (s, s->window[s->strstart], bflush);
- s->lookahead--;
- s->strstart++;
- }
- if (bflush) FLUSH_BLOCK(s, 0);
- }
- FLUSH_BLOCK(s, flush == Z_FINISH);
- return flush == Z_FINISH ? finish_done : block_done;
-}
-
-#ifndef FASTEST
-/* ===========================================================================
- * Same as above, but achieves better compression. We use a lazy
- * evaluation for matches: a match is finally adopted only if there is
- * no better match at the next window position.
- */
-local block_state deflate_slow(s, flush)
- deflate_state *s;
- int flush;
-{
- IPos hash_head = NIL; /* head of hash chain */
- int bflush; /* set if current block must be flushed */
-
- /* Process the input block. */
- for (;;) {
- /* Make sure that we always have enough lookahead, except
- * at the end of the input file. We need MAX_MATCH bytes
- * for the next match, plus MIN_MATCH bytes to insert the
- * string following the next match.
- */
- if (s->lookahead < MIN_LOOKAHEAD) {
- fill_window(s);
- if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
- return need_more;
- }
- if (s->lookahead == 0) break; /* flush the current block */
- }
-
- /* Insert the string window[strstart .. strstart+2] in the
- * dictionary, and set hash_head to the head of the hash chain:
- */
- if (s->lookahead >= MIN_MATCH) {
- INSERT_STRING(s, s->strstart, hash_head);
- }
-
- /* Find the longest match, discarding those <= prev_length.
- */
- s->prev_length = s->match_length, s->prev_match = s->match_start;
- s->match_length = MIN_MATCH-1;
-
- if (hash_head != NIL && s->prev_length < s->max_lazy_match &&
- s->strstart - hash_head <= MAX_DIST(s)) {
- /* To simplify the code, we prevent matches with the string
- * of window index 0 (in particular we have to avoid a match
- * of the string with itself at the start of the input file).
- */
- if (s->strategy < Z_HUFFMAN_ONLY) {
- s->match_length = longest_match (s, hash_head);
- } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) {
- s->match_length = longest_match_fast (s, hash_head);
- }
- /* longest_match() or longest_match_fast() sets match_start */
-
- if (s->match_length <= 5 && (s->strategy == Z_FILTERED
-#if TOO_FAR <= 32767
- || (s->match_length == MIN_MATCH &&
- s->strstart - s->match_start > TOO_FAR)
-#endif
- )) {
-
- /* If prev_match is also MIN_MATCH, match_start is garbage
- * but we will ignore the current match anyway.
- */
- s->match_length = MIN_MATCH-1;
- }
- }
- /* If there was a match at the previous step and the current
- * match is not better, output the previous match:
- */
- if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) {
- uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
- /* Do not insert strings in hash table beyond this. */
-
- check_match(s, s->strstart-1, s->prev_match, s->prev_length);
-
- _tr_tally_dist(s, s->strstart -1 - s->prev_match,
- s->prev_length - MIN_MATCH, bflush);
-
- /* Insert in hash table all strings up to the end of the match.
- * strstart-1 and strstart are already inserted. If there is not
- * enough lookahead, the last two strings are not inserted in
- * the hash table.
- */
- s->lookahead -= s->prev_length-1;
- s->prev_length -= 2;
- do {
- if (++s->strstart <= max_insert) {
- INSERT_STRING(s, s->strstart, hash_head);
- }
- } while (--s->prev_length != 0);
- s->match_available = 0;
- s->match_length = MIN_MATCH-1;
- s->strstart++;
-
- if (bflush) FLUSH_BLOCK(s, 0);
-
- } else if (s->match_available) {
- /* If there was no match at the previous position, output a
- * single literal. If there was a match but the current match
- * is longer, truncate the previous match to a single literal.
- */
- Tracevv((stderr,"%c", s->window[s->strstart-1]));
- _tr_tally_lit(s, s->window[s->strstart-1], bflush);
- if (bflush) {
- FLUSH_BLOCK_ONLY(s, 0);
- }
- s->strstart++;
- s->lookahead--;
- if (s->strm->avail_out == 0) return need_more;
- } else {
- /* There is no previous match to compare with, wait for
- * the next step to decide.
- */
- s->match_available = 1;
- s->strstart++;
- s->lookahead--;
- }
- }
- Assert (flush != Z_NO_FLUSH, "no flush?");
- if (s->match_available) {
- Tracevv((stderr,"%c", s->window[s->strstart-1]));
- _tr_tally_lit(s, s->window[s->strstart-1], bflush);
- s->match_available = 0;
- }
- FLUSH_BLOCK(s, flush == Z_FINISH);
- return flush == Z_FINISH ? finish_done : block_done;
-}
-#endif /* FASTEST */
diff --git a/src/zlib/deflate.h b/src/zlib/deflate.h
deleted file mode 100644
index 410681d18..000000000
--- a/src/zlib/deflate.h
+++ /dev/null
@@ -1,325 +0,0 @@
-/* deflate.h -- internal compression state
- * Copyright (C) 1995-2002 Jean-loup Gailly
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* WARNING: this file should *not* be used by applications. It is
- part of the implementation of the compression library and is
- subject to change. Applications should only use zlib.h.
- */
-
-/* @(#) $Id$ */
-
-#ifndef DEFLATE_H
-#define DEFLATE_H
-
-#include "zutil.h"
-
-/* define NO_GZIP when compiling if you want to disable gzip header and
- trailer creation by deflate(). NO_GZIP would be used to avoid linking in
- the crc code when it is not needed. For shared libraries, gzip encoding
- should be left enabled. */
-#ifndef NO_GZIP
-# define GZIP
-#endif
-
-/* ===========================================================================
- * Internal compression state.
- */
-
-#define LENGTH_CODES 29
-/* number of length codes, not counting the special END_BLOCK code */
-
-#define LITERALS 256
-/* number of literal bytes 0..255 */
-
-#define L_CODES (LITERALS+1+LENGTH_CODES)
-/* number of Literal or Length codes, including the END_BLOCK code */
-
-#define D_CODES 30
-/* number of distance codes */
-
-#define BL_CODES 19
-/* number of codes used to transfer the bit lengths */
-
-#define HEAP_SIZE (2*L_CODES+1)
-/* maximum heap size */
-
-#define MAX_BITS 15
-/* All codes must not exceed MAX_BITS bits */
-
-#define INIT_STATE 42
-#define BUSY_STATE 113
-#define FINISH_STATE 666
-/* Stream status */
-
-
-/* Data structure describing a single value and its code string. */
-typedef struct ct_data_s {
- union {
- ush freq; /* frequency count */
- ush code; /* bit string */
- } fc;
- union {
- ush dad; /* father node in Huffman tree */
- ush len; /* length of bit string */
- } dl;
-} FAR ct_data;
-
-#define Freq fc.freq
-#define Code fc.code
-#define Dad dl.dad
-#define Len dl.len
-
-typedef struct static_tree_desc_s static_tree_desc;
-
-typedef struct tree_desc_s {
- ct_data *dyn_tree; /* the dynamic tree */
- int max_code; /* largest code with non zero frequency */
- static_tree_desc *stat_desc; /* the corresponding static tree */
-} FAR tree_desc;
-
-typedef ush Pos;
-typedef Pos FAR Posf;
-typedef unsigned IPos;
-
-/* A Pos is an index in the character window. We use short instead of int to
- * save space in the various tables. IPos is used only for parameter passing.
- */
-
-typedef struct internal_state {
- z_streamp strm; /* pointer back to this zlib stream */
- int status; /* as the name implies */
- Bytef *pending_buf; /* output still pending */
- ulg pending_buf_size; /* size of pending_buf */
- Bytef *pending_out; /* next pending byte to output to the stream */
- int pending; /* nb of bytes in the pending buffer */
- int wrap; /* bit 0 true for zlib, bit 1 true for gzip */
- Byte method; /* STORED (for zip only) or DEFLATED */
- int last_flush; /* value of flush param for previous deflate call */
-
- /* used by deflate.c: */
-
- uInt w_size; /* LZ77 window size (32K by default) */
- uInt w_bits; /* log2(w_size) (8..16) */
- uInt w_mask; /* w_size - 1 */
-
- Bytef *window;
- /* Sliding window. Input bytes are read into the second half of the window,
- * and move to the first half later to keep a dictionary of at least wSize
- * bytes. With this organization, matches are limited to a distance of
- * wSize-MAX_MATCH bytes, but this ensures that IO is always
- * performed with a length multiple of the block size. Also, it limits
- * the window size to 64K, which is quite useful on MSDOS.
- * To do: use the user input buffer as sliding window.
- */
-
- ulg window_size;
- /* Actual size of window: 2*wSize, except when the user input buffer
- * is directly used as sliding window.
- */
-
- Posf *prev;
- /* Link to older string with same hash index. To limit the size of this
- * array to 64K, this link is maintained only for the last 32K strings.
- * An index in this array is thus a window index modulo 32K.
- */
-
- Posf *head; /* Heads of the hash chains or NIL. */
-
- uInt ins_h; /* hash index of string to be inserted */
- uInt hash_size; /* number of elements in hash table */
- uInt hash_bits; /* log2(hash_size) */
- uInt hash_mask; /* hash_size-1 */
-
- uInt hash_shift;
- /* Number of bits by which ins_h must be shifted at each input
- * step. It must be such that after MIN_MATCH steps, the oldest
- * byte no longer takes part in the hash key, that is:
- * hash_shift * MIN_MATCH >= hash_bits
- */
-
- long block_start;
- /* Window position at the beginning of the current output block. Gets
- * negative when the window is moved backwards.
- */
-
- uInt match_length; /* length of best match */
- IPos prev_match; /* previous match */
- int match_available; /* set if previous match exists */
- uInt strstart; /* start of string to insert */
- uInt match_start; /* start of matching string */
- uInt lookahead; /* number of valid bytes ahead in window */
-
- uInt prev_length;
- /* Length of the best match at previous step. Matches not greater than this
- * are discarded. This is used in the lazy match evaluation.
- */
-
- uInt max_chain_length;
- /* To speed up deflation, hash chains are never searched beyond this
- * length. A higher limit improves compression ratio but degrades the
- * speed.
- */
-
- uInt max_lazy_match;
- /* Attempt to find a better match only when the current match is strictly
- * smaller than this value. This mechanism is used only for compression
- * levels >= 4.
- */
-# define max_insert_length max_lazy_match
- /* Insert new strings in the hash table only if the match length is not
- * greater than this length. This saves time but degrades compression.
- * max_insert_length is used only for compression levels <= 3.
- */
-
- int level; /* compression level (1..9) */
- int strategy; /* favor or force Huffman coding*/
-
- uInt good_match;
- /* Use a faster search when the previous match is longer than this */
-
- int nice_match; /* Stop searching when current match exceeds this */
-
- /* used by trees.c: */
- /* Didn't use ct_data typedef below to supress compiler warning */
- struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */
- struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
- struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */
-
- struct tree_desc_s l_desc; /* desc. for literal tree */
- struct tree_desc_s d_desc; /* desc. for distance tree */
- struct tree_desc_s bl_desc; /* desc. for bit length tree */
-
- ush bl_count[MAX_BITS+1];
- /* number of codes at each bit length for an optimal tree */
-
- int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */
- int heap_len; /* number of elements in the heap */
- int heap_max; /* element of largest frequency */
- /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
- * The same heap array is used to build all trees.
- */
-
- uch depth[2*L_CODES+1];
- /* Depth of each subtree used as tie breaker for trees of equal frequency
- */
-
- uchf *l_buf; /* buffer for literals or lengths */
-
- uInt lit_bufsize;
- /* Size of match buffer for literals/lengths. There are 4 reasons for
- * limiting lit_bufsize to 64K:
- * - frequencies can be kept in 16 bit counters
- * - if compression is not successful for the first block, all input
- * data is still in the window so we can still emit a stored block even
- * when input comes from standard input. (This can also be done for
- * all blocks if lit_bufsize is not greater than 32K.)
- * - if compression is not successful for a file smaller than 64K, we can
- * even emit a stored file instead of a stored block (saving 5 bytes).
- * This is applicable only for zip (not gzip or zlib).
- * - creating new Huffman trees less frequently may not provide fast
- * adaptation to changes in the input data statistics. (Take for
- * example a binary file with poorly compressible code followed by
- * a highly compressible string table.) Smaller buffer sizes give
- * fast adaptation but have of course the overhead of transmitting
- * trees more frequently.
- * - I can't count above 4
- */
-
- uInt last_lit; /* running index in l_buf */
-
- ushf *d_buf;
- /* Buffer for distances. To simplify the code, d_buf and l_buf have
- * the same number of elements. To use different lengths, an extra flag
- * array would be necessary.
- */
-
- ulg opt_len; /* bit length of current block with optimal trees */
- ulg static_len; /* bit length of current block with static trees */
- uInt matches; /* number of string matches in current block */
- int last_eob_len; /* bit length of EOB code for last block */
-
-#ifdef DEBUG
- ulg compressed_len; /* total bit length of compressed file mod 2^32 */
- ulg bits_sent; /* bit length of compressed data sent mod 2^32 */
-#endif
-
- ush bi_buf;
- /* Output buffer. bits are inserted starting at the bottom (least
- * significant bits).
- */
- int bi_valid;
- /* Number of valid bits in bi_buf. All bits above the last valid bit
- * are always zero.
- */
-
-} FAR deflate_state;
-
-/* Output a byte on the stream.
- * IN assertion: there is enough room in pending_buf.
- */
-#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);}
-
-
-#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
-/* Minimum amount of lookahead, except at the end of the input file.
- * See deflate.c for comments about the MIN_MATCH+1.
- */
-
-#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD)
-/* In order to simplify the code, particularly on 16 bit machines, match
- * distances are limited to MAX_DIST instead of WSIZE.
- */
-
- /* in trees.c */
-void _tr_init OF((deflate_state *s));
-int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc));
-void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len,
- int eof));
-void _tr_align OF((deflate_state *s));
-void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len,
- int eof));
-
-#define d_code(dist) \
- ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])
-/* Mapping from a distance to a distance code. dist is the distance - 1 and
- * must not have side effects. _dist_code[256] and _dist_code[257] are never
- * used.
- */
-
-#ifndef DEBUG
-/* Inline versions of _tr_tally for speed: */
-
-#if defined(GEN_TREES_H) || !defined(STDC)
- extern uch _length_code[];
- extern uch _dist_code[];
-#else
- extern const uch _length_code[];
- extern const uch _dist_code[];
-#endif
-
-# define _tr_tally_lit(s, c, flush) \
- { uch cc = (c); \
- s->d_buf[s->last_lit] = 0; \
- s->l_buf[s->last_lit++] = cc; \
- s->dyn_ltree[cc].Freq++; \
- flush = (s->last_lit == s->lit_bufsize-1); \
- }
-# define _tr_tally_dist(s, distance, length, flush) \
- { uch len = (length); \
- ush dist = (distance); \
- s->d_buf[s->last_lit] = dist; \
- s->l_buf[s->last_lit++] = len; \
- dist--; \
- s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \
- s->dyn_dtree[d_code(dist)].Freq++; \
- flush = (s->last_lit == s->lit_bufsize-1); \
- }
-#else
-# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)
-# define _tr_tally_dist(s, distance, length, flush) \
- flush = _tr_tally(s, distance, length)
-#endif
-
-#endif /* DEFLATE_H */
diff --git a/src/zlib/inffast.c b/src/zlib/inffast.c
deleted file mode 100644
index 8c02a178d..000000000
--- a/src/zlib/inffast.c
+++ /dev/null
@@ -1,305 +0,0 @@
-/* inffast.c -- fast decoding
- * Copyright (C) 1995-2004 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-#include "zutil.h"
-#include "inftrees.h"
-#include "inflate.h"
-#include "inffast.h"
-
-#ifndef ASMINF
-
-/* Allow machine dependent optimization for post-increment or pre-increment.
- Based on testing to date,
- Pre-increment preferred for:
- - PowerPC G3 (Adler)
- - MIPS R5000 (Randers-Pehrson)
- Post-increment preferred for:
- - none
- No measurable difference:
- - Pentium III (Anderson)
- - M68060 (Nikl)
- */
-#ifdef POSTINC
-# define OFF 0
-# define PUP(a) *(a)++
-#else
-# define OFF 1
-# define PUP(a) *++(a)
-#endif
-
-/*
- Decode literal, length, and distance codes and write out the resulting
- literal and match bytes until either not enough input or output is
- available, an end-of-block is encountered, or a data error is encountered.
- When large enough input and output buffers are supplied to inflate(), for
- example, a 16K input buffer and a 64K output buffer, more than 95% of the
- inflate execution time is spent in this routine.
-
- Entry assumptions:
-
- state->mode == LEN
- strm->avail_in >= 6
- strm->avail_out >= 258
- start >= strm->avail_out
- state->bits < 8
-
- On return, state->mode is one of:
-
- LEN -- ran out of enough output space or enough available input
- TYPE -- reached end of block code, inflate() to interpret next block
- BAD -- error in block data
-
- Notes:
-
- - The maximum input bits used by a length/distance pair is 15 bits for the
- length code, 5 bits for the length extra, 15 bits for the distance code,
- and 13 bits for the distance extra. This totals 48 bits, or six bytes.
- Therefore if strm->avail_in >= 6, then there is enough input to avoid
- checking for available input while decoding.
-
- - The maximum bytes that a single length/distance pair can output is 258
- bytes, which is the maximum length that can be coded. inflate_fast()
- requires strm->avail_out >= 258 for each loop to avoid checking for
- output space.
- */
-void inflate_fast(strm, start)
-z_streamp strm;
-unsigned start; /* inflate()'s starting value for strm->avail_out */
-{
- struct inflate_state FAR *state;
- unsigned char FAR *in; /* local strm->next_in */
- unsigned char FAR *last; /* while in < last, enough input available */
- unsigned char FAR *out; /* local strm->next_out */
- unsigned char FAR *beg; /* inflate()'s initial strm->next_out */
- unsigned char FAR *end; /* while out < end, enough space available */
- unsigned wsize; /* window size or zero if not using window */
- unsigned whave; /* valid bytes in the window */
- unsigned write; /* window write index */
- unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */
- unsigned long hold; /* local strm->hold */
- unsigned bits; /* local strm->bits */
- code const FAR *lcode; /* local strm->lencode */
- code const FAR *dcode; /* local strm->distcode */
- unsigned lmask; /* mask for first level of length codes */
- unsigned dmask; /* mask for first level of distance codes */
- code this; /* retrieved table entry */
- unsigned op; /* code bits, operation, extra bits, or */
- /* window position, window bytes to copy */
- unsigned len; /* match length, unused bytes */
- unsigned dist; /* match distance */
- unsigned char FAR *from; /* where to copy match from */
-
- /* copy state to local variables */
- state = (struct inflate_state FAR *)strm->state;
- in = strm->next_in - OFF;
- last = in + (strm->avail_in - 5);
- out = strm->next_out - OFF;
- beg = out - (start - strm->avail_out);
- end = out + (strm->avail_out - 257);
- wsize = state->wsize;
- whave = state->whave;
- write = state->write;
- window = state->window;
- hold = state->hold;
- bits = state->bits;
- lcode = state->lencode;
- dcode = state->distcode;
- lmask = (1U << state->lenbits) - 1;
- dmask = (1U << state->distbits) - 1;
-
- /* decode literals and length/distances until end-of-block or not enough
- input data or output space */
- do {
- if (bits < 15) {
- hold += (unsigned long)(PUP(in)) << bits;
- bits += 8;
- hold += (unsigned long)(PUP(in)) << bits;
- bits += 8;
- }
- this = lcode[hold & lmask];
- dolen:
- op = (unsigned)(this.bits);
- hold >>= op;
- bits -= op;
- op = (unsigned)(this.op);
- if (op == 0) { /* literal */
- Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ?
- "inflate: literal '%c'\n" :
- "inflate: literal 0x%02x\n", this.val));
- PUP(out) = (unsigned char)(this.val);
- }
- else if (op & 16) { /* length base */
- len = (unsigned)(this.val);
- op &= 15; /* number of extra bits */
- if (op) {
- if (bits < op) {
- hold += (unsigned long)(PUP(in)) << bits;
- bits += 8;
- }
- len += (unsigned)hold & ((1U << op) - 1);
- hold >>= op;
- bits -= op;
- }
- Tracevv((stderr, "inflate: length %u\n", len));
- if (bits < 15) {
- hold += (unsigned long)(PUP(in)) << bits;
- bits += 8;
- hold += (unsigned long)(PUP(in)) << bits;
- bits += 8;
- }
- this = dcode[hold & dmask];
- dodist:
- op = (unsigned)(this.bits);
- hold >>= op;
- bits -= op;
- op = (unsigned)(this.op);
- if (op & 16) { /* distance base */
- dist = (unsigned)(this.val);
- op &= 15; /* number of extra bits */
- if (bits < op) {
- hold += (unsigned long)(PUP(in)) << bits;
- bits += 8;
- if (bits < op) {
- hold += (unsigned long)(PUP(in)) << bits;
- bits += 8;
- }
- }
- dist += (unsigned)hold & ((1U << op) - 1);
- hold >>= op;
- bits -= op;
- Tracevv((stderr, "inflate: distance %u\n", dist));
- op = (unsigned)(out - beg); /* max distance in output */
- if (dist > op) { /* see if copy from window */
- op = dist - op; /* distance back in window */
- if (op > whave) {
- strm->msg = (char *)"invalid distance too far back";
- state->mode = BAD;
- break;
- }
- from = window - OFF;
- if (write == 0) { /* very common case */
- from += wsize - op;
- if (op < len) { /* some from window */
- len -= op;
- do {
- PUP(out) = PUP(from);
- } while (--op);
- from = out - dist; /* rest from output */
- }
- }
- else if (write < op) { /* wrap around window */
- from += wsize + write - op;
- op -= write;
- if (op < len) { /* some from end of window */
- len -= op;
- do {
- PUP(out) = PUP(from);
- } while (--op);
- from = window - OFF;
- if (write < len) { /* some from start of window */
- op = write;
- len -= op;
- do {
- PUP(out) = PUP(from);
- } while (--op);
- from = out - dist; /* rest from output */
- }
- }
- }
- else { /* contiguous in window */
- from += write - op;
- if (op < len) { /* some from window */
- len -= op;
- do {
- PUP(out) = PUP(from);
- } while (--op);
- from = out - dist; /* rest from output */
- }
- }
- while (len > 2) {
- PUP(out) = PUP(from);
- PUP(out) = PUP(from);
- PUP(out) = PUP(from);
- len -= 3;
- }
- if (len) {
- PUP(out) = PUP(from);
- if (len > 1)
- PUP(out) = PUP(from);
- }
- }
- else {
- from = out - dist; /* copy direct from output */
- do { /* minimum length is three */
- PUP(out) = PUP(from);
- PUP(out) = PUP(from);
- PUP(out) = PUP(from);
- len -= 3;
- } while (len > 2);
- if (len) {
- PUP(out) = PUP(from);
- if (len > 1)
- PUP(out) = PUP(from);
- }
- }
- }
- else if ((op & 64) == 0) { /* 2nd level distance code */
- this = dcode[this.val + (hold & ((1U << op) - 1))];
- goto dodist;
- }
- else {
- strm->msg = (char *)"invalid distance code";
- state->mode = BAD;
- break;
- }
- }
- else if ((op & 64) == 0) { /* 2nd level length code */
- this = lcode[this.val + (hold & ((1U << op) - 1))];
- goto dolen;
- }
- else if (op & 32) { /* end-of-block */
- Tracevv((stderr, "inflate: end of block\n"));
- state->mode = TYPE;
- break;
- }
- else {
- strm->msg = (char *)"invalid literal/length code";
- state->mode = BAD;
- break;
- }
- } while (in < last && out < end);
-
- /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
- len = bits >> 3;
- in -= len;
- bits -= len << 3;
- hold &= (1U << bits) - 1;
-
- /* update state and return */
- strm->next_in = in + OFF;
- strm->next_out = out + OFF;
- strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last));
- strm->avail_out = (unsigned)(out < end ?
- 257 + (end - out) : 257 - (out - end));
- state->hold = hold;
- state->bits = bits;
- return;
-}
-
-/*
- inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe):
- - Using bit fields for code structure
- - Different op definition to avoid & for extra bits (do & for table bits)
- - Three separate decoding do-loops for direct, window, and write == 0
- - Special case for distance > 1 copies to do overlapped load and store copy
- - Explicit branch predictions (based on measured branch probabilities)
- - Deferring match copy and interspersed it with decoding subsequent codes
- - Swapping literal/length else
- - Swapping window/direct else
- - Larger unrolled copy loops (three is about right)
- - Moving len -= 3 statement into middle of loop
- */
-
-#endif /* !ASMINF */
diff --git a/src/zlib/inffast.h b/src/zlib/inffast.h
deleted file mode 100644
index 1e88d2d97..000000000
--- a/src/zlib/inffast.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/* inffast.h -- header to use inffast.c
- * Copyright (C) 1995-2003 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* WARNING: this file should *not* be used by applications. It is
- part of the implementation of the compression library and is
- subject to change. Applications should only use zlib.h.
- */
-
-void inflate_fast OF((z_streamp strm, unsigned start));
diff --git a/src/zlib/inffixed.h b/src/zlib/inffixed.h
deleted file mode 100644
index 75ed4b597..000000000
--- a/src/zlib/inffixed.h
+++ /dev/null
@@ -1,94 +0,0 @@
- /* inffixed.h -- table for decoding fixed codes
- * Generated automatically by makefixed().
- */
-
- /* WARNING: this file should *not* be used by applications. It
- is part of the implementation of the compression library and
- is subject to change. Applications should only use zlib.h.
- */
-
- static const code lenfix[512] = {
- {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48},
- {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128},
- {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59},
- {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176},
- {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20},
- {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100},
- {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8},
- {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216},
- {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76},
- {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114},
- {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},
- {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148},
- {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42},
- {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86},
- {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15},
- {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236},
- {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62},
- {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142},
- {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31},
- {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162},
- {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25},
- {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105},
- {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4},
- {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202},
- {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69},
- {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125},
- {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13},
- {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195},
- {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35},
- {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91},
- {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19},
- {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246},
- {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55},
- {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135},
- {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99},
- {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190},
- {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16},
- {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96},
- {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6},
- {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209},
- {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},
- {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116},
- {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4},
- {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153},
- {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44},
- {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82},
- {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11},
- {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229},
- {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58},
- {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138},
- {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51},
- {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173},
- {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30},
- {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110},
- {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0},
- {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195},
- {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65},
- {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121},
- {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},
- {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258},
- {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37},
- {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93},
- {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23},
- {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251},
- {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51},
- {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131},
- {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67},
- {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183},
- {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23},
- {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103},
- {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9},
- {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223},
- {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79},
- {0,9,255}
- };
-
- static const code distfix[32] = {
- {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025},
- {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193},
- {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385},
- {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577},
- {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073},
- {22,5,193},{64,5,0}
- };
diff --git a/src/zlib/inflate.c b/src/zlib/inflate.c
deleted file mode 100644
index c6d38266d..000000000
--- a/src/zlib/inflate.c
+++ /dev/null
@@ -1,1274 +0,0 @@
-/* inflate.c -- zlib decompression
- * Copyright (C) 1995-2003 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/*
- * Change history:
- *
- * 1.2.beta0 24 Nov 2002
- * - First version -- complete rewrite of inflate to simplify code, avoid
- * creation of window when not needed, minimize use of window when it is
- * needed, make inffast.c even faster, implement gzip decoding, and to
- * improve code readability and style over the previous zlib inflate code
- *
- * 1.2.beta1 25 Nov 2002
- * - Use pointers for available input and output checking in inffast.c
- * - Remove input and output counters in inffast.c
- * - Change inffast.c entry and loop from avail_in >= 7 to >= 6
- * - Remove unnecessary second byte pull from length extra in inffast.c
- * - Unroll direct copy to three copies per loop in inffast.c
- *
- * 1.2.beta2 4 Dec 2002
- * - Change external routine names to reduce potential conflicts
- * - Correct filename to inffixed.h for fixed tables in inflate.c
- * - Make hbuf[] unsigned char to match parameter type in inflate.c
- * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset)
- * to avoid negation problem on Alphas (64 bit) in inflate.c
- *
- * 1.2.beta3 22 Dec 2002
- * - Add comments on state->bits assertion in inffast.c
- * - Add comments on op field in inftrees.h
- * - Fix bug in reuse of allocated window after inflateReset()
- * - Remove bit fields--back to byte structure for speed
- * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths
- * - Change post-increments to pre-increments in inflate_fast(), PPC biased?
- * - Add compile time option, POSTINC, to use post-increments instead (Intel?)
- * - Make MATCH copy in inflate() much faster for when inflate_fast() not used
- * - Use local copies of stream next and avail values, as well as local bit
- * buffer and bit count in inflate()--for speed when inflate_fast() not used
- *
- * 1.2.beta4 1 Jan 2003
- * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings
- * - Move a comment on output buffer sizes from inffast.c to inflate.c
- * - Add comments in inffast.c to introduce the inflate_fast() routine
- * - Rearrange window copies in inflate_fast() for speed and simplification
- * - Unroll last copy for window match in inflate_fast()
- * - Use local copies of window variables in inflate_fast() for speed
- * - Pull out common write == 0 case for speed in inflate_fast()
- * - Make op and len in inflate_fast() unsigned for consistency
- * - Add FAR to lcode and dcode declarations in inflate_fast()
- * - Simplified bad distance check in inflate_fast()
- * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new
- * source file infback.c to provide a call-back interface to inflate for
- * programs like gzip and unzip -- uses window as output buffer to avoid
- * window copying
- *
- * 1.2.beta5 1 Jan 2003
- * - Improved inflateBack() interface to allow the caller to provide initial
- * input in strm.
- * - Fixed stored blocks bug in inflateBack()
- *
- * 1.2.beta6 4 Jan 2003
- * - Added comments in inffast.c on effectiveness of POSTINC
- * - Typecasting all around to reduce compiler warnings
- * - Changed loops from while (1) or do {} while (1) to for (;;), again to
- * make compilers happy
- * - Changed type of window in inflateBackInit() to unsigned char *
- *
- * 1.2.beta7 27 Jan 2003
- * - Changed many types to unsigned or unsigned short to avoid warnings
- * - Added inflateCopy() function
- *
- * 1.2.0 9 Mar 2003
- * - Changed inflateBack() interface to provide separate opaque descriptors
- * for the in() and out() functions
- * - Changed inflateBack() argument and in_func typedef to swap the length
- * and buffer address return values for the input function
- * - Check next_in and next_out for Z_NULL on entry to inflate()
- *
- * The history for versions after 1.2.0 are in ChangeLog in zlib distribution.
- */
-
-#include "zutil.h"
-#include "inftrees.h"
-#include "inflate.h"
-#include "inffast.h"
-
-#ifdef MAKEFIXED
-# ifndef BUILDFIXED
-# define BUILDFIXED
-# endif
-#endif
-
-/* function prototypes */
-local void fixedtables OF((struct inflate_state FAR *state));
-local int updatewindow OF((z_streamp strm, unsigned out));
-#ifdef BUILDFIXED
- void makefixed OF((void));
-#endif
-local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf,
- unsigned len));
-
-int ZEXPORT inflateReset(strm)
-z_streamp strm;
-{
- struct inflate_state FAR *state;
-
- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
- state = (struct inflate_state FAR *)strm->state;
- strm->total_in = strm->total_out = state->total = 0;
- strm->msg = Z_NULL;
- strm->adler = 1; /* to support ill-conceived Java test suite */
- state->mode = HEAD;
- state->last = 0;
- state->havedict = 0;
- state->wsize = 0;
- state->whave = 0;
- state->hold = 0;
- state->bits = 0;
- state->lencode = state->distcode = state->next = state->codes;
- Tracev((stderr, "inflate: reset\n"));
- return Z_OK;
-}
-
-int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size)
-z_streamp strm;
-int windowBits;
-const char *version;
-int stream_size;
-{
- struct inflate_state FAR *state;
-
- if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
- stream_size != (int)(sizeof(z_stream)))
- return Z_VERSION_ERROR;
- if (strm == Z_NULL) return Z_STREAM_ERROR;
- strm->msg = Z_NULL; /* in case we return an error */
- if (strm->zalloc == (alloc_func)0) {
- strm->zalloc = zcalloc;
- strm->opaque = (voidpf)0;
- }
- if (strm->zfree == (free_func)0) strm->zfree = zcfree;
- state = (struct inflate_state FAR *)
- ZALLOC(strm, 1, sizeof(struct inflate_state));
- if (state == Z_NULL) return Z_MEM_ERROR;
- Tracev((stderr, "inflate: allocated\n"));
- strm->state = (voidpf)state;
- if (windowBits < 0) {
- state->wrap = 0;
- windowBits = -windowBits;
- }
- else {
- state->wrap = (windowBits >> 4) + 1;
-#ifdef GUNZIP
- if (windowBits < 48) windowBits &= 15;
-#endif
- }
- if (windowBits < 8 || windowBits > 15) {
- ZFREE(strm, state);
- strm->state = Z_NULL;
- return Z_STREAM_ERROR;
- }
- state->wbits = (unsigned)windowBits;
- state->window = Z_NULL;
- return inflateReset(strm);
-}
-
-int ZEXPORT inflateInit_(strm, version, stream_size)
-z_streamp strm;
-const char *version;
-int stream_size;
-{
- return inflateInit2_(strm, DEF_WBITS, version, stream_size);
-}
-
-/*
- Return state with length and distance decoding tables and index sizes set to
- fixed code decoding. Normally this returns fixed tables from inffixed.h.
- If BUILDFIXED is defined, then instead this routine builds the tables the
- first time it's called, and returns those tables the first time and
- thereafter. This reduces the size of the code by about 2K bytes, in
- exchange for a little execution time. However, BUILDFIXED should not be
- used for threaded applications, since the rewriting of the tables and virgin
- may not be thread-safe.
- */
-local void fixedtables(state)
-struct inflate_state FAR *state;
-{
-#ifdef BUILDFIXED
- static int virgin = 1;
- static code *lenfix, *distfix;
- static code fixed[544];
-
- /* build fixed huffman tables if first call (may not be thread safe) */
- if (virgin) {
- unsigned sym, bits;
- static code *next;
-
- /* literal/length table */
- sym = 0;
- while (sym < 144) state->lens[sym++] = 8;
- while (sym < 256) state->lens[sym++] = 9;
- while (sym < 280) state->lens[sym++] = 7;
- while (sym < 288) state->lens[sym++] = 8;
- next = fixed;
- lenfix = next;
- bits = 9;
- inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
-
- /* distance table */
- sym = 0;
- while (sym < 32) state->lens[sym++] = 5;
- distfix = next;
- bits = 5;
- inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
-
- /* do this just once */
- virgin = 0;
- }
-#else /* !BUILDFIXED */
-# include "inffixed.h"
-#endif /* BUILDFIXED */
- state->lencode = lenfix;
- state->lenbits = 9;
- state->distcode = distfix;
- state->distbits = 5;
-}
-
-#ifdef MAKEFIXED
-#include <stdio.h>
-
-/*
- Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also
- defines BUILDFIXED, so the tables are built on the fly. makefixed() writes
- those tables to stdout, which would be piped to inffixed.h. A small program
- can simply call makefixed to do this:
-
- void makefixed(void);
-
- int main(void)
- {
- makefixed();
- return 0;
- }
-
- Then that can be linked with zlib built with MAKEFIXED defined and run:
-
- a.out > inffixed.h
- */
-void makefixed()
-{
- unsigned low, size;
- struct inflate_state state;
-
- fixedtables(&state);
- puts(" /* inffixed.h -- table for decoding fixed codes");
- puts(" * Generated automatically by makefixed().");
- puts(" */");
- puts("");
- puts(" /* WARNING: this file should *not* be used by applications.");
- puts(" It is part of the implementation of this library and is");
- puts(" subject to change. Applications should only use zlib.h.");
- puts(" */");
- puts("");
- size = 1U << 9;
- printf(" static const code lenfix[%u] = {", size);
- low = 0;
- for (;;) {
- if ((low % 7) == 0) printf("\n ");
- printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits,
- state.lencode[low].val);
- if (++low == size) break;
- putchar(',');
- }
- puts("\n };");
- size = 1U << 5;
- printf("\n static const code distfix[%u] = {", size);
- low = 0;
- for (;;) {
- if ((low % 6) == 0) printf("\n ");
- printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits,
- state.distcode[low].val);
- if (++low == size) break;
- putchar(',');
- }
- puts("\n };");
-}
-#endif /* MAKEFIXED */
-
-/*
- Update the window with the last wsize (normally 32K) bytes written before
- returning. If window does not exist yet, create it. This is only called
- when a window is already in use, or when output has been written during this
- inflate call, but the end of the deflate stream has not been reached yet.
- It is also called to create a window for dictionary data when a dictionary
- is loaded.
-
- Providing output buffers larger than 32K to inflate() should provide a speed
- advantage, since only the last 32K of output is copied to the sliding window
- upon return from inflate(), and since all distances after the first 32K of
- output will fall in the output data, making match copies simpler and faster.
- The advantage may be dependent on the size of the processor's data caches.
- */
-local int updatewindow(strm, out)
-z_streamp strm;
-unsigned out;
-{
- struct inflate_state FAR *state;
- unsigned copy, dist;
-
- state = (struct inflate_state FAR *)strm->state;
-
- /* if it hasn't been done already, allocate space for the window */
- if (state->window == Z_NULL) {
- state->window = (unsigned char FAR *)
- ZALLOC(strm, 1U << state->wbits,
- sizeof(unsigned char));
- if (state->window == Z_NULL) return 1;
- }
-
- /* if window not in use yet, initialize */
- if (state->wsize == 0) {
- state->wsize = 1U << state->wbits;
- state->write = 0;
- state->whave = 0;
- }
-
- /* copy state->wsize or less output bytes into the circular window */
- copy = out - strm->avail_out;
- if (copy >= state->wsize) {
- zmemcpy(state->window, strm->next_out - state->wsize, state->wsize);
- state->write = 0;
- state->whave = state->wsize;
- }
- else {
- dist = state->wsize - state->write;
- if (dist > copy) dist = copy;
- zmemcpy(state->window + state->write, strm->next_out - copy, dist);
- copy -= dist;
- if (copy) {
- zmemcpy(state->window, strm->next_out - copy, copy);
- state->write = copy;
- state->whave = state->wsize;
- }
- else {
- state->write += dist;
- if (state->write == state->wsize) state->write = 0;
- if (state->whave < state->wsize) state->whave += dist;
- }
- }
- return 0;
-}
-
-/* Macros for inflate(): */
-
-/* check function to use adler32() for zlib or crc32() for gzip */
-#ifdef GUNZIP
-# define UPDATE(check, buf, len) \
- (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))
-#else
-# define UPDATE(check, buf, len) adler32(check, buf, len)
-#endif
-
-/* check macros for header crc */
-#ifdef GUNZIP
-# define CRC2(check, word) \
- do { \
- hbuf[0] = (unsigned char)(word); \
- hbuf[1] = (unsigned char)((word) >> 8); \
- check = crc32(check, hbuf, 2); \
- } while (0)
-
-# define CRC4(check, word) \
- do { \
- hbuf[0] = (unsigned char)(word); \
- hbuf[1] = (unsigned char)((word) >> 8); \
- hbuf[2] = (unsigned char)((word) >> 16); \
- hbuf[3] = (unsigned char)((word) >> 24); \
- check = crc32(check, hbuf, 4); \
- } while (0)
-#endif
-
-/* Load registers with state in inflate() for speed */
-#define LOAD() \
- do { \
- put = strm->next_out; \
- left = strm->avail_out; \
- next = strm->next_in; \
- have = strm->avail_in; \
- hold = state->hold; \
- bits = state->bits; \
- } while (0)
-
-/* Restore state from registers in inflate() */
-#define RESTORE() \
- do { \
- strm->next_out = put; \
- strm->avail_out = left; \
- strm->next_in = next; \
- strm->avail_in = have; \
- state->hold = hold; \
- state->bits = bits; \
- } while (0)
-
-/* Clear the input bit accumulator */
-#define INITBITS() \
- do { \
- hold = 0; \
- bits = 0; \
- } while (0)
-
-/* Get a byte of input into the bit accumulator, or return from inflate()
- if there is no input available. */
-#define PULLBYTE() \
- do { \
- if (have == 0) goto inf_leave; \
- have--; \
- hold += (unsigned long)(*next++) << bits; \
- bits += 8; \
- } while (0)
-
-/* Assure that there are at least n bits in the bit accumulator. If there is
- not enough available input to do that, then return from inflate(). */
-#define NEEDBITS(n) \
- do { \
- while (bits < (unsigned)(n)) \
- PULLBYTE(); \
- } while (0)
-
-/* Return the low n bits of the bit accumulator (n < 16) */
-#define BITS(n) \
- ((unsigned)hold & ((1U << (n)) - 1))
-
-/* Remove n bits from the bit accumulator */
-#define DROPBITS(n) \
- do { \
- hold >>= (n); \
- bits -= (unsigned)(n); \
- } while (0)
-
-/* Remove zero to seven bits as needed to go to a byte boundary */
-#define BYTEBITS() \
- do { \
- hold >>= bits & 7; \
- bits -= bits & 7; \
- } while (0)
-
-/* Reverse the bytes in a 32-bit value */
-#define REVERSE(q) \
- ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
- (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))
-
-/*
- inflate() uses a state machine to process as much input data and generate as
- much output data as possible before returning. The state machine is
- structured roughly as follows:
-
- for (;;) switch (state) {
- ...
- case STATEn:
- if (not enough input data or output space to make progress)
- return;
- ... make progress ...
- state = STATEm;
- break;
- ...
- }
-
- so when inflate() is called again, the same case is attempted again, and
- if the appropriate resources are provided, the machine proceeds to the
- next state. The NEEDBITS() macro is usually the way the state evaluates
- whether it can proceed or should return. NEEDBITS() does the return if
- the requested bits are not available. The typical use of the BITS macros
- is:
-
- NEEDBITS(n);
- ... do something with BITS(n) ...
- DROPBITS(n);
-
- where NEEDBITS(n) either returns from inflate() if there isn't enough
- input left to load n bits into the accumulator, or it continues. BITS(n)
- gives the low n bits in the accumulator. When done, DROPBITS(n) drops
- the low n bits off the accumulator. INITBITS() clears the accumulator
- and sets the number of available bits to zero. BYTEBITS() discards just
- enough bits to put the accumulator on a byte boundary. After BYTEBITS()
- and a NEEDBITS(8), then BITS(8) would return the next byte in the stream.
-
- NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return
- if there is no input available. The decoding of variable length codes uses
- PULLBYTE() directly in order to pull just enough bytes to decode the next
- code, and no more.
-
- Some states loop until they get enough input, making sure that enough
- state information is maintained to continue the loop where it left off
- if NEEDBITS() returns in the loop. For example, want, need, and keep
- would all have to actually be part of the saved state in case NEEDBITS()
- returns:
-
- case STATEw:
- while (want < need) {
- NEEDBITS(n);
- keep[want++] = BITS(n);
- DROPBITS(n);
- }
- state = STATEx;
- case STATEx:
-
- As shown above, if the next state is also the next case, then the break
- is omitted.
-
- A state may also return if there is not enough output space available to
- complete that state. Those states are copying stored data, writing a
- literal byte, and copying a matching string.
-
- When returning, a "goto inf_leave" is used to update the total counters,
- update the check value, and determine whether any progress has been made
- during that inflate() call in order to return the proper return code.
- Progress is defined as a change in either strm->avail_in or strm->avail_out.
- When there is a window, goto inf_leave will update the window with the last
- output written. If a goto inf_leave occurs in the middle of decompression
- and there is no window currently, goto inf_leave will create one and copy
- output to the window for the next call of inflate().
-
- In this implementation, the flush parameter of inflate() only affects the
- return code (per zlib.h). inflate() always writes as much as possible to
- strm->next_out, given the space available and the provided input--the effect
- documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers
- the allocation of and copying into a sliding window until necessary, which
- provides the effect documented in zlib.h for Z_FINISH when the entire input
- stream available. So the only thing the flush parameter actually does is:
- when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it
- will return Z_BUF_ERROR if it has not reached the end of the stream.
- */
-
-int ZEXPORT inflate(strm, flush)
-z_streamp strm;
-int flush;
-{
- struct inflate_state FAR *state;
- unsigned char FAR *next; /* next input */
- unsigned char FAR *put; /* next output */
- unsigned have, left; /* available input and output */
- unsigned long hold; /* bit buffer */
- unsigned bits; /* bits in bit buffer */
- unsigned in, out; /* save starting available input and output */
- unsigned copy; /* number of stored or match bytes to copy */
- unsigned char FAR *from; /* where to copy match bytes from */
- code this; /* current decoding table entry */
- code last; /* parent table entry */
- unsigned len; /* length to copy for repeats, bits to drop */
- int ret; /* return code */
-#ifdef GUNZIP
- unsigned char hbuf[4]; /* buffer for gzip header crc calculation */
-#endif
- static const unsigned short order[19] = /* permutation of code lengths */
- {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
-
- if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL ||
- (strm->next_in == Z_NULL && strm->avail_in != 0))
- return Z_STREAM_ERROR;
-
- state = (struct inflate_state FAR *)strm->state;
- if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */
- LOAD();
- in = have;
- out = left;
- ret = Z_OK;
- for (;;)
- switch (state->mode) {
- case HEAD:
- if (state->wrap == 0) {
- state->mode = TYPEDO;
- break;
- }
- NEEDBITS(16);
-#ifdef GUNZIP
- if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */
- state->check = crc32(0L, Z_NULL, 0);
- CRC2(state->check, hold);
- INITBITS();
- state->mode = FLAGS;
- break;
- }
- state->flags = 0; /* expect zlib header */
- if (!(state->wrap & 1) || /* check if zlib header allowed */
-#else
- if (
-#endif
- ((BITS(8) << 8) + (hold >> 8)) % 31) {
- strm->msg = (char *)"incorrect header check";
- state->mode = BAD;
- break;
- }
- if (BITS(4) != Z_DEFLATED) {
- strm->msg = (char *)"unknown compression method";
- state->mode = BAD;
- break;
- }
- DROPBITS(4);
- if (BITS(4) + 8 > state->wbits) {
- strm->msg = (char *)"invalid window size";
- state->mode = BAD;
- break;
- }
- Tracev((stderr, "inflate: zlib header ok\n"));
- strm->adler = state->check = adler32(0L, Z_NULL, 0);
- state->mode = hold & 0x200 ? DICTID : TYPE;
- INITBITS();
- break;
-#ifdef GUNZIP
- case FLAGS:
- NEEDBITS(16);
- state->flags = (int)(hold);
- if ((state->flags & 0xff) != Z_DEFLATED) {
- strm->msg = (char *)"unknown compression method";
- state->mode = BAD;
- break;
- }
- if (state->flags & 0xe000) {
- strm->msg = (char *)"unknown header flags set";
- state->mode = BAD;
- break;
- }
- if (state->flags & 0x0200) CRC2(state->check, hold);
- INITBITS();
- state->mode = TIME;
- case TIME:
- NEEDBITS(32);
- if (state->flags & 0x0200) CRC4(state->check, hold);
- INITBITS();
- state->mode = OS;
- case OS:
- NEEDBITS(16);
- if (state->flags & 0x0200) CRC2(state->check, hold);
- INITBITS();
- state->mode = EXLEN;
- case EXLEN:
- if (state->flags & 0x0400) {
- NEEDBITS(16);
- state->length = (unsigned)(hold);
- if (state->flags & 0x0200) CRC2(state->check, hold);
- INITBITS();
- }
- state->mode = EXTRA;
- case EXTRA:
- if (state->flags & 0x0400) {
- copy = state->length;
- if (copy > have) copy = have;
- if (copy) {
- if (state->flags & 0x0200)
- state->check = crc32(state->check, next, copy);
- have -= copy;
- next += copy;
- state->length -= copy;
- }
- if (state->length) goto inf_leave;
- }
- state->mode = NAME;
- case NAME:
- if (state->flags & 0x0800) {
- if (have == 0) goto inf_leave;
- copy = 0;
- do {
- len = (unsigned)(next[copy++]);
- } while (len && copy < have);
- if (state->flags & 0x02000)
- state->check = crc32(state->check, next, copy);
- have -= copy;
- next += copy;
- if (len) goto inf_leave;
- }
- state->mode = COMMENT;
- case COMMENT:
- if (state->flags & 0x1000) {
- if (have == 0) goto inf_leave;
- copy = 0;
- do {
- len = (unsigned)(next[copy++]);
- } while (len && copy < have);
- if (state->flags & 0x02000)
- state->check = crc32(state->check, next, copy);
- have -= copy;
- next += copy;
- if (len) goto inf_leave;
- }
- state->mode = HCRC;
- case HCRC:
- if (state->flags & 0x0200) {
- NEEDBITS(16);
- if (hold != (state->check & 0xffff)) {
- strm->msg = (char *)"header crc mismatch";
- state->mode = BAD;
- break;
- }
- INITBITS();
- }
- strm->adler = state->check = crc32(0L, Z_NULL, 0);
- state->mode = TYPE;
- break;
-#endif
- case DICTID:
- NEEDBITS(32);
- strm->adler = state->check = REVERSE(hold);
- INITBITS();
- state->mode = DICT;
- case DICT:
- if (state->havedict == 0) {
- RESTORE();
- return Z_NEED_DICT;
- }
- strm->adler = state->check = adler32(0L, Z_NULL, 0);
- state->mode = TYPE;
- case TYPE:
- if (flush == Z_BLOCK) goto inf_leave;
- case TYPEDO:
- if (state->last) {
- BYTEBITS();
- state->mode = CHECK;
- break;
- }
- NEEDBITS(3);
- state->last = BITS(1);
- DROPBITS(1);
- switch (BITS(2)) {
- case 0: /* stored block */
- Tracev((stderr, "inflate: stored block%s\n",
- state->last ? " (last)" : ""));
- state->mode = STORED;
- break;
- case 1: /* fixed block */
- fixedtables(state);
- Tracev((stderr, "inflate: fixed codes block%s\n",
- state->last ? " (last)" : ""));
- state->mode = LEN; /* decode codes */
- break;
- case 2: /* dynamic block */
- Tracev((stderr, "inflate: dynamic codes block%s\n",
- state->last ? " (last)" : ""));
- state->mode = TABLE;
- break;
- case 3:
- strm->msg = (char *)"invalid block type";
- state->mode = BAD;
- }
- DROPBITS(2);
- break;
- case STORED:
- BYTEBITS(); /* go to byte boundary */
- NEEDBITS(32);
- if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
- strm->msg = (char *)"invalid stored block lengths";
- state->mode = BAD;
- break;
- }
- state->length = (unsigned)hold & 0xffff;
- Tracev((stderr, "inflate: stored length %u\n",
- state->length));
- INITBITS();
- state->mode = COPY;
- case COPY:
- copy = state->length;
- if (copy) {
- if (copy > have) copy = have;
- if (copy > left) copy = left;
- if (copy == 0) goto inf_leave;
- zmemcpy(put, next, copy);
- have -= copy;
- next += copy;
- left -= copy;
- put += copy;
- state->length -= copy;
- break;
- }
- Tracev((stderr, "inflate: stored end\n"));
- state->mode = TYPE;
- break;
- case TABLE:
- NEEDBITS(14);
- state->nlen = BITS(5) + 257;
- DROPBITS(5);
- state->ndist = BITS(5) + 1;
- DROPBITS(5);
- state->ncode = BITS(4) + 4;
- DROPBITS(4);
-#ifndef PKZIP_BUG_WORKAROUND
- if (state->nlen > 286 || state->ndist > 30) {
- strm->msg = (char *)"too many length or distance symbols";
- state->mode = BAD;
- break;
- }
-#endif
- Tracev((stderr, "inflate: table sizes ok\n"));
- state->have = 0;
- state->mode = LENLENS;
- case LENLENS:
- while (state->have < state->ncode) {
- NEEDBITS(3);
- state->lens[order[state->have++]] = (unsigned short)BITS(3);
- DROPBITS(3);
- }
- while (state->have < 19)
- state->lens[order[state->have++]] = 0;
- state->next = state->codes;
- state->lencode = (code const FAR *)(state->next);
- state->lenbits = 7;
- ret = inflate_table(CODES, state->lens, 19, &(state->next),
- &(state->lenbits), state->work);
- if (ret) {
- strm->msg = (char *)"invalid code lengths set";
- state->mode = BAD;
- break;
- }
- Tracev((stderr, "inflate: code lengths ok\n"));
- state->have = 0;
- state->mode = CODELENS;
- case CODELENS:
- while (state->have < state->nlen + state->ndist) {
- for (;;) {
- this = state->lencode[BITS(state->lenbits)];
- if ((unsigned)(this.bits) <= bits) break;
- PULLBYTE();
- }
- if (this.val < 16) {
- NEEDBITS(this.bits);
- DROPBITS(this.bits);
- state->lens[state->have++] = this.val;
- }
- else {
- if (this.val == 16) {
- NEEDBITS(this.bits + 2);
- DROPBITS(this.bits);
- if (state->have == 0) {
- strm->msg = (char *)"invalid bit length repeat";
- state->mode = BAD;
- break;
- }
- len = state->lens[state->have - 1];
- copy = 3 + BITS(2);
- DROPBITS(2);
- }
- else if (this.val == 17) {
- NEEDBITS(this.bits + 3);
- DROPBITS(this.bits);
- len = 0;
- copy = 3 + BITS(3);
- DROPBITS(3);
- }
- else {
- NEEDBITS(this.bits + 7);
- DROPBITS(this.bits);
- len = 0;
- copy = 11 + BITS(7);
- DROPBITS(7);
- }
- if (state->have + copy > state->nlen + state->ndist) {
- strm->msg = (char *)"invalid bit length repeat";
- state->mode = BAD;
- break;
- }
- while (copy--)
- state->lens[state->have++] = (unsigned short)len;
- }
- }
-
- /* handle error breaks in while */
- if (state->mode == BAD) break;
-
- /* build code tables */
- state->next = state->codes;
- state->lencode = (code const FAR *)(state->next);
- state->lenbits = 9;
- ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
- &(state->lenbits), state->work);
- if (ret) {
- strm->msg = (char *)"invalid literal/lengths set";
- state->mode = BAD;
- break;
- }
- state->distcode = (code const FAR *)(state->next);
- state->distbits = 6;
- ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
- &(state->next), &(state->distbits), state->work);
- if (ret) {
- strm->msg = (char *)"invalid distances set";
- state->mode = BAD;
- break;
- }
- Tracev((stderr, "inflate: codes ok\n"));
- state->mode = LEN;
- case LEN:
- if (have >= 6 && left >= 258) {
- RESTORE();
- inflate_fast(strm, out);
- LOAD();
- break;
- }
- for (;;) {
- this = state->lencode[BITS(state->lenbits)];
- if ((unsigned)(this.bits) <= bits) break;
- PULLBYTE();
- }
- if (this.op && (this.op & 0xf0) == 0) {
- last = this;
- for (;;) {
- this = state->lencode[last.val +
- (BITS(last.bits + last.op) >> last.bits)];
- if ((unsigned)(last.bits + this.bits) <= bits) break;
- PULLBYTE();
- }
- DROPBITS(last.bits);
- }
- DROPBITS(this.bits);
- state->length = (unsigned)this.val;
- if ((int)(this.op) == 0) {
- Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ?
- "inflate: literal '%c'\n" :
- "inflate: literal 0x%02x\n", this.val));
- state->mode = LIT;
- break;
- }
- if (this.op & 32) {
- Tracevv((stderr, "inflate: end of block\n"));
- state->mode = TYPE;
- break;
- }
- if (this.op & 64) {
- strm->msg = (char *)"invalid literal/length code";
- state->mode = BAD;
- break;
- }
- state->extra = (unsigned)(this.op) & 15;
- state->mode = LENEXT;
- case LENEXT:
- if (state->extra) {
- NEEDBITS(state->extra);
- state->length += BITS(state->extra);
- DROPBITS(state->extra);
- }
- Tracevv((stderr, "inflate: length %u\n", state->length));
- state->mode = DIST;
- case DIST:
- for (;;) {
- this = state->distcode[BITS(state->distbits)];
- if ((unsigned)(this.bits) <= bits) break;
- PULLBYTE();
- }
- if ((this.op & 0xf0) == 0) {
- last = this;
- for (;;) {
- this = state->distcode[last.val +
- (BITS(last.bits + last.op) >> last.bits)];
- if ((unsigned)(last.bits + this.bits) <= bits) break;
- PULLBYTE();
- }
- DROPBITS(last.bits);
- }
- DROPBITS(this.bits);
- if (this.op & 64) {
- strm->msg = (char *)"invalid distance code";
- state->mode = BAD;
- break;
- }
- state->offset = (unsigned)this.val;
- state->extra = (unsigned)(this.op) & 15;
- state->mode = DISTEXT;
- case DISTEXT:
- if (state->extra) {
- NEEDBITS(state->extra);
- state->offset += BITS(state->extra);
- DROPBITS(state->extra);
- }
- if (state->offset > state->whave + out - left) {
- strm->msg = (char *)"invalid distance too far back";
- state->mode = BAD;
- break;
- }
- Tracevv((stderr, "inflate: distance %u\n", state->offset));
- state->mode = MATCH;
- case MATCH:
- if (left == 0) goto inf_leave;
- copy = out - left;
- if (state->offset > copy) { /* copy from window */
- copy = state->offset - copy;
- if (copy > state->write) {
- copy -= state->write;
- from = state->window + (state->wsize - copy);
- }
- else
- from = state->window + (state->write - copy);
- if (copy > state->length) copy = state->length;
- }
- else { /* copy from output */
- from = put - state->offset;
- copy = state->length;
- }
- if (copy > left) copy = left;
- left -= copy;
- state->length -= copy;
- do {
- *put++ = *from++;
- } while (--copy);
- if (state->length == 0) state->mode = LEN;
- break;
- case LIT:
- if (left == 0) goto inf_leave;
- *put++ = (unsigned char)(state->length);
- left--;
- state->mode = LEN;
- break;
- case CHECK:
- if (state->wrap) {
- NEEDBITS(32);
- out -= left;
- strm->total_out += out;
- state->total += out;
- if (out)
- strm->adler = state->check =
- UPDATE(state->check, put - out, out);
- out = left;
- if ((
-#ifdef GUNZIP
- state->flags ? hold :
-#endif
- REVERSE(hold)) != state->check) {
- strm->msg = (char *)"incorrect data check";
- state->mode = BAD;
- break;
- }
- INITBITS();
- Tracev((stderr, "inflate: check matches trailer\n"));
- }
-#ifdef GUNZIP
- state->mode = LENGTH;
- case LENGTH:
- if (state->wrap && state->flags) {
- NEEDBITS(32);
- if (hold != (state->total & 0xffffffffUL)) {
- strm->msg = (char *)"incorrect length check";
- state->mode = BAD;
- break;
- }
- INITBITS();
- Tracev((stderr, "inflate: length matches trailer\n"));
- }
-#endif
- state->mode = DONE;
- case DONE:
- ret = Z_STREAM_END;
- goto inf_leave;
- case BAD:
- ret = Z_DATA_ERROR;
- goto inf_leave;
- case MEM:
- return Z_MEM_ERROR;
- case SYNC:
- default:
- return Z_STREAM_ERROR;
- }
-
- /*
- Return from inflate(), updating the total counts and the check value.
- If there was no progress during the inflate() call, return a buffer
- error. Call updatewindow() to create and/or update the window state.
- Note: a memory error from inflate() is non-recoverable.
- */
- inf_leave:
- RESTORE();
- if (state->wsize || (state->mode < CHECK && out != strm->avail_out))
- if (updatewindow(strm, out)) {
- state->mode = MEM;
- return Z_MEM_ERROR;
- }
- in -= strm->avail_in;
- out -= strm->avail_out;
- strm->total_in += in;
- strm->total_out += out;
- state->total += out;
- if (state->wrap && out)
- strm->adler = state->check =
- UPDATE(state->check, strm->next_out - out, out);
- strm->data_type = state->bits + (state->last ? 64 : 0) +
- (state->mode == TYPE ? 128 : 0);
- if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
- ret = Z_BUF_ERROR;
- return ret;
-}
-
-int ZEXPORT inflateEnd(strm)
-z_streamp strm;
-{
- struct inflate_state FAR *state;
- if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
- return Z_STREAM_ERROR;
- state = (struct inflate_state FAR *)strm->state;
- if (state->window != Z_NULL) ZFREE(strm, state->window);
- ZFREE(strm, strm->state);
- strm->state = Z_NULL;
- Tracev((stderr, "inflate: end\n"));
- return Z_OK;
-}
-
-int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength)
-z_streamp strm;
-const Bytef *dictionary;
-uInt dictLength;
-{
- struct inflate_state FAR *state;
- unsigned long id;
-
- /* check state */
- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
- state = (struct inflate_state FAR *)strm->state;
- if (state->mode != DICT) return Z_STREAM_ERROR;
-
- /* check for correct dictionary id */
- id = adler32(0L, Z_NULL, 0);
- id = adler32(id, dictionary, dictLength);
- if (id != state->check) return Z_DATA_ERROR;
-
- /* copy dictionary to window */
- if (updatewindow(strm, strm->avail_out)) {
- state->mode = MEM;
- return Z_MEM_ERROR;
- }
- if (dictLength > state->wsize) {
- zmemcpy(state->window, dictionary + dictLength - state->wsize,
- state->wsize);
- state->whave = state->wsize;
- }
- else {
- zmemcpy(state->window + state->wsize - dictLength, dictionary,
- dictLength);
- state->whave = dictLength;
- }
- state->havedict = 1;
- Tracev((stderr, "inflate: dictionary set\n"));
- return Z_OK;
-}
-
-/*
- Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found
- or when out of input. When called, *have is the number of pattern bytes
- found in order so far, in 0..3. On return *have is updated to the new
- state. If on return *have equals four, then the pattern was found and the
- return value is how many bytes were read including the last byte of the
- pattern. If *have is less than four, then the pattern has not been found
- yet and the return value is len. In the latter case, syncsearch() can be
- called again with more data and the *have state. *have is initialized to
- zero for the first call.
- */
-local unsigned syncsearch(have, buf, len)
-unsigned FAR *have;
-unsigned char FAR *buf;
-unsigned len;
-{
- unsigned got;
- unsigned next;
-
- got = *have;
- next = 0;
- while (next < len && got < 4) {
- if ((int)(buf[next]) == (got < 2 ? 0 : 0xff))
- got++;
- else if (buf[next])
- got = 0;
- else
- got = 4 - got;
- next++;
- }
- *have = got;
- return next;
-}
-
-int ZEXPORT inflateSync(strm)
-z_streamp strm;
-{
- unsigned len; /* number of bytes to look at or looked at */
- unsigned long in, out; /* temporary to save total_in and total_out */
- unsigned char buf[4]; /* to restore bit buffer to byte string */
- struct inflate_state FAR *state;
-
- /* check parameters */
- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
- state = (struct inflate_state FAR *)strm->state;
- if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR;
-
- /* if first time, start search in bit buffer */
- if (state->mode != SYNC) {
- state->mode = SYNC;
- state->hold <<= state->bits & 7;
- state->bits -= state->bits & 7;
- len = 0;
- while (state->bits >= 8) {
- buf[len++] = (unsigned char)(state->hold);
- state->hold >>= 8;
- state->bits -= 8;
- }
- state->have = 0;
- syncsearch(&(state->have), buf, len);
- }
-
- /* search available input */
- len = syncsearch(&(state->have), strm->next_in, strm->avail_in);
- strm->avail_in -= len;
- strm->next_in += len;
- strm->total_in += len;
-
- /* return no joy or set up to restart inflate() on a new block */
- if (state->have != 4) return Z_DATA_ERROR;
- in = strm->total_in; out = strm->total_out;
- inflateReset(strm);
- strm->total_in = in; strm->total_out = out;
- state->mode = TYPE;
- return Z_OK;
-}
-
-/*
- Returns true if inflate is currently at the end of a block generated by
- Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP
- implementation to provide an additional safety check. PPP uses
- Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored
- block. When decompressing, PPP checks that at the end of input packet,
- inflate is waiting for these length bytes.
- */
-int ZEXPORT inflateSyncPoint(strm)
-z_streamp strm;
-{
- struct inflate_state FAR *state;
-
- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
- state = (struct inflate_state FAR *)strm->state;
- return state->mode == STORED && state->bits == 0;
-}
-
-int ZEXPORT inflateCopy(dest, source)
-z_streamp dest;
-z_streamp source;
-{
- struct inflate_state FAR *state;
- struct inflate_state FAR *copy;
- unsigned char FAR *window;
-
- /* check input */
- if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL ||
- source->zalloc == (alloc_func)0 || source->zfree == (free_func)0)
- return Z_STREAM_ERROR;
- state = (struct inflate_state FAR *)source->state;
-
- /* allocate space */
- copy = (struct inflate_state FAR *)
- ZALLOC(source, 1, sizeof(struct inflate_state));
- if (copy == Z_NULL) return Z_MEM_ERROR;
- window = Z_NULL;
- if (state->window != Z_NULL) {
- window = (unsigned char FAR *)
- ZALLOC(source, 1U << state->wbits, sizeof(unsigned char));
- if (window == Z_NULL) {
- ZFREE(source, copy);
- return Z_MEM_ERROR;
- }
- }
-
- /* copy state */
- *dest = *source;
- *copy = *state;
- copy->lencode = copy->codes + (state->lencode - state->codes);
- copy->distcode = copy->codes + (state->distcode - state->codes);
- copy->next = copy->codes + (state->next - state->codes);
- if (window != Z_NULL)
- zmemcpy(window, state->window, 1U << state->wbits);
- copy->window = window;
- dest->state = (voidpf)copy;
- return Z_OK;
-}
diff --git a/src/zlib/inflate.h b/src/zlib/inflate.h
deleted file mode 100644
index 9a12c8fd2..000000000
--- a/src/zlib/inflate.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/* inflate.h -- internal inflate state definition
- * Copyright (C) 1995-2003 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* WARNING: this file should *not* be used by applications. It is
- part of the implementation of the compression library and is
- subject to change. Applications should only use zlib.h.
- */
-
-/* define NO_GZIP when compiling if you want to disable gzip header and
- trailer decoding by inflate(). NO_GZIP would be used to avoid linking in
- the crc code when it is not needed. For shared libraries, gzip decoding
- should be left enabled. */
-#ifndef NO_GZIP
-# define GUNZIP
-#endif
-
-/* Possible inflate modes between inflate() calls */
-typedef enum {
- HEAD, /* i: waiting for magic header */
-#ifdef GUNZIP
- FLAGS, /* i: waiting for method and flags (gzip) */
- TIME, /* i: waiting for modification time (gzip) */
- OS, /* i: waiting for extra flags and operating system (gzip) */
- EXLEN, /* i: waiting for extra length (gzip) */
- EXTRA, /* i: waiting for extra bytes (gzip) */
- NAME, /* i: waiting for end of file name (gzip) */
- COMMENT, /* i: waiting for end of comment (gzip) */
- HCRC, /* i: waiting for header crc (gzip) */
-#endif
- DICTID, /* i: waiting for dictionary check value */
- DICT, /* waiting for inflateSetDictionary() call */
- TYPE, /* i: waiting for type bits, including last-flag bit */
- TYPEDO, /* i: same, but skip check to exit inflate on new block */
- STORED, /* i: waiting for stored size (length and complement) */
- COPY, /* i/o: waiting for input or output to copy stored block */
- TABLE, /* i: waiting for dynamic block table lengths */
- LENLENS, /* i: waiting for code length code lengths */
- CODELENS, /* i: waiting for length/lit and distance code lengths */
- LEN, /* i: waiting for length/lit code */
- LENEXT, /* i: waiting for length extra bits */
- DIST, /* i: waiting for distance code */
- DISTEXT, /* i: waiting for distance extra bits */
- MATCH, /* o: waiting for output space to copy string */
- LIT, /* o: waiting for output space to write literal */
- CHECK, /* i: waiting for 32-bit check value */
-#ifdef GUNZIP
- LENGTH, /* i: waiting for 32-bit length (gzip) */
-#endif
- DONE, /* finished check, done -- remain here until reset */
- BAD, /* got a data error -- remain here until reset */
- MEM, /* got an inflate() memory error -- remain here until reset */
- SYNC /* looking for synchronization bytes to restart inflate() */
-} inflate_mode;
-
-/*
- State transitions between above modes -
-
- (most modes can go to the BAD or MEM mode -- not shown for clarity)
-
- Process header:
- HEAD -> (gzip) or (zlib)
- (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME
- NAME -> COMMENT -> HCRC -> TYPE
- (zlib) -> DICTID or TYPE
- DICTID -> DICT -> TYPE
- Read deflate blocks:
- TYPE -> STORED or TABLE or LEN or CHECK
- STORED -> COPY -> TYPE
- TABLE -> LENLENS -> CODELENS -> LEN
- Read deflate codes:
- LEN -> LENEXT or LIT or TYPE
- LENEXT -> DIST -> DISTEXT -> MATCH -> LEN
- LIT -> LEN
- Process trailer:
- CHECK -> LENGTH -> DONE
- */
-
-/* state maintained between inflate() calls. Approximately 7K bytes. */
-struct inflate_state {
- inflate_mode mode; /* current inflate mode */
- int last; /* true if processing last block */
- int wrap; /* bit 0 true for zlib, bit 1 true for gzip */
- int havedict; /* true if dictionary provided */
- int flags; /* gzip header method and flags (0 if zlib) */
- unsigned long check; /* protected copy of check value */
- unsigned long total; /* protected copy of output count */
- /* sliding window */
- unsigned wbits; /* log base 2 of requested window size */
- unsigned wsize; /* window size or zero if not using window */
- unsigned whave; /* valid bytes in the window */
- unsigned write; /* window write index */
- unsigned char FAR *window; /* allocated sliding window, if needed */
- /* bit accumulator */
- unsigned long hold; /* input bit accumulator */
- unsigned bits; /* number of bits in "in" */
- /* for string and stored block copying */
- unsigned length; /* literal or length of data to copy */
- unsigned offset; /* distance back to copy string from */
- /* for table and code decoding */
- unsigned extra; /* extra bits needed */
- /* fixed and dynamic code tables */
- code const FAR *lencode; /* starting table for length/literal codes */
- code const FAR *distcode; /* starting table for distance codes */
- unsigned lenbits; /* index bits for lencode */
- unsigned distbits; /* index bits for distcode */
- /* dynamic table building */
- unsigned ncode; /* number of code length code lengths */
- unsigned nlen; /* number of length code lengths */
- unsigned ndist; /* number of distance code lengths */
- unsigned have; /* number of code lengths in lens[] */
- code FAR *next; /* next available space in codes[] */
- unsigned short lens[320]; /* temporary storage for code lengths */
- unsigned short work[288]; /* work area for code table building */
- code codes[ENOUGH]; /* space for code tables */
-};
diff --git a/src/zlib/inftrees.c b/src/zlib/inftrees.c
deleted file mode 100644
index 8a896b287..000000000
--- a/src/zlib/inftrees.c
+++ /dev/null
@@ -1,328 +0,0 @@
-/* inftrees.c -- generate Huffman trees for efficient decoding
- * Copyright (C) 1995-2004 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-#include "zutil.h"
-#include "inftrees.h"
-
-#define MAXBITS 15
-
-const char inflate_copyright[] =
- " inflate 1.2.2 Copyright 1995-2004 Mark Adler ";
-/*
- If you use the zlib library in a product, an acknowledgment is welcome
- in the documentation of your product. If for some reason you cannot
- include such an acknowledgment, I would appreciate that you keep this
- copyright string in the executable of your product.
- */
-
-/*
- Build a set of tables to decode the provided canonical Huffman code.
- The code lengths are lens[0..codes-1]. The result starts at *table,
- whose indices are 0..2^bits-1. work is a writable array of at least
- lens shorts, which is used as a work area. type is the type of code
- to be generated, CODES, LENS, or DISTS. On return, zero is success,
- -1 is an invalid code, and +1 means that ENOUGH isn't enough. table
- on return points to the next available entry's address. bits is the
- requested root table index bits, and on return it is the actual root
- table index bits. It will differ if the request is greater than the
- longest code or if it is less than the shortest code.
- */
-int inflate_table(type, lens, codes, table, bits, work)
-codetype type;
-unsigned short FAR *lens;
-unsigned codes;
-code FAR * FAR *table;
-unsigned FAR *bits;
-unsigned short FAR *work;
-{
- unsigned len; /* a code's length in bits */
- unsigned sym; /* index of code symbols */
- unsigned min, max; /* minimum and maximum code lengths */
- unsigned root; /* number of index bits for root table */
- unsigned curr; /* number of index bits for current table */
- unsigned drop; /* code bits to drop for sub-table */
- int left; /* number of prefix codes available */
- unsigned used; /* code entries in table used */
- unsigned huff; /* Huffman code */
- unsigned incr; /* for incrementing code, index */
- unsigned fill; /* index for replicating entries */
- unsigned low; /* low bits for current root entry */
- unsigned mask; /* mask for low root bits */
- code this; /* table entry for duplication */
- code FAR *next; /* next available space in table */
- const unsigned short FAR *base; /* base value table to use */
- const unsigned short FAR *extra; /* extra bits table to use */
- int end; /* use base and extra for symbol > end */
- unsigned short count[MAXBITS+1]; /* number of codes of each length */
- unsigned short offs[MAXBITS+1]; /* offsets in table for each length */
- static const unsigned short lbase[31] = { /* Length codes 257..285 base */
- 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
- 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
- static const unsigned short lext[31] = { /* Length codes 257..285 extra */
- 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
- 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 199, 198};
- static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
- 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
- 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
- 8193, 12289, 16385, 24577, 0, 0};
- static const unsigned short dext[32] = { /* Distance codes 0..29 extra */
- 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
- 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
- 28, 28, 29, 29, 64, 64};
-
- /*
- Process a set of code lengths to create a canonical Huffman code. The
- code lengths are lens[0..codes-1]. Each length corresponds to the
- symbols 0..codes-1. The Huffman code is generated by first sorting the
- symbols by length from short to long, and retaining the symbol order
- for codes with equal lengths. Then the code starts with all zero bits
- for the first code of the shortest length, and the codes are integer
- increments for the same length, and zeros are appended as the length
- increases. For the deflate format, these bits are stored backwards
- from their more natural integer increment ordering, and so when the
- decoding tables are built in the large loop below, the integer codes
- are incremented backwards.
-
- This routine assumes, but does not check, that all of the entries in
- lens[] are in the range 0..MAXBITS. The caller must assure this.
- 1..MAXBITS is interpreted as that code length. zero means that that
- symbol does not occur in this code.
-
- The codes are sorted by computing a count of codes for each length,
- creating from that a table of starting indices for each length in the
- sorted table, and then entering the symbols in order in the sorted
- table. The sorted table is work[], with that space being provided by
- the caller.
-
- The length counts are used for other purposes as well, i.e. finding
- the minimum and maximum length codes, determining if there are any
- codes at all, checking for a valid set of lengths, and looking ahead
- at length counts to determine sub-table sizes when building the
- decoding tables.
- */
-
- /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
- for (len = 0; len <= MAXBITS; len++)
- count[len] = 0;
- for (sym = 0; sym < codes; sym++)
- count[lens[sym]]++;
-
- /* bound code lengths, force root to be within code lengths */
- root = *bits;
- for (max = MAXBITS; max >= 1; max--)
- if (count[max] != 0) break;
- if (root > max) root = max;
- if (max == 0) { /* no symbols to code at all */
- this.op = (unsigned char)64; /* invalid code marker */
- this.bits = (unsigned char)1;
- this.val = (unsigned short)0;
- *(*table)++ = this; /* make a table to force an error */
- *(*table)++ = this;
- *bits = 1;
- return 0; /* no symbols, but wait for decoding to report error */
- }
- for (min = 1; min <= MAXBITS; min++)
- if (count[min] != 0) break;
- if (root < min) root = min;
-
- /* check for an over-subscribed or incomplete set of lengths */
- left = 1;
- for (len = 1; len <= MAXBITS; len++) {
- left <<= 1;
- left -= count[len];
- if (left < 0) return -1; /* over-subscribed */
- }
- if (left > 0 && (type == CODES || (codes - count[0] != 1)))
- return -1; /* incomplete set */
-
- /* generate offsets into symbol table for each length for sorting */
- offs[1] = 0;
- for (len = 1; len < MAXBITS; len++)
- offs[len + 1] = offs[len] + count[len];
-
- /* sort symbols by length, by symbol order within each length */
- for (sym = 0; sym < codes; sym++)
- if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym;
-
- /*
- Create and fill in decoding tables. In this loop, the table being
- filled is at next and has curr index bits. The code being used is huff
- with length len. That code is converted to an index by dropping drop
- bits off of the bottom. For codes where len is less than drop + curr,
- those top drop + curr - len bits are incremented through all values to
- fill the table with replicated entries.
-
- root is the number of index bits for the root table. When len exceeds
- root, sub-tables are created pointed to by the root entry with an index
- of the low root bits of huff. This is saved in low to check for when a
- new sub-table should be started. drop is zero when the root table is
- being filled, and drop is root when sub-tables are being filled.
-
- When a new sub-table is needed, it is necessary to look ahead in the
- code lengths to determine what size sub-table is needed. The length
- counts are used for this, and so count[] is decremented as codes are
- entered in the tables.
-
- used keeps track of how many table entries have been allocated from the
- provided *table space. It is checked when a LENS table is being made
- against the space in *table, ENOUGH, minus the maximum space needed by
- the worst case distance code, MAXD. This should never happen, but the
- sufficiency of ENOUGH has not been proven exhaustively, hence the check.
- This assumes that when type == LENS, bits == 9.
-
- sym increments through all symbols, and the loop terminates when
- all codes of length max, i.e. all codes, have been processed. This
- routine permits incomplete codes, so another loop after this one fills
- in the rest of the decoding tables with invalid code markers.
- */
-
- /* set up for code type */
- switch (type) {
- case CODES:
- base = extra = work; /* dummy value--not used */
- end = 19;
- break;
- case LENS:
- base = lbase;
- base -= 257;
- extra = lext;
- extra -= 257;
- end = 256;
- break;
- default: /* DISTS */
- base = dbase;
- extra = dext;
- end = -1;
- }
-
- /* initialize state for loop */
- huff = 0; /* starting code */
- sym = 0; /* starting code symbol */
- len = min; /* starting code length */
- next = *table; /* current table to fill in */
- curr = root; /* current table index bits */
- drop = 0; /* current bits to drop from code for index */
- low = (unsigned)(-1); /* trigger new sub-table when len > root */
- used = 1U << root; /* use root table entries */
- mask = used - 1; /* mask for comparing low */
-
- /* check available table space */
- if (type == LENS && used >= ENOUGH - MAXD)
- return 1;
-
- /* process all codes and make table entries */
- for (;;) {
- /* create table entry */
- this.bits = (unsigned char)(len - drop);
- if ((int)(work[sym]) < end) {
- this.op = (unsigned char)0;
- this.val = work[sym];
- }
- else if ((int)(work[sym]) > end) {
- this.op = (unsigned char)(extra[work[sym]]);
- this.val = base[work[sym]];
- }
- else {
- this.op = (unsigned char)(32 + 64); /* end of block */
- this.val = 0;
- }
-
- /* replicate for those indices with low len bits equal to huff */
- incr = 1U << (len - drop);
- fill = 1U << curr;
- do {
- fill -= incr;
- next[(huff >> drop) + fill] = this;
- } while (fill != 0);
-
- /* backwards increment the len-bit code huff */
- incr = 1U << (len - 1);
- while (huff & incr)
- incr >>= 1;
- if (incr != 0) {
- huff &= incr - 1;
- huff += incr;
- }
- else
- huff = 0;
-
- /* go to next symbol, update count, len */
- sym++;
- if (--(count[len]) == 0) {
- if (len == max) break;
- len = lens[work[sym]];
- }
-
- /* create new sub-table if needed */
- if (len > root && (huff & mask) != low) {
- /* if first time, transition to sub-tables */
- if (drop == 0)
- drop = root;
-
- /* increment past last table */
- next += 1U << curr;
-
- /* determine length of next table */
- curr = len - drop;
- left = (int)(1 << curr);
- while (curr + drop < max) {
- left -= count[curr + drop];
- if (left <= 0) break;
- curr++;
- left <<= 1;
- }
-
- /* check for enough space */
- used += 1U << curr;
- if (type == LENS && used >= ENOUGH - MAXD)
- return 1;
-
- /* point entry in root table to sub-table */
- low = huff & mask;
- (*table)[low].op = (unsigned char)curr;
- (*table)[low].bits = (unsigned char)root;
- (*table)[low].val = (unsigned short)(next - *table);
- }
- }
-
- /*
- Fill in rest of table for incomplete codes. This loop is similar to the
- loop above in incrementing huff for table indices. It is assumed that
- len is equal to curr + drop, so there is no loop needed to increment
- through high index bits. When the current sub-table is filled, the loop
- drops back to the root table to fill in any remaining entries there.
- */
- this.op = (unsigned char)64; /* invalid code marker */
- this.bits = (unsigned char)(len - drop);
- this.val = (unsigned short)0;
- while (huff != 0) {
- /* when done with sub-table, drop back to root table */
- if (drop != 0 && (huff & mask) != low) {
- drop = 0;
- len = root;
- next = *table;
- this.bits = (unsigned char)len;
- }
-
- /* put invalid code marker in table */
- next[huff >> drop] = this;
-
- /* backwards increment the len-bit code huff */
- incr = 1U << (len - 1);
- while (huff & incr)
- incr >>= 1;
- if (incr != 0) {
- huff &= incr - 1;
- huff += incr;
- }
- else
- huff = 0;
- }
-
- /* set return parameters */
- *table += used;
- *bits = root;
- return 0;
-}
diff --git a/src/zlib/inftrees.h b/src/zlib/inftrees.h
deleted file mode 100644
index 82d365a7e..000000000
--- a/src/zlib/inftrees.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* inftrees.h -- header to use inftrees.c
- * Copyright (C) 1995-2003 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* WARNING: this file should *not* be used by applications. It is
- part of the implementation of the compression library and is
- subject to change. Applications should only use zlib.h.
- */
-
-/* Structure for decoding tables. Each entry provides either the
- information needed to do the operation requested by the code that
- indexed that table entry, or it provides a pointer to another
- table that indexes more bits of the code. op indicates whether
- the entry is a pointer to another table, a literal, a length or
- distance, an end-of-block, or an invalid code. For a table
- pointer, the low four bits of op is the number of index bits of
- that table. For a length or distance, the low four bits of op
- is the number of extra bits to get after the code. bits is
- the number of bits in this code or part of the code to drop off
- of the bit buffer. val is the actual byte to output in the case
- of a literal, the base length or distance, or the offset from
- the current table to the next table. Each entry is four bytes. */
-typedef struct {
- unsigned char op; /* operation, extra bits, table bits */
- unsigned char bits; /* bits in this part of the code */
- unsigned short val; /* offset in table or code value */
-} code;
-
-/* op values as set by inflate_table():
- 00000000 - literal
- 0000tttt - table link, tttt != 0 is the number of table index bits
- 0001eeee - length or distance, eeee is the number of extra bits
- 01100000 - end of block
- 01000000 - invalid code
- */
-
-/* Maximum size of dynamic tree. The maximum found in a long but non-
- exhaustive search was 1004 code structures (850 for length/literals
- and 154 for distances, the latter actually the result of an
- exhaustive search). The true maximum is not known, but the value
- below is more than safe. */
-#define ENOUGH 1440
-#define MAXD 154
-
-/* Type of code to build for inftable() */
-typedef enum {
- CODES,
- LENS,
- DISTS
-} codetype;
-
-extern int inflate_table OF((codetype type, unsigned short FAR *lens,
- unsigned codes, code FAR * FAR *table,
- unsigned FAR *bits, unsigned short FAR *work));
diff --git a/src/zlib/trees.c b/src/zlib/trees.c
deleted file mode 100644
index 52c820fa2..000000000
--- a/src/zlib/trees.c
+++ /dev/null
@@ -1,1215 +0,0 @@
-/* trees.c -- output deflated data using Huffman coding
- * Copyright (C) 1995-2003 Jean-loup Gailly
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/*
- * ALGORITHM
- *
- * The "deflation" process uses several Huffman trees. The more
- * common source values are represented by shorter bit sequences.
- *
- * Each code tree is stored in a compressed form which is itself
- * a Huffman encoding of the lengths of all the code strings (in
- * ascending order by source values). The actual code strings are
- * reconstructed from the lengths in the inflate process, as described
- * in the deflate specification.
- *
- * REFERENCES
- *
- * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification".
- * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc
- *
- * Storer, James A.
- * Data Compression: Methods and Theory, pp. 49-50.
- * Computer Science Press, 1988. ISBN 0-7167-8156-5.
- *
- * Sedgewick, R.
- * Algorithms, p290.
- * Addison-Wesley, 1983. ISBN 0-201-06672-6.
- */
-
-/* @(#) $Id$ */
-
-/* #define GEN_TREES_H */
-
-#include "deflate.h"
-
-#ifdef DEBUG
-# include <ctype.h>
-#endif
-
-/* ===========================================================================
- * Constants
- */
-
-#define MAX_BL_BITS 7
-/* Bit length codes must not exceed MAX_BL_BITS bits */
-
-#define END_BLOCK 256
-/* end of block literal code */
-
-#define REP_3_6 16
-/* repeat previous bit length 3-6 times (2 bits of repeat count) */
-
-#define REPZ_3_10 17
-/* repeat a zero length 3-10 times (3 bits of repeat count) */
-
-#define REPZ_11_138 18
-/* repeat a zero length 11-138 times (7 bits of repeat count) */
-
-local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */
- = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0};
-
-local const int extra_dbits[D_CODES] /* extra bits for each distance code */
- = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
-
-local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */
- = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};
-
-local const uch bl_order[BL_CODES]
- = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};
-/* The lengths of the bit length codes are sent in order of decreasing
- * probability, to avoid transmitting the lengths for unused bit length codes.
- */
-
-#define Buf_size (8 * 2*sizeof(char))
-/* Number of bits used within bi_buf. (bi_buf might be implemented on
- * more than 16 bits on some systems.)
- */
-
-/* ===========================================================================
- * Local data. These are initialized only once.
- */
-
-#define DIST_CODE_LEN 512 /* see definition of array dist_code below */
-
-#if defined(GEN_TREES_H) || !defined(STDC)
-/* non ANSI compilers may not accept trees.h */
-
-local ct_data static_ltree[L_CODES+2];
-/* The static literal tree. Since the bit lengths are imposed, there is no
- * need for the L_CODES extra codes used during heap construction. However
- * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
- * below).
- */
-
-local ct_data static_dtree[D_CODES];
-/* The static distance tree. (Actually a trivial tree since all codes use
- * 5 bits.)
- */
-
-uch _dist_code[DIST_CODE_LEN];
-/* Distance codes. The first 256 values correspond to the distances
- * 3 .. 258, the last 256 values correspond to the top 8 bits of
- * the 15 bit distances.
- */
-
-uch _length_code[MAX_MATCH-MIN_MATCH+1];
-/* length code for each normalized match length (0 == MIN_MATCH) */
-
-local int base_length[LENGTH_CODES];
-/* First normalized length for each code (0 = MIN_MATCH) */
-
-local int base_dist[D_CODES];
-/* First normalized distance for each code (0 = distance of 1) */
-
-#else
-# include "trees.h"
-#endif /* GEN_TREES_H */
-
-struct static_tree_desc_s {
- const ct_data *static_tree; /* static tree or NULL */
- const intf *extra_bits; /* extra bits for each code or NULL */
- int extra_base; /* base index for extra_bits */
- int elems; /* max number of elements in the tree */
- int max_length; /* max bit length for the codes */
-};
-
-local static_tree_desc static_l_desc =
-{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS};
-
-local static_tree_desc static_d_desc =
-{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS};
-
-local static_tree_desc static_bl_desc =
-{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS};
-
-/* ===========================================================================
- * Local (static) routines in this file.
- */
-
-local void tr_static_init OF((void));
-local void init_block OF((deflate_state *s));
-local void pqdownheap OF((deflate_state *s, ct_data *tree, int k));
-local void gen_bitlen OF((deflate_state *s, tree_desc *desc));
-local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count));
-local void build_tree OF((deflate_state *s, tree_desc *desc));
-local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code));
-local void send_tree OF((deflate_state *s, ct_data *tree, int max_code));
-local int build_bl_tree OF((deflate_state *s));
-local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,
- int blcodes));
-local void compress_block OF((deflate_state *s, ct_data *ltree,
- ct_data *dtree));
-local void set_data_type OF((deflate_state *s));
-local unsigned bi_reverse OF((unsigned value, int length));
-local void bi_windup OF((deflate_state *s));
-local void bi_flush OF((deflate_state *s));
-local void copy_block OF((deflate_state *s, charf *buf, unsigned len,
- int header));
-
-#ifdef GEN_TREES_H
-local void gen_trees_header OF((void));
-#endif
-
-#ifndef DEBUG
-# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len)
- /* Send a code of the given tree. c and tree must not have side effects */
-
-#else /* DEBUG */
-# define send_code(s, c, tree) \
- { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \
- send_bits(s, tree[c].Code, tree[c].Len); }
-#endif
-
-/* ===========================================================================
- * Output a short LSB first on the stream.
- * IN assertion: there is enough room in pendingBuf.
- */
-#define put_short(s, w) { \
- put_byte(s, (uch)((w) & 0xff)); \
- put_byte(s, (uch)((ush)(w) >> 8)); \
-}
-
-/* ===========================================================================
- * Send a value on a given number of bits.
- * IN assertion: length <= 16 and value fits in length bits.
- */
-#ifdef DEBUG
-local void send_bits OF((deflate_state *s, int value, int length));
-
-local void send_bits(s, value, length)
- deflate_state *s;
- int value; /* value to send */
- int length; /* number of bits */
-{
- Tracevv((stderr," l %2d v %4x ", length, value));
- Assert(length > 0 && length <= 15, "invalid length");
- s->bits_sent += (ulg)length;
-
- /* If not enough room in bi_buf, use (valid) bits from bi_buf and
- * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid))
- * unused bits in value.
- */
- if (s->bi_valid > (int)Buf_size - length) {
- s->bi_buf |= (value << s->bi_valid);
- put_short(s, s->bi_buf);
- s->bi_buf = (ush)value >> (Buf_size - s->bi_valid);
- s->bi_valid += length - Buf_size;
- } else {
- s->bi_buf |= value << s->bi_valid;
- s->bi_valid += length;
- }
-}
-#else /* !DEBUG */
-
-#define send_bits(s, value, length) \
-{ int len = length;\
- if (s->bi_valid > (int)Buf_size - len) {\
- int val = value;\
- s->bi_buf |= (val << s->bi_valid);\
- put_short(s, s->bi_buf);\
- s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\
- s->bi_valid += len - Buf_size;\
- } else {\
- s->bi_buf |= (value) << s->bi_valid;\
- s->bi_valid += len;\
- }\
-}
-#endif /* DEBUG */
-
-
-/* the arguments must not have side effects */
-
-/* ===========================================================================
- * Initialize the various 'constant' tables.
- */
-local void tr_static_init()
-{
-#if defined(GEN_TREES_H) || !defined(STDC)
- static int static_init_done = 0;
- int n; /* iterates over tree elements */
- int bits; /* bit counter */
- int length; /* length value */
- int code; /* code value */
- int dist; /* distance index */
- ush bl_count[MAX_BITS+1];
- /* number of codes at each bit length for an optimal tree */
-
- if (static_init_done) return;
-
- /* For some embedded targets, global variables are not initialized: */
- static_l_desc.static_tree = static_ltree;
- static_l_desc.extra_bits = extra_lbits;
- static_d_desc.static_tree = static_dtree;
- static_d_desc.extra_bits = extra_dbits;
- static_bl_desc.extra_bits = extra_blbits;
-
- /* Initialize the mapping length (0..255) -> length code (0..28) */
- length = 0;
- for (code = 0; code < LENGTH_CODES-1; code++) {
- base_length[code] = length;
- for (n = 0; n < (1<<extra_lbits[code]); n++) {
- _length_code[length++] = (uch)code;
- }
- }
- Assert (length == 256, "tr_static_init: length != 256");
- /* Note that the length 255 (match length 258) can be represented
- * in two different ways: code 284 + 5 bits or code 285, so we
- * overwrite length_code[255] to use the best encoding:
- */
- _length_code[length-1] = (uch)code;
-
- /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
- dist = 0;
- for (code = 0 ; code < 16; code++) {
- base_dist[code] = dist;
- for (n = 0; n < (1<<extra_dbits[code]); n++) {
- _dist_code[dist++] = (uch)code;
- }
- }
- Assert (dist == 256, "tr_static_init: dist != 256");
- dist >>= 7; /* from now on, all distances are divided by 128 */
- for ( ; code < D_CODES; code++) {
- base_dist[code] = dist << 7;
- for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
- _dist_code[256 + dist++] = (uch)code;
- }
- }
- Assert (dist == 256, "tr_static_init: 256+dist != 512");
-
- /* Construct the codes of the static literal tree */
- for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0;
- n = 0;
- while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++;
- while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++;
- while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++;
- while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++;
- /* Codes 286 and 287 do not exist, but we must include them in the
- * tree construction to get a canonical Huffman tree (longest code
- * all ones)
- */
- gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count);
-
- /* The static distance tree is trivial: */
- for (n = 0; n < D_CODES; n++) {
- static_dtree[n].Len = 5;
- static_dtree[n].Code = bi_reverse((unsigned)n, 5);
- }
- static_init_done = 1;
-
-# ifdef GEN_TREES_H
- gen_trees_header();
-# endif
-#endif /* defined(GEN_TREES_H) || !defined(STDC) */
-}
-
-/* ===========================================================================
- * Genererate the file trees.h describing the static trees.
- */
-#ifdef GEN_TREES_H
-# ifndef DEBUG
-# include <stdio.h>
-# endif
-
-# define SEPARATOR(i, last, width) \
- ((i) == (last)? "\n};\n\n" : \
- ((i) % (width) == (width)-1 ? ",\n" : ", "))
-
-void gen_trees_header()
-{
- FILE *header = fopen("trees.h", "w");
- int i;
-
- Assert (header != NULL, "Can't open trees.h");
- fprintf(header,
- "/* header created automatically with -DGEN_TREES_H */\n\n");
-
- fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n");
- for (i = 0; i < L_CODES+2; i++) {
- fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code,
- static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5));
- }
-
- fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n");
- for (i = 0; i < D_CODES; i++) {
- fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code,
- static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5));
- }
-
- fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n");
- for (i = 0; i < DIST_CODE_LEN; i++) {
- fprintf(header, "%2u%s", _dist_code[i],
- SEPARATOR(i, DIST_CODE_LEN-1, 20));
- }
-
- fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n");
- for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) {
- fprintf(header, "%2u%s", _length_code[i],
- SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20));
- }
-
- fprintf(header, "local const int base_length[LENGTH_CODES] = {\n");
- for (i = 0; i < LENGTH_CODES; i++) {
- fprintf(header, "%1u%s", base_length[i],
- SEPARATOR(i, LENGTH_CODES-1, 20));
- }
-
- fprintf(header, "local const int base_dist[D_CODES] = {\n");
- for (i = 0; i < D_CODES; i++) {
- fprintf(header, "%5u%s", base_dist[i],
- SEPARATOR(i, D_CODES-1, 10));
- }
-
- fclose(header);
-}
-#endif /* GEN_TREES_H */
-
-/* ===========================================================================
- * Initialize the tree data structures for a new zlib stream.
- */
-void _tr_init(s)
- deflate_state *s;
-{
- tr_static_init();
-
- s->l_desc.dyn_tree = s->dyn_ltree;
- s->l_desc.stat_desc = &static_l_desc;
-
- s->d_desc.dyn_tree = s->dyn_dtree;
- s->d_desc.stat_desc = &static_d_desc;
-
- s->bl_desc.dyn_tree = s->bl_tree;
- s->bl_desc.stat_desc = &static_bl_desc;
-
- s->bi_buf = 0;
- s->bi_valid = 0;
- s->last_eob_len = 8; /* enough lookahead for inflate */
-#ifdef DEBUG
- s->compressed_len = 0L;
- s->bits_sent = 0L;
-#endif
-
- /* Initialize the first block of the first file: */
- init_block(s);
-}
-
-/* ===========================================================================
- * Initialize a new block.
- */
-local void init_block(s)
- deflate_state *s;
-{
- int n; /* iterates over tree elements */
-
- /* Initialize the trees. */
- for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0;
- for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0;
- for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;
-
- s->dyn_ltree[END_BLOCK].Freq = 1;
- s->opt_len = s->static_len = 0L;
- s->last_lit = s->matches = 0;
-}
-
-#define SMALLEST 1
-/* Index within the heap array of least frequent node in the Huffman tree */
-
-
-/* ===========================================================================
- * Remove the smallest element from the heap and recreate the heap with
- * one less element. Updates heap and heap_len.
- */
-#define pqremove(s, tree, top) \
-{\
- top = s->heap[SMALLEST]; \
- s->heap[SMALLEST] = s->heap[s->heap_len--]; \
- pqdownheap(s, tree, SMALLEST); \
-}
-
-/* ===========================================================================
- * Compares to subtrees, using the tree depth as tie breaker when
- * the subtrees have equal frequency. This minimizes the worst case length.
- */
-#define smaller(tree, n, m, depth) \
- (tree[n].Freq < tree[m].Freq || \
- (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m]))
-
-/* ===========================================================================
- * Restore the heap property by moving down the tree starting at node k,
- * exchanging a node with the smallest of its two sons if necessary, stopping
- * when the heap property is re-established (each father smaller than its
- * two sons).
- */
-local void pqdownheap(s, tree, k)
- deflate_state *s;
- ct_data *tree; /* the tree to restore */
- int k; /* node to move down */
-{
- int v = s->heap[k];
- int j = k << 1; /* left son of k */
- while (j <= s->heap_len) {
- /* Set j to the smallest of the two sons: */
- if (j < s->heap_len &&
- smaller(tree, s->heap[j+1], s->heap[j], s->depth)) {
- j++;
- }
- /* Exit if v is smaller than both sons */
- if (smaller(tree, v, s->heap[j], s->depth)) break;
-
- /* Exchange v with the smallest son */
- s->heap[k] = s->heap[j]; k = j;
-
- /* And continue down the tree, setting j to the left son of k */
- j <<= 1;
- }
- s->heap[k] = v;
-}
-
-/* ===========================================================================
- * Compute the optimal bit lengths for a tree and update the total bit length
- * for the current block.
- * IN assertion: the fields freq and dad are set, heap[heap_max] and
- * above are the tree nodes sorted by increasing frequency.
- * OUT assertions: the field len is set to the optimal bit length, the
- * array bl_count contains the frequencies for each bit length.
- * The length opt_len is updated; static_len is also updated if stree is
- * not null.
- */
-local void gen_bitlen(s, desc)
- deflate_state *s;
- tree_desc *desc; /* the tree descriptor */
-{
- ct_data *tree = desc->dyn_tree;
- int max_code = desc->max_code;
- const ct_data *stree = desc->stat_desc->static_tree;
- const intf *extra = desc->stat_desc->extra_bits;
- int base = desc->stat_desc->extra_base;
- int max_length = desc->stat_desc->max_length;
- int h; /* heap index */
- int n, m; /* iterate over the tree elements */
- int bits; /* bit length */
- int xbits; /* extra bits */
- ush f; /* frequency */
- int overflow = 0; /* number of elements with bit length too large */
-
- for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0;
-
- /* In a first pass, compute the optimal bit lengths (which may
- * overflow in the case of the bit length tree).
- */
- tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */
-
- for (h = s->heap_max+1; h < HEAP_SIZE; h++) {
- n = s->heap[h];
- bits = tree[tree[n].Dad].Len + 1;
- if (bits > max_length) bits = max_length, overflow++;
- tree[n].Len = (ush)bits;
- /* We overwrite tree[n].Dad which is no longer needed */
-
- if (n > max_code) continue; /* not a leaf node */
-
- s->bl_count[bits]++;
- xbits = 0;
- if (n >= base) xbits = extra[n-base];
- f = tree[n].Freq;
- s->opt_len += (ulg)f * (bits + xbits);
- if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits);
- }
- if (overflow == 0) return;
-
- Trace((stderr,"\nbit length overflow\n"));
- /* This happens for example on obj2 and pic of the Calgary corpus */
-
- /* Find the first bit length which could increase: */
- do {
- bits = max_length-1;
- while (s->bl_count[bits] == 0) bits--;
- s->bl_count[bits]--; /* move one leaf down the tree */
- s->bl_count[bits+1] += 2; /* move one overflow item as its brother */
- s->bl_count[max_length]--;
- /* The brother of the overflow item also moves one step up,
- * but this does not affect bl_count[max_length]
- */
- overflow -= 2;
- } while (overflow > 0);
-
- /* Now recompute all bit lengths, scanning in increasing frequency.
- * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
- * lengths instead of fixing only the wrong ones. This idea is taken
- * from 'ar' written by Haruhiko Okumura.)
- */
- for (bits = max_length; bits != 0; bits--) {
- n = s->bl_count[bits];
- while (n != 0) {
- m = s->heap[--h];
- if (m > max_code) continue;
- if (tree[m].Len != (unsigned) bits) {
- Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
- s->opt_len += ((long)bits - (long)tree[m].Len)
- *(long)tree[m].Freq;
- tree[m].Len = (ush)bits;
- }
- n--;
- }
- }
-}
-
-/* ===========================================================================
- * Generate the codes for a given tree and bit counts (which need not be
- * optimal).
- * IN assertion: the array bl_count contains the bit length statistics for
- * the given tree and the field len is set for all tree elements.
- * OUT assertion: the field code is set for all tree elements of non
- * zero code length.
- */
-local void gen_codes (tree, max_code, bl_count)
- ct_data *tree; /* the tree to decorate */
- int max_code; /* largest code with non zero frequency */
- ushf *bl_count; /* number of codes at each bit length */
-{
- ush next_code[MAX_BITS+1]; /* next code value for each bit length */
- ush code = 0; /* running code value */
- int bits; /* bit index */
- int n; /* code index */
-
- /* The distribution counts are first used to generate the code values
- * without bit reversal.
- */
- for (bits = 1; bits <= MAX_BITS; bits++) {
- next_code[bits] = code = (code + bl_count[bits-1]) << 1;
- }
- /* Check that the bit counts in bl_count are consistent. The last code
- * must be all ones.
- */
- Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
- "inconsistent bit counts");
- Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
-
- for (n = 0; n <= max_code; n++) {
- int len = tree[n].Len;
- if (len == 0) continue;
- /* Now reverse the bits */
- tree[n].Code = bi_reverse(next_code[len]++, len);
-
- Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
- n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
- }
-}
-
-/* ===========================================================================
- * Construct one Huffman tree and assigns the code bit strings and lengths.
- * Update the total bit length for the current block.
- * IN assertion: the field freq is set for all tree elements.
- * OUT assertions: the fields len and code are set to the optimal bit length
- * and corresponding code. The length opt_len is updated; static_len is
- * also updated if stree is not null. The field max_code is set.
- */
-local void build_tree(s, desc)
- deflate_state *s;
- tree_desc *desc; /* the tree descriptor */
-{
- ct_data *tree = desc->dyn_tree;
- const ct_data *stree = desc->stat_desc->static_tree;
- int elems = desc->stat_desc->elems;
- int n, m; /* iterate over heap elements */
- int max_code = -1; /* largest code with non zero frequency */
- int node; /* new node being created */
-
- /* Construct the initial heap, with least frequent element in
- * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
- * heap[0] is not used.
- */
- s->heap_len = 0, s->heap_max = HEAP_SIZE;
-
- for (n = 0; n < elems; n++) {
- if (tree[n].Freq != 0) {
- s->heap[++(s->heap_len)] = max_code = n;
- s->depth[n] = 0;
- } else {
- tree[n].Len = 0;
- }
- }
-
- /* The pkzip format requires that at least one distance code exists,
- * and that at least one bit should be sent even if there is only one
- * possible code. So to avoid special checks later on we force at least
- * two codes of non zero frequency.
- */
- while (s->heap_len < 2) {
- node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0);
- tree[node].Freq = 1;
- s->depth[node] = 0;
- s->opt_len--; if (stree) s->static_len -= stree[node].Len;
- /* node is 0 or 1 so it does not have extra bits */
- }
- desc->max_code = max_code;
-
- /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
- * establish sub-heaps of increasing lengths:
- */
- for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n);
-
- /* Construct the Huffman tree by repeatedly combining the least two
- * frequent nodes.
- */
- node = elems; /* next internal node of the tree */
- do {
- pqremove(s, tree, n); /* n = node of least frequency */
- m = s->heap[SMALLEST]; /* m = node of next least frequency */
-
- s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */
- s->heap[--(s->heap_max)] = m;
-
- /* Create a new node father of n and m */
- tree[node].Freq = tree[n].Freq + tree[m].Freq;
- s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ?
- s->depth[n] : s->depth[m]) + 1);
- tree[n].Dad = tree[m].Dad = (ush)node;
-#ifdef DUMP_BL_TREE
- if (tree == s->bl_tree) {
- fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)",
- node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq);
- }
-#endif
- /* and insert the new node in the heap */
- s->heap[SMALLEST] = node++;
- pqdownheap(s, tree, SMALLEST);
-
- } while (s->heap_len >= 2);
-
- s->heap[--(s->heap_max)] = s->heap[SMALLEST];
-
- /* At this point, the fields freq and dad are set. We can now
- * generate the bit lengths.
- */
- gen_bitlen(s, (tree_desc *)desc);
-
- /* The field len is now set, we can generate the bit codes */
- gen_codes ((ct_data *)tree, max_code, s->bl_count);
-}
-
-/* ===========================================================================
- * Scan a literal or distance tree to determine the frequencies of the codes
- * in the bit length tree.
- */
-local void scan_tree (s, tree, max_code)
- deflate_state *s;
- ct_data *tree; /* the tree to be scanned */
- int max_code; /* and its largest code of non zero frequency */
-{
- int n; /* iterates over all tree elements */
- int prevlen = -1; /* last emitted length */
- int curlen; /* length of current code */
- int nextlen = tree[0].Len; /* length of next code */
- int count = 0; /* repeat count of the current code */
- int max_count = 7; /* max repeat count */
- int min_count = 4; /* min repeat count */
-
- if (nextlen == 0) max_count = 138, min_count = 3;
- tree[max_code+1].Len = (ush)0xffff; /* guard */
-
- for (n = 0; n <= max_code; n++) {
- curlen = nextlen; nextlen = tree[n+1].Len;
- if (++count < max_count && curlen == nextlen) {
- continue;
- } else if (count < min_count) {
- s->bl_tree[curlen].Freq += count;
- } else if (curlen != 0) {
- if (curlen != prevlen) s->bl_tree[curlen].Freq++;
- s->bl_tree[REP_3_6].Freq++;
- } else if (count <= 10) {
- s->bl_tree[REPZ_3_10].Freq++;
- } else {
- s->bl_tree[REPZ_11_138].Freq++;
- }
- count = 0; prevlen = curlen;
- if (nextlen == 0) {
- max_count = 138, min_count = 3;
- } else if (curlen == nextlen) {
- max_count = 6, min_count = 3;
- } else {
- max_count = 7, min_count = 4;
- }
- }
-}
-
-/* ===========================================================================
- * Send a literal or distance tree in compressed form, using the codes in
- * bl_tree.
- */
-local void send_tree (s, tree, max_code)
- deflate_state *s;
- ct_data *tree; /* the tree to be scanned */
- int max_code; /* and its largest code of non zero frequency */
-{
- int n; /* iterates over all tree elements */
- int prevlen = -1; /* last emitted length */
- int curlen; /* length of current code */
- int nextlen = tree[0].Len; /* length of next code */
- int count = 0; /* repeat count of the current code */
- int max_count = 7; /* max repeat count */
- int min_count = 4; /* min repeat count */
-
- /* tree[max_code+1].Len = -1; */ /* guard already set */
- if (nextlen == 0) max_count = 138, min_count = 3;
-
- for (n = 0; n <= max_code; n++) {
- curlen = nextlen; nextlen = tree[n+1].Len;
- if (++count < max_count && curlen == nextlen) {
- continue;
- } else if (count < min_count) {
- do { send_code(s, curlen, s->bl_tree); } while (--count != 0);
-
- } else if (curlen != 0) {
- if (curlen != prevlen) {
- send_code(s, curlen, s->bl_tree); count--;
- }
- Assert(count >= 3 && count <= 6, " 3_6?");
- send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2);
-
- } else if (count <= 10) {
- send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3);
-
- } else {
- send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7);
- }
- count = 0; prevlen = curlen;
- if (nextlen == 0) {
- max_count = 138, min_count = 3;
- } else if (curlen == nextlen) {
- max_count = 6, min_count = 3;
- } else {
- max_count = 7, min_count = 4;
- }
- }
-}
-
-/* ===========================================================================
- * Construct the Huffman tree for the bit lengths and return the index in
- * bl_order of the last bit length code to send.
- */
-local int build_bl_tree(s)
- deflate_state *s;
-{
- int max_blindex; /* index of last bit length code of non zero freq */
-
- /* Determine the bit length frequencies for literal and distance trees */
- scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code);
- scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code);
-
- /* Build the bit length tree: */
- build_tree(s, (tree_desc *)(&(s->bl_desc)));
- /* opt_len now includes the length of the tree representations, except
- * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
- */
-
- /* Determine the number of bit length codes to send. The pkzip format
- * requires that at least 4 bit length codes be sent. (appnote.txt says
- * 3 but the actual value used is 4.)
- */
- for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {
- if (s->bl_tree[bl_order[max_blindex]].Len != 0) break;
- }
- /* Update opt_len to include the bit length tree and counts */
- s->opt_len += 3*(max_blindex+1) + 5+5+4;
- Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
- s->opt_len, s->static_len));
-
- return max_blindex;
-}
-
-/* ===========================================================================
- * Send the header for a block using dynamic Huffman trees: the counts, the
- * lengths of the bit length codes, the literal tree and the distance tree.
- * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
- */
-local void send_all_trees(s, lcodes, dcodes, blcodes)
- deflate_state *s;
- int lcodes, dcodes, blcodes; /* number of codes for each tree */
-{
- int rank; /* index in bl_order */
-
- Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
- Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
- "too many codes");
- Tracev((stderr, "\nbl counts: "));
- send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */
- send_bits(s, dcodes-1, 5);
- send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */
- for (rank = 0; rank < blcodes; rank++) {
- Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
- send_bits(s, s->bl_tree[bl_order[rank]].Len, 3);
- }
- Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
-
- send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */
- Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
-
- send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */
- Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
-}
-
-/* ===========================================================================
- * Send a stored block
- */
-void _tr_stored_block(s, buf, stored_len, eof)
- deflate_state *s;
- charf *buf; /* input block */
- ulg stored_len; /* length of input block */
- int eof; /* true if this is the last block for a file */
-{
- send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */
-#ifdef DEBUG
- s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;
- s->compressed_len += (stored_len + 4) << 3;
-#endif
- copy_block(s, buf, (unsigned)stored_len, 1); /* with header */
-}
-
-/* ===========================================================================
- * Send one empty static block to give enough lookahead for inflate.
- * This takes 10 bits, of which 7 may remain in the bit buffer.
- * The current inflate code requires 9 bits of lookahead. If the
- * last two codes for the previous block (real code plus EOB) were coded
- * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode
- * the last real code. In this case we send two empty static blocks instead
- * of one. (There are no problems if the previous block is stored or fixed.)
- * To simplify the code, we assume the worst case of last real code encoded
- * on one bit only.
- */
-void _tr_align(s)
- deflate_state *s;
-{
- send_bits(s, STATIC_TREES<<1, 3);
- send_code(s, END_BLOCK, static_ltree);
-#ifdef DEBUG
- s->compressed_len += 10L; /* 3 for block type, 7 for EOB */
-#endif
- bi_flush(s);
- /* Of the 10 bits for the empty block, we have already sent
- * (10 - bi_valid) bits. The lookahead for the last real code (before
- * the EOB of the previous block) was thus at least one plus the length
- * of the EOB plus what we have just sent of the empty static block.
- */
- if (1 + s->last_eob_len + 10 - s->bi_valid < 9) {
- send_bits(s, STATIC_TREES<<1, 3);
- send_code(s, END_BLOCK, static_ltree);
-#ifdef DEBUG
- s->compressed_len += 10L;
-#endif
- bi_flush(s);
- }
- s->last_eob_len = 7;
-}
-
-/* ===========================================================================
- * Determine the best encoding for the current block: dynamic trees, static
- * trees or store, and output the encoded block to the zip file.
- */
-void _tr_flush_block(s, buf, stored_len, eof)
- deflate_state *s;
- charf *buf; /* input block, or NULL if too old */
- ulg stored_len; /* length of input block */
- int eof; /* true if this is the last block for a file */
-{
- ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */
- int max_blindex = 0; /* index of last bit length code of non zero freq */
-
- /* Build the Huffman trees unless a stored block is forced */
- if (s->level > 0) {
-
- /* Check if the file is ascii or binary */
- if (s->strm->data_type == Z_UNKNOWN) set_data_type(s);
-
- /* Construct the literal and distance trees */
- build_tree(s, (tree_desc *)(&(s->l_desc)));
- Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
- s->static_len));
-
- build_tree(s, (tree_desc *)(&(s->d_desc)));
- Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
- s->static_len));
- /* At this point, opt_len and static_len are the total bit lengths of
- * the compressed block data, excluding the tree representations.
- */
-
- /* Build the bit length tree for the above two trees, and get the index
- * in bl_order of the last bit length code to send.
- */
- max_blindex = build_bl_tree(s);
-
- /* Determine the best encoding. Compute the block lengths in bytes. */
- opt_lenb = (s->opt_len+3+7)>>3;
- static_lenb = (s->static_len+3+7)>>3;
-
- Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
- opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
- s->last_lit));
-
- if (static_lenb <= opt_lenb) opt_lenb = static_lenb;
-
- } else {
- Assert(buf != (char*)0, "lost buf");
- opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
- }
-
-#ifdef FORCE_STORED
- if (buf != (char*)0) { /* force stored block */
-#else
- if (stored_len+4 <= opt_lenb && buf != (char*)0) {
- /* 4: two words for the lengths */
-#endif
- /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
- * Otherwise we can't have processed more than WSIZE input bytes since
- * the last block flush, because compression would have been
- * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
- * transform a block into a stored block.
- */
- _tr_stored_block(s, buf, stored_len, eof);
-
-#ifdef FORCE_STATIC
- } else if (static_lenb >= 0) { /* force static trees */
-#else
- } else if (static_lenb == opt_lenb) {
-#endif
- send_bits(s, (STATIC_TREES<<1)+eof, 3);
- compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree);
-#ifdef DEBUG
- s->compressed_len += 3 + s->static_len;
-#endif
- } else {
- send_bits(s, (DYN_TREES<<1)+eof, 3);
- send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,
- max_blindex+1);
- compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree);
-#ifdef DEBUG
- s->compressed_len += 3 + s->opt_len;
-#endif
- }
- Assert (s->compressed_len == s->bits_sent, "bad compressed size");
- /* The above check is made mod 2^32, for files larger than 512 MB
- * and uLong implemented on 32 bits.
- */
- init_block(s);
-
- if (eof) {
- bi_windup(s);
-#ifdef DEBUG
- s->compressed_len += 7; /* align on byte boundary */
-#endif
- }
- Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
- s->compressed_len-7*eof));
-}
-
-/* ===========================================================================
- * Save the match info and tally the frequency counts. Return true if
- * the current block must be flushed.
- */
-int _tr_tally (s, dist, lc)
- deflate_state *s;
- unsigned dist; /* distance of matched string */
- unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */
-{
- s->d_buf[s->last_lit] = (ush)dist;
- s->l_buf[s->last_lit++] = (uch)lc;
- if (dist == 0) {
- /* lc is the unmatched char */
- s->dyn_ltree[lc].Freq++;
- } else {
- s->matches++;
- /* Here, lc is the match length - MIN_MATCH */
- dist--; /* dist = match distance - 1 */
- Assert((ush)dist < (ush)MAX_DIST(s) &&
- (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
- (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match");
-
- s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++;
- s->dyn_dtree[d_code(dist)].Freq++;
- }
-
-#ifdef TRUNCATE_BLOCK
- /* Try to guess if it is profitable to stop the current block here */
- if ((s->last_lit & 0x1fff) == 0 && s->level > 2) {
- /* Compute an upper bound for the compressed length */
- ulg out_length = (ulg)s->last_lit*8L;
- ulg in_length = (ulg)((long)s->strstart - s->block_start);
- int dcode;
- for (dcode = 0; dcode < D_CODES; dcode++) {
- out_length += (ulg)s->dyn_dtree[dcode].Freq *
- (5L+extra_dbits[dcode]);
- }
- out_length >>= 3;
- Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
- s->last_lit, in_length, out_length,
- 100L - out_length*100L/in_length));
- if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1;
- }
-#endif
- return (s->last_lit == s->lit_bufsize-1);
- /* We avoid equality with lit_bufsize because of wraparound at 64K
- * on 16 bit machines and because stored blocks are restricted to
- * 64K-1 bytes.
- */
-}
-
-/* ===========================================================================
- * Send the block data compressed using the given Huffman trees
- */
-local void compress_block(s, ltree, dtree)
- deflate_state *s;
- ct_data *ltree; /* literal tree */
- ct_data *dtree; /* distance tree */
-{
- unsigned dist; /* distance of matched string */
- int lc; /* match length or unmatched char (if dist == 0) */
- unsigned lx = 0; /* running index in l_buf */
- unsigned code; /* the code to send */
- int extra; /* number of extra bits to send */
-
- if (s->last_lit != 0) do {
- dist = s->d_buf[lx];
- lc = s->l_buf[lx++];
- if (dist == 0) {
- send_code(s, lc, ltree); /* send a literal byte */
- Tracecv(isgraph(lc), (stderr," '%c' ", lc));
- } else {
- /* Here, lc is the match length - MIN_MATCH */
- code = _length_code[lc];
- send_code(s, code+LITERALS+1, ltree); /* send the length code */
- extra = extra_lbits[code];
- if (extra != 0) {
- lc -= base_length[code];
- send_bits(s, lc, extra); /* send the extra length bits */
- }
- dist--; /* dist is now the match distance - 1 */
- code = d_code(dist);
- Assert (code < D_CODES, "bad d_code");
-
- send_code(s, code, dtree); /* send the distance code */
- extra = extra_dbits[code];
- if (extra != 0) {
- dist -= base_dist[code];
- send_bits(s, dist, extra); /* send the extra distance bits */
- }
- } /* literal or match pair ? */
-
- /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
- Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,
- "pendingBuf overflow");
-
- } while (lx < s->last_lit);
-
- send_code(s, END_BLOCK, ltree);
- s->last_eob_len = ltree[END_BLOCK].Len;
-}
-
-/* ===========================================================================
- * Set the data type to ASCII or BINARY, using a crude approximation:
- * binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise.
- * IN assertion: the fields freq of dyn_ltree are set and the total of all
- * frequencies does not exceed 64K (to fit in an int on 16 bit machines).
- */
-local void set_data_type(s)
- deflate_state *s;
-{
- int n = 0;
- unsigned ascii_freq = 0;
- unsigned bin_freq = 0;
- while (n < 7) bin_freq += s->dyn_ltree[n++].Freq;
- while (n < 128) ascii_freq += s->dyn_ltree[n++].Freq;
- while (n < LITERALS) bin_freq += s->dyn_ltree[n++].Freq;
- s->strm->data_type = bin_freq > (ascii_freq >> 2) ? Z_BINARY : Z_ASCII;
-}
-
-/* ===========================================================================
- * Reverse the first len bits of a code, using straightforward code (a faster
- * method would use a table)
- * IN assertion: 1 <= len <= 15
- */
-local unsigned bi_reverse(code, len)
- unsigned code; /* the value to invert */
- int len; /* its bit length */
-{
- register unsigned res = 0;
- do {
- res |= code & 1;
- code >>= 1, res <<= 1;
- } while (--len > 0);
- return res >> 1;
-}
-
-/* ===========================================================================
- * Flush the bit buffer, keeping at most 7 bits in it.
- */
-local void bi_flush(s)
- deflate_state *s;
-{
- if (s->bi_valid == 16) {
- put_short(s, s->bi_buf);
- s->bi_buf = 0;
- s->bi_valid = 0;
- } else if (s->bi_valid >= 8) {
- put_byte(s, (Byte)s->bi_buf);
- s->bi_buf >>= 8;
- s->bi_valid -= 8;
- }
-}
-
-/* ===========================================================================
- * Flush the bit buffer and align the output on a byte boundary
- */
-local void bi_windup(s)
- deflate_state *s;
-{
- if (s->bi_valid > 8) {
- put_short(s, s->bi_buf);
- } else if (s->bi_valid > 0) {
- put_byte(s, (Byte)s->bi_buf);
- }
- s->bi_buf = 0;
- s->bi_valid = 0;
-#ifdef DEBUG
- s->bits_sent = (s->bits_sent+7) & ~7;
-#endif
-}
-
-/* ===========================================================================
- * Copy a stored block, storing first the length and its
- * one's complement if requested.
- */
-local void copy_block(s, buf, len, header)
- deflate_state *s;
- charf *buf; /* the input data */
- unsigned len; /* its length */
- int header; /* true if block header must be written */
-{
- bi_windup(s); /* align on byte boundary */
- s->last_eob_len = 8; /* enough lookahead for inflate */
-
- if (header) {
- put_short(s, (ush)len);
- put_short(s, (ush)~len);
-#ifdef DEBUG
- s->bits_sent += 2*16;
-#endif
- }
-#ifdef DEBUG
- s->bits_sent += (ulg)len<<3;
-#endif
- while (len--) {
- put_byte(s, *buf++);
- }
-}
diff --git a/src/zlib/trees.h b/src/zlib/trees.h
deleted file mode 100644
index 72facf900..000000000
--- a/src/zlib/trees.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/* header created automatically with -DGEN_TREES_H */
-
-local const ct_data static_ltree[L_CODES+2] = {
-{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}},
-{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}},
-{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}},
-{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}},
-{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}},
-{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}},
-{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}},
-{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}},
-{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}},
-{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}},
-{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}},
-{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}},
-{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}},
-{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}},
-{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}},
-{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}},
-{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}},
-{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}},
-{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}},
-{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}},
-{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}},
-{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}},
-{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}},
-{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}},
-{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}},
-{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}},
-{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}},
-{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}},
-{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}},
-{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}},
-{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}},
-{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}},
-{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}},
-{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}},
-{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}},
-{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}},
-{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}},
-{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}},
-{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}},
-{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}},
-{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}},
-{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}},
-{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}},
-{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}},
-{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}},
-{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}},
-{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}},
-{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}},
-{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}},
-{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}},
-{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}},
-{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}},
-{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}},
-{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}},
-{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}},
-{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}},
-{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}},
-{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}}
-};
-
-local const ct_data static_dtree[D_CODES] = {
-{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}},
-{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}},
-{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}},
-{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}},
-{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}},
-{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}}
-};
-
-const uch _dist_code[DIST_CODE_LEN] = {
- 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8,
- 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10,
-10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13,
-13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15,
-15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17,
-18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22,
-23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
-24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27,
-27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
-27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
-28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
-28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
-28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
-29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
-29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
-29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29
-};
-
-const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12,
-13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16,
-17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19,
-19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22,
-22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23,
-23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
-24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26,
-26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
-27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28
-};
-
-local const int base_length[LENGTH_CODES] = {
-0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56,
-64, 80, 96, 112, 128, 160, 192, 224, 0
-};
-
-local const int base_dist[D_CODES] = {
- 0, 1, 2, 3, 4, 6, 8, 12, 16, 24,
- 32, 48, 64, 96, 128, 192, 256, 384, 512, 768,
- 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576
-};
-
diff --git a/src/zlib/zconf.h b/src/zlib/zconf.h
deleted file mode 100644
index 3c21403fc..000000000
--- a/src/zlib/zconf.h
+++ /dev/null
@@ -1,326 +0,0 @@
-/* zconf.h -- configuration of the zlib compression library
- * Copyright (C) 1995-2004 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* @(#) $Id$ */
-
-#ifndef ZCONF_H
-#define ZCONF_H
-
-/*
- * If you *really* need a unique prefix for all types and library functions,
- * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
- */
-#ifdef Z_PREFIX
-# define deflateInit_ z_deflateInit_
-# define deflate z_deflate
-# define deflateEnd z_deflateEnd
-# define inflateInit_ z_inflateInit_
-# define inflate z_inflate
-# define inflateEnd z_inflateEnd
-# define deflateInit2_ z_deflateInit2_
-# define deflateSetDictionary z_deflateSetDictionary
-# define deflateCopy z_deflateCopy
-# define deflateReset z_deflateReset
-# define deflateParams z_deflateParams
-# define deflateBound z_deflateBound
-# define deflatePrime z_deflatePrime
-# define inflateInit2_ z_inflateInit2_
-# define inflateSetDictionary z_inflateSetDictionary
-# define inflateSync z_inflateSync
-# define inflateSyncPoint z_inflateSyncPoint
-# define inflateCopy z_inflateCopy
-# define inflateReset z_inflateReset
-# define inflateBack z_inflateBack
-# define inflateBackEnd z_inflateBackEnd
-# define compress z_compress
-# define compress2 z_compress2
-# define compressBound z_compressBound
-# define uncompress z_uncompress
-# define adler32 z_adler32
-# define crc32 z_crc32
-# define get_crc_table z_get_crc_table
-# define zError z_zError
-
-# define Byte z_Byte
-# define uInt z_uInt
-# define uLong z_uLong
-# define Bytef z_Bytef
-# define charf z_charf
-# define intf z_intf
-# define uIntf z_uIntf
-# define uLongf z_uLongf
-# define voidpf z_voidpf
-# define voidp z_voidp
-#endif
-
-#if defined(__MSDOS__) && !defined(MSDOS)
-# define MSDOS
-#endif
-#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
-# define OS2
-#endif
-#if defined(_WINDOWS) && !defined(WINDOWS)
-# define WINDOWS
-#endif
-#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
-# define WIN32
-#endif
-#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
-# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
-# ifndef SYS16BIT
-# define SYS16BIT
-# endif
-# endif
-#endif
-
-/*
- * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
- * than 64k bytes at a time (needed on systems with 16-bit int).
- */
-#ifdef SYS16BIT
-# define MAXSEG_64K
-#endif
-#ifdef MSDOS
-# define UNALIGNED_OK
-#endif
-
-#ifdef __STDC_VERSION__
-# ifndef STDC
-# define STDC
-# endif
-# if __STDC_VERSION__ >= 199901L
-# ifndef STDC99
-# define STDC99
-# endif
-# endif
-#endif
-#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
-# define STDC
-#endif
-#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
-# define STDC
-#endif
-#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
-# define STDC
-#endif
-#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
-# define STDC
-#endif
-
-#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */
-# define STDC
-#endif
-
-#ifndef STDC
-# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
-# define const /* note: need a more gentle solution here */
-# endif
-#endif
-
-/* Some Mac compilers merge all .h files incorrectly: */
-#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)
-# define NO_DUMMY_DECL
-#endif
-
-/* Maximum value for memLevel in deflateInit2 */
-#ifndef MAX_MEM_LEVEL
-# ifdef MAXSEG_64K
-# define MAX_MEM_LEVEL 8
-# else
-# define MAX_MEM_LEVEL 9
-# endif
-#endif
-
-/* Maximum value for windowBits in deflateInit2 and inflateInit2.
- * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
- * created by gzip. (Files created by minigzip can still be extracted by
- * gzip.)
- */
-#ifndef MAX_WBITS
-# define MAX_WBITS 15 /* 32K LZ77 window */
-#endif
-
-/* The memory requirements for deflate are (in bytes):
- (1 << (windowBits+2)) + (1 << (memLevel+9))
- that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
- plus a few kilobytes for small objects. For example, if you want to reduce
- the default memory requirements from 256K to 128K, compile with
- make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
- Of course this will generally degrade compression (there's no free lunch).
-
- The memory requirements for inflate are (in bytes) 1 << windowBits
- that is, 32K for windowBits=15 (default value) plus a few kilobytes
- for small objects.
-*/
-
- /* Type declarations */
-
-#ifndef OF /* function prototypes */
-# ifdef STDC
-# define OF(args) args
-# else
-# define OF(args) ()
-# endif
-#endif
-
-/* The following definitions for FAR are needed only for MSDOS mixed
- * model programming (small or medium model with some far allocations).
- * This was tested only with MSC; for other MSDOS compilers you may have
- * to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
- * just define FAR to be empty.
- */
-#ifdef SYS16BIT
-# if defined(M_I86SM) || defined(M_I86MM)
- /* MSC small or medium model */
-# define SMALL_MEDIUM
-# ifdef _MSC_VER
-# define FAR _far
-# else
-# define FAR far
-# endif
-# endif
-# if (defined(__SMALL__) || defined(__MEDIUM__))
- /* Turbo C small or medium model */
-# define SMALL_MEDIUM
-# ifdef __BORLANDC__
-# define FAR _far
-# else
-# define FAR far
-# endif
-# endif
-#endif
-
-#if defined(WINDOWS) || defined(WIN32)
- /* If building or using zlib as a DLL, define ZLIB_DLL.
- * This is not mandatory, but it offers a little performance increase.
- */
-# ifdef ZLIB_DLL
-# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
-# ifdef ZLIB_INTERNAL
-# define ZEXTERN extern __declspec(dllexport)
-# else
-# define ZEXTERN extern __declspec(dllimport)
-# endif
-# endif
-# endif /* ZLIB_DLL */
- /* If building or using zlib with the WINAPI/WINAPIV calling convention,
- * define ZLIB_WINAPI.
- * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
- */
-# ifdef ZLIB_WINAPI
-# ifdef FAR
-# undef FAR
-# endif
-# include <windows.h>
- /* No need for _export, use ZLIB.DEF instead. */
- /* For complete Windows compatibility, use WINAPI, not __stdcall. */
-# define ZEXPORT WINAPI
-# ifdef WIN32
-# define ZEXPORTVA WINAPIV
-# else
-# define ZEXPORTVA FAR CDECL
-# endif
-# endif
-#endif
-
-#if defined (__BEOS__)
-# ifdef ZLIB_DLL
-# ifdef ZLIB_INTERNAL
-# define ZEXPORT __declspec(dllexport)
-# define ZEXPORTVA __declspec(dllexport)
-# else
-# define ZEXPORT __declspec(dllimport)
-# define ZEXPORTVA __declspec(dllimport)
-# endif
-# endif
-#endif
-
-#ifndef ZEXTERN
-# define ZEXTERN extern
-#endif
-#ifndef ZEXPORT
-# define ZEXPORT
-#endif
-#ifndef ZEXPORTVA
-# define ZEXPORTVA
-#endif
-
-#ifndef FAR
-# define FAR
-#endif
-
-#if !defined(__MACTYPES__)
-typedef unsigned char Byte; /* 8 bits */
-#endif
-typedef unsigned int uInt; /* 16 bits or more */
-typedef unsigned long uLong; /* 32 bits or more */
-
-#ifdef SMALL_MEDIUM
- /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
-# define Bytef Byte FAR
-#else
- typedef Byte FAR Bytef;
-#endif
-typedef char FAR charf;
-typedef int FAR intf;
-typedef uInt FAR uIntf;
-typedef uLong FAR uLongf;
-
-#ifdef STDC
- typedef void const *voidpc;
- typedef void FAR *voidpf;
- typedef void *voidp;
-#else
- typedef Byte const *voidpc;
- typedef Byte FAR *voidpf;
- typedef Byte *voidp;
-#endif
-
-#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */
-# include <sys/types.h> /* for off_t */
-# include <unistd.h> /* for SEEK_* and off_t */
-# ifdef VMS
-# include <unixio.h> /* for off_t */
-# endif
-# define z_off_t off_t
-#endif
-#ifndef SEEK_SET
-# define SEEK_SET 0 /* Seek from beginning of file. */
-# define SEEK_CUR 1 /* Seek from current position. */
-# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
-#endif
-#ifndef z_off_t
-# define z_off_t long
-#endif
-
-#if defined(__OS400__)
-# define NO_vsnprintf
-#endif
-
-#if defined(__MVS__)
-# define NO_vsnprintf
-# ifdef FAR
-# undef FAR
-# endif
-#endif
-
-/* MVS linker does not support external names larger than 8 bytes */
-#if defined(__MVS__)
-# pragma map(deflateInit_,"DEIN")
-# pragma map(deflateInit2_,"DEIN2")
-# pragma map(deflateEnd,"DEEND")
-# pragma map(deflateBound,"DEBND")
-# pragma map(inflateInit_,"ININ")
-# pragma map(inflateInit2_,"ININ2")
-# pragma map(inflateEnd,"INEND")
-# pragma map(inflateSync,"INSY")
-# pragma map(inflateSetDictionary,"INSEDI")
-# pragma map(compressBound,"CMBND")
-# pragma map(inflate_table,"INTABL")
-# pragma map(inflate_fast,"INFA")
-# pragma map(inflate_copyright,"INCOPY")
-#endif
-
-#endif /* ZCONF_H */
diff --git a/src/zlib/zlib.h b/src/zlib/zlib.h
deleted file mode 100644
index b4ddd3439..000000000
--- a/src/zlib/zlib.h
+++ /dev/null
@@ -1,1200 +0,0 @@
-/* zlib.h -- interface of the 'zlib' general purpose compression library
- version 1.2.2, October 3rd, 2004
-
- Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-
- Jean-loup Gailly Mark Adler
- jloup@gzip.org madler@alumni.caltech.edu
-
-
- The data format used by the zlib library is described by RFCs (Request for
- Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt
- (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
-*/
-
-#ifndef ZLIB_H
-#define ZLIB_H
-
-#include "zconf.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define ZLIB_VERSION "1.2.2"
-#define ZLIB_VERNUM 0x1220
-
-/*
- The 'zlib' compression library provides in-memory compression and
- decompression functions, including integrity checks of the uncompressed
- data. This version of the library supports only one compression method
- (deflation) but other algorithms will be added later and will have the same
- stream interface.
-
- Compression can be done in a single step if the buffers are large
- enough (for example if an input file is mmap'ed), or can be done by
- repeated calls of the compression function. In the latter case, the
- application must provide more input and/or consume the output
- (providing more output space) before each call.
-
- The compressed data format used by default by the in-memory functions is
- the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped
- around a deflate stream, which is itself documented in RFC 1951.
-
- The library also supports reading and writing files in gzip (.gz) format
- with an interface similar to that of stdio using the functions that start
- with "gz". The gzip format is different from the zlib format. gzip is a
- gzip wrapper, documented in RFC 1952, wrapped around a deflate stream.
-
- This library can optionally read and write gzip streams in memory as well.
-
- The zlib format was designed to be compact and fast for use in memory
- and on communications channels. The gzip format was designed for single-
- file compression on file systems, has a larger header than zlib to maintain
- directory information, and uses a different, slower check method than zlib.
-
- The library does not install any signal handler. The decoder checks
- the consistency of the compressed data, so the library should never
- crash even in case of corrupted input.
-*/
-
-typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
-typedef void (*free_func) OF((voidpf opaque, voidpf address));
-
-struct internal_state;
-
-typedef struct z_stream_s {
- Bytef *next_in; /* next input byte */
- uInt avail_in; /* number of bytes available at next_in */
- uLong total_in; /* total nb of input bytes read so far */
-
- Bytef *next_out; /* next output byte should be put there */
- uInt avail_out; /* remaining free space at next_out */
- uLong total_out; /* total nb of bytes output so far */
-
- char *msg; /* last error message, NULL if no error */
- struct internal_state FAR *state; /* not visible by applications */
-
- alloc_func zalloc; /* used to allocate the internal state */
- free_func zfree; /* used to free the internal state */
- voidpf opaque; /* private data object passed to zalloc and zfree */
-
- int data_type; /* best guess about the data type: ascii or binary */
- uLong adler; /* adler32 value of the uncompressed data */
- uLong reserved; /* reserved for future use */
-} z_stream;
-
-typedef z_stream FAR *z_streamp;
-
-/*
- The application must update next_in and avail_in when avail_in has
- dropped to zero. It must update next_out and avail_out when avail_out
- has dropped to zero. The application must initialize zalloc, zfree and
- opaque before calling the init function. All other fields are set by the
- compression library and must not be updated by the application.
-
- The opaque value provided by the application will be passed as the first
- parameter for calls of zalloc and zfree. This can be useful for custom
- memory management. The compression library attaches no meaning to the
- opaque value.
-
- zalloc must return Z_NULL if there is not enough memory for the object.
- If zlib is used in a multi-threaded application, zalloc and zfree must be
- thread safe.
-
- On 16-bit systems, the functions zalloc and zfree must be able to allocate
- exactly 65536 bytes, but will not be required to allocate more than this
- if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
- pointers returned by zalloc for objects of exactly 65536 bytes *must*
- have their offset normalized to zero. The default allocation function
- provided by this library ensures this (see zutil.c). To reduce memory
- requirements and avoid any allocation of 64K objects, at the expense of
- compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
-
- The fields total_in and total_out can be used for statistics or
- progress reports. After compression, total_in holds the total size of
- the uncompressed data and may be saved for use in the decompressor
- (particularly if the decompressor wants to decompress everything in
- a single step).
-*/
-
- /* constants */
-
-#define Z_NO_FLUSH 0
-#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */
-#define Z_SYNC_FLUSH 2
-#define Z_FULL_FLUSH 3
-#define Z_FINISH 4
-#define Z_BLOCK 5
-/* Allowed flush values; see deflate() and inflate() below for details */
-
-#define Z_OK 0
-#define Z_STREAM_END 1
-#define Z_NEED_DICT 2
-#define Z_ERRNO (-1)
-#define Z_STREAM_ERROR (-2)
-#define Z_DATA_ERROR (-3)
-#define Z_MEM_ERROR (-4)
-#define Z_BUF_ERROR (-5)
-#define Z_VERSION_ERROR (-6)
-/* Return codes for the compression/decompression functions. Negative
- * values are errors, positive values are used for special but normal events.
- */
-
-#define Z_NO_COMPRESSION 0
-#define Z_BEST_SPEED 1
-#define Z_BEST_COMPRESSION 9
-#define Z_DEFAULT_COMPRESSION (-1)
-/* compression levels */
-
-#define Z_FILTERED 1
-#define Z_HUFFMAN_ONLY 2
-#define Z_RLE 3
-#define Z_DEFAULT_STRATEGY 0
-/* compression strategy; see deflateInit2() below for details */
-
-#define Z_BINARY 0
-#define Z_ASCII 1
-#define Z_UNKNOWN 2
-/* Possible values of the data_type field (though see inflate()) */
-
-#define Z_DEFLATED 8
-/* The deflate compression method (the only one supported in this version) */
-
-#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */
-
-#define zlib_version zlibVersion()
-/* for compatibility with versions < 1.0.2 */
-
- /* basic functions */
-
-ZEXTERN const char * ZEXPORT zlibVersion OF((void));
-/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
- If the first character differs, the library code actually used is
- not compatible with the zlib.h header file used by the application.
- This check is automatically made by deflateInit and inflateInit.
- */
-
-/*
-ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
-
- Initializes the internal stream state for compression. The fields
- zalloc, zfree and opaque must be initialized before by the caller.
- If zalloc and zfree are set to Z_NULL, deflateInit updates them to
- use default allocation functions.
-
- The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
- 1 gives best speed, 9 gives best compression, 0 gives no compression at
- all (the input data is simply copied a block at a time).
- Z_DEFAULT_COMPRESSION requests a default compromise between speed and
- compression (currently equivalent to level 6).
-
- deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
- enough memory, Z_STREAM_ERROR if level is not a valid compression level,
- Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible
- with the version assumed by the caller (ZLIB_VERSION).
- msg is set to null if there is no error message. deflateInit does not
- perform any compression: this will be done by deflate().
-*/
-
-
-ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
-/*
- deflate compresses as much data as possible, and stops when the input
- buffer becomes empty or the output buffer becomes full. It may introduce some
- output latency (reading input without producing any output) except when
- forced to flush.
-
- The detailed semantics are as follows. deflate performs one or both of the
- following actions:
-
- - Compress more input starting at next_in and update next_in and avail_in
- accordingly. If not all input can be processed (because there is not
- enough room in the output buffer), next_in and avail_in are updated and
- processing will resume at this point for the next call of deflate().
-
- - Provide more output starting at next_out and update next_out and avail_out
- accordingly. This action is forced if the parameter flush is non zero.
- Forcing flush frequently degrades the compression ratio, so this parameter
- should be set only when necessary (in interactive applications).
- Some output may be provided even if flush is not set.
-
- Before the call of deflate(), the application should ensure that at least
- one of the actions is possible, by providing more input and/or consuming
- more output, and updating avail_in or avail_out accordingly; avail_out
- should never be zero before the call. The application can consume the
- compressed output when it wants, for example when the output buffer is full
- (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK
- and with zero avail_out, it must be called again after making room in the
- output buffer because there might be more output pending.
-
- If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
- flushed to the output buffer and the output is aligned on a byte boundary, so
- that the decompressor can get all input data available so far. (In particular
- avail_in is zero after the call if enough output space has been provided
- before the call.) Flushing may degrade compression for some compression
- algorithms and so it should be used only when necessary.
-
- If flush is set to Z_FULL_FLUSH, all output is flushed as with
- Z_SYNC_FLUSH, and the compression state is reset so that decompression can
- restart from this point if previous compressed data has been damaged or if
- random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
- the compression.
-
- If deflate returns with avail_out == 0, this function must be called again
- with the same value of the flush parameter and more output space (updated
- avail_out), until the flush is complete (deflate returns with non-zero
- avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that
- avail_out is greater than six to avoid repeated flush markers due to
- avail_out == 0 on return.
-
- If the parameter flush is set to Z_FINISH, pending input is processed,
- pending output is flushed and deflate returns with Z_STREAM_END if there
- was enough output space; if deflate returns with Z_OK, this function must be
- called again with Z_FINISH and more output space (updated avail_out) but no
- more input data, until it returns with Z_STREAM_END or an error. After
- deflate has returned Z_STREAM_END, the only possible operations on the
- stream are deflateReset or deflateEnd.
-
- Z_FINISH can be used immediately after deflateInit if all the compression
- is to be done in a single step. In this case, avail_out must be at least
- the value returned by deflateBound (see below). If deflate does not return
- Z_STREAM_END, then it must be called again as described above.
-
- deflate() sets strm->adler to the adler32 checksum of all input read
- so far (that is, total_in bytes).
-
- deflate() may update data_type if it can make a good guess about
- the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered
- binary. This field is only for information purposes and does not affect
- the compression algorithm in any manner.
-
- deflate() returns Z_OK if some progress has been made (more input
- processed or more output produced), Z_STREAM_END if all input has been
- consumed and all output has been produced (only when flush is set to
- Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
- if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible
- (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not
- fatal, and deflate() can be called again with more input and more output
- space to continue compressing.
-*/
-
-
-ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
-/*
- All dynamically allocated data structures for this stream are freed.
- This function discards any unprocessed input and does not flush any
- pending output.
-
- deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
- stream state was inconsistent, Z_DATA_ERROR if the stream was freed
- prematurely (some input or output was discarded). In the error case,
- msg may be set but then points to a static string (which must not be
- deallocated).
-*/
-
-
-/*
-ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
-
- Initializes the internal stream state for decompression. The fields
- next_in, avail_in, zalloc, zfree and opaque must be initialized before by
- the caller. If next_in is not Z_NULL and avail_in is large enough (the exact
- value depends on the compression method), inflateInit determines the
- compression method from the zlib header and allocates all data structures
- accordingly; otherwise the allocation will be deferred to the first call of
- inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to
- use default allocation functions.
-
- inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
- memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
- version assumed by the caller. msg is set to null if there is no error
- message. inflateInit does not perform any decompression apart from reading
- the zlib header if present: this will be done by inflate(). (So next_in and
- avail_in may be modified, but next_out and avail_out are unchanged.)
-*/
-
-
-ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
-/*
- inflate decompresses as much data as possible, and stops when the input
- buffer becomes empty or the output buffer becomes full. It may introduce
- some output latency (reading input without producing any output) except when
- forced to flush.
-
- The detailed semantics are as follows. inflate performs one or both of the
- following actions:
-
- - Decompress more input starting at next_in and update next_in and avail_in
- accordingly. If not all input can be processed (because there is not
- enough room in the output buffer), next_in is updated and processing
- will resume at this point for the next call of inflate().
-
- - Provide more output starting at next_out and update next_out and avail_out
- accordingly. inflate() provides as much output as possible, until there
- is no more input data or no more space in the output buffer (see below
- about the flush parameter).
-
- Before the call of inflate(), the application should ensure that at least
- one of the actions is possible, by providing more input and/or consuming
- more output, and updating the next_* and avail_* values accordingly.
- The application can consume the uncompressed output when it wants, for
- example when the output buffer is full (avail_out == 0), or after each
- call of inflate(). If inflate returns Z_OK and with zero avail_out, it
- must be called again after making room in the output buffer because there
- might be more output pending.
-
- The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH,
- Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much
- output as possible to the output buffer. Z_BLOCK requests that inflate() stop
- if and when it get to the next deflate block boundary. When decoding the zlib
- or gzip format, this will cause inflate() to return immediately after the
- header and before the first block. When doing a raw inflate, inflate() will
- go ahead and process the first block, and will return when it gets to the end
- of that block, or when it runs out of data.
-
- The Z_BLOCK option assists in appending to or combining deflate streams.
- Also to assist in this, on return inflate() will set strm->data_type to the
- number of unused bits in the last byte taken from strm->next_in, plus 64
- if inflate() is currently decoding the last block in the deflate stream,
- plus 128 if inflate() returned immediately after decoding an end-of-block
- code or decoding the complete header up to just before the first byte of the
- deflate stream. The end-of-block will not be indicated until all of the
- uncompressed data from that block has been written to strm->next_out. The
- number of unused bits may in general be greater than seven, except when
- bit 7 of data_type is set, in which case the number of unused bits will be
- less than eight.
-
- inflate() should normally be called until it returns Z_STREAM_END or an
- error. However if all decompression is to be performed in a single step
- (a single call of inflate), the parameter flush should be set to
- Z_FINISH. In this case all pending input is processed and all pending
- output is flushed; avail_out must be large enough to hold all the
- uncompressed data. (The size of the uncompressed data may have been saved
- by the compressor for this purpose.) The next operation on this stream must
- be inflateEnd to deallocate the decompression state. The use of Z_FINISH
- is never required, but can be used to inform inflate that a faster approach
- may be used for the single inflate() call.
-
- In this implementation, inflate() always flushes as much output as
- possible to the output buffer, and always uses the faster approach on the
- first call. So the only effect of the flush parameter in this implementation
- is on the return value of inflate(), as noted below, or when it returns early
- because Z_BLOCK is used.
-
- If a preset dictionary is needed after this call (see inflateSetDictionary
- below), inflate sets strm->adler to the adler32 checksum of the dictionary
- chosen by the compressor and returns Z_NEED_DICT; otherwise it sets
- strm->adler to the adler32 checksum of all output produced so far (that is,
- total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described
- below. At the end of the stream, inflate() checks that its computed adler32
- checksum is equal to that saved by the compressor and returns Z_STREAM_END
- only if the checksum is correct.
-
- inflate() will decompress and check either zlib-wrapped or gzip-wrapped
- deflate data. The header type is detected automatically. Any information
- contained in the gzip header is not retained, so applications that need that
- information should instead use raw inflate, see inflateInit2() below, or
- inflateBack() and perform their own processing of the gzip header and
- trailer.
-
- inflate() returns Z_OK if some progress has been made (more input processed
- or more output produced), Z_STREAM_END if the end of the compressed data has
- been reached and all uncompressed output has been produced, Z_NEED_DICT if a
- preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
- corrupted (input stream not conforming to the zlib format or incorrect check
- value), Z_STREAM_ERROR if the stream structure was inconsistent (for example
- if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory,
- Z_BUF_ERROR if no progress is possible or if there was not enough room in the
- output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and
- inflate() can be called again with more input and more output space to
- continue decompressing. If Z_DATA_ERROR is returned, the application may then
- call inflateSync() to look for a good compression block if a partial recovery
- of the data is desired.
-*/
-
-
-ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
-/*
- All dynamically allocated data structures for this stream are freed.
- This function discards any unprocessed input and does not flush any
- pending output.
-
- inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
- was inconsistent. In the error case, msg may be set but then points to a
- static string (which must not be deallocated).
-*/
-
- /* Advanced functions */
-
-/*
- The following functions are needed only in some special applications.
-*/
-
-/*
-ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
- int level,
- int method,
- int windowBits,
- int memLevel,
- int strategy));
-
- This is another version of deflateInit with more compression options. The
- fields next_in, zalloc, zfree and opaque must be initialized before by
- the caller.
-
- The method parameter is the compression method. It must be Z_DEFLATED in
- this version of the library.
-
- The windowBits parameter is the base two logarithm of the window size
- (the size of the history buffer). It should be in the range 8..15 for this
- version of the library. Larger values of this parameter result in better
- compression at the expense of memory usage. The default value is 15 if
- deflateInit is used instead.
-
- windowBits can also be -8..-15 for raw deflate. In this case, -windowBits
- determines the window size. deflate() will then generate raw deflate data
- with no zlib header or trailer, and will not compute an adler32 check value.
-
- windowBits can also be greater than 15 for optional gzip encoding. Add
- 16 to windowBits to write a simple gzip header and trailer around the
- compressed data instead of a zlib wrapper. The gzip header will have no
- file name, no extra data, no comment, no modification time (set to zero),
- no header crc, and the operating system will be set to 255 (unknown). If a
- gzip stream is being written, strm->adler is a crc32 instead of an adler32.
-
- The memLevel parameter specifies how much memory should be allocated
- for the internal compression state. memLevel=1 uses minimum memory but
- is slow and reduces compression ratio; memLevel=9 uses maximum memory
- for optimal speed. The default value is 8. See zconf.h for total memory
- usage as a function of windowBits and memLevel.
-
- The strategy parameter is used to tune the compression algorithm. Use the
- value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
- filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no
- string match), or Z_RLE to limit match distances to one (run-length
- encoding). Filtered data consists mostly of small values with a somewhat
- random distribution. In this case, the compression algorithm is tuned to
- compress them better. The effect of Z_FILTERED is to force more Huffman
- coding and less string matching; it is somewhat intermediate between
- Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as
- Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy
- parameter only affects the compression ratio but not the correctness of the
- compressed output even if it is not set appropriately.
-
- deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
- memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid
- method). msg is set to null if there is no error message. deflateInit2 does
- not perform any compression: this will be done by deflate().
-*/
-
-ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
- const Bytef *dictionary,
- uInt dictLength));
-/*
- Initializes the compression dictionary from the given byte sequence
- without producing any compressed output. This function must be called
- immediately after deflateInit, deflateInit2 or deflateReset, before any
- call of deflate. The compressor and decompressor must use exactly the same
- dictionary (see inflateSetDictionary).
-
- The dictionary should consist of strings (byte sequences) that are likely
- to be encountered later in the data to be compressed, with the most commonly
- used strings preferably put towards the end of the dictionary. Using a
- dictionary is most useful when the data to be compressed is short and can be
- predicted with good accuracy; the data can then be compressed better than
- with the default empty dictionary.
-
- Depending on the size of the compression data structures selected by
- deflateInit or deflateInit2, a part of the dictionary may in effect be
- discarded, for example if the dictionary is larger than the window size in
- deflate or deflate2. Thus the strings most likely to be useful should be
- put at the end of the dictionary, not at the front.
-
- Upon return of this function, strm->adler is set to the adler32 value
- of the dictionary; the decompressor may later use this value to determine
- which dictionary has been used by the compressor. (The adler32 value
- applies to the whole dictionary even if only a subset of the dictionary is
- actually used by the compressor.) If a raw deflate was requested, then the
- adler32 value is not computed and strm->adler is not set.
-
- deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
- parameter is invalid (such as NULL dictionary) or the stream state is
- inconsistent (for example if deflate has already been called for this stream
- or if the compression method is bsort). deflateSetDictionary does not
- perform any compression: this will be done by deflate().
-*/
-
-ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
- z_streamp source));
-/*
- Sets the destination stream as a complete copy of the source stream.
-
- This function can be useful when several compression strategies will be
- tried, for example when there are several ways of pre-processing the input
- data with a filter. The streams that will be discarded should then be freed
- by calling deflateEnd. Note that deflateCopy duplicates the internal
- compression state which can be quite large, so this strategy is slow and
- can consume lots of memory.
-
- deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
- enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
- (such as zalloc being NULL). msg is left unchanged in both source and
- destination.
-*/
-
-ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));
-/*
- This function is equivalent to deflateEnd followed by deflateInit,
- but does not free and reallocate all the internal compression state.
- The stream will keep the same compression level and any other attributes
- that may have been set by deflateInit2.
-
- deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
- stream state was inconsistent (such as zalloc or state being NULL).
-*/
-
-ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
- int level,
- int strategy));
-/*
- Dynamically update the compression level and compression strategy. The
- interpretation of level and strategy is as in deflateInit2. This can be
- used to switch between compression and straight copy of the input data, or
- to switch to a different kind of input data requiring a different
- strategy. If the compression level is changed, the input available so far
- is compressed with the old level (and may be flushed); the new level will
- take effect only at the next call of deflate().
-
- Before the call of deflateParams, the stream state must be set as for
- a call of deflate(), since the currently available input may have to
- be compressed and flushed. In particular, strm->avail_out must be non-zero.
-
- deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
- stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR
- if strm->avail_out was zero.
-*/
-
-ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,
- uLong sourceLen));
-/*
- deflateBound() returns an upper bound on the compressed size after
- deflation of sourceLen bytes. It must be called after deflateInit()
- or deflateInit2(). This would be used to allocate an output buffer
- for deflation in a single pass, and so would be called before deflate().
-*/
-
-ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,
- int bits,
- int value));
-/*
- deflatePrime() inserts bits in the deflate output stream. The intent
- is that this function is used to start off the deflate output with the
- bits leftover from a previous deflate stream when appending to it. As such,
- this function can only be used for raw deflate, and must be used before the
- first deflate() call after a deflateInit2() or deflateReset(). bits must be
- less than or equal to 16, and that many of the least significant bits of
- value will be inserted in the output.
-
- deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
- stream state was inconsistent.
-*/
-
-/*
-ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
- int windowBits));
-
- This is another version of inflateInit with an extra parameter. The
- fields next_in, avail_in, zalloc, zfree and opaque must be initialized
- before by the caller.
-
- The windowBits parameter is the base two logarithm of the maximum window
- size (the size of the history buffer). It should be in the range 8..15 for
- this version of the library. The default value is 15 if inflateInit is used
- instead. windowBits must be greater than or equal to the windowBits value
- provided to deflateInit2() while compressing, or it must be equal to 15 if
- deflateInit2() was not used. If a compressed stream with a larger window
- size is given as input, inflate() will return with the error code
- Z_DATA_ERROR instead of trying to allocate a larger window.
-
- windowBits can also be -8..-15 for raw inflate. In this case, -windowBits
- determines the window size. inflate() will then process raw deflate data,
- not looking for a zlib or gzip header, not generating a check value, and not
- looking for any check values for comparison at the end of the stream. This
- is for use with other formats that use the deflate compressed data format
- such as zip. Those formats provide their own check values. If a custom
- format is developed using the raw deflate format for compressed data, it is
- recommended that a check value such as an adler32 or a crc32 be applied to
- the uncompressed data as is done in the zlib, gzip, and zip formats. For
- most applications, the zlib format should be used as is. Note that comments
- above on the use in deflateInit2() applies to the magnitude of windowBits.
-
- windowBits can also be greater than 15 for optional gzip decoding. Add
- 32 to windowBits to enable zlib and gzip decoding with automatic header
- detection, or add 16 to decode only the gzip format (the zlib format will
- return a Z_DATA_ERROR. If a gzip stream is being decoded, strm->adler is
- a crc32 instead of an adler32.
-
- inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
- memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative
- memLevel). msg is set to null if there is no error message. inflateInit2
- does not perform any decompression apart from reading the zlib header if
- present: this will be done by inflate(). (So next_in and avail_in may be
- modified, but next_out and avail_out are unchanged.)
-*/
-
-ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
- const Bytef *dictionary,
- uInt dictLength));
-/*
- Initializes the decompression dictionary from the given uncompressed byte
- sequence. This function must be called immediately after a call of inflate
- if this call returned Z_NEED_DICT. The dictionary chosen by the compressor
- can be determined from the adler32 value returned by this call of
- inflate. The compressor and decompressor must use exactly the same
- dictionary (see deflateSetDictionary).
-
- inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
- parameter is invalid (such as NULL dictionary) or the stream state is
- inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the
- expected one (incorrect adler32 value). inflateSetDictionary does not
- perform any decompression: this will be done by subsequent calls of
- inflate().
-*/
-
-ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
-/*
- Skips invalid compressed data until a full flush point (see above the
- description of deflate with Z_FULL_FLUSH) can be found, or until all
- available input is skipped. No output is provided.
-
- inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR
- if no more input was provided, Z_DATA_ERROR if no flush point has been found,
- or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
- case, the application may save the current current value of total_in which
- indicates where valid compressed data was found. In the error case, the
- application may repeatedly call inflateSync, providing more input each time,
- until success or end of the input data.
-*/
-
-ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
- z_streamp source));
-/*
- Sets the destination stream as a complete copy of the source stream.
-
- This function can be useful when randomly accessing a large stream. The
- first pass through the stream can periodically record the inflate state,
- allowing restarting inflate at those points when randomly accessing the
- stream.
-
- inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
- enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
- (such as zalloc being NULL). msg is left unchanged in both source and
- destination.
-*/
-
-ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
-/*
- This function is equivalent to inflateEnd followed by inflateInit,
- but does not free and reallocate all the internal decompression state.
- The stream will keep attributes that may have been set by inflateInit2.
-
- inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
- stream state was inconsistent (such as zalloc or state being NULL).
-*/
-
-/*
-ZEXTERN int ZEXPORT inflateBackInit OF((z_stream FAR *strm, int windowBits,
- unsigned char FAR *window));
-
- Initialize the internal stream state for decompression using inflateBack()
- calls. The fields zalloc, zfree and opaque in strm must be initialized
- before the call. If zalloc and zfree are Z_NULL, then the default library-
- derived memory allocation routines are used. windowBits is the base two
- logarithm of the window size, in the range 8..15. window is a caller
- supplied buffer of that size. Except for special applications where it is
- assured that deflate was used with small window sizes, windowBits must be 15
- and a 32K byte window must be supplied to be able to decompress general
- deflate streams.
-
- See inflateBack() for the usage of these routines.
-
- inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of
- the paramaters are invalid, Z_MEM_ERROR if the internal state could not
- be allocated, or Z_VERSION_ERROR if the version of the library does not
- match the version of the header file.
-*/
-
-typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *));
-typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));
-
-ZEXTERN int ZEXPORT inflateBack OF((z_stream FAR *strm,
- in_func in, void FAR *in_desc,
- out_func out, void FAR *out_desc));
-/*
- inflateBack() does a raw inflate with a single call using a call-back
- interface for input and output. This is more efficient than inflate() for
- file i/o applications in that it avoids copying between the output and the
- sliding window by simply making the window itself the output buffer. This
- function trusts the application to not change the output buffer passed by
- the output function, at least until inflateBack() returns.
-
- inflateBackInit() must be called first to allocate the internal state
- and to initialize the state with the user-provided window buffer.
- inflateBack() may then be used multiple times to inflate a complete, raw
- deflate stream with each call. inflateBackEnd() is then called to free
- the allocated state.
-
- A raw deflate stream is one with no zlib or gzip header or trailer.
- This routine would normally be used in a utility that reads zip or gzip
- files and writes out uncompressed files. The utility would decode the
- header and process the trailer on its own, hence this routine expects
- only the raw deflate stream to decompress. This is different from the
- normal behavior of inflate(), which expects either a zlib or gzip header and
- trailer around the deflate stream.
-
- inflateBack() uses two subroutines supplied by the caller that are then
- called by inflateBack() for input and output. inflateBack() calls those
- routines until it reads a complete deflate stream and writes out all of the
- uncompressed data, or until it encounters an error. The function's
- parameters and return types are defined above in the in_func and out_func
- typedefs. inflateBack() will call in(in_desc, &buf) which should return the
- number of bytes of provided input, and a pointer to that input in buf. If
- there is no input available, in() must return zero--buf is ignored in that
- case--and inflateBack() will return a buffer error. inflateBack() will call
- out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out()
- should return zero on success, or non-zero on failure. If out() returns
- non-zero, inflateBack() will return with an error. Neither in() nor out()
- are permitted to change the contents of the window provided to
- inflateBackInit(), which is also the buffer that out() uses to write from.
- The length written by out() will be at most the window size. Any non-zero
- amount of input may be provided by in().
-
- For convenience, inflateBack() can be provided input on the first call by
- setting strm->next_in and strm->avail_in. If that input is exhausted, then
- in() will be called. Therefore strm->next_in must be initialized before
- calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called
- immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in
- must also be initialized, and then if strm->avail_in is not zero, input will
- initially be taken from strm->next_in[0 .. strm->avail_in - 1].
-
- The in_desc and out_desc parameters of inflateBack() is passed as the
- first parameter of in() and out() respectively when they are called. These
- descriptors can be optionally used to pass any information that the caller-
- supplied in() and out() functions need to do their job.
-
- On return, inflateBack() will set strm->next_in and strm->avail_in to
- pass back any unused input that was provided by the last in() call. The
- return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR
- if in() or out() returned an error, Z_DATA_ERROR if there was a format
- error in the deflate stream (in which case strm->msg is set to indicate the
- nature of the error), or Z_STREAM_ERROR if the stream was not properly
- initialized. In the case of Z_BUF_ERROR, an input or output error can be
- distinguished using strm->next_in which will be Z_NULL only if in() returned
- an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to
- out() returning non-zero. (in() will always be called before out(), so
- strm->next_in is assured to be defined if out() returns non-zero.) Note
- that inflateBack() cannot return Z_OK.
-*/
-
-ZEXTERN int ZEXPORT inflateBackEnd OF((z_stream FAR *strm));
-/*
- All memory allocated by inflateBackInit() is freed.
-
- inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream
- state was inconsistent.
-*/
-
-ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));
-/* Return flags indicating compile-time options.
-
- Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other:
- 1.0: size of uInt
- 3.2: size of uLong
- 5.4: size of voidpf (pointer)
- 7.6: size of z_off_t
-
- Compiler, assembler, and debug options:
- 8: DEBUG
- 9: ASMV or ASMINF -- use ASM code
- 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention
- 11: 0 (reserved)
-
- One-time table building (smaller code, but not thread-safe if true):
- 12: BUILDFIXED -- build static block decoding tables when needed
- 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed
- 14,15: 0 (reserved)
-
- Library content (indicates missing functionality):
- 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking
- deflate code when not needed)
- 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect
- and decode gzip streams (to avoid linking crc code)
- 18-19: 0 (reserved)
-
- Operation variations (changes in library functionality):
- 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate
- 21: FASTEST -- deflate algorithm with only one, lowest compression level
- 22,23: 0 (reserved)
-
- The sprintf variant used by gzprintf (zero is best):
- 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format
- 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure!
- 26: 0 = returns value, 1 = void -- 1 means inferred string length returned
-
- Remainder:
- 27-31: 0 (reserved)
- */
-
-
- /* utility functions */
-
-/*
- The following utility functions are implemented on top of the
- basic stream-oriented functions. To simplify the interface, some
- default options are assumed (compression level and memory usage,
- standard memory allocation functions). The source code of these
- utility functions can easily be modified if you need special options.
-*/
-
-ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
- const Bytef *source, uLong sourceLen));
-/*
- Compresses the source buffer into the destination buffer. sourceLen is
- the byte length of the source buffer. Upon entry, destLen is the total
- size of the destination buffer, which must be at least the value returned
- by compressBound(sourceLen). Upon exit, destLen is the actual size of the
- compressed buffer.
- This function can be used to compress a whole file at once if the
- input file is mmap'ed.
- compress returns Z_OK if success, Z_MEM_ERROR if there was not
- enough memory, Z_BUF_ERROR if there was not enough room in the output
- buffer.
-*/
-
-ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
- const Bytef *source, uLong sourceLen,
- int level));
-/*
- Compresses the source buffer into the destination buffer. The level
- parameter has the same meaning as in deflateInit. sourceLen is the byte
- length of the source buffer. Upon entry, destLen is the total size of the
- destination buffer, which must be at least the value returned by
- compressBound(sourceLen). Upon exit, destLen is the actual size of the
- compressed buffer.
-
- compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
- memory, Z_BUF_ERROR if there was not enough room in the output buffer,
- Z_STREAM_ERROR if the level parameter is invalid.
-*/
-
-ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen));
-/*
- compressBound() returns an upper bound on the compressed size after
- compress() or compress2() on sourceLen bytes. It would be used before
- a compress() or compress2() call to allocate the destination buffer.
-*/
-
-ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
- const Bytef *source, uLong sourceLen));
-/*
- Decompresses the source buffer into the destination buffer. sourceLen is
- the byte length of the source buffer. Upon entry, destLen is the total
- size of the destination buffer, which must be large enough to hold the
- entire uncompressed data. (The size of the uncompressed data must have
- been saved previously by the compressor and transmitted to the decompressor
- by some mechanism outside the scope of this compression library.)
- Upon exit, destLen is the actual size of the compressed buffer.
- This function can be used to decompress a whole file at once if the
- input file is mmap'ed.
-
- uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
- enough memory, Z_BUF_ERROR if there was not enough room in the output
- buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete.
-*/
-
-
-typedef voidp gzFile;
-
-ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
-/*
- Opens a gzip (.gz) file for reading or writing. The mode parameter
- is as in fopen ("rb" or "wb") but can also include a compression level
- ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for
- Huffman only compression as in "wb1h", or 'R' for run-length encoding
- as in "wb1R". (See the description of deflateInit2 for more information
- about the strategy parameter.)
-
- gzopen can be used to read a file which is not in gzip format; in this
- case gzread will directly read from the file without decompression.
-
- gzopen returns NULL if the file could not be opened or if there was
- insufficient memory to allocate the (de)compression state; errno
- can be checked to distinguish the two cases (if errno is zero, the
- zlib error is Z_MEM_ERROR). */
-
-ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
-/*
- gzdopen() associates a gzFile with the file descriptor fd. File
- descriptors are obtained from calls like open, dup, creat, pipe or
- fileno (in the file has been previously opened with fopen).
- The mode parameter is as in gzopen.
- The next call of gzclose on the returned gzFile will also close the
- file descriptor fd, just like fclose(fdopen(fd), mode) closes the file
- descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode).
- gzdopen returns NULL if there was insufficient memory to allocate
- the (de)compression state.
-*/
-
-ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
-/*
- Dynamically update the compression level or strategy. See the description
- of deflateInit2 for the meaning of these parameters.
- gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not
- opened for writing.
-*/
-
-ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
-/*
- Reads the given number of uncompressed bytes from the compressed file.
- If the input file was not in gzip format, gzread copies the given number
- of bytes into the buffer.
- gzread returns the number of uncompressed bytes actually read (0 for
- end of file, -1 for error). */
-
-ZEXTERN int ZEXPORT gzwrite OF((gzFile file,
- voidpc buf, unsigned len));
-/*
- Writes the given number of uncompressed bytes into the compressed file.
- gzwrite returns the number of uncompressed bytes actually written
- (0 in case of error).
-*/
-
-ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...));
-/*
- Converts, formats, and writes the args to the compressed file under
- control of the format string, as in fprintf. gzprintf returns the number of
- uncompressed bytes actually written (0 in case of error). The number of
- uncompressed bytes written is limited to 4095. The caller should assure that
- this limit is not exceeded. If it is exceeded, then gzprintf() will return
- return an error (0) with nothing written. In this case, there may also be a
- buffer overflow with unpredictable consequences, which is possible only if
- zlib was compiled with the insecure functions sprintf() or vsprintf()
- because the secure snprintf() or vsnprintf() functions were not available.
-*/
-
-ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
-/*
- Writes the given null-terminated string to the compressed file, excluding
- the terminating null character.
- gzputs returns the number of characters written, or -1 in case of error.
-*/
-
-ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
-/*
- Reads bytes from the compressed file until len-1 characters are read, or
- a newline character is read and transferred to buf, or an end-of-file
- condition is encountered. The string is then terminated with a null
- character.
- gzgets returns buf, or Z_NULL in case of error.
-*/
-
-ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));
-/*
- Writes c, converted to an unsigned char, into the compressed file.
- gzputc returns the value that was written, or -1 in case of error.
-*/
-
-ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
-/*
- Reads one byte from the compressed file. gzgetc returns this byte
- or -1 in case of end of file or error.
-*/
-
-ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
-/*
- Push one character back onto the stream to be read again later.
- Only one character of push-back is allowed. gzungetc() returns the
- character pushed, or -1 on failure. gzungetc() will fail if a
- character has been pushed but not read yet, or if c is -1. The pushed
- character will be discarded if the stream is repositioned with gzseek()
- or gzrewind().
-*/
-
-ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
-/*
- Flushes all pending output into the compressed file. The parameter
- flush is as in the deflate() function. The return value is the zlib
- error number (see function gzerror below). gzflush returns Z_OK if
- the flush parameter is Z_FINISH and all output could be flushed.
- gzflush should be called only when strictly necessary because it can
- degrade compression.
-*/
-
-ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
- z_off_t offset, int whence));
-/*
- Sets the starting position for the next gzread or gzwrite on the
- given compressed file. The offset represents a number of bytes in the
- uncompressed data stream. The whence parameter is defined as in lseek(2);
- the value SEEK_END is not supported.
- If the file is opened for reading, this function is emulated but can be
- extremely slow. If the file is opened for writing, only forward seeks are
- supported; gzseek then compresses a sequence of zeroes up to the new
- starting position.
-
- gzseek returns the resulting offset location as measured in bytes from
- the beginning of the uncompressed stream, or -1 in case of error, in
- particular if the file is opened for writing and the new starting position
- would be before the current position.
-*/
-
-ZEXTERN int ZEXPORT gzrewind OF((gzFile file));
-/*
- Rewinds the given file. This function is supported only for reading.
-
- gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
-*/
-
-ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file));
-/*
- Returns the starting position for the next gzread or gzwrite on the
- given compressed file. This position represents a number of bytes in the
- uncompressed data stream.
-
- gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
-*/
-
-ZEXTERN int ZEXPORT gzeof OF((gzFile file));
-/*
- Returns 1 when EOF has previously been detected reading the given
- input stream, otherwise zero.
-*/
-
-ZEXTERN int ZEXPORT gzclose OF((gzFile file));
-/*
- Flushes all pending output if necessary, closes the compressed file
- and deallocates all the (de)compression state. The return value is the zlib
- error number (see function gzerror below).
-*/
-
-ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
-/*
- Returns the error message for the last error which occurred on the
- given compressed file. errnum is set to zlib error number. If an
- error occurred in the file system and not in the compression library,
- errnum is set to Z_ERRNO and the application may consult errno
- to get the exact error code.
-*/
-
-ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
-/*
- Clears the error and end-of-file flags for file. This is analogous to the
- clearerr() function in stdio. This is useful for continuing to read a gzip
- file that is being written concurrently.
-*/
-
- /* checksum functions */
-
-/*
- These functions are not related to compression but are exported
- anyway because they might be useful in applications using the
- compression library.
-*/
-
-ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
-
-/*
- Update a running Adler-32 checksum with the bytes buf[0..len-1] and
- return the updated checksum. If buf is NULL, this function returns
- the required initial value for the checksum.
- An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
- much faster. Usage example:
-
- uLong adler = adler32(0L, Z_NULL, 0);
-
- while (read_buffer(buffer, length) != EOF) {
- adler = adler32(adler, buffer, length);
- }
- if (adler != original_adler) error();
-*/
-
-ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
-/*
- Update a running crc with the bytes buf[0..len-1] and return the updated
- crc. If buf is NULL, this function returns the required initial value
- for the crc. Pre- and post-conditioning (one's complement) is performed
- within this function so it shouldn't be done by the application.
- Usage example:
-
- uLong crc = crc32(0L, Z_NULL, 0);
-
- while (read_buffer(buffer, length) != EOF) {
- crc = crc32(crc, buffer, length);
- }
- if (crc != original_crc) error();
-*/
-
-
- /* various hacks, don't look :) */
-
-/* deflateInit and inflateInit are macros to allow checking the zlib version
- * and the compiler's view of z_stream:
- */
-ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,
- const char *version, int stream_size));
-ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,
- const char *version, int stream_size));
-ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method,
- int windowBits, int memLevel,
- int strategy, const char *version,
- int stream_size));
-ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits,
- const char *version, int stream_size));
-ZEXTERN int ZEXPORT inflateBackInit_ OF((z_stream FAR *strm, int windowBits,
- unsigned char FAR *window,
- const char *version,
- int stream_size));
-#define deflateInit(strm, level) \
- deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream))
-#define inflateInit(strm) \
- inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream))
-#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
- deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
- (strategy), ZLIB_VERSION, sizeof(z_stream))
-#define inflateInit2(strm, windowBits) \
- inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
-#define inflateBackInit(strm, windowBits, window) \
- inflateBackInit_((strm), (windowBits), (window), \
- ZLIB_VERSION, sizeof(z_stream))
-
-
-#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL)
- struct internal_state {int dummy;}; /* hack for buggy compilers */
-#endif
-
-ZEXTERN const char * ZEXPORT zError OF((int));
-ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z));
-ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void));
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* ZLIB_H */
diff --git a/src/zlib/zutil.c b/src/zlib/zutil.c
deleted file mode 100644
index 0ef4f99f5..000000000
--- a/src/zlib/zutil.c
+++ /dev/null
@@ -1,319 +0,0 @@
-/* zutil.c -- target dependent utility functions for the compression library
- * Copyright (C) 1995-2003 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* @(#) $Id$ */
-
-#include "zutil.h"
-
-#ifndef NO_DUMMY_DECL
-struct internal_state {int dummy;}; /* for buggy compilers */
-#endif
-
-#ifndef STDC
-extern void exit OF((int));
-#endif
-
-const char * const z_errmsg[10] = {
-"need dictionary", /* Z_NEED_DICT 2 */
-"stream end", /* Z_STREAM_END 1 */
-"", /* Z_OK 0 */
-"file error", /* Z_ERRNO (-1) */
-"stream error", /* Z_STREAM_ERROR (-2) */
-"data error", /* Z_DATA_ERROR (-3) */
-"insufficient memory", /* Z_MEM_ERROR (-4) */
-"buffer error", /* Z_BUF_ERROR (-5) */
-"incompatible version",/* Z_VERSION_ERROR (-6) */
-""};
-
-
-const char * ZEXPORT zlibVersion()
-{
- return ZLIB_VERSION;
-}
-
-uLong ZEXPORT zlibCompileFlags()
-{
- uLong flags;
-
- flags = 0;
- switch (sizeof(uInt)) {
- case 2: break;
- case 4: flags += 1; break;
- case 8: flags += 2; break;
- default: flags += 3;
- }
- switch (sizeof(uLong)) {
- case 2: break;
- case 4: flags += 1 << 2; break;
- case 8: flags += 2 << 2; break;
- default: flags += 3 << 2;
- }
- switch (sizeof(voidpf)) {
- case 2: break;
- case 4: flags += 1 << 4; break;
- case 8: flags += 2 << 4; break;
- default: flags += 3 << 4;
- }
- switch (sizeof(z_off_t)) {
- case 2: break;
- case 4: flags += 1 << 6; break;
- case 8: flags += 2 << 6; break;
- default: flags += 3 << 6;
- }
-#ifdef DEBUG
- flags += 1 << 8;
-#endif
-#if defined(ASMV) || defined(ASMINF)
- flags += 1 << 9;
-#endif
-#ifdef ZLIB_WINAPI
- flags += 1 << 10;
-#endif
-#ifdef BUILDFIXED
- flags += 1 << 12;
-#endif
-#ifdef DYNAMIC_CRC_TABLE
- flags += 1 << 13;
-#endif
-#ifdef NO_GZCOMPRESS
- flags += 1 << 16;
-#endif
-#ifdef NO_GZIP
- flags += 1 << 17;
-#endif
-#ifdef PKZIP_BUG_WORKAROUND
- flags += 1 << 20;
-#endif
-#ifdef FASTEST
- flags += 1 << 21;
-#endif
-#ifdef STDC
-# ifdef NO_vsnprintf
- flags += 1 << 25;
-# ifdef HAS_vsprintf_void
- flags += 1 << 26;
-# endif
-# else
-# ifdef HAS_vsnprintf_void
- flags += 1 << 26;
-# endif
-# endif
-#else
- flags += 1 << 24;
-# ifdef NO_snprintf
- flags += 1 << 25;
-# ifdef HAS_sprintf_void
- flags += 1 << 26;
-# endif
-# else
-# ifdef HAS_snprintf_void
- flags += 1 << 26;
-# endif
-# endif
-#endif
- return flags;
-}
-
-#ifdef DEBUG
-
-# ifndef verbose
-# define verbose 0
-# endif
-int z_verbose = verbose;
-
-void z_error (m)
- char *m;
-{
- fprintf(stderr, "%s\n", m);
- exit(1);
-}
-#endif
-
-/* exported to allow conversion of error code to string for compress() and
- * uncompress()
- */
-const char * ZEXPORT zError(err)
- int err;
-{
- return ERR_MSG(err);
-}
-
-#if defined(_WIN32_WCE)
- /* does not exist on WCE */
- int errno = 0;
-#endif
-
-#ifndef HAVE_MEMCPY
-
-void zmemcpy(dest, source, len)
- Bytef* dest;
- const Bytef* source;
- uInt len;
-{
- if (len == 0) return;
- do {
- *dest++ = *source++; /* ??? to be unrolled */
- } while (--len != 0);
-}
-
-int zmemcmp(s1, s2, len)
- const Bytef* s1;
- const Bytef* s2;
- uInt len;
-{
- uInt j;
-
- for (j = 0; j < len; j++) {
- if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;
- }
- return 0;
-}
-
-void zmemzero(dest, len)
- Bytef* dest;
- uInt len;
-{
- if (len == 0) return;
- do {
- *dest++ = 0; /* ??? to be unrolled */
- } while (--len != 0);
-}
-#endif
-
-
-#ifdef SYS16BIT
-
-#ifdef __TURBOC__
-/* Turbo C in 16-bit mode */
-
-# define MY_ZCALLOC
-
-/* Turbo C malloc() does not allow dynamic allocation of 64K bytes
- * and farmalloc(64K) returns a pointer with an offset of 8, so we
- * must fix the pointer. Warning: the pointer must be put back to its
- * original form in order to free it, use zcfree().
- */
-
-#define MAX_PTR 10
-/* 10*64K = 640K */
-
-local int next_ptr = 0;
-
-typedef struct ptr_table_s {
- voidpf org_ptr;
- voidpf new_ptr;
-} ptr_table;
-
-local ptr_table table[MAX_PTR];
-/* This table is used to remember the original form of pointers
- * to large buffers (64K). Such pointers are normalized with a zero offset.
- * Since MSDOS is not a preemptive multitasking OS, this table is not
- * protected from concurrent access. This hack doesn't work anyway on
- * a protected system like OS/2. Use Microsoft C instead.
- */
-
-voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
-{
- voidpf buf = opaque; /* just to make some compilers happy */
- ulg bsize = (ulg)items*size;
-
- /* If we allocate less than 65520 bytes, we assume that farmalloc
- * will return a usable pointer which doesn't have to be normalized.
- */
- if (bsize < 65520L) {
- buf = farmalloc(bsize);
- if (*(ush*)&buf != 0) return buf;
- } else {
- buf = farmalloc(bsize + 16L);
- }
- if (buf == NULL || next_ptr >= MAX_PTR) return NULL;
- table[next_ptr].org_ptr = buf;
-
- /* Normalize the pointer to seg:0 */
- *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;
- *(ush*)&buf = 0;
- table[next_ptr++].new_ptr = buf;
- return buf;
-}
-
-void zcfree (voidpf opaque, voidpf ptr)
-{
- int n;
- if (*(ush*)&ptr != 0) { /* object < 64K */
- farfree(ptr);
- return;
- }
- /* Find the original pointer */
- for (n = 0; n < next_ptr; n++) {
- if (ptr != table[n].new_ptr) continue;
-
- farfree(table[n].org_ptr);
- while (++n < next_ptr) {
- table[n-1] = table[n];
- }
- next_ptr--;
- return;
- }
- ptr = opaque; /* just to make some compilers happy */
- Assert(0, "zcfree: ptr not found");
-}
-
-#endif /* __TURBOC__ */
-
-
-#ifdef M_I86
-/* Microsoft C in 16-bit mode */
-
-# define MY_ZCALLOC
-
-#if (!defined(_MSC_VER) || (_MSC_VER <= 600))
-# define _halloc halloc
-# define _hfree hfree
-#endif
-
-voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
-{
- if (opaque) opaque = 0; /* to make compiler happy */
- return _halloc((long)items, size);
-}
-
-void zcfree (voidpf opaque, voidpf ptr)
-{
- if (opaque) opaque = 0; /* to make compiler happy */
- _hfree(ptr);
-}
-
-#endif /* M_I86 */
-
-#endif /* SYS16BIT */
-
-
-#ifndef MY_ZCALLOC /* Any system without a special alloc function */
-
-#ifndef STDC
-extern voidp malloc OF((uInt size));
-extern voidp calloc OF((uInt items, uInt size));
-extern void free OF((voidpf ptr));
-#endif
-
-voidpf zcalloc (opaque, items, size)
- voidpf opaque;
- unsigned items;
- unsigned size;
-{
- if (opaque) items += size - size; /* make compiler happy */
- return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) :
- (voidpf)calloc(items, size);
-}
-
-void zcfree (opaque, ptr)
- voidpf opaque;
- voidpf ptr;
-{
- free(ptr);
- if (opaque) return; /* make compiler happy */
-}
-
-#endif /* MY_ZCALLOC */
diff --git a/src/zlib/zutil.h b/src/zlib/zutil.h
deleted file mode 100644
index 7b42edcaa..000000000
--- a/src/zlib/zutil.h
+++ /dev/null
@@ -1,263 +0,0 @@
-/* zutil.h -- internal interface and configuration of the compression library
- * Copyright (C) 1995-2003 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* WARNING: this file should *not* be used by applications. It is
- part of the implementation of the compression library and is
- subject to change. Applications should only use zlib.h.
- */
-
-/* @(#) $Id$ */
-
-#ifndef ZUTIL_H
-#define ZUTIL_H
-
-#define ZLIB_INTERNAL
-#include "zlib.h"
-
-#ifdef STDC
-# include <stddef.h>
-# include <string.h>
-# include <stdlib.h>
-#endif
-#ifdef NO_ERRNO_H
- extern int errno;
-#else
-# include <errno.h>
-#endif
-
-#ifndef local
-# define local static
-#endif
-/* compile with -Dlocal if your debugger can't find static symbols */
-
-typedef unsigned char uch;
-typedef uch FAR uchf;
-typedef unsigned short ush;
-typedef ush FAR ushf;
-typedef unsigned long ulg;
-
-extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
-/* (size given to avoid silly warnings with Visual C++) */
-
-#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
-
-#define ERR_RETURN(strm,err) \
- return (strm->msg = (char*)ERR_MSG(err), (err))
-/* To be used only when the state is known to be valid */
-
- /* common constants */
-
-#ifndef DEF_WBITS
-# define DEF_WBITS MAX_WBITS
-#endif
-/* default windowBits for decompression. MAX_WBITS is for compression only */
-
-#if MAX_MEM_LEVEL >= 8
-# define DEF_MEM_LEVEL 8
-#else
-# define DEF_MEM_LEVEL MAX_MEM_LEVEL
-#endif
-/* default memLevel */
-
-#define STORED_BLOCK 0
-#define STATIC_TREES 1
-#define DYN_TREES 2
-/* The three kinds of block type */
-
-#define MIN_MATCH 3
-#define MAX_MATCH 258
-/* The minimum and maximum match lengths */
-
-#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */
-
- /* target dependencies */
-
-#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32))
-# define OS_CODE 0x00
-# if defined(__TURBOC__) || defined(__BORLANDC__)
-# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))
- /* Allow compilation with ANSI keywords only enabled */
- void _Cdecl farfree( void *block );
- void *_Cdecl farmalloc( unsigned long nbytes );
-# else
-# include <alloc.h>
-# endif
-# else /* MSC or DJGPP */
-# include <malloc.h>
-# endif
-#endif
-
-#ifdef AMIGA
-# define OS_CODE 0x01
-#endif
-
-#if defined(VAXC) || defined(VMS)
-# define OS_CODE 0x02
-# define F_OPEN(name, mode) \
- fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")
-#endif
-
-#if defined(ATARI) || defined(atarist)
-# define OS_CODE 0x05
-#endif
-
-#ifdef OS2
-# define OS_CODE 0x06
-#endif
-
-#if defined(MACOS) || defined(TARGET_OS_MAC)
-# define OS_CODE 0x07
-# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
-# include <unix.h> /* for fdopen */
-# else
-# ifndef fdopen
-# define fdopen(fd,mode) NULL /* No fdopen() */
-# endif
-# endif
-#endif
-
-#ifdef TOPS20
-# define OS_CODE 0x0a
-#endif
-
-#ifdef WIN32
-# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */
-# define OS_CODE 0x0b
-# endif
-#endif
-
-#ifdef __50SERIES /* Prime/PRIMOS */
-# define OS_CODE 0x0f
-#endif
-
-#if defined(_BEOS_) || defined(RISCOS)
-# define fdopen(fd,mode) NULL /* No fdopen() */
-#endif
-
-#if (defined(_MSC_VER) && (_MSC_VER > 600))
-# if defined(_WIN32_WCE)
-# define fdopen(fd,mode) NULL /* No fdopen() */
-# ifndef _PTRDIFF_T_DEFINED
- typedef int ptrdiff_t;
-# define _PTRDIFF_T_DEFINED
-# endif
-# else
-# define fdopen(fd,type) _fdopen(fd,type)
-# endif
-#endif
-
- /* common defaults */
-
-#ifndef OS_CODE
-# define OS_CODE 0x03 /* assume Unix */
-#endif
-
-#ifndef F_OPEN
-# define F_OPEN(name, mode) fopen((name), (mode))
-#endif
-
- /* functions */
-
-#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550)
-# ifndef HAVE_VSNPRINTF
-# define HAVE_VSNPRINTF
-# endif
-#endif
-#if defined(__CYGWIN__)
-# ifndef HAVE_VSNPRINTF
-# define HAVE_VSNPRINTF
-# endif
-#endif
-#ifndef HAVE_VSNPRINTF
-# ifdef MSDOS
- /* vsnprintf may exist on some MS-DOS compilers (DJGPP?),
- but for now we just assume it doesn't. */
-# define NO_vsnprintf
-# endif
-# ifdef __TURBOC__
-# define NO_vsnprintf
-# endif
-# ifdef WIN32
- /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */
-# if !defined(vsnprintf) && !defined(NO_vsnprintf)
-# define vsnprintf _vsnprintf
-# endif
-# endif
-# ifdef __SASC
-# define NO_vsnprintf
-# endif
-#endif
-#ifdef VMS
-# define NO_vsnprintf
-#endif
-
-#ifdef HAVE_STRERROR
-# ifndef VMS
- extern char *strerror OF((int));
-# endif
-# define zstrerror(errnum) strerror(errnum)
-#else
-# define zstrerror(errnum) ""
-#endif
-
-#if defined(pyr)
-# define NO_MEMCPY
-#endif
-#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__)
- /* Use our own functions for small and medium model with MSC <= 5.0.
- * You may have to use the same strategy for Borland C (untested).
- * The __SC__ check is for Symantec.
- */
-# define NO_MEMCPY
-#endif
-#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY)
-# define HAVE_MEMCPY
-#endif
-#ifdef HAVE_MEMCPY
-# ifdef SMALL_MEDIUM /* MSDOS small or medium model */
-# define zmemcpy _fmemcpy
-# define zmemcmp _fmemcmp
-# define zmemzero(dest, len) _fmemset(dest, 0, len)
-# else
-# define zmemcpy memcpy
-# define zmemcmp memcmp
-# define zmemzero(dest, len) memset(dest, 0, len)
-# endif
-#else
- extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len));
- extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len));
- extern void zmemzero OF((Bytef* dest, uInt len));
-#endif
-
-/* Diagnostic functions */
-#ifdef DEBUG
-# include <stdio.h>
- extern int z_verbose;
- extern void z_error OF((char *m));
-# define Assert(cond,msg) {if(!(cond)) z_error(msg);}
-# define Trace(x) {if (z_verbose>=0) fprintf x ;}
-# define Tracev(x) {if (z_verbose>0) fprintf x ;}
-# define Tracevv(x) {if (z_verbose>1) fprintf x ;}
-# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;}
-# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;}
-#else
-# define Assert(cond,msg)
-# define Trace(x)
-# define Tracev(x)
-# define Tracevv(x)
-# define Tracec(c,x)
-# define Tracecv(c,x)
-#endif
-
-
-voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size));
-void zcfree OF((voidpf opaque, voidpf ptr));
-
-#define ZALLOC(strm, items, size) \
- (*((strm)->zalloc))((strm)->opaque, (items), (size))
-#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))
-#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}
-
-#endif /* ZUTIL_H */