From 9f8f222a8dc995e03cb51ac827e790c5926b312d Mon Sep 17 00:00:00 2001 From: skotlex Date: Fri, 18 Aug 2006 02:04:25 +0000 Subject: - Vaporize will no fail when the homun is dead. - Corrected thhe double free issue that occurs when a homun dies and has no intimacy left. - Fixed the charsave_method:1 saving/loading exp as signed ints rather than unsigned. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@8335 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-Trunk.txt | 5 +++++ src/map/battle.c | 2 -- src/map/charsave.c | 9 ++++++--- src/map/mercenary.c | 20 +++++++++++--------- 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index 2109948f6..ceeae54e9 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/08/17 + * Vaporize will no fail when the homun is dead. [Skotlex] + * Corrected thhe double free issue that occurs when a homun dies and has no + intimacy left. [Skotlex] + * Fixed the charsave_method:1 saving/loading exp as signed ints rather than + unsigned. [Skotlex] * Applied use of structure regen_data for a unified regen module. Natural and skill-heal is handled by this structure, while sitting-skill-heal is still player dependant (mostly because the other object types can't sit) diff --git a/src/map/battle.c b/src/map/battle.c index 12e8f69f6..4f2e03e5f 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -1213,8 +1213,6 @@ static struct Damage battle_calc_weapon_attack( case W_SHOTGUN: case W_GATLING: case W_GRENADE: - case W_WHIP: //These two do use arrow based skills. - case W_MUSICAL: break; default: i |= 16; // for ex. shuriken must not be influenced by DEX diff --git a/src/map/charsave.c b/src/map/charsave.c index 0c55164cb..1be249e5a 100644 --- a/src/map/charsave.c +++ b/src/map/charsave.c @@ -24,6 +24,7 @@ struct mmo_charstatus *charsave_loadchar(int charid){ int i,j, friends; struct mmo_charstatus *c; char *str_p; + double exp; friends = 0; c = (struct mmo_charstatus *)aCalloc(1,sizeof(struct mmo_charstatus)); @@ -62,8 +63,10 @@ struct mmo_charstatus *charsave_loadchar(int charid){ c->class_ = atoi(charsql_row[4]); c->base_level = atoi(charsql_row[5]); c->job_level = atoi(charsql_row[6]); - c->base_exp = atoi(charsql_row[7]); - c->job_exp = atoi(charsql_row[8]); + exp = atof(charsql_row[7]); + c->base_exp = (unsigned int)cap_value(exp,0,UINT_MAX); + exp = atof(charsql_row[8]); + c->job_exp = (unsigned int)cap_value(exp,0,UINT_MAX); c->zeny = atoi(charsql_row[9]); c->str = atoi(charsql_row[10]); c->agi = atoi(charsql_row[11]); @@ -276,7 +279,7 @@ int charsave_savechar(int charid, struct mmo_charstatus *c){ // char tmp_str2[512]; //First save the 'char' sprintf(tmp_sql ,"UPDATE `char` SET `class`='%d', `base_level`='%d', `job_level`='%d'," - "`base_exp`='%d', `job_exp`='%d', `zeny`='%d'," + "`base_exp`='%u', `job_exp`='%u', `zeny`='%d'," "`max_hp`='%d',`hp`='%d',`max_sp`='%d',`sp`='%d',`status_point`='%d',`skill_point`='%d'," "`str`='%d',`agi`='%d',`vit`='%d',`int`='%d',`dex`='%d',`luk`='%d'," "`option`='%d',`karma`='%d',`manner`='%d',`party_id`='%d',`guild_id`='%d',`pet_id`='%d'," diff --git a/src/map/mercenary.c b/src/map/mercenary.c index 3988ce27d..fff6a23f1 100644 --- a/src/map/mercenary.c +++ b/src/map/mercenary.c @@ -114,26 +114,25 @@ void merc_damage(struct homun_data *hd,struct block_list *src,int hp,int sp) int merc_hom_dead(struct homun_data *hd, struct block_list *src) { struct map_session_data *sd = hd->master; + + clif_emotion(&hd->bl, 16) ; //wah if (!sd) - { - clif_emotion(&hd->bl, 16) ; //wah return 7; - } //Delete timers when dead. merc_hom_hungry_timer_delete(hd); sd->homunculus.hp = 0 ; clif_hominfo(sd,hd,0); // Send dead flag - if(!merc_hom_decrease_intimacy(hd, 100)) { // Intimacy was < 100 + if(!merc_hom_decrease_intimacy(hd, 100)) // Intimacy was < 100 clif_emotion(&sd->bl, 23) ; //omg - return 7; //Delete from memory. + else { + clif_emotion(&sd->bl, 28) ; //sob + clif_send_homdata(hd->master,SP_INTIMATE,hd->master->homunculus.intimacy / 100); } - clif_send_homdata(hd->master,SP_INTIMATE,hd->master->homunculus.intimacy / 100); - clif_emotion(&hd->bl, 16) ; //wah - clif_emotion(&sd->bl, 28) ; //sob - return 3; //Remove from map. + //Remove from map (if it has no intimacy, it is auto-removed from memory) + return 3; } //Vaporize a character's homun. If flag, HP needs to be 80% or above. @@ -147,6 +146,9 @@ int merc_hom_vaporize(struct map_session_data *sd, int flag) if (!hd || sd->homunculus.vaporize) return 0; + if (status_isdead(&hd->bl)) + return 0; //Can't vaporize a dead homun. + if (flag && hd->battle_status.hp < (hd->battle_status.max_hp*80/100)) return 0; -- cgit v1.2.3-70-g09d2