Cleaned up some parts of the code.

Removed obsolete script function 'hasitems'.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@10838 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
ultramage 2007-07-01 15:26:53 +00:00
parent bd846b5d97
commit 1ed7f6c584
21 changed files with 582 additions and 759 deletions

View File

@ -3118,14 +3118,6 @@ not.
---------------------------------------
*hasitems(0)
This function will return 1 if the invoking character has anything at all in
their inventory and 0 if they do not. Even though the argument is not used for
anything, it is required.
---------------------------------------
*getequipisidentify(<equipment slot>)
This function will return 1 if an item in the specified equipment slot is

View File

@ -676,8 +676,8 @@ int mmo_char_fromstr(char *str, struct mmo_charstatus *p, struct global_reg *reg
p->int_ = tmp_int[16];
p->dex = tmp_int[17];
p->luk = tmp_int[18];
p->status_point = tmp_int[19] > USHRT_MAX ? USHRT_MAX : tmp_int[19];
p->skill_point = tmp_int[20] > USHRT_MAX ? USHRT_MAX : tmp_int[20];
p->status_point = min(tmp_int[19], USHRT_MAX);
p->skill_point = min(tmp_int[20], USHRT_MAX);
p->option = tmp_int[21];
p->karma = tmp_int[22];
p->manner = tmp_int[23];
@ -1032,13 +1032,13 @@ void mmo_char_sync(void)
// Data save
fp = lock_fopen(char_txt, &lock);
if (fp == NULL) {
ShowWarning("Server can't not save characters.\n");
char_log("WARNING: Server can't not save characters." RETCODE);
ShowWarning("Server cannot save characters.\n");
char_log("WARNING: Server cannot 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]].status, char_dat[id[i]].global, char_dat[id[i]].global_num); // use of sorted index
fprintf(fp, "%s" RETCODE, line);
fprintf(fp, "%s" RETCODE, line);
}
fprintf(fp, "%d\t%%newid%%" RETCODE, char_id_count);
lock_fclose(fp, char_txt, &lock);
@ -1057,7 +1057,7 @@ void mmo_char_sync(void)
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]].status,char_dat[id[i]].global, char_dat[id[i]].global_num); // use of sorted index
fprintf(fp, "%s" RETCODE, line);
fprintf(fp, "%s" RETCODE, line);
}
fprintf(fp, "%d\t%%newid%%" RETCODE, char_id_count);
lock_fclose(fp, backup_txt, &lock);
@ -1668,9 +1668,9 @@ int mmo_char_tobuf(uint8* buf, struct mmo_charstatus *p)
return 0;
WBUFL(buf,0) = p->char_id;
WBUFL(buf,4) = p->base_exp>LONG_MAX?LONG_MAX:p->base_exp;
WBUFL(buf,4) = min(p->base_exp, LONG_MAX);
WBUFL(buf,8) = p->zeny;
WBUFL(buf,12) = p->job_exp>LONG_MAX?LONG_MAX:p->job_exp;
WBUFL(buf,12) = min(p->job_exp, LONG_MAX);
WBUFL(buf,16) = p->job_level;
WBUFL(buf,20) = 0;// probably opt1
@ -1680,17 +1680,17 @@ int mmo_char_tobuf(uint8* buf, struct mmo_charstatus *p)
WBUFL(buf,32) = p->karma;
WBUFL(buf,36) = p->manner;
WBUFW(buf,40) = (p->status_point > SHRT_MAX) ? SHRT_MAX : p->status_point;
WBUFW(buf,42) = (p->hp > SHRT_MAX) ? SHRT_MAX : p->hp;
WBUFW(buf,44) = (p->max_hp > SHRT_MAX) ? SHRT_MAX : p->max_hp;
WBUFW(buf,46) = (p->sp > SHRT_MAX) ? SHRT_MAX : p->sp;
WBUFW(buf,48) = (p->max_sp > SHRT_MAX) ? SHRT_MAX : p->max_sp;
WBUFW(buf,40) = min(p->status_point, SHRT_MAX);
WBUFW(buf,42) = min(p->hp, SHRT_MAX);
WBUFW(buf,44) = min(p->max_hp, SHRT_MAX);
WBUFW(buf,46) = min(p->sp, SHRT_MAX);
WBUFW(buf,48) = min(p->max_sp, SHRT_MAX);
WBUFW(buf,50) = DEFAULT_WALK_SPEED; // p->speed;
WBUFW(buf,52) = p->class_;
WBUFW(buf,54) = p->hair;
WBUFW(buf,56) = p->option&0x20 ? 0 : p->weapon; //When the weapon is sent and your option is riding, the client crashes on login!?
WBUFW(buf,58) = p->base_level;
WBUFW(buf,60) = (p->skill_point > SHRT_MAX) ? SHRT_MAX : p->skill_point;
WBUFW(buf,60) = min(p->skill_point, SHRT_MAX);
WBUFW(buf,62) = p->head_bottom;
WBUFW(buf,64) = p->shield;
WBUFW(buf,66) = p->head_top;
@ -1700,12 +1700,12 @@ int mmo_char_tobuf(uint8* buf, struct mmo_charstatus *p)
memcpy(WBUFP(buf,74), p->name, NAME_LENGTH);
WBUFB(buf,98) = (p->str > UCHAR_MAX) ? UCHAR_MAX : p->str;
WBUFB(buf,99) = (p->agi > UCHAR_MAX) ? UCHAR_MAX : p->agi;
WBUFB(buf,100) = (p->vit > UCHAR_MAX) ? UCHAR_MAX : p->vit;
WBUFB(buf,101) = (p->int_ > UCHAR_MAX) ? UCHAR_MAX : p->int_;
WBUFB(buf,102) = (p->dex > UCHAR_MAX) ? UCHAR_MAX : p->dex;
WBUFB(buf,103) = (p->luk > UCHAR_MAX) ? UCHAR_MAX : p->luk;
WBUFB(buf,98) = min(p->str, UCHAR_MAX);
WBUFB(buf,99) = min(p->agi, UCHAR_MAX);
WBUFB(buf,100) = min(p->vit, UCHAR_MAX);
WBUFB(buf,101) = min(p->int_, UCHAR_MAX);
WBUFB(buf,102) = min(p->dex, UCHAR_MAX);
WBUFB(buf,103) = min(p->luk, UCHAR_MAX);
//Updated packet structure with rename-button included. Credits to Sara-chan
#if PACKETVER > 7
WBUFW(buf,104) = p->char_num;
@ -1941,7 +1941,7 @@ static void char_auth_ok(int fd, struct char_session_data *sd)
int send_accounts_tologin(int tid, unsigned int tick, int id, int data);
int parse_tologin(int fd)
int parse_fromlogin(int fd)
{
int i;
struct char_session_data *sd;
@ -1962,7 +1962,7 @@ int parse_tologin(int fd)
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));
// printf("parse_fromlogin: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd));
switch(RFIFOW(fd,0)) {
case 0x2711:
@ -2078,7 +2078,7 @@ int parse_tologin(int fd)
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");
// printf("parse_fromlogin: To become GM answer: char -> map.\n");
RFIFOSKIP(fd,10);
}
@ -2941,8 +2941,8 @@ int parse_frommap(int fd)
WFIFOHEAD(map_fd, 20 + sizeof(struct mmo_charstatus));
WFIFOW(map_fd,0) = 0x2afd;
WFIFOW(map_fd,2) = 20 + sizeof(struct mmo_charstatus);
WFIFOL(map_fd,4) = RFIFOL(fd, 2); //Account ID
WFIFOL(map_fd,8) = RFIFOL(fd, 6); //Login1
WFIFOL(map_fd,4) = RFIFOL(fd,2); //Account ID
WFIFOL(map_fd,8) = RFIFOL(fd,6); //Login1
WFIFOL(map_fd,16) = RFIFOL(fd,10); //Login2
WFIFOL(map_fd,12) = (unsigned long)0; //TODO: connect_until_time, how do I figure it out right now?
memcpy(WFIFOP(map_fd,20), char_data, sizeof(struct mmo_charstatus));
@ -3255,20 +3255,23 @@ int parse_frommap(int fd)
return 0;
}
// Searches for the mapserver that has a given map (and optionally ip/port, if not -1).
// If found, returns the server's index in the 'server' array (otherwise returns -1).
int search_mapserver(unsigned short map, uint32 ip, uint16 port)
{
int i, j;
for(i = 0; i < MAX_MAP_SERVERS; i++)
if (server_fd[i] > 0)
{
if (server_fd[i] > 0
&& (ip == (uint32)-1 || server[i].ip == ip)
&& (port == (uint16)-1 || server[i].port == port))
{
for (j = 0; server[i].map[j]; j++)
if (server[i].map[j] == map) {
if (ip != (uint32)-1 && server[i].ip != ip)
continue;
if (port != (uint16)-1 && server[i].port != port)
continue;
if (server[i].map[j] == map)
return i;
}
}
}
return -1;
}
@ -3442,8 +3445,7 @@ int parse_char(int fd)
break;
}
cd = &char_dat[sd->found_char[ch]].status;
char_log("Character Selected, Account ID: %d, Character Slot: %d, Character Name: %s." RETCODE,
sd->account_id, char_num, cd->name);
char_log("Character Selected, Account ID: %d, Character Slot: %d, Character Name: %s." RETCODE, sd->account_id, char_num, cd->name);
cd->sex = sd->sex;
@ -3926,7 +3928,7 @@ int check_connect_login_server(int tid, unsigned int tick, int id, int data)
login_fd = 0;
return 0;
}
session[login_fd]->func_parse = parse_tologin;
session[login_fd]->func_parse = parse_fromlogin;
realloc_fifo(login_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
WFIFOHEAD(login_fd,86);
@ -4332,8 +4334,6 @@ int do_init(int argc, char **argv)
set_defaultparse(parse_char);
char_fd = make_listen_bind(bind_ip, 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(send_accounts_tologin, "send_accounts_tologin");
@ -4354,6 +4354,8 @@ int do_init(int argc, char **argv)
//##TODO invoke a CONSOLE_START plugin event
}
char_fd = make_listen_bind(bind_ip, char_port);
char_log("The char-server is ready (Server is listening on the port %d)." RETCODE, char_port);
ShowStatus("The char-server is "CL_GREEN"ready"CL_RESET" (Server is listening on the port %d).\n\n", char_port);

View File

@ -743,27 +743,15 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){
int memitemdata_to_sql(struct itemtmp mapitem[], int count, int char_id, int tableswitch)
{
int i,j, flag, id;
char *tablename;
char* tablename;
char selectoption[16];
char * str_p = tmp_sql;
char* str_p = tmp_sql;
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;
case TABLE_INVENTORY: tablename = inventory_db; 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:
ShowError("Invalid table name!\n");
return 1;
@ -1578,50 +1566,45 @@ int count_users(void)
/// Writes char data to the buffer in the format used by the client.
/// Used in packets 0x6b (chars info) and 0x6d (new char info)
/// Returns the size (106 or 108)
int mmo_char_tobuf(uint8* buf, struct mmo_charstatus *p)
int mmo_char_tobuf(uint8* buf, struct mmo_charstatus* p)
{
if( buf == NULL || p == NULL )
return 0;
WBUFL(buf,0) = p->char_id;
WBUFL(buf,4) = p->base_exp>LONG_MAX?LONG_MAX:p->base_exp;
WBUFL(buf,4) = min(p->base_exp, LONG_MAX);
WBUFL(buf,8) = p->zeny;
WBUFL(buf,12) = p->job_exp>LONG_MAX?LONG_MAX:p->job_exp;
WBUFL(buf,12) = min(p->job_exp, LONG_MAX);
WBUFL(buf,16) = p->job_level;
WBUFL(buf,20) = 0;// probably opt1
WBUFL(buf,24) = 0;// probably opt2
WBUFL(buf,20) = 0; // probably opt1
WBUFL(buf,24) = 0; // probably opt2
WBUFL(buf,28) = p->option;
WBUFL(buf,32) = p->karma;
WBUFL(buf,36) = p->manner;
WBUFW(buf,40) = (p->status_point > SHRT_MAX) ? SHRT_MAX : p->status_point;
WBUFW(buf,42) = (p->hp > SHRT_MAX) ? SHRT_MAX : p->hp;
WBUFW(buf,44) = (p->max_hp > SHRT_MAX) ? SHRT_MAX : p->max_hp;
WBUFW(buf,46) = (p->sp > SHRT_MAX) ? SHRT_MAX : p->sp;
WBUFW(buf,48) = (p->max_sp > SHRT_MAX) ? SHRT_MAX : p->max_sp;
WBUFW(buf,40) = min(p->status_point, SHRT_MAX);
WBUFW(buf,42) = min(p->hp, SHRT_MAX);
WBUFW(buf,44) = min(p->max_hp, SHRT_MAX);
WBUFW(buf,46) = min(p->sp, SHRT_MAX);
WBUFW(buf,48) = min(p->max_sp, SHRT_MAX);
WBUFW(buf,50) = DEFAULT_WALK_SPEED; // p->speed;
WBUFW(buf,52) = p->class_;
WBUFW(buf,54) = p->hair;
WBUFW(buf,56) = p->option&0x20 ? 0 : p->weapon; //When the weapon is sent and your option is riding, the client crashes on login!?
WBUFW(buf,58) = p->base_level;
WBUFW(buf,60) = (p->skill_point > SHRT_MAX) ? SHRT_MAX : p->skill_point;
WBUFW(buf,60) = min(p->skill_point, SHRT_MAX);
WBUFW(buf,62) = p->head_bottom;
WBUFW(buf,64) = p->shield;
WBUFW(buf,66) = p->head_top;
WBUFW(buf,68) = p->head_mid;
WBUFW(buf,70) = p->hair_color;
WBUFW(buf,72) = p->clothes_color;
memcpy(WBUFP(buf,74), p->name, NAME_LENGTH);
WBUFB(buf,98) = (p->str > UCHAR_MAX) ? UCHAR_MAX : p->str;
WBUFB(buf,99) = (p->agi > UCHAR_MAX) ? UCHAR_MAX : p->agi;
WBUFB(buf,100) = (p->vit > UCHAR_MAX) ? UCHAR_MAX : p->vit;
WBUFB(buf,101) = (p->int_ > UCHAR_MAX) ? UCHAR_MAX : p->int_;
WBUFB(buf,102) = (p->dex > UCHAR_MAX) ? UCHAR_MAX : p->dex;
WBUFB(buf,103) = (p->luk > UCHAR_MAX) ? UCHAR_MAX : p->luk;
WBUFB(buf,98) = min(p->str, UCHAR_MAX);
WBUFB(buf,99) = min(p->agi, UCHAR_MAX);
WBUFB(buf,100) = min(p->vit, UCHAR_MAX);
WBUFB(buf,101) = min(p->int_, UCHAR_MAX);
WBUFB(buf,102) = min(p->dex, UCHAR_MAX);
WBUFB(buf,103) = min(p->luk, UCHAR_MAX);
//Updated packet structure with rename-button included. Credits to Sara-chan
#if PACKETVER > 7
WBUFW(buf,104) = p->char_num;
@ -1633,11 +1616,11 @@ int mmo_char_tobuf(uint8* buf, struct mmo_charstatus *p)
#endif
}
int mmo_char_send006b(int fd, struct char_session_data *sd)
int mmo_char_send006b(int fd, struct char_session_data* sd)
{
int i, j, found_num = 0;
set_char_online(-1, 99,sd->account_id);
set_char_online(-1, 99, sd->account_id);
//search char.
sprintf(tmp_sql, "SELECT `char_id` FROM `%s` WHERE `account_id` = '%d' AND `char_num` < '%d'",char_db, sd->account_id, MAX_CHARS);
@ -1664,19 +1647,17 @@ int mmo_char_send006b(int fd, struct char_session_data *sd)
ShowInfo("Loading Char Data ("CL_BOLD"%d"CL_RESET")\n",sd->account_id);
j = 24;// offset
j = 24; // offset
WFIFOHEAD(fd, j + found_num*108);
WFIFOW(fd,0) = 0x6b;
memset(WFIFOP(fd,4), 0, 20); // unknown bytes
for(i = 0; i < found_num; i++)
{
WFIFOHEAD(fd, j + found_num*108);
WFIFOW(fd,0) = 0x6b;
memset(WFIFOP(fd,4), 0, 20);// unknown bytes
for(i = 0; i < found_num; i++)
{
mmo_char_fromsql(sd->found_char[i], &char_dat, false);
j += mmo_char_tobuf(WFIFOP(fd,j), &char_dat);
}
WFIFOW(fd,2) = j;// packet len
WFIFOSET(fd,j);
mmo_char_fromsql(sd->found_char[i], &char_dat, false);
j += mmo_char_tobuf(WFIFOP(fd,j), &char_dat);
}
WFIFOW(fd,2) = j; // packet len
WFIFOSET(fd,j);
return 0;
}
@ -1728,7 +1709,7 @@ static void char_auth_ok(int fd, struct char_session_data *sd)
int send_accounts_tologin(int tid, unsigned int tick, int id, int data);
int parse_tologin(int fd)
int parse_fromlogin(int fd)
{
int i;
struct char_session_data *sd;
@ -1749,8 +1730,9 @@ int parse_tologin(int fd)
// hehe. no need to set user limit 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));
while(RFIFOREST(fd) >= 2)
{
// printf("parse_fromlogin : %d %d %x\n", fd, RFIFOREST(fd), RFIFOW(fd, 0));
switch(RFIFOW(fd,0)) {
case 0x2711:
@ -2608,13 +2590,11 @@ int parse_frommap(int fd)
if (RFIFOREST(fd) < 35)
return 0;
{
unsigned short name;
int map_id, map_fd = -1;
struct online_char_data* data;
struct mmo_charstatus* char_data;
name = RFIFOW(fd,18);
map_id = search_mapserver(name, ntohl(RFIFOL(fd,24)), ntohs(RFIFOW(fd,28))); //Locate mapserver by ip and port.
map_id = search_mapserver(RFIFOW(fd,18), ntohl(RFIFOL(fd,24)), ntohs(RFIFOW(fd,28))); //Locate mapserver by ip and port.
if (map_id >= 0)
map_fd = server_fd[map_id];
//Char should just had been saved before this packet, so this should be safe. [Skotlex]
@ -2975,20 +2955,23 @@ int parse_frommap(int fd)
return 0;
}
// Searches for the mapserver that has a given map (and optionally ip/port, if not -1).
// If found, returns the server's index in the 'server' array (otherwise returns -1).
int search_mapserver(unsigned short map, uint32 ip, uint16 port)
{
int i, j;
for(i = 0; i < MAX_MAP_SERVERS; i++)
if (server_fd[i] > 0)
{
if (server_fd[i] > 0
&& (ip == (uint32)-1 || server[i].ip == ip)
&& (port == (uint16)-1 || server[i].port == port))
{
for (j = 0; server[i].map[j]; j++)
if (server[i].map[j] == map) {
if (ip != (uint32)-1 && server[i].ip != ip)
continue;
if (port != (uint16)-1 && server[i].port != port)
continue;
if (server[i].map[j] == map)
return i;
}
}
}
return -1;
}
@ -3615,7 +3598,7 @@ int check_connect_login_server(int tid, unsigned int tick, int id, int data)
login_fd = 0;
return 0;
}
session[login_fd]->func_parse = parse_tologin;
session[login_fd]->func_parse = parse_fromlogin;
realloc_fifo(login_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
WFIFOHEAD(login_fd,86);
@ -3705,16 +3688,16 @@ int char_lan_config_read(const char *lancfgName)
}
#endif //TXT_SQL_CONVERT
void sql_config_read(const char *cfgName)
void sql_config_read(const char* cfgName)
{
char line[1024], w1[1024], w2[1024];
FILE *fp;
FILE* fp;
ShowInfo("Reading file %s...\n", cfgName);
if ((fp = fopen(cfgName, "r")) == NULL) {
ShowFatalError("file not found: %s\n", cfgName);
exit(1);
ShowError("file not found: %s\n", cfgName);
return;
}
while(fgets(line, sizeof(line), fp))
@ -3725,96 +3708,93 @@ void sql_config_read(const char *cfgName)
if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2)
continue;
if(strcmpi(w1,"char_db")==0){
if(!strcmpi(w1,"char_db"))
strcpy(char_db,w2);
#ifndef TXT_SQL_CONVERT
} else if(strcmpi(w1, "gm_read_method") == 0) {
if(atoi(w2) != 0)
char_gm_read = true;
else
char_gm_read = false;
else if(!strcmpi(w1,"gm_read_method"))
char_gm_read = config_switch(w2);
//custom columns for login database
}else if(strcmpi(w1,"login_db")==0){
strcpy(login_db, w2);
}else if(strcmpi(w1,"login_db_level")==0){
else if(!strcmpi(w1,"login_db"))
strcpy(login_db,w2);
else if(!strcmpi(w1,"login_db_level"))
strcpy(login_db_level,w2);
}else if(strcmpi(w1,"login_db_account_id")==0){
else if(!strcmpi(w1,"login_db_account_id"))
strcpy(login_db_account_id,w2);
}else if(strcmpi(w1,"lowest_gm_level")==0){
else if(!strcmpi(w1,"lowest_gm_level")) {
lowest_gm_level = atoi(w2);
ShowStatus("set lowest_gm_level : %s\n",w2);
ShowStatus("set lowest_gm_level : %s\n", w2);
}
#endif
}else if(strcmpi(w1,"scdata_db")==0){
else if(!strcmpi(w1,"scdata_db"))
strcpy(scdata_db,w2);
}else if(strcmpi(w1,"cart_db")==0){
else if(!strcmpi(w1,"cart_db"))
strcpy(cart_db,w2);
}else if(strcmpi(w1,"inventory_db")==0){
strcpy(inventory_db,w2);
}else if(strcmpi(w1,"charlog_db")==0){
else if(!strcmpi(w1,"inventory_db"))
strcpy(inventory_db, w2);
else if(!strcmpi(w1,"charlog_db"))
strcpy(charlog_db,w2);
}else if(strcmpi(w1,"storage_db")==0){
else if(!strcmpi(w1,"storage_db"))
strcpy(storage_db,w2);
}else if(strcmpi(w1,"reg_db")==0){
else if(!strcmpi(w1,"reg_db"))
strcpy(reg_db,w2);
}else if(strcmpi(w1,"skill_db")==0){
else if(!strcmpi(w1,"skill_db"))
strcpy(skill_db,w2);
}else if(strcmpi(w1,"interlog_db")==0){
else if(!strcmpi(w1,"interlog_db"))
strcpy(interlog_db,w2);
}else if(strcmpi(w1,"memo_db")==0){
else if(!strcmpi(w1,"memo_db"))
strcpy(memo_db,w2);
}else if(strcmpi(w1,"guild_db")==0){
else if(!strcmpi(w1,"guild_db"))
strcpy(guild_db,w2);
}else if(strcmpi(w1,"guild_alliance_db")==0){
else if(!strcmpi(w1,"guild_alliance_db"))
strcpy(guild_alliance_db,w2);
}else if(strcmpi(w1,"guild_castle_db")==0){
else if(!strcmpi(w1,"guild_castle_db"))
strcpy(guild_castle_db,w2);
}else if(strcmpi(w1,"guild_expulsion_db")==0){
else if(!strcmpi(w1,"guild_expulsion_db"))
strcpy(guild_expulsion_db,w2);
}else if(strcmpi(w1,"guild_member_db")==0){
else if(!strcmpi(w1,"guild_member_db"))
strcpy(guild_member_db,w2);
}else if(strcmpi(w1,"guild_skill_db")==0){
else if(!strcmpi(w1,"guild_skill_db"))
strcpy(guild_skill_db,w2);
}else if(strcmpi(w1,"guild_position_db")==0){
else if(!strcmpi(w1,"guild_position_db"))
strcpy(guild_position_db,w2);
}else if(strcmpi(w1,"guild_storage_db")==0){
else if(!strcmpi(w1,"guild_storage_db"))
strcpy(guild_storage_db,w2);
}else if(strcmpi(w1,"party_db")==0){
else if(!strcmpi(w1,"party_db"))
strcpy(party_db,w2);
}else if(strcmpi(w1,"pet_db")==0){
else if(!strcmpi(w1,"pet_db"))
strcpy(pet_db,w2);
}else if(strcmpi(w1,"friend_db")==0){
else if(!strcmpi(w1,"friend_db"))
strcpy(friend_db,w2);
#ifndef TXT_SQL_CONVERT
}else if(strcmpi(w1,"db_path")==0){
else if(!strcmpi(w1,"db_path"))
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]
//Map server option to use SQL item/mob-db or not
else if(!strcmpi(w1,"use_sql_db")==0){
db_use_sqldbs = config_switch(w2);
ShowStatus("Using SQL dbs: %s\n",w2);
}else if(strcmpi(w1,"item_db_db")==0){
}
else if(!strcmpi(w1,"item_db_db"))
strcpy(item_db_db,w2);
}else if(strcmpi(w1,"item_db2_db")==0){
else if(!strcmpi(w1,"item_db2_db"))
strcpy(item_db2_db,w2);
#endif
//support the import command, just like any other config
}else if(strcmpi(w1,"import")==0){
else if(!strcmpi(w1,"import"))
sql_config_read(w2);
}
}
fclose(fp);
ShowInfo("Done reading %s.\n", cfgName);
}
#ifndef TXT_SQL_CONVERT
int char_config_read(const char *cfgName)
int char_config_read(const char* cfgName)
{
char line[1024], w1[1024], w2[1024];
FILE* fp = fopen(cfgName, "r");
if (fp == NULL) {
ShowFatalError("Configuration file not found: %s.\n", cfgName);
exit(1);
ShowError("Configuration file not found: %s.\n", cfgName);
return 1;
}
ShowInfo("Reading configuration file %s...\n", cfgName);
@ -3968,7 +3948,6 @@ int char_config_read(const char *cfgName)
void do_final(void)
{
ShowInfo("Doing final stage...\n");
//inter_save();
do_final_itemdb();
//check SQL save progress.
//wait until save char complete
@ -4074,11 +4053,8 @@ int do_init(int argc, char **argv)
mmo_char_sql_init();
ShowInfo("char server initialized.\n");
// ShowDebug("set parser -> parse_char()...\n");
set_defaultparse(parse_char);
// ShowDebug("set terminate function -> do_final().....\n");
if ((naddr_ != 0) && (!login_ip || !char_ip))
{
char ip_str[16];
@ -4124,32 +4100,32 @@ int do_init(int argc, char **argv)
{
//##TODO invoke a CONSOLE_START plugin event
}
//Cleaning the tables for NULL entrys @ startup [Sirius]
//Chardb clean
ShowInfo("Cleaning the '%s' table...\n", char_db);
sprintf(tmp_sql,"DELETE FROM `%s` WHERE `account_id` = '0'", char_db);
if(mysql_query(&mysql_handle, tmp_sql)){
ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
}
//guilddb clean
ShowInfo("Cleaning the '%s' table...\n", 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)){
ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
}
//guildmemberdb clean
ShowInfo("Cleaning the '%s' table...\n", 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)){
ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
}
//Chardb clean
ShowInfo("Cleaning the '%s' table...\n", char_db);
sprintf(tmp_sql,"DELETE FROM `%s` WHERE `account_id` = '0'", char_db);
if(mysql_query(&mysql_handle, tmp_sql)){
ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
}
//guilddb clean
ShowInfo("Cleaning the '%s' table...\n", 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)){
ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
}
//guildmemberdb clean
ShowInfo("Cleaning the '%s' table...\n", 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)){
ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
}
ShowInfo("End of char server initilization function.\n");
ShowStatus("The char-server is "CL_GREEN"ready"CL_RESET" (Server is listening on the port %d).\n\n", char_port);
return 0;
@ -4157,47 +4133,47 @@ int do_init(int argc, char **argv)
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)) {
ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
}
sql_res = mysql_store_result (&mysql_handle);
sql_row = sql_res?mysql_fetch_row (sql_res):NULL;
if (sql_row)
tmp_id = atoi (sql_row[0]);
else
ShowError("CHAR: child Failed!\n");
if (sql_res) mysql_free_result (sql_res);
if ( tmp_id == child_id )
return 1;
else
return 0;
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)) {
ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
}
sql_res = mysql_store_result (&mysql_handle);
sql_row = sql_res?mysql_fetch_row (sql_res):NULL;
if (sql_row)
tmp_id = atoi (sql_row[0]);
else
ShowError("CHAR: child Failed!\n");
if (sql_res) mysql_free_result (sql_res);
if ( tmp_id == child_id )
return 1;
else
return 0;
}
int char_married(int pl1,int pl2)
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)) {
ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
}
sql_res = mysql_store_result (&mysql_handle);
sql_row = sql_res?mysql_fetch_row (sql_res):NULL;
if (sql_row)
tmp_id = atoi (sql_row[0]);
else
ShowError("CHAR: married Failed!\n");
if (sql_res) mysql_free_result (sql_res);
if ( tmp_id == pl2 )
return 1;
else
return 0;
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)) {
ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
}
sql_res = mysql_store_result (&mysql_handle);
sql_row = sql_res?mysql_fetch_row (sql_res):NULL;
if (sql_row)
tmp_id = atoi (sql_row[0]);
else
ShowError("CHAR: married Failed!\n");
if (sql_res) mysql_free_result (sql_res);
if ( tmp_id == pl2 )
return 1;
else
return 0;
}
int char_family(int pl1,int pl2,int pl3)
int char_family(int pl1, int pl2, int pl3)
{
int charid, partnerid, childid;
sprintf (tmp_sql, "SELECT `char_id`,`partner_id`,`child` FROM `%s` WHERE `char_id` IN ('%d','%d','%d')", char_db, pl1, pl2, pl3);

View File

@ -51,29 +51,29 @@ char main_chat_nick[16] = "Main";
// sending packet list
// NOTE: This variable ain't used at all! And it's confusing.. where do I add that the length of packet 0x2b07 is 10? x.x [Skotlex]
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, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
int inter_send_packet_length[] = {
-1,-1,27,-1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3800-
-1, 7, 0, 0, 0, 0, 0, 0, -1,11, 0, 0, 0, 0, 0, 0, // 3810-
35,-1,11,15, 34,29, 7,-1, 0, 0, 0, 0, 0, 0, 0, 0, // 3820-
10,-1,15, 0, 79,19, 7,-1, 0,-1,-1,-1, 14,67,186,-1, // 3830-
9, 9,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3840-
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3850-
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3860-
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3870-
11,-1, 7, 3, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3880-
};
// recv. packet list
int inter_recv_packet_length[]={
-1,-1, 7,-1, -1,13,36, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3000-0x300f
6,-1, 0, 0, 0, 0, 0, 0, 10,-1, 0, 0, 0, 0, 0, 0, //0x3010-0x301f
-1, 6,-1,14, 14,19, 6,-1, 14,14, 0, 0, 0, 0, 0, 0, //0x3020-0x302f
-1, 6,-1,-1, 55,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1, //0x3030-0x303f
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, //0x3080-0x308f
-1,10,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x3090 - 0x309f Homunculus packets [albator]
int inter_recv_packet_length[] = {
-1,-1, 7,-1, -1,13,36, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3000-
6,-1, 0, 0, 0, 0, 0, 0, 10,-1, 0, 0, 0, 0, 0, 0, // 3010-
-1, 6,-1,14, 14,19, 6,-1, 14,14, 0, 0, 0, 0, 0, 0, // 3020-
-1, 6,-1,-1, 55,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1, // 3030-
5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3040-
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3050-
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3060-
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3070-
48,14,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3080-
-1,10,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3090- Homunculus packets [albator]
};
struct WisData {
@ -187,86 +187,83 @@ int inter_accreg_sql_init(void)
/*==========================================
* read config file
*------------------------------------------*/
static int inter_config_read(const char *cfgName)
static int inter_config_read(const char* cfgName)
{
int i;
char line[1024], w1[1024], w2[1024];
FILE *fp;
FILE* fp;
fp=fopen(cfgName,"r");
if(fp==NULL){
fp = fopen(cfgName, "r");
if(fp == NULL) {
ShowError("file not found: %s\n", cfgName);
return 1;
}
ShowInfo("reading file %s...\n",cfgName);
ShowInfo("reading file %s...\n", cfgName);
while(fgets(line, sizeof(line), fp))
{
i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
if(i!=2)
i = sscanf(line, "%[^:]: %[^\r\n]", w1, w2);
if(i != 2)
continue;
if(strcmpi(w1,"char_server_ip")==0){
strcpy(char_server_ip, w2);
ShowStatus ("set char_server_ip : %s\n",w2);
}
else if(strcmpi(w1,"char_server_port")==0){
char_server_port=atoi(w2);
ShowStatus ("set char_server_port : %s\n",w2);
}
else if(strcmpi(w1,"char_server_id")==0){
strcpy(char_server_id, w2);
ShowStatus ("set char_server_id : %s\n",w2);
}
else if(strcmpi(w1,"char_server_pw")==0){
strcpy(char_server_pw, w2);
ShowStatus ("set char_server_pw : %s\n",w2);
}
else if(strcmpi(w1,"char_server_db")==0){
strcpy(char_server_db, w2);
ShowStatus ("set char_server_db : %s\n",w2);
}
else if(strcmpi(w1,"default_codepage")==0){
strcpy(default_codepage, w2);
ShowStatus ("set default_codepage : %s\n",w2);
if(!strcmpi(w1,"char_server_ip")) {
strcpy(char_server_ip,w2);
ShowStatus ("set char_server_ip : %s\n", w2);
} else
if(!strcmpi(w1,"char_server_port")) {
char_server_port = atoi(w2);
ShowStatus ("set char_server_port : %s\n", w2);
} else
if(!strcmpi(w1,"char_server_id")) {
strcpy(char_server_id,w2);
ShowStatus ("set char_server_id : %s\n", w2);
} else
if(!strcmpi(w1,"char_server_pw")) {
strcpy(char_server_pw,w2);
ShowStatus ("set char_server_pw : %s\n", w2);
} else
if(!strcmpi(w1,"char_server_db")) {
strcpy(char_server_db,w2);
ShowStatus ("set char_server_db : %s\n", w2);
} else
if(!strcmpi(w1,"default_codepage")) {
strcpy(default_codepage,w2);
ShowStatus ("set default_codepage : %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){
else
if(!strcmpi(w1,"login_server_ip")) {
strcpy(login_server_ip, w2);
ShowStatus ("set login_server_ip : %s\n",w2);
}
else if(strcmpi(w1,"login_server_port")==0){
login_server_port=atoi(w2);
ShowStatus ("set login_server_port : %s\n",w2);
}
else if(strcmpi(w1,"login_server_id")==0){
ShowStatus ("set login_server_ip : %s\n", w2);
} else
if(!strcmpi(w1,"login_server_port")) {
login_server_port = atoi(w2);
ShowStatus ("set login_server_port : %s\n", w2);
} else
if(!strcmpi(w1,"login_server_id")) {
strcpy(login_server_id, w2);
ShowStatus ("set login_server_id : %s\n",w2);
}
else if(strcmpi(w1,"login_server_pw")==0){
ShowStatus ("set login_server_id : %s\n", w2);
} else
if(!strcmpi(w1,"login_server_pw")) {
strcpy(login_server_pw, w2);
ShowStatus ("set login_server_pw : %s\n",w2);
}
else if(strcmpi(w1,"login_server_db")==0){
ShowStatus ("set login_server_pw : %s\n", w2);
} else
if(!strcmpi(w1,"login_server_db")) {
strcpy(login_server_db, w2);
ShowStatus ("set login_server_db : %s\n",w2);
ShowStatus ("set login_server_db : %s\n", w2);
}
#ifndef TXT_SQL_CONVERT
else if(strcmpi(w1,"party_share_level")==0){
party_share_level=(unsigned int)atof(w2);
}
else if(strcmpi(w1,"log_inter")==0){
else if(!strcmpi(w1,"party_share_level"))
party_share_level = atoi(w2);
else if(!strcmpi(w1,"log_inter"))
log_inter = atoi(w2);
}
else if(strcmpi(w1, "main_chat_nick")==0){ // Main chat nick [LuzZza]
strcpy(main_chat_nick, w2); //
}
else if(!strcmpi(w1,"main_chat_nick"))
strcpy(main_chat_nick, w2);
#endif //TXT_SQL_CONVERT
else if(strcmpi(w1,"import")==0){
else if(!strcmpi(w1,"import"))
inter_config_read(w2);
}
}
fclose(fp);
@ -277,7 +274,7 @@ static int inter_config_read(const char *cfgName)
#ifndef TXT_SQL_CONVERT
// Save interlog into sql
int inter_log(char *fmt,...)
int inter_log(char* fmt, ...)
{
char str[255];
char temp_str[510]; //Needs be twice as long as str[] //Skotlex
@ -438,7 +435,8 @@ int inter_sql_test (void)
}
// finalize
void inter_final(void) {
void inter_final(void)
{
wis_db->destroy(wis_db, NULL);
inter_guild_sql_final();
@ -451,7 +449,8 @@ void inter_final(void) {
return;
}
int inter_mapif_init(int fd) {
int inter_mapif_init(int fd)
{
inter_guild_mapif_init(fd);
return 0;
@ -461,20 +460,22 @@ int inter_mapif_init(int fd) {
//--------------------------------------------------------
// GM message sending
int mapif_GMmessage(unsigned char *mes, int len, unsigned long color, int sfd) {
int mapif_GMmessage(unsigned char *mes, int len, unsigned long color, int sfd)
{
unsigned char buf[2048];
if (len > 2048) len = 2047; //Make it fit to avoid crashes. [Skotlex]
WBUFW(buf, 0) = 0x3800;
WBUFW(buf, 2) = len;
WBUFL(buf, 4) = color;
memcpy(WBUFP(buf, 8), mes, len-8);
WBUFW(buf,0) = 0x3800;
WBUFW(buf,2) = len;
WBUFL(buf,4) = color;
memcpy(WBUFP(buf,8), mes, len - 8);
mapif_sendallwos(sfd, buf, len);
return 0;
}
// Wis sending
int mapif_wis_message(struct WisData *wd) {
int mapif_wis_message(struct WisData *wd)
{
unsigned char buf[2048];
if (wd->len > 2047-56) wd->len = 2047-56; //Force it to fit to avoid crashes. [Skotlex]
@ -549,11 +550,11 @@ int mapif_send_gmaccounts()
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;
WBUFL(buf,len) = gm_account[i].account_id;
WBUFB(buf,len+4) = (uint8)gm_account[i].level;
len += 5;
}
WBUFW(buf, 2) = len;
WBUFW(buf,2) = len;
mapif_sendall(buf, len);
return 0;
@ -588,7 +589,8 @@ int mapif_disconnectplayer(int fd, int account_id, int char_id, int reason)
//--------------------------------------------------------
// Existence check of WISP data
int check_ttl_wisdata_sub(DBKey key, void *data, va_list ap) {
int check_ttl_wisdata_sub(DBKey key, void *data, va_list ap)
{
unsigned long tick;
struct WisData *wd = (struct WisData *)data;
tick = va_arg(ap, unsigned long);
@ -599,7 +601,8 @@ int check_ttl_wisdata_sub(DBKey key, void *data, va_list ap) {
return 0;
}
int check_ttl_wisdata(void) {
int check_ttl_wisdata(void)
{
unsigned long tick = gettick();
int i;
@ -623,18 +626,18 @@ int check_ttl_wisdata(void) {
// GM message sending
int mapif_parse_GMmessage(int fd)
{
RFIFOHEAD(fd);
mapif_GMmessage(RFIFOP(fd, 8), RFIFOW(fd, 2), RFIFOL(fd, 4), fd);
mapif_GMmessage(RFIFOP(fd,8), RFIFOW(fd,2), RFIFOL(fd,4), fd);
return 0;
}
// Wisp/page request to send
int mapif_parse_WisRequest(int fd) {
int mapif_parse_WisRequest(int fd)
{
struct WisData* wd;
static int wisid = 0;
char name[NAME_LENGTH], t_name[NAME_LENGTH*2]; //Needs space to allocate names with escaped chars [Skotlex]
RFIFOHEAD(fd);
if ( fd <= 0 ) {return 0;} // check if we have a valid fd
if (RFIFOW(fd,2)-52 >= sizeof(wd->msg)) {
@ -676,7 +679,7 @@ int mapif_parse_WisRequest(int fd) {
mapif_send(fd, buf, 27);
} else {
CREATE(wd, struct WisData, 1);
CREATE(wd, struct WisData, 1);
// Whether the failure of previous wisp/page transmission (timeout)
check_ttl_wisdata();
@ -703,10 +706,11 @@ int mapif_parse_WisRequest(int fd) {
// Wisp/page transmission result
int mapif_parse_WisReply(int fd) {
int mapif_parse_WisReply(int fd)
{
int id, flag;
struct WisData *wd;
RFIFOHEAD(fd);
id = RFIFOL(fd,2);
flag = RFIFOB(fd,6);
wd = idb_get(wis_db, id);
@ -722,9 +726,10 @@ int mapif_parse_WisReply(int fd) {
}
// Received wisp message from map-server for ALL gm (just copy the message and resends it to ALL map-servers)
int mapif_parse_WisToGM(int fd) {
int mapif_parse_WisToGM(int fd)
{
unsigned char buf[2048]; // 0x3003/0x3803 <packet_len>.w <wispname>.24B <min_gm_level>.w <message>.?B
RFIFOHEAD(fd);
ShowDebug("Sent packet back!\n");
memcpy(WBUFP(buf,0), RFIFOP(fd,0), RFIFOW(fd,2));
WBUFW(buf, 0) = 0x3803;
@ -738,7 +743,7 @@ int mapif_parse_Registry(int fd)
{
int j,p,len, max;
struct accreg *reg=accreg_pt;
RFIFOHEAD(fd);
memset(accreg_pt,0,sizeof(struct accreg));
switch (RFIFOB(fd, 12)) {
case 3: //Character registry
@ -770,26 +775,23 @@ int mapif_parse_Registry(int fd)
// Request the value of all registries.
int mapif_parse_RegistryRequest(int fd)
{
RFIFOHEAD(fd);
//Load Char Registry
if (RFIFOB(fd,12))
mapif_account_reg_reply(fd,RFIFOL(fd,2),RFIFOL(fd,6),3);
if (RFIFOB(fd,12)) mapif_account_reg_reply(fd,RFIFOL(fd,2),RFIFOL(fd,6),3);
//Load Account Registry
if (RFIFOB(fd,11))
mapif_account_reg_reply(fd,RFIFOL(fd,2),RFIFOL(fd,6),2);
if (RFIFOB(fd,11)) mapif_account_reg_reply(fd,RFIFOL(fd,2),RFIFOL(fd,6),2);
//Ask Login Server for Account2 values.
if (RFIFOB(fd,10))
request_accreg2(RFIFOL(fd,2),RFIFOL(fd,6)-2);
if (RFIFOB(fd,10)) request_accreg2(RFIFOL(fd,2),RFIFOL(fd,6)-2);
return 1;
}
static void mapif_namechange_ack(int fd, int account_id, int char_id, int type, int flag, char *name){
static void mapif_namechange_ack(int fd, int account_id, int char_id, int type, int flag, char *name)
{
WFIFOHEAD(fd, NAME_LENGTH+13);
WFIFOW(fd, 0) =0x3806;
WFIFOL(fd, 2) =account_id;
WFIFOL(fd, 6) =char_id;
WFIFOB(fd,10) =type;
WFIFOB(fd,11) =flag;
WFIFOW(fd, 0) = 0x3806;
WFIFOL(fd, 2) = account_id;
WFIFOL(fd, 6) = char_id;
WFIFOB(fd,10) = type;
WFIFOB(fd,11) = flag;
memcpy(WFIFOP(fd, 12), name, NAME_LENGTH);
WFIFOSET(fd, NAME_LENGTH+13);
}
@ -800,11 +802,10 @@ int mapif_parse_NameChangeRequest(int fd)
char* name;
int i;
RFIFOHEAD(fd);
account_id = RFIFOL(fd, 2);
char_id = RFIFOL(fd, 6);
type = RFIFOB(fd, 10);
name = RFIFOP(fd, 11);
account_id = RFIFOL(fd,2);
char_id = RFIFOL(fd,6);
type = RFIFOB(fd,10);
name = RFIFOP(fd,11);
// Check Authorised letters/symbols in the name
if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised
@ -833,22 +834,17 @@ int mapif_parse_NameChangeRequest(int fd)
int inter_parse_frommap(int fd)
{
int cmd;
int len=0;
RFIFOHEAD(fd);
cmd=RFIFOW(fd,0);
int len = 0;
cmd = RFIFOW(fd,0);
// inter鯖管轄かを調べる
if(cmd < 0x3000 || cmd >= 0x3000 + (sizeof(inter_recv_packet_length)/
sizeof(inter_recv_packet_length[0]) ) )
if(cmd < 0x3000 || cmd >= 0x3000 + ARRAYLENGTH(inter_recv_packet_length) || inter_recv_packet_length[cmd - 0x3000] == 0)
return 0;
if (inter_recv_packet_length[cmd-0x3000] == 0) //This is necessary, because otherwise we return 2 and the char server will just hang waiting for packets! [Skotlex]
return 0;
// パケット長を調べる
if((len = inter_check_length(fd, inter_recv_packet_length[cmd - 0x3000])) == 0)
return 2;
switch(cmd){
switch(cmd) {
case 0x3000: mapif_parse_GMmessage(fd); break;
case 0x3001: mapif_parse_WisRequest(fd); break;
case 0x3002: mapif_parse_WisReply(fd); break;
@ -857,17 +853,15 @@ int inter_parse_frommap(int fd)
case 0x3005: mapif_parse_RegistryRequest(fd); break;
case 0x3006: mapif_parse_NameChangeRequest(fd); break;
default:
if(inter_party_parse_frommap(fd))
if( inter_party_parse_frommap(fd)
|| inter_guild_parse_frommap(fd)
|| inter_storage_parse_frommap(fd)
|| inter_pet_parse_frommap(fd)
|| inter_homunculus_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;
if(inter_homunculus_parse_frommap(fd)) //albator
break;
return 0;
else
return 0;
}
RFIFOSKIP(fd, len);
@ -877,9 +871,8 @@ int inter_parse_frommap(int fd)
// RFIFO check
int inter_check_length(int fd, int length)
{
RFIFOHEAD(fd);
if(length==-1){ // v-len packet
if(RFIFOREST(fd)<4) // packet not yet
if(length == -1) { // v-len packet
if(RFIFOREST(fd) < 4) // packet not yet
return 0;
length = RFIFOW(fd, 2);
}

View File

@ -690,12 +690,12 @@ int _vShowMessage(enum msg_type flag, const char *string, va_list ap)
return 1;
}
if ((flag == MSG_DEBUG && !SHOW_DEBUG_MSG) ||
(flag == MSG_INFORMATION && msg_silent&1) ||
(flag == MSG_STATUS && msg_silent&2) ||
(flag == MSG_NOTICE && msg_silent&4) ||
(flag == MSG_WARNING && msg_silent&8) ||
(flag == MSG_ERROR && msg_silent&16) ||
(flag == MSG_SQL && msg_silent&16))
(flag == MSG_INFORMATION && msg_silent&1) ||
(flag == MSG_STATUS && msg_silent&2) ||
(flag == MSG_NOTICE && msg_silent&4) ||
(flag == MSG_WARNING && msg_silent&8) ||
(flag == MSG_ERROR && msg_silent&16) ||
(flag == MSG_SQL && msg_silent&16))
return 0; //Do not print it.
if (timestamp_format[0])

View File

@ -612,7 +612,7 @@ int do_sendrecv(int next)
if(session[i]->eof) //func_send can't free a session, this is safe.
{ //Finally, even if there is no data to parse, connections signalled eof should be closed, so we call parse_func [Skotlex]
session[i]->func_parse(i); //This should close the session inmediately.
session[i]->func_parse(i); //This should close the session immediately.
}
}
#endif

View File

@ -132,7 +132,7 @@ struct auth_data {
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]; // account script variables
struct global_reg account_reg2[ACCOUNT_REG2_NUM]; // account script variables (stored on login server)
} *auth_dat = NULL;
uint32 auth_num = 0, auth_max = 0;
@ -1367,8 +1367,10 @@ int parse_fromchar(int fd)
{
uint32 i;
int j, id;
uint32 ipl = session[fd]->client_addr;
char ip[16];
ip2str(ipl, ip);
for(id = 0; id < MAX_SERVERS; id++)
if (server_fd[id] == fd)
@ -1379,8 +1381,6 @@ int parse_fromchar(int fd)
return 0;
}
ip2str(ipl, ip);
if(session[fd]->eof) {
ShowStatus("Char-server '%s' has disconnected.\n", server[id].name);
login_log("Char-server '%s' has disconnected (ip: %s)." RETCODE, server[id].name, ip);

View File

@ -726,6 +726,7 @@ int parse_fromchar(int fd)
uint32 ipl = session[fd]->client_addr;
char ip[16];
ip2str(ipl, ip);
for(id = 0; id < MAX_SERVERS; id++)
if (server_fd[id] == fd)
@ -736,8 +737,6 @@ int parse_fromchar(int fd)
return 0;
}
ip2str(ipl, ip);
if(session[fd]->eof) {
ShowStatus("Char-server '%s' has disconnected.\n", server[id].name);
server_fd[id] = -1;
@ -1889,8 +1888,8 @@ void sql_config_read(const char* cfgName)
char line[1024], w1[1024], w2[1024];
FILE* fp = fopen(cfgName, "r");
if(fp == NULL) {
ShowFatalError("file not found: %s\n", cfgName);
exit(1);
ShowError("file not found: %s\n", cfgName);
return;
}
ShowInfo("reading configuration file %s...\n", cfgName);
while(fgets(line, sizeof(line), fp))

View File

@ -8358,7 +8358,7 @@ int atcommand_makehomun(const int fd, struct map_session_data* sd, const char* c
/*==========================================
* modify homunculus intimacy [orn]
*------------------------------------------o */
*------------------------------------------*/
int atcommand_homfriendly(const int fd, struct map_session_data* sd, const char* command, const char* message)
{
int friendly = 0;

View File

@ -30,7 +30,7 @@ static const int packet_len_table[0x3d] = { // U - used, F - free
60, 3,-1,27,10,-1, 6,-1, // 2af8-2aff: U->2af8, U->2af9, U->2afa, U->2afb, U->2afc, U->2afd, U->2afe, U->2aff
6,-1,18, 7,-1,49,30,10, // 2b00-2b07: U->2b00, U->2b01, U->2b02, U->2b03, U->2b04, U->2b05, U->2b06, U->2b07
6,30,-1,10,86, 7,44,34, // 2b08-2b0f: U->2b08, U->2b09, U->2b0a, U->2b0b, U->2b0c, U->2b0d, U->2b0e, U->2b0f
0,-1,10, 6,11,-1, 0, 0, // 2b10-2b17: U->2b10, U->2b11, U->2b12, U->2b13, U->2b14, U->2b15, U->2b16, U->2b17
11,-1,10, 6,11,-1, 0,10, // 2b10-2b17: U->2b10, U->2b11, U->2b12, U->2b13, U->2b14, U->2b15, U->2b16, U->2b17
-1,-1,-1,-1,-1,-1, 2, 7, // 2b18-2b1f: U->2b18, U->2b19, U->2b1a, U->2b1b, U->2b1c, U->2b1d, U->2b1e, U->2b1f
-1,10, 8,-1,-1,-1,-1,-1, // 2b20-2b27: U->2b20, U->2b21, U->2b22, U->2b23, F->2b24, F->2b25, F->2b26, F->2b27
};
@ -97,7 +97,7 @@ int other_mapserver_count=0; //Holds count of how many other map servers are onl
//Interval at which map server sends number of connected users. [Skotlex]
#define UPDATE_INTERVAL 10000
//This define should spare writing the check in every function. [Skotlex]
#define chrif_check(a) { if(!chrif_isconnect()) return a; }
#define chrif_check(a) { if(!chrif_isconnected()) return a; }
// sets char-server's user id
@ -147,7 +147,7 @@ void chrif_setport(uint16 port)
}
// says whether the char-server is connected or not
int chrif_isconnect(void)
int chrif_isconnected(void)
{
return (char_fd > 0 && session[char_fd] != NULL && chrif_state == 2);
}
@ -163,7 +163,8 @@ int chrif_save(struct map_session_data *sd, int flag)
if (!flag) //The flag check is needed to prevent 'nosave' taking effect when a jailed player logs out.
pc_makesavestatus(sd);
if(!chrif_isconnect())
if(!chrif_isconnected())
{
if (flag) sd->state.finalsave = 1; //Will save character on reconnect.
return -1;
@ -238,10 +239,9 @@ int chrif_sendmap(int fd)
int chrif_recvmap(int fd)
{
int i, j;
uint32 ip;
uint16 port;
ip = ntohl(RFIFOL(fd,4));
port = ntohs(RFIFOW(fd,8));
uint32 ip = ntohl(RFIFOL(fd,4));
uint16 port = ntohs(RFIFOW(fd,8));
for(i = 10, j = 0; i < RFIFOW(fd,2); i += 4, j++) {
map_setipport(RFIFOW(fd,i), ip, port);
}
@ -256,15 +256,11 @@ int chrif_recvmap(int fd)
int chrif_removemap(int fd)
{
int i, j;
uint32 ip;
uint16 port;
uint32 ip = RFIFOL(fd,4);
uint16 port = RFIFOW(fd,8);
ip = RFIFOL(fd, 4);
port = RFIFOW(fd, 8);
for(i = 10, j = 0; i < RFIFOW(fd, 2); i += 4, j++){
for(i = 10, j = 0; i < RFIFOW(fd, 2); i += 4, j++)
map_eraseipport(RFIFOW(fd, i), ip, port);
}
other_mapserver_count--;
if(battle_config.etc_log)
@ -284,10 +280,8 @@ int chrif_save_ack(int fd)
}
// request to move a character between mapservers
int chrif_changemapserver(struct map_session_data *sd, short map, int x, int y, uint32 ip, uint16 port)
int chrif_changemapserver(struct map_session_data* sd, short map, int x, int y, uint32 ip, uint16 port)
{
uint32 s_ip;
nullpo_retr(-1, sd);
chrif_check(-1);
@ -298,11 +292,6 @@ int chrif_changemapserver(struct map_session_data *sd, short map, int x, int y,
return -1;
}
if (sd->fd && sd->fd < fd_max && session[sd->fd])
s_ip = session[sd->fd]->client_addr;
else //Not connected? Can't retrieve IP
s_ip = 0;
WFIFOHEAD(char_fd,35);
WFIFOW(char_fd, 0) = 0x2b05;
WFIFOL(char_fd, 2) = sd->bl.id;
@ -315,7 +304,7 @@ int chrif_changemapserver(struct map_session_data *sd, short map, int x, int y,
WFIFOL(char_fd,24) = htonl(ip);
WFIFOW(char_fd,28) = htons(port);
WFIFOB(char_fd,30) = sd->status.sex;
WFIFOL(char_fd,31) = htonl(s_ip); // not used
WFIFOL(char_fd,31) = 0; // sd's IP, not used anymore
WFIFOSET(char_fd,35);
return 0;
@ -337,6 +326,7 @@ int chrif_changemapserverack(int fd)
clif_authfail_fd(sd->fd, 0);
return 0;
}
sprintf(mapname, "%s.gat", mapindex_id2name(RFIFOW(fd,18)));
clif_changemapserver(sd, mapname, RFIFOW(fd,20), RFIFOW(fd,22), ntohl(RFIFOL(fd,24)), ntohs(RFIFOW(fd,28)));
@ -380,6 +370,7 @@ int chrif_sendmapack(int fd)
ShowFatalError("chrif : send map list to char server failed %d\n", RFIFOB(fd,2));
exit(1);
}
memcpy(wisp_server_name, RFIFOP(fd,3), NAME_LENGTH);
ShowStatus("Map sending complete. Map Server is now online.\n");
chrif_state = 2;
@ -646,14 +637,10 @@ int chrif_changesex(int id, int sex)
}
/*==========================================
* Answer after a request about a character name to do some operations (by Yor)
* Used to answer of chrif_char_ask_name.
* R 2b0f <accid>.l <name>.24B <type>.w <answer>.w
* Reply to chrif_char_ask_name() (request to do some character operation)
* type of operation:
* 1: block
* 2: ban
* 3: unblock
* 4: unban
* 5: changesex
* 1: block, 2: ban, 3: unblock, 4: unban, 5: changesex
* type of answer:
* 0: login-server request done
* 1: player not found
@ -662,100 +649,43 @@ int chrif_changesex(int id, int sex)
*------------------------------------------*/
int chrif_char_ask_name_answer(int fd)
{
int acc;
struct map_session_data *sd;
struct map_session_data* sd;
char* action;
char output[256];
char player_name[NAME_LENGTH];
acc = RFIFOL(fd,2); // account_id of who has asked (-1 if nobody)
memcpy(player_name, RFIFOP(fd,6), NAME_LENGTH);
player_name[NAME_LENGTH-1] = '\0';
int acc = RFIFOL(fd,2); // account_id of who has asked (-1 if nobody)
char* player_name = (char*)RFIFOP(fd,6);
uint16 type;
uint16 answer;
type = RFIFOW(fd,30);
answer = RFIFOW(fd,32);
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 request 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 request 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 request 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 request 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 request 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
if (acc < 0 || sd == NULL) {
ShowError("chrif_char_ask_name_answer failed - player not online.\n");
return 0;
}
switch(type)
{
case 1: action = "block"; break;
case 2: action = "ban"; break;
case 3: action = "unblock"; break;
case 4: action = "unban"; break;
case 5: action = "change the sex of"; break;
default: action = "???"; break;
}
switch(answer)
{
case 0: sprintf(output, "Login-server has been asked to %s the player '%20s'.", action, player_name); break;
case 1: sprintf(output, "The player '%20s' doesn't exist.", player_name); break;
case 2: sprintf(output, "Your GM level don't authorise you to %s the player '%20s'.", action, player_name); break;
case 3: sprintf(output, "Login-server is offline. Impossible to %s the player '%20s'.", action, player_name); break;
default: output[0] = '\0'; break;
}
clif_displaymessage(sd->fd, output);
return 0;
}
@ -859,22 +789,19 @@ int chrif_changedsex(int fd)
*------------------------------------------*/
int chrif_divorce(int char_id, int partner_id)
{
struct map_session_data *sd = NULL;
struct map_session_data* sd;
int i;
if (!char_id || !partner_id)
if (!char_id || !partner_id || (sd = map_charid2sd(partner_id)) == NULL || sd->status.partner_id != char_id)
return 0;
nullpo_retr(0, sd = map_charid2sd(partner_id));
if (sd->status.partner_id == char_id) {
int i;
//離婚(相方は既にキャラが消えている筈なので)
sd->status.partner_id = 0;
//離婚(相方は既にキャラが消えている筈なので)
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 (sd->status.inventory[i].nameid == WEDDING_RING_M || sd->status.inventory[i].nameid == WEDDING_RING_F)
pc_delitem(sd, i, 1, 0);
return 0;
}
@ -917,60 +844,40 @@ int chrif_accountban(int fd)
if (battle_config.etc_log)
ShowNotice("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)
ShowError("chrif_accountban failed - player not online.\n");
if (acc < 0 || sd == NULL) {
ShowError("chrif_accountban failed - player not online.\n");
return 0;
}
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: clif_displaymessage(sd->fd, "Your account has 'Unregistered'."); break;
case 2: clif_displaymessage(sd->fd, "Your account has an 'Incorrect Password'..."); break;
case 3: clif_displaymessage(sd->fd, "Your account has expired."); break;
case 4: clif_displaymessage(sd->fd, "Your account has been rejected from server."); break;
case 5: clif_displaymessage(sd->fd, "Your account has been blocked by the GM Team."); break;
case 6: clif_displaymessage(sd->fd, "Your Game's EXE file is not the latest version."); break;
case 7: clif_displaymessage(sd->fd, "Your account has been prohibited to log in."); break;
case 8: clif_displaymessage(sd->fd, "Server is jammed due to over populated."); break;
case 9: clif_displaymessage(sd->fd, "Your account has not more authorised."); break;
case 100: 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
return 0;
}
@ -978,13 +885,11 @@ int chrif_accountban(int fd)
//packet.w AID.L WHY.B 2+4+1 = 7byte
int chrif_disconnectplayer(int fd)
{
struct map_session_data *sd;
struct map_session_data* sd;
sd = map_id2sd(RFIFOL(fd, 2));
if(sd == NULL){
if(sd == NULL)
return -1;
}
if (!sd->fd)
{ //No connection
@ -995,27 +900,13 @@ int chrif_disconnectplayer(int fd)
return 0;
}
switch(RFIFOB(fd, 6)){
//clif_authfail_fd
case 1: //server closed
clif_authfail_fd(sd->fd, 1);
break;
case 2: //someone else logged in
clif_authfail_fd(sd->fd, 2);
break;
case 3: //server overpopulated
clif_authfail_fd(sd->fd, 4);
break;
case 4: //out of time payd for .. (avail)
clif_authfail_fd(sd->fd, 10);
break;
case 5: //forced to dc by gm
clif_authfail_fd(sd->fd, 15);
break;
switch(RFIFOB(fd, 6))
{
case 1: clif_authfail_fd(sd->fd, 1); break; //server closed
case 2: clif_authfail_fd(sd->fd, 2); break; //someone else logged in
case 3: clif_authfail_fd(sd->fd, 4); break; //server overpopulated
case 4: clif_authfail_fd(sd->fd, 10); break; //out of available time paid for
case 5: clif_authfail_fd(sd->fd, 15); break; //forced to dc by gm
}
return 0;
}
@ -1047,26 +938,21 @@ int chrif_recvgmaccounts(int fd)
* Request/Receive top 10 Fame character list
*------------------------------------------*/
int chrif_updatefamelist(struct map_session_data *sd)
int chrif_updatefamelist(struct map_session_data* sd)
{
char type;
chrif_check(-1);
switch(sd->class_&MAPID_UPPERMASK) {
case MAPID_BLACKSMITH:
type = 1;
break;
case MAPID_ALCHEMIST:
type = 2;
break;
case MAPID_TAEKWON:
type = 3;
break;
switch(sd->class_ & MAPID_UPPERMASK)
{
case MAPID_BLACKSMITH: type = 1; break;
case MAPID_ALCHEMIST: type = 2; break;
case MAPID_TAEKWON: type = 3; break;
default:
return 0;
}
WFIFOHEAD(char_fd, 12);
WFIFOHEAD(char_fd, 11);
WFIFOW(char_fd,0) = 0x2b10;
WFIFOL(char_fd,2) = sd->status.char_id;
WFIFOL(char_fd,6) = sd->status.fame;
@ -1124,26 +1010,19 @@ int chrif_recvfamelist(int fd)
int chrif_updatefamelist_ack(int fd)
{
struct fame_list *list;
char index;
switch (RFIFOB(fd, 2))
struct fame_list* list;
uint8 index;
switch (RFIFOB(fd,2))
{
case 1:
list = smith_fame_list;
break;
case 2:
list = chemist_fame_list;
break;
case 3:
list = taekwon_fame_list;
break;
default:
return 0;
case 1: list = smith_fame_list; break;
case 2: list = chemist_fame_list; break;
case 3: list = taekwon_fame_list; break;
default: return 0;
}
index = RFIFOB(fd, 3);
if (index < 0 || index >= MAX_FAME_LIST)
return 0;
list[(int)index].fame = RFIFOL(fd, 4);
list[index].fame = RFIFOL(fd,4);
return 1;
}
@ -1191,8 +1070,9 @@ int chrif_save_scdata(struct map_session_data *sd)
return 0;
}
//Retrieve and load sc_data for a player. [Skotlex]
int chrif_load_scdata(int fd)
{ //Retrieve and load sc_data for a player. [Skotlex]
{
#ifdef ENABLE_SC_SAVING
struct map_session_data *sd;
struct status_change_data *data;
@ -1365,24 +1245,29 @@ void chrif_update_ip(int fd)
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);
}
else if (fd != char_fd)
ShowDebug("chrif_parse: Disconnecting invalid session #%d (is not the char-server)\n", fd);
// only process data from the char-server
if (fd != char_fd)
{
ShowDebug("chrif_parse: Disconnecting invalid session #%d (is not the char-server)\n", fd);
do_close(fd);
return 0;
}
if (session[fd]->eof)
{
if (chrif_connected == 1)
chrif_disconnect(fd);
do_close(fd);
return 0;
}
while (RFIFOREST(fd) >= 2) { //Infinite loop on broken pipe fix. [Skotlex]
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) {
if (cmd < 0x2af8 || cmd >= 0x2af8 + ARRAYLENGTH(packet_len_table) || packet_len_table[cmd-0x2af8] == 0)
{
int r = intif_parse(fd); // intifÉ“n·
if (r == 1) continue; // intifÅ<E2809A>ˆ<CB86>µ½
@ -1392,16 +1277,20 @@ int chrif_parse(int fd)
ShowWarning("chrif_parse: session #%d, intif_parse failed -> disconnected.\n", fd);
return 0;
}
packet_len = packet_len_table[cmd-0x2af8];
if (packet_len == -1) {
if (packet_len == -1)
{ // dynamic-length packet, second WORD holds the length
if (RFIFOREST(fd) < 4)
return 0;
packet_len = RFIFOW(fd,2);
}
if ((int)RFIFOREST(fd) < packet_len)
return 0;
switch(cmd) {
switch(cmd)
{
case 0x2af9: chrif_connectack(fd); break;
case 0x2afb: chrif_sendmapack(fd); break;
case 0x2afd: chrif_authok(fd); break;
@ -1425,7 +1314,6 @@ int chrif_parse(int fd)
case 0x2b20: chrif_removemap(fd); break;
case 0x2b21: chrif_save_ack(fd); break;
case 0x2b22: chrif_updatefamelist_ack(fd); break;
default:
if (battle_config.error_log)
ShowError("chrif_parse : unknown packet (session #%d): 0x%x. Disconnecting.\n", fd, cmd);
@ -1492,11 +1380,14 @@ int send_users_tochar(int tid, unsigned int tick, int id, int data)
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) {
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);
if (char_fd == -1)
@ -1504,6 +1395,7 @@ int check_connect_char_server(int tid, unsigned int tick, int id, int data)
char_fd = 0;
return 0;
}
session[char_fd]->func_parse = chrif_parse;
realloc_fifo(char_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
@ -1519,16 +1411,8 @@ int check_connect_char_server(int tid, unsigned int tick, int id, int data)
srvinfo = 1;
}
#endif /* not TXT_ONLY */
/* There is no need, the connection is TCP, so the packet is assured to arrive unless the connection dies [Skotlex]
//If for some reason the next iteration (10 secs) we are still not connected,
//assume the packets got lost, so we need to resend them. [Skotlex]
if (chrif_state == 0)
chrif_connect(char_fd);
else if (chrif_state == 1)
chrif_sendmap(char_fd);
*/
}
if (chrif_isconnect()) displayed = 0;
if (chrif_isconnected()) displayed = 0;
return 0;
}
@ -1560,6 +1444,7 @@ int do_init_chrif(void)
add_timer_func_list(send_usercount_tochar, "send_usercount_tochar");
add_timer_func_list(send_users_tochar, "send_users_tochar");
add_timer_func_list(auth_db_cleanup, "auth_db_cleanup");
add_timer_interval(gettick() + 1000, check_connect_char_server, 0, 0, 10 * 1000);
#ifdef TXT_ONLY
//Txt needs this more frequently because it is used for the online.html file.

View File

@ -18,7 +18,7 @@ void chrif_checkdefaultlogin(void);
int chrif_setip(const char* ip);
void chrif_setport(uint16 port);
int chrif_isconnect(void);
int chrif_isconnected(void);
extern int chrif_connected;
extern int other_mapserver_count;

View File

@ -550,7 +550,7 @@ int clif_authok(struct map_session_data *sd)
* 4 - server full -> MsgStringTable[264]
* 5 - underaged -> MsgStringTable[305]
* 9 - too many connections from this ip -> MsgStringTable[529]
* 10 - payed time has ended -> MsgStringTable[530]
* 10 - out of available time paid for -> MsgStringTable[530]
* 15 - disconnected by a GM -> if( servicetype == taiwan ) MsgStringTable[579]
* other - disconnected -> MsgStringTable[3]
*/
@ -581,17 +581,14 @@ void clif_updatemaxid(int account_id, int char_id)
*------------------------------------------*/
int clif_charselectok(int id)
{
struct map_session_data *sd;
struct map_session_data* sd;
int fd;
if ((sd = map_id2sd(id)) == NULL)
return 1;
if (!sd->fd)
if ((sd = map_id2sd(id)) == NULL || !sd->fd)
return 1;
fd = sd->fd;
WFIFOHEAD(fd, packet_len(0xb3));
WFIFOHEAD(fd,packet_len(0xb3));
WFIFOW(fd,0) = 0xb3;
WFIFOB(fd,2) = 1;
WFIFOSET(fd,packet_len(0xb3));
@ -2809,18 +2806,18 @@ int clif_initialstatus(struct map_session_data *sd)
buf=WFIFOP(fd,0);
WBUFW(buf,0)=0xbd;
WBUFW(buf,2)=(sd->status.status_point > SHRT_MAX)? SHRT_MAX:sd->status.status_point;
WBUFB(buf,4)=(sd->status.str > UCHAR_MAX)? UCHAR_MAX:sd->status.str;
WBUFW(buf,2)=min(sd->status.status_point, SHRT_MAX);
WBUFB(buf,4)=min(sd->status.str, UCHAR_MAX);
WBUFB(buf,5)=pc_need_status_point(sd,SP_STR);
WBUFB(buf,6)=(sd->status.agi > UCHAR_MAX)? UCHAR_MAX:sd->status.agi;
WBUFB(buf,6)=min(sd->status.agi, UCHAR_MAX);
WBUFB(buf,7)=pc_need_status_point(sd,SP_AGI);
WBUFB(buf,8)=(sd->status.vit > UCHAR_MAX)? UCHAR_MAX:sd->status.vit;
WBUFB(buf,8)=min(sd->status.vit, UCHAR_MAX);
WBUFB(buf,9)=pc_need_status_point(sd,SP_VIT);
WBUFB(buf,10)=(sd->status.int_ > UCHAR_MAX)? UCHAR_MAX:sd->status.int_;
WBUFB(buf,10)=min(sd->status.int_, UCHAR_MAX);
WBUFB(buf,11)=pc_need_status_point(sd,SP_INT);
WBUFB(buf,12)=(sd->status.dex > UCHAR_MAX)? UCHAR_MAX:sd->status.dex;
WBUFB(buf,12)=min(sd->status.dex, UCHAR_MAX);
WBUFB(buf,13)=pc_need_status_point(sd,SP_DEX);
WBUFB(buf,14)=(sd->status.luk > UCHAR_MAX)? UCHAR_MAX:sd->status.luk;
WBUFB(buf,14)=min(sd->status.luk, UCHAR_MAX);
WBUFB(buf,15)=pc_need_status_point(sd,SP_LUK);
WBUFW(buf,16) = sd->battle_status.batk + sd->battle_status.rhw.atk + sd->battle_status.lhw->atk;
@ -3797,7 +3794,7 @@ int clif_damage(struct block_list *src,struct block_list *dst,unsigned int tick,
WBUFW(buf,22)=damage?div:0;
WBUFW(buf,27)=damage2?div:0;
} else {
WBUFW(buf,22)=(damage > SHRT_MAX)?SHRT_MAX:damage;
WBUFW(buf,22)=min(damage, SHRT_MAX);
WBUFW(buf,27)=damage2;
}
WBUFW(buf,24)=div;
@ -4457,7 +4454,7 @@ int clif_skill_nodamage(struct block_list *src,struct block_list *dst,int skill_
WBUFW(buf,0)=0x11a;
WBUFW(buf,2)=skill_id;
WBUFW(buf,4)=(heal > SHRT_MAX)? SHRT_MAX:heal;
WBUFW(buf,4)=min(heal, SHRT_MAX);
WBUFL(buf,6)=dst->id;
WBUFL(buf,10)=src?src->id:0;
WBUFB(buf,14)=fail;
@ -6734,42 +6731,43 @@ int clif_guild_emblem(struct map_session_data *sd,struct guild *g)
WFIFOSET(fd,WFIFOW(fd,2));
return 0;
}
/*==========================================
* ƒƒhƒXƒLƒ<EFBFBD>M
* Send guild skills
*------------------------------------------*/
int clif_guild_skillinfo(struct map_session_data *sd)
int clif_guild_skillinfo(struct map_session_data* sd)
{
int fd;
int i,id,c,up=1;
struct guild *g;
struct guild* g;
int i,c;
nullpo_retr(0, sd);
fd=sd->fd;
g=guild_search(sd->status.guild_id);
if(g==NULL)
fd = sd->fd;
g = guild_search(sd->status.guild_id);
if(g == NULL)
return 0;
WFIFOHEAD(fd, MAX_GUILDSKILL * 37 + 6);
WFIFOW(fd,0)=0x0162;
WFIFOW(fd,4)=g->skill_point;
for(i=c=0;i<MAX_GUILDSKILL;i++){
if(g->skill[i].id>0 && guild_check_skill_require(g,g->skill[i].id)){
WFIFOW(fd,c*37+ 6) = id = g->skill[i].id;
WFIFOW(fd,0) = 0x0162;
WFIFOW(fd,4) = g->skill_point;
for(i = 0, c = 0; i < MAX_GUILDSKILL; i++)
{
if(g->skill[i].id > 0 && guild_check_skill_require(g, g->skill[i].id))
{
int id = g->skill[i].id;
WFIFOW(fd,c*37+ 6) = id;
WFIFOW(fd,c*37+ 8) = skill_get_inf(id);
WFIFOW(fd,c*37+10) = 0;
WFIFOW(fd,c*37+12) = g->skill[i].lv;
WFIFOW(fd,c*37+14) = skill_get_sp(id,g->skill[i].lv);
WFIFOW(fd,c*37+16) = skill_get_range(id,g->skill[i].lv);
WFIFOW(fd,c*37+14) = skill_get_sp(id, g->skill[i].lv);
WFIFOW(fd,c*37+16) = skill_get_range(id, g->skill[i].lv);
strncpy((char*)WFIFOP(fd,c*37+18), skill_get_name(id), NAME_LENGTH);
if(g->skill[i].lv < guild_skill_get_max(id) && (sd == g->member[0].sd))
up = 1;
else
up = 0;
WFIFOB(fd,c*37+42)= up;
WFIFOB(fd,c*37+42)= (g->skill[i].lv < guild_skill_get_max(id) && sd == g->member[0].sd) ? 1 : 0;
c++;
}
}
WFIFOW(fd,2)=c*37+6;
WFIFOW(fd,2) = c*37 + 6;
WFIFOSET(fd,WFIFOW(fd,2));
return 0;
}
@ -6778,7 +6776,7 @@ int clif_guild_skillinfo(struct map_session_data *sd)
* Sends guild notice to client
* R 016f <str1z>.60B <str2z>.120B
*------------------------------------------*/
int clif_guild_notice(struct map_session_data *sd,struct guild *g)
int clif_guild_notice(struct map_session_data* sd, struct guild* g)
{
int fd;
@ -6787,17 +6785,16 @@ int clif_guild_notice(struct map_session_data *sd,struct guild *g)
fd = sd->fd;
if ( !session_isActive(fd) ) //null pointer right here [Kevin]
if ( !session_isActive(fd) )
return 0;
if (fd <= 0)
return 0;
if(*g->mes1==0 && *g->mes2==0)
if(g->mes1[0] == '\0' && g->mes2[0] == '\0')
return 0;
WFIFOHEAD(fd,packet_len(0x16f));
WFIFOW(fd,0)=0x16f;
memcpy(WFIFOP(fd,2),g->mes1,60);
memcpy(WFIFOP(fd,62),g->mes2,120);
WFIFOW(fd,0) = 0x16f;
memcpy(WFIFOP(fd,2), g->mes1, 60);
memcpy(WFIFOP(fd,62), g->mes2, 120);
WFIFOSET(fd,packet_len(0x16f));
return 0;
}
@ -8960,6 +8957,7 @@ void clif_parse_TakeItem(int fd, struct map_session_data *sd)
if (!pc_takeitem(sd, fitem))
break;
return;
} while (0);
// Client REQUIRES a fail packet or you can no longer pick items.
@ -11717,10 +11715,10 @@ static int packetdb_readdb(void)
//#0x0240
-1, -1, -1, -1, -1, 3, 4, 8, -1, 3, 70, 4, 8,12, 4, 10,
3, 32, -1, 3, 3, 5, 5, 8, 2, 3, -1, -1, 4,-1, 4, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
//#0x0280
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0
};
struct {
void (*func)(int, struct map_session_data *);

View File

@ -116,7 +116,7 @@ struct item_data {
unsigned value_notoc : 1;
short no_equip;
unsigned no_refine : 1; // [celest]
unsigned delay_consume : 1; // Signifies items that are not consumed inmediately upon double-click [Skotlex]
unsigned delay_consume : 1; // Signifies items that are not consumed immediately upon double-click [Skotlex]
unsigned trade_restriction : 7; //Item restrictions mask [Skotlex]
unsigned autoequip: 1;
} flag;

View File

@ -792,7 +792,7 @@ int map_foreachinarea(int (*func)(struct block_list*,va_list),int m,int x0,int y
if (type&~BL_MOB)
for (by = y0 / BLOCK_SIZE; by <= y1 / BLOCK_SIZE; by++) {
for(bx=x0/BLOCK_SIZE;bx<=x1/BLOCK_SIZE;bx++){
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){
@ -1597,19 +1597,19 @@ static void* create_charid2nick(DBKey key, va_list args)
/*==========================================
* charid_dbへ追加()
*------------------------------------------*/
void map_addchariddb(int charid, char *name)
void map_addchariddb(int charid, char* name)
{
struct charid2nick *p;
struct charid2nick* p;
int req = 0;
p = idb_ensure(charid_db,charid,create_charid2nick);
p = idb_ensure(charid_db, charid, create_charid2nick);
req = p->req_id;
p->req_id = 0;
//We overwrite the nick anyway in case a different one arrived.
memcpy(p->nick, name, NAME_LENGTH);
if (req) {
struct map_session_data *sd = map_id2sd(req);
struct map_session_data* sd = map_id2sd(req);
if (sd) clif_solved_charname(sd,charid);
}
}
@ -2775,8 +2775,8 @@ int map_config_read(char *cfgName)
fp = fopen(cfgName,"r");
if (fp == NULL) {
ShowFatalError("Map configuration file not found at: %s\n", cfgName);
exit(1);
ShowError("Map configuration file not found at: %s\n", cfgName);
return 1;
}
while(fgets(line, sizeof(line), fp))
{
@ -3244,7 +3244,7 @@ static int map_abort_sub(DBKey key,void * data,va_list ap)
void do_abort(void)
{
//Save all characters and then flush the inter-connection.
if (!chrif_isconnect())
if (!chrif_isconnected())
{
if (pc_db->size(pc_db))
ShowFatalError("Server has crashed without a connection to the char-server, character data can't be saved!\n");

View File

@ -496,7 +496,7 @@ struct party_member_data {
struct party_data {
struct party party;
struct party_member_data data[MAX_PARTY];
unsigned char itemc; //For item distribution.
uint8 itemc; //For item distribution, position of last picker in party
struct {
unsigned monk : 1; //There's at least one monk in party?
unsigned sg : 1; //There's at least one Star Gladiator in party?

View File

@ -999,7 +999,7 @@ int mob_unlocktarget(struct mob_data *md,int tick)
default:
mob_stop_attack(md);
if (battle_config.mob_ai&0x8)
mob_stop_walking(md,1); //Inmediately stop chasing.
mob_stop_walking(md,1); //Immediately stop chasing.
md->state.skillstate = MSS_IDLE;
md->next_walktime=tick+rand()%3000+3000;
break;
@ -2085,7 +2085,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
exp += exp*(battle_config.exp_bonus_attacker*(count-1))/100.; //[Gengar]
}
mexp = (exp > UINT_MAX)?UINT_MAX:(exp<1?1:(unsigned int)exp);
mexp = (unsigned int)cap_value(exp, 1, UINT_MAX);
if(use_irc && irc_announce_mvp_flag)
irc_announce_mvp(mvp_sd,md);

View File

@ -761,43 +761,46 @@ int party_exp_share(struct party_data *p,struct block_list *src,unsigned int bas
}
//Does party loot. first holds the id of the player who has time priority to take the item.
int party_share_loot(struct party_data *p, TBL_PC *sd, struct item *item_data, int first)
int party_share_loot(struct party_data* p, TBL_PC* sd, struct item* item_data, int first)
{
TBL_PC *target=NULL;
TBL_PC* target = NULL;
int i;
if (p && p->party.item&2 && (first || !(battle_config.party_share_type&1))) {
if (p && p->party.item&2 && (first || !(battle_config.party_share_type&1)))
{
//item distribution to party members.
if (battle_config.party_share_type&2) { //Round Robin
TBL_PC *psd;
if (battle_config.party_share_type&2)
{ //Round Robin
TBL_PC* psd;
i = p->itemc;
do {
i++;
if (i >= MAX_PARTY)
i = 0; // reset counter to 1st person in party so it'll stop when it reaches "itemc"
if ((psd=p->data[i].sd)==NULL || sd->bl.m != psd->bl.m ||
pc_isdead(psd) || (battle_config.idle_no_share && (
psd->chatID || psd->vender_id || (psd->idletime < (last_tick - battle_config.idle_no_share)))
))
if( (psd = p->data[i].sd) == NULL || sd->bl.m != psd->bl.m || pc_isdead(psd) ||
(battle_config.idle_no_share && (psd->chatID || psd->vender_id || last_tick - battle_config.idle_no_share > psd->idletime)) )
continue;
if (pc_additem(psd,item_data,item_data->amount))
continue; //Chosen char can't pick up loot.
//Successful pick.
p->itemc = i;
target = psd;
break;
} while (i != p->itemc);
} else { //Random pick
TBL_PC *psd[MAX_PARTY];
int count=0;
}
else
{ //Random pick
TBL_PC* psd[MAX_PARTY];
int count = 0;
//Collect pick candidates
for (i = 0; i < MAX_PARTY; i++) {
if ((psd[count]=p->data[i].sd) && psd[count]->bl.m == sd->bl.m &&
!pc_isdead(psd[count]) && (!battle_config.idle_no_share || (
!psd[count]->chatID && !psd[count]->vender_id &&
(psd[count]->idletime >= (last_tick - battle_config.idle_no_share)))
))
count++;
if( (psd[count] = p->data[i].sd) == NULL || psd[count]->bl.m != sd->bl.m || pc_isdead(psd[count]) ||
(battle_config.idle_no_share && (psd[count]->chatID || psd[count]->vender_id || last_tick - battle_config.idle_no_share > psd[count]->idletime)) )
continue;
count++;
}
while (count > 0) { //Pick a random member.
i = rand()%count;
@ -812,16 +815,17 @@ int party_share_loot(struct party_data *p, TBL_PC *sd, struct item *item_data, i
}
}
}
if (!target) { //Give it to the owner.
target = sd;
if (!target) {
target = sd; //Give it to the char that picked it up
if ((i=pc_additem(sd,item_data,item_data->amount)))
return i;
}
if(log_config.enable_logs&0x8) //Logs items, taken by (P)layers [Lupus]
log_pick_pc(target, "P", item_data->nameid, item_data->amount, item_data);
//Logs
if(battle_config.party_show_share_picker && target != sd){
if(battle_config.party_show_share_picker && target != sd) {
char output[80];
sprintf(output, "%s acquired %s.",target->status.name, itemdb_jname(item_data->nameid));
clif_disp_onlyself(sd,output,strlen(output));

View File

@ -2920,8 +2920,8 @@ int pc_takeitem(struct map_session_data *sd,struct flooritem_data *fitem)
}
}
}
//This function takes care of giving the item to whoever should have it
//considering party-share options.
//This function takes care of giving the item to whoever should have it, considering party-share options.
if ((flag = party_share_loot(p,sd,&fitem->item_data, fitem->first_get_id))) {
clif_additem(sd,0,0,flag);
return 1;
@ -2929,7 +2929,6 @@ int pc_takeitem(struct map_session_data *sd,struct flooritem_data *fitem)
//Display pickup animation.
pc_stop_attack(sd);
clif_takeitem(&sd->bl,&fitem->bl);
map_clearflooritem(fitem->bl.id);
return 1;
@ -3050,7 +3049,7 @@ int pc_useitem(struct map_session_data *sd,int n)
sd->itemindex = n;
amount = sd->status.inventory[n].amount;
script = sd->inventory_data[n]->script;
//Check if the item is to be consumed inmediately [Skotlex]
//Check if the item is to be consumed immediately [Skotlex]
if (sd->inventory_data[n]->flag.delay_consume)
clif_useitemack(sd,n,amount,1);
else {

View File

@ -3859,7 +3859,6 @@ BUILDIN_FUNC(charcommand); // [MouseJstr]
BUILDIN_FUNC(movenpc); // [MouseJstr]
BUILDIN_FUNC(message); // [MouseJstr]
BUILDIN_FUNC(npctalk); // [Valaris]
BUILDIN_FUNC(hasitems); // [Valaris]
BUILDIN_FUNC(getlook); //Lorky [Lupus]
BUILDIN_FUNC(getsavepoint); //Lorky [Lupus]
BUILDIN_FUNC(npcspeed); // [Valaris]
@ -4193,7 +4192,6 @@ struct script_function buildin_func[] = {
BUILDIN_DEF(movenpc,"sii"), // [MouseJstr]
BUILDIN_DEF(message,"s*"), // [MouseJstr]
BUILDIN_DEF(npctalk,"*"), // [Valaris]
BUILDIN_DEF(hasitems,"*"), // [Valaris]
BUILDIN_DEF(mobcount,"ss"),
BUILDIN_DEF(getlook,"i"),
BUILDIN_DEF(getsavepoint,"i"),
@ -11370,29 +11368,6 @@ BUILDIN_FUNC(npctalk)
return 0;
}
/*==========================================
* hasitems (checks to see if player has any
* items on them, if so will return a 1)
* [Valaris]
*------------------------------------------*/
BUILDIN_FUNC(hasitems)
{
int i;
TBL_PC *sd;
sd=script_rid2sd(st);
for(i=0; i<MAX_INVENTORY; i++) {
if(sd->status.inventory[i].amount && sd->status.inventory[i].nameid!=2364 && sd->status.inventory[i].nameid!=2365) {
script_pushint(st,1);
return 0;
}
}
script_pushint(st,0);
return 0;
}
// change npc walkspeed [Valaris]
BUILDIN_FUNC(npcspeed)
{

View File

@ -3537,7 +3537,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
)
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);
abra_skilllv = min(skilllv, skill_get_max(abra_skillid));
clif_skill_nodamage (src, bl, skillid, skilllv, 1);
if (sd)

View File

@ -39,7 +39,7 @@ int storage_guild_storagesaved(int guild_id); //Ack from char server that guild
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);
void storage_sortitem(struct storage* stor);
void storage_gsortitem(struct guild_storage* gstor);
#endif /* _STORAGE_H_ */