diff --git a/src/map/map.c b/src/map/map.c index 53ad77238d..21ad997117 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -1699,32 +1699,7 @@ int map_quit(struct map_session_data *sd) { elemental_clean_effect(sd->ed); unit_remove_map(&sd->ed->bl,CLR_TELEPORT); } - - if( raChSys.ally && sd->status.guild_id ) { - struct guild *g = sd->guild, *sg; - if( g ) { - if( idb_exists(((struct raChSysCh *)g->channel)->users, sd->status.char_id) ) - clif_chsys_left((struct raChSysCh *)g->channel,sd); - for (i = 0; i < MAX_GUILDALLIANCE; i++) { - if( g->alliance[i].guild_id && (sg = guild_search(g->alliance[i].guild_id) ) ) { - if( idb_exists(((struct raChSysCh *)sg->channel)->users, sd->status.char_id) ) - clif_chsys_left((struct raChSysCh *)sg->channel,sd); - break; - } - } - } - } - - if( sd->channel_count ) { - uint8 ch_count = sd->channel_count; - for( i = 0; i < ch_count; i++ ) { - if( sd->channels[i] != NULL ) - clif_chsys_left(sd->channels[i],sd); - } - if( raChSys.closing ) - aFree(sd->channels); - } - + unit_remove_map_pc(sd,CLR_TELEPORT); if( map[sd->bl.m].instance_id ) { // Avoid map conflicts and warnings on next login @@ -3593,8 +3568,11 @@ void do_final(void) // remove all objects on maps for (i = 0; i < map_num; i++) { ShowStatus("Cleaning up maps [%d/%d]: %s..."CL_CLL"\r", i+1, map_num, map[i].name); - if (map[i].m >= 0) + if (map[i].m >= 0) { map_foreachinmap(cleanup_sub, i, BL_ALL); + if( map[i].channel != NULL ) + clif_chsys_delete((struct raChSysCh *)map[i].channel); + } } ShowStatus("Cleaned up %d maps."CL_CLL"\n", map_num); diff --git a/src/map/skill.c b/src/map/skill.c index 9a9b524848..a40fe4caf4 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -2470,8 +2470,8 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds if(rnd()%100 > (1 + skill_lv) ) dmg.blewcount = 0; break; default: - if(damage < dmg.div_ && skill_lv != CH_PALMSTRIKE) - dmg.blewcount = 0; //only pushback when it hit + if(damage < dmg.div_ && skill_id != CH_PALMSTRIKE) + dmg.blewcount = 0; //only pushback when it hit for other break; } switch(skill_id){ @@ -3374,10 +3374,6 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data) ( sc && sc->option&OPTION_HIDE ) ){ skill_blown(src,target,skill_get_blewcount(skl->skill_id, skl->skill_lv), -1, 0x0 ); break; - } else if( tsc && tsc->data[SC_SAFETYWALL] ){ - skill_attack(skl->type,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag); - skill_blown(src,target,skill_get_blewcount(skl->skill_id, skl->skill_lv), -1, 0x0 ); - break; } } default: @@ -12330,7 +12326,7 @@ static int skill_unit_effect (struct block_list* bl, va_list ap) skill_unit_onout(unit,bl,tick); if( flag&4 ) - skill_unit_onleft(skill_id, bl, tick); + skill_unit_onleft(skill_id, bl, tick); }else if( !isTarget && flag&4 && ( group->state.song_dance&0x1 || ( group->src_id == bl->id && group->state.song_dance&0x2 ) ) ){ skill_unit_onleft(skill_id, bl, tick);//Ensemble check to terminate it. } @@ -15935,7 +15931,7 @@ int skill_unit_move (struct block_list *bl, unsigned int tick, int flag) { for( i = 0; i < ARRAYLENGTH(skill_unit_temp); i++ ) if( skill_unit_temp[i] ) skill_unit_onleft(skill_unit_temp[i], bl, tick); - } + } return 0; } diff --git a/src/map/sql/CMakeLists.txt b/src/map/sql/CMakeLists.txt index 47c8e495c5..2e41bc303b 100644 --- a/src/map/sql/CMakeLists.txt +++ b/src/map/sql/CMakeLists.txt @@ -41,6 +41,7 @@ set( SQL_MAP_HEADERS "${SQL_MAP_SOURCE_DIR}/trade.h" "${SQL_MAP_SOURCE_DIR}/unit.h" "${SQL_MAP_SOURCE_DIR}/vending.h" + "${SQL_MAP_SOURCE_DIR}/cashshop.h" ) set( SQL_MAP_SOURCES "${SQL_MAP_SOURCE_DIR}/atcommand.c" @@ -80,6 +81,7 @@ set( SQL_MAP_SOURCES "${SQL_MAP_SOURCE_DIR}/trade.c" "${SQL_MAP_SOURCE_DIR}/unit.c" "${SQL_MAP_SOURCE_DIR}/vending.c" + "${SQL_MAP_SOURCE_DIR}/cashshop.c" ) set( DEPENDENCIES common_sql ) set( LIBRARIES ${GLOBAL_LIBRARIES} ) diff --git a/src/map/unit.c b/src/map/unit.c index 762f127b19..a180ba2216 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -334,7 +334,7 @@ int unit_walktoxy( struct block_list *bl, short x, short y, int flag) if (flag&4 && DIFF_TICK(ud->canmove_tick, gettick()) > 0 && DIFF_TICK(ud->canmove_tick, gettick()) < 2000) - { // Delay walking command. [Skotlex] + { // Delay walking command. [Skotlex] add_timer(ud->canmove_tick+1, unit_delay_walktoxy_timer, bl->id, (x<<16)|(y&0xFFFF)); return 1; } @@ -2293,6 +2293,31 @@ int unit_free(struct block_list *bl, clr_type clrtype) if( sd->duel_invite > 0 ) duel_reject(sd->duel_invite, sd); + if( raChSys.ally && sd->status.guild_id ) { + struct guild *g = sd->guild, *sg; + if( g ) { + if( idb_exists(((struct raChSysCh *)g->channel)->users, sd->status.char_id) ) + clif_chsys_left((struct raChSysCh *)g->channel,sd); + for (i = 0; i < MAX_GUILDALLIANCE; i++) { + if( g->alliance[i].guild_id && (sg = guild_search(g->alliance[i].guild_id) ) ) { + if( idb_exists(((struct raChSysCh *)sg->channel)->users, sd->status.char_id) ) + clif_chsys_left((struct raChSysCh *)sg->channel,sd); + break; + } + } + } + } + + if( sd->channel_count ) { + uint8 ch_count = sd->channel_count; + for( i = 0; i < ch_count; i++ ) { + if( sd->channels[i] != NULL ) + clif_chsys_left(sd->channels[i],sd); + } + if( raChSys.closing ) + aFree(sd->channels); + } + // Notify friends that this char logged out. [Skotlex] map_foreachpc(clif_friendslist_toggle_sub, sd->status.account_id, sd->status.char_id, 0); party_send_logout(sd);