summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt15
-rw-r--r--src/map/itemdb.c2
-rw-r--r--src/map/skill.c133
-rw-r--r--src/map/status.c3
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;