- Added missing creation/destruction of the expcache_ers in guild.c

- Unified status_remove_buffs/status_remove_debuffs into a single function.


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@5946 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
skotlex 2006-04-07 16:57:12 +00:00
parent 4dc9cb89ad
commit 0837bb4f38
5 changed files with 73 additions and 57 deletions

View File

@ -4,6 +4,10 @@ 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/04/07
* Added missing creation/destruction of the expcache_ers in guild.c
[Skotlex]
* Unified status_remove_buffs/status_remove_debuffs into a single function.
[Skotlex]
* Fixed pc_setpos ignoring the clrtype sent to it. [Skotlex]
* unit_free will now use clear type 3 for players (warping out effect)
[Skotlex]

View File

@ -206,6 +206,7 @@ void do_init_guild(void)
castle_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
guild_expcache_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_BASE,sizeof(int));
guild_infoevent_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_BASE,sizeof(int));
expcache_ers = ers_new((uint32)sizeof(struct guild_expcache));
guild_castleinfoevent_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_BASE,sizeof(int));
guild_read_castledb();
@ -2002,4 +2003,5 @@ void do_final_guild(void)
guild_expcache_db->destroy(guild_expcache_db,guild_expcache_db_final);
guild_infoevent_db->destroy(guild_infoevent_db,guild_infoevent_db_final);
guild_castleinfoevent_db->destroy(guild_castleinfoevent_db,guild_infoevent_db_final);
ers_destroy(expcache_ers);
}

View File

