- Moved attackedcount to md->state and made it an unsigned char.

- Autospell delay time is now the skill's full delay. 
- Removed variable attackedplayers, since Aegis is state driven, the best approximation to Aegis would be to use the last player that hit the mob.


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@9436 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
skotlex 2006-12-08 13:43:48 +00:00
parent 7ecc1ab6e1
commit e906a6f074
4 changed files with 21 additions and 32 deletions

View File

@ -3,6 +3,8 @@ Date Added
AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK. 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. IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2006/12/08
* Autospell delay time is now the skill's full delay. [Skotlex]
2006/12/07 2006/12/07
* Fixed ladmin's linux compilation and moved some platform specific * Fixed ladmin's linux compilation and moved some platform specific
defines to cbasetypes.h [FlavioJS] defines to cbasetypes.h [FlavioJS]

View File

@ -944,6 +944,7 @@ struct mob_data {
unsigned alchemist: 1; unsigned alchemist: 1;
unsigned no_random_walk: 1; unsigned no_random_walk: 1;
unsigned killer: 1; unsigned killer: 1;
unsigned char attacked_count; //For rude attacked.
int provoke_flag; // Celest int provoke_flag; // Celest
} state; } state;
struct guardian_data* guardian_data; struct guardian_data* guardian_data;
@ -956,8 +957,6 @@ struct mob_data {
struct item *lootitem; struct item *lootitem;
short spawn_n; //Spawn data index on the map server. short spawn_n; //Spawn data index on the map server.
short class_; short class_;
short attacked_count;
unsigned char attacked_players;
unsigned int tdmg; //Stores total damage given to the mob, for exp calculations. [Skotlex] unsigned int tdmg; //Stores total damage given to the mob, for exp calculations. [Skotlex]
int level; int level;
int target_id,attacked_id; int target_id,attacked_id;

View File

@ -677,8 +677,6 @@ int mob_spawn (struct mob_data *md)
malloc_set(&md->state, 0, sizeof(md->state)); malloc_set(&md->state, 0, sizeof(md->state));
status_calc_mob(md, 1); status_calc_mob(md, 1);
md->attacked_id = 0; md->attacked_id = 0;
md->attacked_players = 0;
md->attacked_count = 0;
md->target_id = 0; md->target_id = 0;
md->move_fail_count = 0; md->move_fail_count = 0;
@ -1077,7 +1075,7 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap)
// Abnormalities // Abnormalities
if((md->sc.opt1 > 0 && md->sc.opt1 != OPT1_STONEWAIT) || md->sc.data[SC_BLADESTOP].timer != -1) if((md->sc.opt1 > 0 && md->sc.opt1 != OPT1_STONEWAIT) || md->sc.data[SC_BLADESTOP].timer != -1)
{ //Should reset targets. { //Should reset targets.
md->target_id = md->attacked_id = md->attacked_players = 0; md->target_id = md->attacked_id = 0;
return 0; return 0;
} }
@ -1122,7 +1120,7 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap)
(!mob_can_reach(md, tbl, md->min_chase, MSS_RUSH)))) (!mob_can_reach(md, tbl, md->min_chase, MSS_RUSH))))
{ //Rude-attacked (avoid triggering due to can-walk delay). { //Rude-attacked (avoid triggering due to can-walk delay).
if (DIFF_TICK(tick, md->ud.canmove_tick) > 0 && if (DIFF_TICK(tick, md->ud.canmove_tick) > 0 &&
md->attacked_count++ >= RUDE_ATTACKED_COUNT) md->state.attacked_count++ >= RUDE_ATTACKED_COUNT)
mobskill_use(md, tick, MSC_RUDEATTACKED); mobskill_use(md, tick, MSC_RUDEATTACKED);
} }
} else } else
@ -1137,7 +1135,7 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap)
((TBL_PC*)abl)->state.gangsterparadise ((TBL_PC*)abl)->state.gangsterparadise
) )
) { //Can't attack back ) { //Can't attack back
if (md->attacked_count++ >= RUDE_ATTACKED_COUNT) { if (md->state.attacked_count++ >= RUDE_ATTACKED_COUNT) {
if (mobskill_use(md, tick, MSC_RUDEATTACKED) == 0 && can_move) if (mobskill_use(md, tick, MSC_RUDEATTACKED) == 0 && can_move)
{ {
int dist = rand() % 10 + 1;//Œã‘Þ‚·‚é‹——£ int dist = rand() % 10 + 1;//Œã‘Þ‚·‚é‹——£
@ -1155,8 +1153,8 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap)
{ //Change if the new target is closer than the actual one { //Change if the new target is closer than the actual one
//or if the previous target is not attacking the mob. [Skotlex] //or if the previous target is not attacking the mob. [Skotlex]
md->target_id = md->attacked_id; // set target md->target_id = md->attacked_id; // set target
if (md->attacked_count) if (md->state.attacked_count)
md->attacked_count--; //Should we reset rude attack count? md->state.attacked_count--; //Should we reset rude attack count?
md->min_chase = dist+md->db->range3; md->min_chase = dist+md->db->range3;
if(md->min_chase>MAX_MINCHASE) if(md->min_chase>MAX_MINCHASE)
md->min_chase=MAX_MINCHASE; md->min_chase=MAX_MINCHASE;
@ -1173,7 +1171,6 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap)
md->state.skillstate = MSS_RUSH; md->state.skillstate = MSS_RUSH;
} }
//Clear it since it's been checked for already. //Clear it since it's been checked for already.
md->attacked_players = 0;
md->attacked_id = 0; md->attacked_id = 0;
} }
@ -1597,10 +1594,6 @@ void mob_damage(struct mob_data *md, struct block_list *src, int damage)
if (!src) if (!src)
return; return;
md->attacked_players++;
if (!md->attacked_players) //Counter overflow o.O
md->attacked_players++;
if(md->nd) if(md->nd)
mob_script_callback(md, src, CALLBACK_ATTACK); mob_script_callback(md, src, CALLBACK_ATTACK);
@ -1609,8 +1602,7 @@ void mob_damage(struct mob_data *md, struct block_list *src, int damage)
{ {
struct map_session_data *sd = (TBL_PC*)src; struct map_session_data *sd = (TBL_PC*)src;
char_id = sd->status.char_id; char_id = sd->status.char_id;
if(rand()%1000 < 1000/md->attacked_players) md->attacked_id = src->id;
md->attacked_id = src->id;
break; break;
} }
case BL_HOM: //[orn] case BL_HOM: //[orn]
@ -1619,8 +1611,7 @@ void mob_damage(struct mob_data *md, struct block_list *src, int damage)
flag = 1; flag = 1;
if (hd->master) if (hd->master)
char_id = hd->master->status.char_id; char_id = hd->master->status.char_id;
if(rand()%1000 < 1000/md->attacked_players) md->attacked_id = src->id;
md->attacked_id = src->id;
break; break;
} }
case BL_PET: case BL_PET:
@ -1631,7 +1622,7 @@ void mob_damage(struct mob_data *md, struct block_list *src, int damage)
damage=(damage*battle_config.pet_attack_exp_rate)/100; //Modify logged damage accordingly. damage=(damage*battle_config.pet_attack_exp_rate)/100; //Modify logged damage accordingly.
} }
//Let mobs retaliate against the pet's master [Skotlex] //Let mobs retaliate against the pet's master [Skotlex]
if(pd->msd && rand()%1000 < 1000/md->attacked_players) if(pd->msd)
md->attacked_id = pd->msd->bl.id; md->attacked_id = pd->msd->bl.id;
break; break;
} }
@ -1642,18 +1633,15 @@ void mob_damage(struct mob_data *md, struct block_list *src, int damage)
struct map_session_data* msd = map_id2sd(md2->master_id); struct map_session_data* msd = map_id2sd(md2->master_id);
if (msd) char_id = msd->status.char_id; if (msd) char_id = msd->status.char_id;
} }
if(rand()%1000 < 1000/md->attacked_players) //Let players decide whether to retaliate versus the master or the mob. [Skotlex]
{ //Let players decide whether to retaliate versus the master or the mob. [Skotlex] if (md2->master_id && battle_config.retaliate_to_master)
if (md2->master_id && battle_config.retaliate_to_master) md->attacked_id = md2->master_id;
md->attacked_id = md2->master_id; else
else md->attacked_id = src->id;
md->attacked_id = src->id;
}
break; break;
} }
default: //For all unhandled types. default: //For all unhandled types.
if(rand()%1000 < 1000/md->attacked_players) md->attacked_id = src->id;
md->attacked_id = src->id;
} }
//Log damage... //Log damage...
if (char_id && damage > 0) { if (char_id && damage > 0) {
@ -2739,8 +2727,8 @@ int mobskill_use(struct mob_data *md, unsigned int tick, int event)
case MSC_AFTERSKILL: case MSC_AFTERSKILL:
flag = (md->ud.skillid == c2); break; flag = (md->ud.skillid == c2); break;
case MSC_RUDEATTACKED: case MSC_RUDEATTACKED:
flag = (md->attacked_count >= RUDE_ATTACKED_COUNT); flag = (md->state.attacked_count >= RUDE_ATTACKED_COUNT);
if (flag) md->attacked_count = 0; //Rude attacked count should be reset after the skill condition is met. Thanks to Komurka [Skotlex] if (flag) md->state.attacked_count = 0; //Rude attacked count should be reset after the skill condition is met. Thanks to Komurka [Skotlex]
break; break;
case MSC_MASTERHPLTMAXRATE: case MSC_MASTERHPLTMAXRATE:
flag = ((fbl = mob_getmasterhpltmaxrate(md, ms[i].cond2)) != NULL); break; flag = ((fbl = mob_getmasterhpltmaxrate(md, ms[i].cond2)) != NULL); break;

View File

@ -1455,7 +1455,7 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
//Set canact delay. [Skotlex] //Set canact delay. [Skotlex]
ud = unit_bl2ud(src); ud = unit_bl2ud(src);
if (ud) { if (ud) {
rate = skill_delayfix(src, skill, skilllv)/2; rate = skill_delayfix(src, skill, skilllv);
if (DIFF_TICK(ud->canact_tick, tick + rate) < 0) if (DIFF_TICK(ud->canact_tick, tick + rate) < 0)
ud->canact_tick = tick+rate; ud->canact_tick = tick+rate;
} }
@ -1625,7 +1625,7 @@ int skill_counter_additional_effect (struct block_list* src, struct block_list *
//Set canact delay. [Skotlex] //Set canact delay. [Skotlex]
ud = unit_bl2ud(bl); ud = unit_bl2ud(bl);
if (ud) { if (ud) {
rate = skill_delayfix(bl, skillid, skilllv)/2; rate = skill_delayfix(bl, skillid, skilllv);
if (DIFF_TICK(ud->canact_tick, tick + rate) < 0) if (DIFF_TICK(ud->canact_tick, tick + rate) < 0)
ud->canact_tick = tick+rate; ud->canact_tick = tick+rate;
} }