- 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:
parent
7ecc1ab6e1
commit
e906a6f074
@ -3,6 +3,8 @@ 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.
|
||||
|
||||
2006/12/08
|
||||
* Autospell delay time is now the skill's full delay. [Skotlex]
|
||||
2006/12/07
|
||||
* Fixed ladmin's linux compilation and moved some platform specific
|
||||
defines to cbasetypes.h [FlavioJS]
|
||||
|
@ -944,6 +944,7 @@ struct mob_data {
|
||||
unsigned alchemist: 1;
|
||||
unsigned no_random_walk: 1;
|
||||
unsigned killer: 1;
|
||||
unsigned char attacked_count; //For rude attacked.
|
||||
int provoke_flag; // Celest
|
||||
} state;
|
||||
struct guardian_data* guardian_data;
|
||||
@ -956,8 +957,6 @@ struct mob_data {
|
||||
struct item *lootitem;
|
||||
short spawn_n; //Spawn data index on the map server.
|
||||
short class_;
|
||||
short attacked_count;
|
||||
unsigned char attacked_players;
|
||||
unsigned int tdmg; //Stores total damage given to the mob, for exp calculations. [Skotlex]
|
||||
int level;
|
||||
int target_id,attacked_id;
|
||||
|
@ -677,8 +677,6 @@ int mob_spawn (struct mob_data *md)
|
||||
malloc_set(&md->state, 0, sizeof(md->state));
|
||||
status_calc_mob(md, 1);
|
||||
md->attacked_id = 0;
|
||||
md->attacked_players = 0;
|
||||
md->attacked_count = 0;
|
||||
md->target_id = 0;
|
||||
md->move_fail_count = 0;
|
||||
|
||||
@ -1077,7 +1075,7 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap)
|
||||
// Abnormalities
|
||||
if((md->sc.opt1 > 0 && md->sc.opt1 != OPT1_STONEWAIT) || md->sc.data[SC_BLADESTOP].timer != -1)
|
||||
{ //Should reset targets.
|
||||
md->target_id = md->attacked_id = md->attacked_players = 0;
|
||||
md->target_id = md->attacked_id = 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))))
|
||||
{ //Rude-attacked (avoid triggering due to can-walk delay).
|
||||
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);
|
||||
}
|
||||
} else
|
||||
@ -1137,7 +1135,7 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap)
|
||||
((TBL_PC*)abl)->state.gangsterparadise
|
||||
)
|
||||
) { //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)
|
||||
{
|
||||
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
|
||||
//or if the previous target is not attacking the mob. [Skotlex]
|
||||
md->target_id = md->attacked_id; // set target
|
||||
if (md->attacked_count)
|
||||
md->attacked_count--; //Should we reset rude attack count?
|
||||
if (md->state.attacked_count)
|
||||
md->state.attacked_count--; //Should we reset rude attack count?
|
||||
md->min_chase = dist+md->db->range3;
|
||||
if(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;
|
||||
}
|
||||
//Clear it since it's been checked for already.
|
||||
md->attacked_players = 0;
|
||||
md->attacked_id = 0;
|
||||
}
|
||||
|
||||
@ -1597,10 +1594,6 @@ void mob_damage(struct mob_data *md, struct block_list *src, int damage)
|
||||
if (!src)
|
||||
return;
|
||||
|
||||
md->attacked_players++;
|
||||
if (!md->attacked_players) //Counter overflow o.O
|
||||
md->attacked_players++;
|
||||
|
||||
if(md->nd)
|
||||
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;
|
||||
char_id = sd->status.char_id;
|
||||
if(rand()%1000 < 1000/md->attacked_players)
|
||||
md->attacked_id = src->id;
|
||||
md->attacked_id = src->id;
|
||||
break;
|
||||
}
|
||||
case BL_HOM: //[orn]
|
||||
@ -1619,8 +1611,7 @@ void mob_damage(struct mob_data *md, struct block_list *src, int damage)
|
||||
flag = 1;
|
||||
if (hd->master)
|
||||
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;
|
||||
}
|
||||
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.
|
||||
}
|
||||
//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;
|
||||
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);
|
||||
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]
|
||||
if (md2->master_id && battle_config.retaliate_to_master)
|
||||
md->attacked_id = md2->master_id;
|
||||
else
|
||||
md->attacked_id = src->id;
|
||||
}
|
||||
//Let players decide whether to retaliate versus the master or the mob. [Skotlex]
|
||||
if (md2->master_id && battle_config.retaliate_to_master)
|
||||
md->attacked_id = md2->master_id;
|
||||
else
|
||||
md->attacked_id = src->id;
|
||||
break;
|
||||
}
|
||||
default: //For all unhandled types.
|
||||
if(rand()%1000 < 1000/md->attacked_players)
|
||||
md->attacked_id = src->id;
|
||||
md->attacked_id = src->id;
|
||||
}
|
||||
//Log damage...
|
||||
if (char_id && damage > 0) {
|
||||
@ -2739,8 +2727,8 @@ int mobskill_use(struct mob_data *md, unsigned int tick, int event)
|
||||
case MSC_AFTERSKILL:
|
||||
flag = (md->ud.skillid == c2); break;
|
||||
case MSC_RUDEATTACKED:
|
||||
flag = (md->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]
|
||||
flag = (md->state.attacked_count >= RUDE_ATTACKED_COUNT);
|
||||
if (flag) md->state.attacked_count = 0; //Rude attacked count should be reset after the skill condition is met. Thanks to Komurka [Skotlex]
|
||||
break;
|
||||
case MSC_MASTERHPLTMAXRATE:
|
||||
flag = ((fbl = mob_getmasterhpltmaxrate(md, ms[i].cond2)) != NULL); break;
|
||||
|
@ -1455,7 +1455,7 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
|
||||
//Set canact delay. [Skotlex]
|
||||
ud = unit_bl2ud(src);
|
||||
if (ud) {
|
||||
rate = skill_delayfix(src, skill, skilllv)/2;
|
||||
rate = skill_delayfix(src, skill, skilllv);
|
||||
if (DIFF_TICK(ud->canact_tick, tick + rate) < 0)
|
||||
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]
|
||||
ud = unit_bl2ud(bl);
|
||||
if (ud) {
|
||||
rate = skill_delayfix(bl, skillid, skilllv)/2;
|
||||
rate = skill_delayfix(bl, skillid, skilllv);
|
||||
if (DIFF_TICK(ud->canact_tick, tick + rate) < 0)
|
||||
ud->canact_tick = tick+rate;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user