diff options
-rw-r--r-- | Changelog.txt | 6 | ||||
-rw-r--r-- | src/map/battle.c | 2 | ||||
-rw-r--r-- | src/map/chrif.c | 11 | ||||
-rw-r--r-- | src/map/chrif.h | 1 | ||||
-rw-r--r-- | src/map/clif.c | 6 | ||||
-rw-r--r-- | src/map/pc.c | 10 | ||||
-rw-r--r-- | src/map/skill.c | 13 |
7 files changed, 40 insertions, 9 deletions
diff --git a/Changelog.txt b/Changelog.txt index 9c7e10008..1919f715e 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,10 @@ Date Added +12/4 + * Fixed a change associated with NPC_BARRIER [MouseJstr] + * Renamed flush_fifos_at_exit to flush_fifos [MouseJstr] + * call check_connect_char_server() on char_server disconnect [MouseJstr] + * stale skill groups were crashing server [MouseJstr] + * Fixed crash in SC_LULLABY [MouseJstr] 12/3 * hacked the frozen mob issue [MouseJstr] * Fixed a battle_range crash [MouseJstr] diff --git a/src/map/battle.c b/src/map/battle.c index 6b1d68625..b6ef4146d 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -4964,7 +4964,7 @@ int battle_check_range(struct block_list *src,struct block_list *bl,int range) // be lenient if the skill was cast before we have moved to the correct position [Celest] if (src->type != BL_PC) return 0; - else if (src->type == BL_PC) { + else if (bl->type == BL_PC) { struct map_session_data *sd; nullpo_retr(0, (sd=(struct map_session_data *)bl)); if (sd->walktimer != -1 && !((arange-=battle_config.skill_range_leniency)<=range)) diff --git a/src/map/chrif.c b/src/map/chrif.c index 479b328f5..d11604bc3 100644 --- a/src/map/chrif.c +++ b/src/map/chrif.c @@ -980,6 +980,17 @@ int chrif_parse(int fd) if (fd == char_fd) { printf("Map-server can't connect to char-server (connection #%d).\n", fd); char_fd = -1; + check_connect_char_server(0, 0, 0, 0); + while (char_fd <= 0 || session[char_fd] == NULL) { + struct map_session_data *sd; + int idx; + for (idx = 0; idx <fd_max; idx++) + if ((session[idx] != NULL) && (sd = session[idx]->session_data) && sd && sd->state.auth) + clif_displaymessage(idx, "Map server is paused waiting for char server to return.."); + flush_fifos(); + sleep(10); + check_connect_char_server(0, 0, 0, 0); + } } close(fd); delete_session(fd); diff --git a/src/map/chrif.h b/src/map/chrif.h index ab4f9580b..5f43120cc 100644 --- a/src/map/chrif.h +++ b/src/map/chrif.h @@ -27,6 +27,7 @@ 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_init_chrif(void); diff --git a/src/map/clif.c b/src/map/clif.c index 34ee7aaea..79ca0e227 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -4845,6 +4845,8 @@ int clif_refine(int fd,struct map_session_data *sd,int fail,int index,int val) */ 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); @@ -5535,6 +5537,8 @@ 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; @@ -6247,6 +6251,8 @@ int clif_guild_memberlogin_notice(struct guild *g,int idx,int flag) 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; diff --git a/src/map/pc.c b/src/map/pc.c index f0e2a719f..0c8c32b9a 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -981,7 +981,9 @@ int pc_calc_skilltree_normalize_job(int c, struct map_session_data *sd) { else if ((sd->status.skill_point >= sd->status.job_level && skill_point < sd->change_level+8) && (c > 6 && c < 23)) { switch(c) { case 7: + case 13: case 14: + case 21: c = 1; break; case 8: @@ -1005,8 +1007,10 @@ int pc_calc_skilltree_normalize_job(int c, struct map_session_data *sd) { case 17: c = 6; break; - /*case 4008: + case 4008: + case 4014: case 4015: + case 4022: c = 4002; break; case 4009: @@ -1031,7 +1035,9 @@ int pc_calc_skilltree_normalize_job(int c, struct map_session_data *sd) { c = 4007; break; case 4030: + case 4036: case 4037: + case 4044: c = 4024; break; case 4031: @@ -1054,7 +1060,7 @@ int pc_calc_skilltree_normalize_job(int c, struct map_session_data *sd) { case 4035: case 4043: c = 4029; - break;*/ + break; } } } diff --git a/src/map/skill.c b/src/map/skill.c index 8f711fd57..19e84d791 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -4264,9 +4264,9 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int int skill_time = skill_get_time(skillid,skilllv); clif_skill_nodamage(src,bl,skillid,skilllv,1); skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_time,0 ); - if (bl->type == BL_MOB) + if (src->type == BL_MOB) mob_changestate((struct mob_data *)src,MS_DELAY,skill_time); - else if (bl->type == BL_PC) + else if (src->type == BL_PC) sd->attackabletime = sd->canmove_tick = tick + skill_time; } break; @@ -6023,7 +6023,7 @@ int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int if (sc_data[type].timer==-1) skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),0); else if((unit2=(struct skill_unit *)sc_data[type].val2) && unit2 != src ){ - if( DIFF_TICK(sg->tick,unit2->group->tick)>0 ) + if( unit2->group != 0 && DIFF_TICK(sg->tick,unit2->group->tick)>0 ) skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),0); ts->tick-=sg->interval; } @@ -6080,7 +6080,7 @@ int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int skill_status_change_start(bl,type,sg->skill_lv,(sg->val1)>>16,(sg->val1)&0xffff, (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0); else if((unit2=(struct skill_unit *)sc_data[type].val4) && unit2 != src ){ - if( DIFF_TICK(sg->tick,unit2->group->tick)>0 ) + if( unit2->group != 0 && DIFF_TICK(sg->tick,unit2->group->tick)>0 ) skill_status_change_start(bl,type,sg->skill_lv,(sg->val1)>>16,(sg->val1)&0xffff, (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0); ts->tick-=sg->interval; @@ -8926,8 +8926,9 @@ int skill_status_change_timer(int tid, unsigned int tick, int id, int data) if(!unit || !unit->group || 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); - sc_data[type].timer=add_timer(skill_get_time(unit->group->skill_id,unit->group->skill_lv)/10+tick, - skill_status_change_timer, bl->id, data ); + if (unit->group != 0) + sc_data[type].timer=add_timer(skill_get_time(unit->group->skill_id,unit->group->skill_lv)/10+tick, + skill_status_change_timer, bl->id, data ); return 0; } break; |