summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt4
-rw-r--r--src/map/mob.c18
-rw-r--r--src/map/pc.c5
3 files changed, 20 insertions, 7 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index 9a129f81a..0eeaa917e 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -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/05/19
+ * Modified mobskill_use behaviour to pick a random starting point and check
+ skills from that, rather than always checking from first to last. Fixes
+ skills with high priority blocking skills lower down in the list from
+ triggering. [Skotlex]
* Updated mob ai behaviour so that mobs use IDLE state skills when their
current target cannot be reached for melee fighting. [Skotlex]
2006/05/18
diff --git a/src/map/mob.c b/src/map/mob.c
index c723b2dab..bdbab5cf8 100644
--- a/src/map/mob.c
+++ b/src/map/mob.c
@@ -2570,24 +2570,30 @@ int mobskill_use(struct mob_data *md, unsigned int tick, int event)
struct mob_skill *ms;
struct block_list *fbl = NULL; //Friend bl, which can either be a BL_PC or BL_MOB depending on the situation. [Skotlex]
struct mob_data *fmd = NULL;
- int i;
+ int i,j;
nullpo_retr (0, md);
nullpo_retr (0, ms = md->db->skill);
- if (battle_config.mob_skill_rate == 0 || md->ud.skilltimer != -1)
+ if (!battle_config.mob_skill_rate || md->ud.skilltimer != -1 || !md->db->maxskill)
return 0;
if (event < 0 && DIFF_TICK(md->ud.canact_tick, tick) > 0)
return 0; //Skill act delay only affects non-event skills.
-
- for (i = 0; i < md->db->maxskill; i++) {
- int c2 = ms[i].cond2, flag = 0;
- // ディレイ中
+ //Pick a random starting position and loop from that.
+ j = rand()%md->db->maxskill;
+ for (i = j+1; i != j; i++) {
+ int c2, flag = 0;
+
+ if (i == md->db->maxskill)
+ i = 0;
+
if (DIFF_TICK(tick, md->skilldelay[i]) < ms[i].delay)
continue;
+ c2 = ms[i].cond2;
+
if (ms[i].state != md->state.skillstate && md->state.skillstate != MSS_DEAD) {
if (ms[i].state == MSS_ANY || (ms[i].state == MSS_ANYTARGET && md->target_id))
; //ANYTARGET works with any state as long as there's a target. [Skotlex]
diff --git a/src/map/pc.c b/src/map/pc.c
index 1797bb36b..10567e56d 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -2401,8 +2401,10 @@ int pc_additem(struct map_session_data *sd,struct item *item_data,int amount)
i = MAX_INVENTORY;
- if (!itemdb_isequip2(data)){ //Stackable
+ if (!itemdb_isequip2(data))
+ { //Stackable
for (i = 0; i < MAX_INVENTORY; i++)
+ {
if(sd->status.inventory[i].nameid == item_data->nameid &&
memcmp(&sd->status.inventory[i].card,&item_data->card,
sizeof(item_data->card))==0)
@@ -2413,6 +2415,7 @@ int pc_additem(struct map_session_data *sd,struct item *item_data,int amount)
clif_additem(sd,i,amount,0);
break;
}
+ }
}
if (i >= MAX_INVENTORY){
i = pc_search_inventory(sd,0);