@ -5277,7 +5277,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
sc_start(bl,SC_INCMATKRATE,100,-50,skill_get_time2(skillid,skilllv));
break;
case 2: // all buffs removed
status_change_clear_buffs(bl);
status_change_clear_buffs(bl,1);
break;
case 3: // 1000 damage, random armor destroyed
{
@ -6970,7 +6970,7 @@ int skill_unit_onplace_timer(struct skill_unit *src,struct block_list *bl,unsign
}
break;
case 1: // End all negative status
status_change_clear_debuffs (bl);
status_change_clear_buffs(bl,2);
break;
case 2: // Level 10 Blessing
sc_start(bl,SC_BLESSING,100,10,skill_get_time2(sg->skill_id, sg->skill_lv));

View File

@ -4281,8 +4281,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
break;
val2 = tick;
tick = 1000;
status_change_clear_buffs(bl);
status_change_clear_debuffs(bl); //Gospel clears both types.
status_change_clear_buffs(bl,3); //Remove buffs/debuffs
} else
calc_flag = 1;
break;
@ -4318,7 +4317,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
break;
case SC_HERMODE:
status_change_clear_buffs(bl);
status_change_clear_buffs(bl,1);
break;
case SC_REGENERATION:
@ -5772,65 +5771,77 @@ int status_change_timer_sub(struct block_list *bl, va_list ap )
return 0;
}
int status_change_clear_buffs (struct block_list *bl)
/*==========================================
* Clears buffs/debuffs of a character.
* type&1 -> buffs, type&2 -> debuffs
*------------------------------------------
*/
int status_change_clear_buffs (struct block_list *bl, int type)
{
int i;
struct status_change *sc= status_get_sc(bl);
if (!sc || !sc->count)
return 0;
for (i = 20; i < SC_MAX; i++) {
if(i==SC_HALLUCINATION || i==SC_WEIGHT50 || i==SC_WEIGHT90
|| i == SC_QUAGMIRE || i == SC_SIGNUMCRUCIS || i == SC_DECREASEAGI
|| i == SC_SLOWDOWN || i == SC_ANKLE|| i == SC_BLADESTOP
|| i == SC_MINDBREAKER || i == SC_WINKCHARM
|| i == SC_STOP || i == SC_NOCHAT || i == SC_ORCISH
|| i == SC_STRIPWEAPON || i == SC_STRIPSHIELD || i == SC_STRIPARMOR || i == SC_STRIPHELM
|| i == SC_COMBO || i == SC_DANCING || i == SC_GUILDAURA
)
continue;
if(i==SC_BERSERK) sc->data[i].val4 = 1;
if(sc->data[i].timer != -1)
status_change_end(bl,i,-1);
}
return 0;
}
int status_change_clear_debuffs (struct block_list *bl)
{
int i;
struct status_change *sc = status_get_sc(bl);
if (!sc || !sc->count)
return 0;
if (type&2) //Debuffs
for (i = SC_COMMON_MIN; i <= SC_COMMON_MAX; i++) {
if(sc->data[i].timer != -1)
status_change_end(bl,i,-1);
}
//Other ailments not in the common range.
if(sc->data[SC_HALLUCINATION].timer != -1)
status_change_end(bl,SC_HALLUCINATION,-1);
if(sc->data[SC_QUAGMIRE].timer != -1)
status_change_end(bl,SC_QUAGMIRE,-1);
if(sc->data[SC_SIGNUMCRUCIS].timer != -1)
status_change_end(bl,SC_SIGNUMCRUCIS,-1);
if(sc->data[SC_DECREASEAGI].timer != -1)
status_change_end(bl,SC_DECREASEAGI,-1);
if(sc->data[SC_SLOWDOWN].timer != -1)
status_change_end(bl,SC_SLOWDOWN,-1);
if(sc->data[SC_MINDBREAKER].timer != -1)
status_change_end(bl,SC_MINDBREAKER,-1);
if(sc->data[SC_WINKCHARM].timer != -1)
status_change_end(bl,SC_WINKCHARM,-1);
if(sc->data[SC_STOP].timer != -1)
status_change_end(bl,SC_STOP,-1);
if(sc->data[SC_ORCISH].timer != -1)
status_change_end(bl,SC_ORCISH,-1);
if(sc->data[SC_STRIPWEAPON].timer != -1)
status_change_end(bl,SC_STRIPWEAPON,-1);
if(sc->data[SC_STRIPSHIELD].timer != -1)
status_change_end(bl,SC_STRIPSHIELD,-1);
if(sc->data[SC_STRIPARMOR].timer != -1)
status_change_end(bl,SC_STRIPARMOR,-1);
if(sc->data[SC_STRIPHELM].timer != -1)
status_change_end(bl,SC_STRIPHELM,-1);
for (i = SC_COMMON_MAX+1; i < SC_MAX; i++) {
if(sc->data[i].timer == -1)
continue;
switch (i) {
//Stuff that cannot be removed
case SC_WEIGHT50:
case SC_WEIGHT90:
case SC_COMBO:
case SC_DANCING:
case SC_GUILDAURA:
case SC_SAFETYWALL:
case SC_NOCHAT:
case SC_ANKLE:
case SC_BLADESTOP:
case SC_CP_WEAPON:
case SC_CP_SHIELD:
case SC_CP_ARMOR:
case SC_CP_HELM:
continue;
//Debuffs that can be removed.
case SC_HALLUCINATION:
case SC_QUAGMIRE:
case SC_SIGNUMCRUCIS:
case SC_DECREASEAGI:
case SC_SLOWDOWN:
case SC_MINDBREAKER:
case SC_WINKCHARM:
case SC_STOP:
case SC_ORCISH:
case SC_STRIPWEAPON:
case SC_STRIPSHIELD:
case SC_STRIPARMOR:
case SC_STRIPHELM:
if (!(type&2))
continue;
break;
//The rest are buffs that can be removed.
case SC_BERSERK:
if (!(type&1))
continue;
sc->data[i].val4 = 1;
break;
default:
if (!(type&1))
continue;
break;
}
status_change_end(bl,i,-1);
}
return 0;
}

View File

@ -510,8 +510,7 @@ int status_change_end( struct block_list* bl , int type,int tid );
int status_change_timer(int tid, unsigned int tick, int id, int data);
int status_change_timer_sub(struct block_list *bl, va_list ap );
int status_change_clear(struct block_list *bl,int type);
int status_change_clear_buffs(struct block_list *bl);
int status_change_clear_debuffs(struct block_list *bl);
int status_change_clear_buffs(struct block_list *bl, int type);
int status_calc_pet(struct map_session_data* sd, int first); // [Skotlex]
int status_calc_pc(struct map_session_data* sd,int first);