diff options
-rw-r--r-- | Changelog-Trunk.txt | 15 | ||||
-rw-r--r-- | src/map/itemdb.c | 2 | ||||
-rw-r--r-- | src/map/skill.c | 133 | ||||
-rw-r--r-- | src/map/status.c | 3 |
4 files changed, 81 insertions, 72 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index 430ceeb43..06429ddbb 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -3,6 +3,21 @@ Date Added AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK. IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. +2007/10/05 + * Removed a broken remnant of code from old gospel code (r4349) that's + _supposed_ to clear the gospel status (no item use?) when you step + out of its zone; 1) the constant UNT_GOSPEL was used in a switch() + instead of PA_GOSPEL (thus actually ending 'NPC_STUNATTACK' status), + and 2) this code path is never taken, because Gospel is not recorded + in skill_unit_temp[] (it has a periodic timer and is not DUALMODE) + * Now the first empty spot in the 'skill_unit_temp' array will be used + when tracking movement between land skills; reduced its length to 20 + * Fixed the skill unit mechanism that is supposed to track whether + you're still standing in a certain land skill's AoE or not, which + was not working correctly since the time it was added (r3133) + - solves the nasty problem of Loki, Quagmire, ... status not ending + even after stepping out of it in some cases, if there was another + song overlapping the skill's area (fixes bugreport:34) [ultramage] 2007/10/04 * Completed the SC_LIFEINSURANCE status and it's status icon. [Zephyrus] - Updated Item_db.txt. diff --git a/src/map/itemdb.c b/src/map/itemdb.c index 7d6514446..e110bf488 100644 --- a/src/map/itemdb.c +++ b/src/map/itemdb.c @@ -696,7 +696,7 @@ static int itemdb_gendercheck(struct item_data *id) /*========================================== * processes one itemdb entry *------------------------------------------*/ -static bool itemdb_parse_dbrow(char** str, char* source, int line) +static bool itemdb_parse_dbrow(const char** str, const char* source, int line) { /* +----+--------------+---------------+------+-----------+------------+--------+--------+---------+-------+-------+------------+-------------+---------------+-----------------+--------------+-------------+------------+------+--------+--------------+----------------+ diff --git a/src/map/skill.c b/src/map/skill.c index f941d5b8e..11ce69536 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -2297,8 +2297,6 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds * 0 =—\–ñ?B0‚ɌŒè *------------------------------------------*/ static int skill_area_temp[8]; -static int skill_unit_temp[64]; /* For storing skill_unit ids as players move in/out of them. [Skotlex] */ -static int skill_unit_index=0; //Well, yeah... am too lazy to pass pointers around :X typedef int (*SkillFunc)(struct block_list *, struct block_list *, int, int, unsigned int, int); int skill_area_sub (struct block_list *bl, va_list ap) { @@ -3409,13 +3407,13 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int *------------------------------------------*/ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, int skillid, int skilllv, unsigned int tick, int flag) { - struct map_session_data *sd = NULL; - struct homun_data *hd = NULL; - struct map_session_data *dstsd = NULL; + struct map_session_data *sd; + struct homun_data *hd; + struct map_session_data *dstsd; struct status_data *sstatus, *tstatus; struct status_change *tsc; - struct mob_data *md = NULL; - struct mob_data *dstmd = NULL; + struct mob_data *md; + struct mob_data *dstmd; int i,type; if(skillid > 0 && skilllv <= 0) return 0; // celest @@ -3426,19 +3424,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in if (src->m != bl->m) return 1; - if (src->type == BL_PC) { - sd = (struct map_session_data *)src; - } else if (src->type == BL_HOM) { //[orn] - hd = (struct homun_data *)src; - } else if (src->type == BL_MOB) { - md = (struct mob_data *)src; - } + BL_CAST(BL_PC, src, sd); + BL_CAST(BL_HOM, src, hd); + BL_CAST(BL_MOB, src, md); - if (bl->type == BL_PC){ - dstsd = (struct map_session_data *)bl; - } else if (bl->type == BL_MOB){ - dstmd = (struct mob_data *)bl; - } + BL_CAST(BL_PC, bl, dstsd); + BL_CAST(BL_MOB, bl, dstmd); if(bl->prev == NULL) return 1; @@ -7647,7 +7638,7 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns return skillid; } /*========================================== - * + * Triggered when a char steps out of a skill cell *------------------------------------------*/ int skill_unit_onout (struct skill_unit *src, struct block_list *bl, unsigned int tick) { @@ -7691,7 +7682,7 @@ int skill_unit_onout (struct skill_unit *src, struct block_list *bl, unsigned in } /*========================================== - * Triggered when a char steps out of a skill group [Skotlex] + * Triggered when a char steps out of a skill group (entirely) [Skotlex] *------------------------------------------*/ static int skill_unit_onleft (int skill_id, struct block_list *bl, unsigned int tick) { @@ -7774,10 +7765,6 @@ static int skill_unit_onleft (int skill_id, struct block_list *bl, unsigned int } } break; - case UNT_GOSPEL: - if (sc && sc->data[type].timer != -1 && sc->data[type].val4 == BCT_ALL) //End item-no-use Gospel Effect. [Skotlex] - status_change_end(bl, type, -1); - break; } return skill_id; @@ -10064,13 +10051,16 @@ int skill_delunitgroup (struct block_list *src, struct skill_unit_group *group, } } - if (group->unit_id == UNT_GOSPEL) { //Clear Gospel [Skotlex] + // end Gospel's status change on 'src' + // (needs to be done when the group is deleted by other means than skill deactivation) + if (group->unit_id == UNT_GOSPEL) { struct status_change *sc = status_get_sc(src); if(sc && sc->data[SC_GOSPEL].timer != -1) { sc->data[SC_GOSPEL].val3 = 0; //Remove reference to this group. [Skotlex] status_change_end(src,SC_GOSPEL,-1); } } + if (group->skill_id == SG_SUN_WARM || group->skill_id == SG_MOON_WARM || group->skill_id == SG_STAR_WARM) { @@ -10315,6 +10305,7 @@ int skill_unit_timer (int tid, unsigned int tick, int id, int data) return 0; } +static int skill_unit_temp[20]; // temporary storage for tracking skill unit skill ids as players move in/out of them /*========================================== * *------------------------------------------*/ @@ -10328,6 +10319,7 @@ int skill_unit_move_sub (struct block_list* bl, va_list ap) int flag = va_arg(ap,int); int skill_id; + int i; nullpo_retr(0, group); @@ -10357,9 +10349,8 @@ int skill_unit_move_sub (struct block_list* bl, va_list ap) if( flag&1 ) { if( flag&2 ) - { //Clear skill ids we have stored in onout. - int i; - ARR_FIND(0, ARRAYLENGTH(skill_unit_temp), i, skill_unit_temp[i] == skill_id ); + { //Clear this skill id. + ARR_FIND( 0, ARRAYLENGTH(skill_unit_temp), i, skill_unit_temp[i] == skill_id ); if( i < ARRAYLENGTH(skill_unit_temp) ) skill_unit_temp[i] = 0; } @@ -10367,9 +10358,10 @@ int skill_unit_move_sub (struct block_list* bl, va_list ap) else { if( flag&2 ) - { //Store this unit id. - if( skill_unit_index < ARRAYLENGTH(skill_unit_temp) ) - skill_unit_temp[skill_unit_index++] = skill_id; + { //Store this skill id. + ARR_FIND( 0, ARRAYLENGTH(skill_unit_temp), i, skill_unit_temp[i] == 0 ); + if( i < ARRAYLENGTH(skill_unit_temp) ) + skill_unit_temp[i] = skill_id; else if( battle_config.error_log ) ShowError("skill_unit_move_sub: Reached limit of unit objects per cell!\n"); } @@ -10378,45 +10370,48 @@ int skill_unit_move_sub (struct block_list* bl, va_list ap) if( flag&4 ) skill_unit_onleft(skill_id,target,tick); } + if( flag&64 ) skill_dance_switch(unit, group, 1); return 0; } - - if( flag&1 ) - { - unsigned int result = skill_unit_onplace(unit,target,tick); - if( flag&2 && result ) - { //Clear skill ids we have stored in onout. - int i; - ARR_FIND(0, ARRAYLENGTH(skill_unit_temp), i, skill_unit_temp[i] == result ); - if( i < ARRAYLENGTH(skill_unit_temp) ) - skill_unit_temp[i] = 0; - } - } else { - unsigned int result = skill_unit_onout(unit,target,tick); - if( flag&2 && result ) - { //Store this unit id. - if( skill_unit_index < ARRAYLENGTH(skill_unit_temp) ) - skill_unit_temp[skill_unit_index++] = result; - else if( battle_config.error_log ) - ShowError("skill_unit_move_sub: Reached limit of unit objects per cell!\n"); + if( flag&1 ) + { + unsigned int result = skill_unit_onplace(unit,target,tick); + if( flag&2 && result ) + { //Clear skill ids we have stored in onout. + ARR_FIND( 0, ARRAYLENGTH(skill_unit_temp), i, skill_unit_temp[i] == result ); + if( i < ARRAYLENGTH(skill_unit_temp) ) + skill_unit_temp[i] = 0; + } + } + else + { + unsigned int result = skill_unit_onout(unit,target,tick); + if( flag&2 && result ) + { //Store this unit id. + ARR_FIND( 0, ARRAYLENGTH(skill_unit_temp), i, skill_unit_temp[i] == 0 ); + if( i < ARRAYLENGTH(skill_unit_temp) ) + skill_unit_temp[i] = skill_id; + else if( battle_config.error_log ) + ShowError("skill_unit_move_sub: Reached limit of unit objects per cell!\n"); + } } - } - //TODO: Normally, this is dangerous since the unit and group could be freed - //inside the onout/onplace functions. Currently it is safe because we know song/dance - //cells do not get deleted within them. [Skotlex] - if( flag&64 ) - skill_dance_switch(unit, group, 1); - - if( flag&4 ) - skill_unit_onleft(skill_id,target,tick); + //TODO: Normally, this is dangerous since the unit and group could be freed + //inside the onout/onplace functions. Currently it is safe because we know song/dance + //cells do not get deleted within them. [Skotlex] + if( flag&64 ) + skill_dance_switch(unit, group, 1); + + if( flag&4 ) + skill_unit_onleft(skill_id,target,tick); - return 1; + return 1; + } } /*========================================== @@ -10431,22 +10426,22 @@ int skill_unit_move (struct block_list *bl, unsigned int tick, int flag) { nullpo_retr(0, bl); - if(bl->prev==NULL ) + if( bl->prev == NULL ) return 0; - if (flag&2 && !(flag&1)) + if( flag&2 && !(flag&1) ) { //Onout, clear data - memset (&skill_unit_temp,0,sizeof(skill_unit_temp)); - skill_unit_index=0; + memset(skill_unit_temp, 0, sizeof(skill_unit_temp)); } map_foreachincell(skill_unit_move_sub,bl->m,bl->x,bl->y,BL_SKILL,bl,tick,flag); - if (flag&2 && flag&1) - { //Onplace, check any skill units you have left. + if( flag&2 && flag&1 ) + { //Onplace, check any skill units you have left. int i; - for (i=0; i < ARRAYLENGTH(skill_unit_temp) && skill_unit_temp[i]; i++) - skill_unit_onleft(skill_unit_temp[i], bl, tick); + 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/status.c b/src/map/status.c index 69c4b5053..441ee1959 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -4850,7 +4850,6 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val break; case SC_SILENCE: if (sc->data[SC_GOSPEL].timer!=-1 && sc->data[SC_GOSPEL].val4 == BCT_SELF) - //Clear Gospel [Skotlex] status_change_end(bl,SC_GOSPEL,-1); break; case SC_HIDING: @@ -6357,7 +6356,7 @@ int status_change_end( struct block_list* bl , int type,int tid ) sc_start4(bl, SC_REGENERATION, 100, 10,0,0,(RGN_HP|RGN_SP), skill_get_time(LK_BERSERK, sc->data[type].val1)); break; - case SC_GOSPEL: //Clear the buffs from other chars. + case SC_GOSPEL: if (sc->data[type].val3) { //Clear the group. struct skill_unit_group *group = (struct skill_unit_group *)sc->data[type].val3; sc->data[type].val3 = 0; |