From a506c7fc0edaaf27efd76669361c93dc7e8e640d Mon Sep 17 00:00:00 2001 From: Akinari1087 Date: Tue, 12 Nov 2013 10:36:40 -0700 Subject: [PATCH] Follow up to 4d61cc0 Revert SONIC_CRAW consuming spheres. My mistake Update Eleanor skill damage formulas and spirit sphere consume requirements based on WarpPortal and iROWiki forums Fixed most channel memory leaks - http://rathena.org/board/tracker/issue-8044-memory-leak-revision-17486-causes-players-to-disconnect/ Fixed memory leak caused by item combos breaking out of a loop without freeing --- src/common/mmo.h | 2 +- src/map/battle.c | 12 +++++------- src/map/channel.c | 3 +-- src/map/guild.c | 7 ++----- src/map/pc.c | 4 +++- src/map/skill.c | 14 +++++--------- 6 files changed, 17 insertions(+), 25 deletions(-) diff --git a/src/common/mmo.h b/src/common/mmo.h index b65a6bf8e7..c5d9160845 100644 --- a/src/common/mmo.h +++ b/src/common/mmo.h @@ -532,10 +532,10 @@ struct guild { struct guild_alliance alliance[MAX_GUILDALLIANCE]; struct guild_expulsion expulsion[MAX_GUILDEXPULSION]; struct guild_skill skill[MAX_GUILDSKILL]; + struct Channel *channel; /* TODO: still used for something? */ unsigned short save_flag; // for TXT saving - void *channel; }; struct guild_castle { diff --git a/src/map/battle.c b/src/map/battle.c index 9e0e03860b..2d0dedf042 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -3617,21 +3617,19 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s skillratio += -100 + 70 * skill_lv; break; case MH_SONIC_CRAW: - skillratio += -100 + 40 * skill_lv * status_get_lv(src); - skillratio = skillratio/100; //@TODO uv1 factor need to be confirmed + skillratio = 40 * skill_lv; break; case MH_SILVERVEIN_RUSH: - skillratio += -100 + (150 * skill_lv * status_get_lv(src)) / 100; + skillratio = 150 * skill_lv; break; case MH_MIDNIGHT_FRENZY: - skillratio += -100 + (300 * skill_lv * status_get_lv(src)) / 150; + skillratio = 300 * skill_lv; break; case MH_TINDER_BREAKER: - skillratio += -100 + (100 * skill_lv + status_get_str(src)); - skillratio = (skillratio * status_get_lv(src)) / 120; + skillratio = 100 * skill_lv; break; case MH_CBC: - skillratio += 300 * skill_lv + 4 * status_get_lv(src); + skillratio = 400 * skill_lv; //! TODO: This doesn't seem to be a ratio, but straight damage? break; case MH_MAGMA_FLOW: skillratio += -100 + 100 * skill_lv + 3 * status_get_lv(src); diff --git a/src/map/channel.c b/src/map/channel.c index 8e6c02dbfa..98fec438d4 100644 --- a/src/map/channel.c +++ b/src/map/channel.c @@ -75,7 +75,7 @@ struct Channel* channel_create(char *name, char *pass, unsigned char color, enum int channel_delete(struct Channel *channel) { if(!channel) return -1; - if(channel->type == CHAN_TYPE_PUBLIC && runflag != MAPSERVER_ST_RUNNING) //only delete those serv stop + if(channel->type == CHAN_TYPE_PUBLIC && runflag == MAPSERVER_ST_RUNNING) //only delete those serv stop return -2; if( db_size(channel->users)) { struct map_session_data *sd; @@ -101,7 +101,6 @@ int channel_delete(struct Channel *channel) { } default: strdb_remove(channel_db, channel->name); - aFree(channel); break; } return 0; diff --git a/src/map/guild.c b/src/map/guild.c index 5a945ad5cd..4cd74f368d 100644 --- a/src/map/guild.c +++ b/src/map/guild.c @@ -500,7 +500,6 @@ int guild_recv_info(struct guild *sg) DBData data; struct map_session_data *sd; bool guild_new = false; - struct Channel *channel; nullpo_ret(sg); @@ -545,10 +544,8 @@ int guild_recv_info(struct guild *sg) } if(Channel_Config.ally_enable){ - channel = g->channel; - if(!channel){ - channel = channel_create(Channel_Config.ally_chname,NULL,Channel_Config.ally_chcolor,CHAN_TYPE_ALLY,g->guild_id); - g->channel = channel; + if(!g->channel){ + g->channel = channel_create(Channel_Config.ally_chname,NULL,Channel_Config.ally_chcolor,CHAN_TYPE_ALLY,g->guild_id); channel_ajoin(g); } } diff --git a/src/map/pc.c b/src/map/pc.c index f8b2fcd557..e978054bb3 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -8537,8 +8537,10 @@ int pc_checkcombo(struct map_session_data *sd, struct item_data *data ) { } /* means we broke out of the count loop w/o finding all ids, we can move to the next combo */ - if( j < data->combos[i]->count ) + if( j < data->combos[i]->count ) { + aFree(pair); continue; + } /* we got here, means all items in the combo are matching */ idx = sd->combos.count; diff --git a/src/map/skill.c b/src/map/skill.c index 92191f5c7a..f7c8ea0704 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -696,11 +696,11 @@ bool skill_isNotOk_hom(uint16 skill_id, struct homun_data *hd) break; case MH_CBC: if(!(hd->sc.data[SC_COMBO] && hd->sc.data[SC_COMBO]->val1 == MH_TINDER_BREAKER) - || !hd->homunculus.spiritball) return true; + || !hd->homunculus.spiritball < 2) return true; break; case MH_EQC: if(!(hd->sc.data[SC_COMBO] && hd->sc.data[SC_COMBO]->val1 == MH_CBC) - || !hd->homunculus.spiritball) return true; + || !hd->homunculus.spiritball < 3) return true; break; } @@ -5009,19 +5009,15 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case MH_STAHL_HORN: case MH_NEEDLE_OF_PARALYZE: + case MH_SONIC_CRAW: skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); break; case MH_MIDNIGHT_FRENZY: case MH_SILVERVEIN_RUSH: - case MH_SONIC_CRAW: { TBL_HOM *hd = BL_CAST(BL_HOM,src); - short remove_sphere = (skill_id==MH_SILVERVEIN_RUSH?1:2); - - if(skill_id == MH_SONIC_CRAW) - remove_sphere = hd->homunculus.spiritball; skill_attack(skill_get_type(skill_id),src,src,bl,skill_id,skill_lv,tick,flag); - hom_delspiritball(hd,remove_sphere,0); + hom_delspiritball(hd,skill_id==MH_SILVERVEIN_RUSH?1:2,0); } break; case MH_TINDER_BREAKER: @@ -5031,7 +5027,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint int duration=0; TBL_HOM *hd = BL_CAST(BL_HOM,src); duration = max(skill_lv,(status_get_str(src)/7 - status_get_str(bl)/10))*1000; //Yommy formula - hom_delspiritball(hd,skill_id==MH_EQC?2:1,0); //only EQC consume 2 in grp 2 + hom_delspiritball(hd,skill_id==MH_EQC?3:2,0); //only EQC consume 3 in grp 2 skill_attack(skill_get_type(skill_id),src,src,bl,skill_id,skill_lv,tick,flag); clif_skill_nodamage(src,bl,skill_id,skill_lv, sc_start4(src,bl,status_skill2sc(skill_id),100,skill_lv,src->id,0,0,duration));