From 0fb0df3a0fa3ac24f9f068d0c1ac664beec03354 Mon Sep 17 00:00:00 2001 From: skotlex Date: Tue, 5 Sep 2006 19:49:38 +0000 Subject: - Corrected SC_INTRAVISION not starting. - Small cleanups (line terminators, indenting) - Fixed crash when attempting to read a Label as a string on a script (thanks to End of Exam) - Fixed possible crash when changing a chat-room's owner (thanks to End of Exam) git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@8639 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-Trunk.txt | 5 +++++ src/map/chat.c | 11 ++++++---- src/map/clif.c | 63 +++++++++++++++++++++++++++-------------------------- src/map/mob.h | 2 +- src/map/npc.c | 1 - src/map/npc.h | 2 -- src/map/script.c | 21 ++++++++---------- src/map/script.h | 2 +- src/map/status.c | 6 +++-- 9 files changed, 59 insertions(+), 54 deletions(-) diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index 0fd7e0dbf..68d61111d 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -4,6 +4,11 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. 2006/09/05 + * Corrected SC_INTRAVISION not starting. [Skotlex] + * Fixed crash when attempting to read a Label as a string on a script + (thanks to End of Exam) [Skotlex] + * Fixed possible crash when changing a chat-room's owner (thanks to End of + Exam) [Skotlex] * Fixed dispell removing SC_NOCHAT [Skotlex] * Small fix which should correct skill_attack damaging hidden characters when it shouldn't. [Skotlex] diff --git a/src/map/chat.c b/src/map/chat.c index 6d84aca4c..a1bb7a293 100644 --- a/src/map/chat.c +++ b/src/map/chat.c @@ -145,16 +145,18 @@ int chat_leavechat(struct map_session_data *sd) pc_setchatid(sd,0); if(cd->users == 0 && (*cd->owner)->type==BL_PC){ - // 全員居なくなった&PCのチャットなので消す + //Delete empty chatroom clif_clearchat(cd,0); - map_delobject(cd->bl.id); // freeまでしてくれる + map_delobject(cd->bl.id); } else { for(i=leavechar;i < cd->users;i++) cd->usersd[i] = cd->usersd[i+1]; if(leavechar==0 && (*cd->owner)->type==BL_PC){ - // PCのチャットなので所有者が抜けたので位置変更 + //Adjust Chat location after owner has been changed. + map_delblock( &cd->bl ); cd->bl.x=cd->usersd[0]->bl.x; cd->bl.y=cd->usersd[0]->bl.y; + map_addblock( &cd->bl ); } clif_dispchat(cd,0); } @@ -197,9 +199,10 @@ int chat_changechatowner(struct map_session_data *sd,char *nextownername) cd->usersd[0] = cd->usersd[nextowner]; cd->usersd[nextowner] = tmp_sd; - // 新しい所有者の位置へ変更 + map_delblock( &cd->bl ); cd->bl.x=cd->usersd[0]->bl.x; cd->bl.y=cd->usersd[0]->bl.y; + map_addblock( &cd->bl ); // 再度表示 clif_dispchat(cd,0); diff --git a/src/map/clif.c b/src/map/clif.c index 8018cbf82..a1942d5fc 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -11707,39 +11707,40 @@ int clif_parse(int fd) { if ((int)RFIFOREST(fd) < packet_len) return 0; // まだ1パケット分データが揃ってない - #if DUMP_ALL_PACKETS +#if DUMP_ALL_PACKETS + { + int i; + FILE *fp; + char packet_txt[256] = "save/packet.txt"; + time_t now; dump = 1; - int i; - FILE *fp; - char packet_txt[256] = "save/packet.txt"; - time_t now; - dump = 1; - - if ((fp = fopen(packet_txt, "a")) == NULL) { - ShowError("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 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, "\tsession #%d, packet 0x%04x, length %d, version %d\n", fd, cmd, packet_len, packet_ver); - 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 ((fp = fopen(packet_txt, "a")) == NULL) { + ShowError("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 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, "\tsession #%d, packet 0x%04x, length %d, version %d\n", fd, cmd, packet_len, packet_ver); + 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 (sd && sd->state.auth == 1 && sd->state.waitingdisconnect == 1) { // 切断待ちの場合パケットを処理しない diff --git a/src/map/mob.h b/src/map/mob.h index 4c83e14c6..bb4e1ac57 100644 --- a/src/map/mob.h +++ b/src/map/mob.h @@ -144,7 +144,7 @@ int mobdb_searchname(const char *str); int mobdb_searchname_array(struct mob_db** data, int size, const char *str); int mobdb_checkid(const int id); struct view_data* mob_get_viewdata(int class_); -struct mob_data *mob_once_spawn_sub(struct block_list *bl, int m, +struct mob_data *mob_once_spawn_sub(struct block_list *bl, int m, short x, short y, const char *mobname, int class_, const char *event); int mob_once_spawn(struct map_session_data *sd,char *mapname, short x,short y,const char *mobname,int class_,int amount,const char *event); diff --git a/src/map/npc.c b/src/map/npc.c index 16affe0eb..6971313c8 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -52,7 +52,6 @@ static int npc_mob=0; static int npc_delay_mob=0; static int npc_cache_mob=0; char *current_file = NULL; -//int dummy_npc_id=0; int npc_get_new_npc_id(void){ return npc_id++; } static struct dbt *ev_db; diff --git a/src/map/npc.h b/src/map/npc.h index 8e8949cc5..94de8064a 100644 --- a/src/map/npc.h +++ b/src/map/npc.h @@ -81,8 +81,6 @@ int npc_unload(struct npc_data *nd); int npc_reload(void); int npc_script_event(TBL_PC* sd, int type); -extern int dummy_npc_id; - extern char *current_file; struct npc_data *fake_nd; diff --git a/src/map/script.c b/src/map/script.c index f881a5548..168cfb857 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -559,8 +559,7 @@ unsigned char* parse_simpleexpr(unsigned char *p) int c,l; char *p2; // label , register , function etc - //From what I read, jA figured a better way to handle empty parenthesis '()' - if(skip_word(p)==p/* && !(*p==')' && p[-1]=='(')*/){ + if(skip_word(p)==p){ disp_error_message("unexpected character",p); exit(1); } @@ -1494,7 +1493,6 @@ static void read_constdb(void) type=0; if(sscanf(line,"%[A-Za-z0-9_],%[0-9xXA-Fa-f],%d",name,val,&type)>=2 || sscanf(line,"%[A-Za-z0-9_] %[0-9xXA-Fa-f] %d",name,val,&type)>=2){ - for(i=0;name[i];i++) name[i]=tolower(name[i]); n=add_str((const unsigned char *) name); @@ -1929,12 +1927,13 @@ char* conv_str(struct script_state *st,struct script_data *data) snprintf(buf,ITEM_NAME_LENGTH, "%d",data->u.num); data->type=C_STR; data->u.str=buf; -#if 1 + } else if(data->type==C_POS) { + // Protect form crashes by passing labels to string-expected args [jA2200] + data->type = C_CONSTSTR; + data->u.str = "** SCRIPT ERROR **"; } else if(data->type==C_NAME){ - // テンポラリ。本来無いはず data->type=C_CONSTSTR; data->u.str=str_buf+str_data[data->u.num].str; -#endif } return data->u.str; } @@ -2630,10 +2629,10 @@ void run_script_main(struct script_state *st) if(stack->sp > stack->defsp) { //sp > defsp is valid in cases when you invoke functions and don't use the returned value. [Skotlex] //Since sp is supposed to be defsp in these cases, we could assume the extra stack elements are unneeded. - if (battle_config.etc_log) - { - ShowWarning("Clearing unused stack stack.sp(%d) -> default(%d)\n",stack->sp,stack->defsp); - report_src(st); + if (battle_config.etc_log) + { + ShowWarning("Clearing unused stack stack.sp(%d) -> default(%d)\n",stack->sp,stack->defsp); + report_src(st); } pop_stack(stack, stack->defsp, stack->sp); //Clear out the unused stack-section. } else if(battle_config.error_log) @@ -2791,7 +2790,6 @@ int mapreg_setreg(int num,int val) } } #endif - // else } else { // [zBuffer] #if !defined(TXT_ONLY) && defined(MAPREGSQL) if(name[1] != '@') { // Remove from database because it is unused. @@ -11715,7 +11713,6 @@ int buildin_axtoi(struct script_state *st) return 0; } - // [zBuffer] List of player cont commands ---> int buildin_rid2name(struct script_state *st){ struct block_list *bl = NULL; diff --git a/src/map/script.h b/src/map/script.h index f4bca3569..9970937a5 100644 --- a/src/map/script.h +++ b/src/map/script.h @@ -35,7 +35,7 @@ struct script_data { int num; char *str; } u; - struct linkdb_node** ref; // リファレンス + struct linkdb_node** ref; }; // Moved defsp from script_state to script_stack since diff --git a/src/map/status.c b/src/map/status.c index b55773e23..65fcf8f12 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -5561,9 +5561,11 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val if (map[bl->m].flag.pvp) tick /=2; break; + case SC_INTRAVISION: case SC_ARMOR_ELEMENT: - break; // It just change the armor element of the player (used by battle_attr_fix) - // So it has no SCB and no skill associated (used by potion scripts) + //Place here SCs that have no SCB_* data, no skill associated, no ICON + //associated, and yet are not wrong/unknown. [Skotlex] + break; default: if (calc_flag == SCB_NONE && StatusSkillChangeTable[type]==0 && -- cgit v1.2.3-70-g09d2