- The autoloot range check is no longer done unless AUTOLOOT_DISTANCE is defined (by default it is no longer defined)
- Ganbantein now deletes individual skill cells instead of the whole skill in the area it is casted. - Modified the mob total damage code to prevent overflows when mobs receive over 2kM damage. - Made the dmg structure of the damage log an unsigned int rather than signed. git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@10343 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
3320d40750
commit
e587ff356b
@ -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.
|
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
|
||||||
|
|
||||||
2007/04/25
|
2007/04/25
|
||||||
|
* Ganbantein now deletes individual skill cells instead of the whole skill
|
||||||
|
in the area it is casted.
|
||||||
|
* Modified the mob total damage code to prevent overflows when mobs receive
|
||||||
|
over 2kM damage. [Skotlex]
|
||||||
* Spider Web / Fiber Lock status cannot be dispelled now [ultramage]
|
* Spider Web / Fiber Lock status cannot be dispelled now [ultramage]
|
||||||
2007/04/24
|
2007/04/24
|
||||||
* All mob casted skills have a fixed range of 9 now.
|
* All mob casted skills have a fixed range of 9 now.
|
||||||
|
@ -7,9 +7,8 @@
|
|||||||
//This is the distance at which @autoloot works,
|
//This is the distance at which @autoloot works,
|
||||||
//if the item drops farther from the player than this,
|
//if the item drops farther from the player than this,
|
||||||
//it will not be autolooted. [Skotlex]
|
//it will not be autolooted. [Skotlex]
|
||||||
#ifndef AUTOLOOT_DISTANCE
|
//Note: The range is unlimited unless this define is set.
|
||||||
#define AUTOLOOT_DISTANCE AREA_SIZE
|
//#define AUTOLOOT_DISTANCE AREA_SIZE
|
||||||
#endif
|
|
||||||
|
|
||||||
enum AtCommandType {
|
enum AtCommandType {
|
||||||
AtCommand_None = -1,
|
AtCommand_None = -1,
|
||||||
|
@ -923,7 +923,7 @@ struct mob_data {
|
|||||||
struct guardian_data* guardian_data;
|
struct guardian_data* guardian_data;
|
||||||
struct {
|
struct {
|
||||||
int id;
|
int id;
|
||||||
int dmg;
|
unsigned int dmg;
|
||||||
unsigned flag : 1; //0: Normal. 1: Homunc exp
|
unsigned flag : 1; //0: Normal. 1: Homunc exp
|
||||||
} dmglog[DAMAGELOG_SIZE];
|
} dmglog[DAMAGELOG_SIZE];
|
||||||
struct spawn_data *spawn; //Spawn data.
|
struct spawn_data *spawn; //Spawn data.
|
||||||
|
@ -1513,8 +1513,10 @@ static void mob_item_drop(struct mob_data *md, struct item_drop_list *dlist, str
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (dlist->first_sd && dlist->first_sd->state.autoloot &&
|
if (dlist->first_sd && dlist->first_sd->state.autoloot &&
|
||||||
drop_rate <= dlist->first_sd->state.autoloot &&
|
drop_rate <= dlist->first_sd->state.autoloot
|
||||||
check_distance_blxy(&dlist->first_sd->bl, dlist->x, dlist->y, AUTOLOOT_DISTANCE)
|
#ifdef AUTOLOOT_DISTANCE
|
||||||
|
&& check_distance_blxy(&dlist->first_sd->bl, dlist->x, dlist->y, AUTOLOOT_DISTANCE)
|
||||||
|
#endif
|
||||||
) { //Autoloot.
|
) { //Autoloot.
|
||||||
if (party_share_loot(
|
if (party_share_loot(
|
||||||
dlist->first_sd->status.party_id?
|
dlist->first_sd->status.party_id?
|
||||||
@ -1617,7 +1619,14 @@ void mob_damage(struct mob_data *md, struct block_list *src, int damage)
|
|||||||
|
|
||||||
if (damage > 0)
|
if (damage > 0)
|
||||||
{ //Store total damage...
|
{ //Store total damage...
|
||||||
md->tdmg+=damage;
|
if (UINT_MAX - (unsigned int)damage > md->tdmg)
|
||||||
|
md->tdmg+=damage;
|
||||||
|
else if (md->tdmg == UINT_MAX)
|
||||||
|
damage = 0; //Stop recording damage once the cap has been reached.
|
||||||
|
else { //Cap damage log...
|
||||||
|
damage = (int)(UINT_MAX - md->tdmg);
|
||||||
|
md->tdmg = UINT_MAX;
|
||||||
|
}
|
||||||
if (md->state.aggressive)
|
if (md->state.aggressive)
|
||||||
{ //No longer aggressive, change to retaliate AI.
|
{ //No longer aggressive, change to retaliate AI.
|
||||||
md->state.aggressive = 0;
|
md->state.aggressive = 0;
|
||||||
@ -1688,8 +1697,9 @@ void mob_damage(struct mob_data *md, struct block_list *src, int damage)
|
|||||||
}
|
}
|
||||||
//Log damage...
|
//Log damage...
|
||||||
if (char_id && damage > 0) {
|
if (char_id && damage > 0) {
|
||||||
int i,minpos,mindmg;
|
int i,minpos;
|
||||||
for(i=0,minpos=DAMAGELOG_SIZE-1,mindmg=INT_MAX;i<DAMAGELOG_SIZE;i++){
|
unsigned int mindmg;
|
||||||
|
for(i=0,minpos=DAMAGELOG_SIZE-1,mindmg=UINT_MAX;i<DAMAGELOG_SIZE;i++){
|
||||||
if(md->dmglog[i].id==char_id &&
|
if(md->dmglog[i].id==char_id &&
|
||||||
md->dmglog[i].flag==flag)
|
md->dmglog[i].flag==flag)
|
||||||
break;
|
break;
|
||||||
@ -1811,7 +1821,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
|
|||||||
tmpsd[i] = NULL;
|
tmpsd[i] = NULL;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(mvp_damage<(unsigned int)md->dmglog[i].dmg){
|
if(mvp_damage<md->dmglog[i].dmg){
|
||||||
third_sd = second_sd;
|
third_sd = second_sd;
|
||||||
second_sd = mvp_sd;
|
second_sd = mvp_sd;
|
||||||
mvp_sd=tmpsd[i];
|
mvp_sd=tmpsd[i];
|
||||||
@ -1822,8 +1832,13 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
|
|||||||
if(!battle_config.exp_calc_type && count > 1)
|
if(!battle_config.exp_calc_type && count > 1)
|
||||||
{ //Apply first-attacker 200% exp share bonus
|
{ //Apply first-attacker 200% exp share bonus
|
||||||
//TODO: Determine if this should go before calculating the MVP player instead of after.
|
//TODO: Determine if this should go before calculating the MVP player instead of after.
|
||||||
md->tdmg += md->dmglog[0].dmg;
|
if (UINT_MAX - md->dmglog[0].dmg > md->tdmg) {
|
||||||
md->dmglog[0].dmg<<=1;
|
md->tdmg += md->dmglog[0].dmg;
|
||||||
|
md->dmglog[0].dmg<<=1;
|
||||||
|
} else {
|
||||||
|
md->dmglog[0].dmg+= UINT_MAX - md->tdmg;
|
||||||
|
md->tdmg = UINT_MAX;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!(type&2) && //No exp
|
if(!(type&2) && //No exp
|
||||||
|
@ -6527,7 +6527,7 @@ int skill_dance_overlap(struct skill_unit *unit, int flag)
|
|||||||
* Flag: 0 - Convert, 1 - Revert, 2 - Initialize.
|
* Flag: 0 - Convert, 1 - Revert, 2 - Initialize.
|
||||||
*------------------------------------------
|
*------------------------------------------
|
||||||
*/
|
*/
|
||||||
#define skill_dance_switch(unit, group, flag) ((group->state.song_dance&0x1 && unit->val2&UF_ENSEMBLE)?skill_dance_switch_sub(unit, group, flag):0)
|
#define skill_dance_switch(unit, group, flag) (((group)->state.song_dance&0x1 && (unit)->val2&UF_ENSEMBLE)?skill_dance_switch_sub(unit, group, flag):0)
|
||||||
static int skill_dance_switch_sub(struct skill_unit *unit, struct skill_unit_group *group, int flag)
|
static int skill_dance_switch_sub(struct skill_unit *unit, struct skill_unit_group *group, int flag)
|
||||||
{
|
{
|
||||||
static struct skill_unit_group original, dissonance, uglydance, *group2;
|
static struct skill_unit_group original, dissonance, uglydance, *group2;
|
||||||
@ -9552,10 +9552,7 @@ int skill_ganbatein (struct block_list *bl, va_list ap)
|
|||||||
if (unit->group->state.song_dance&0x1)
|
if (unit->group->state.song_dance&0x1)
|
||||||
return 0; //Don't touch song/dance.
|
return 0; //Don't touch song/dance.
|
||||||
|
|
||||||
if (unit->group->skill_id == SA_LANDPROTECTOR)
|
skill_delunit(unit, 1);
|
||||||
skill_delunit(unit, 1);
|
|
||||||
else skill_delunitgroup(NULL, unit->group, 1);
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user