- Fixed skill_delayfix not altering delay at all after you reached 150.
- Applied ers to pet loot drops. - Cleaned up the pet loot drop function. - Mob skill state MSS_ANY won't include MSS_DEAD now. - Added mob skill state MSS_ANYTARGET ("anytarget") which means any state (except dead) on which the mob has a target set. git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@6250 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
c56c5f2b68
commit
9f19b5cfdc
@ -2,6 +2,14 @@ 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/04/24
|
||||
* Fixed skill_delayfix not altering delay at all after you reached 150.
|
||||
[Skotlex]
|
||||
* Applied ers to pet loot drops and cleaned up the pet loot drop function.
|
||||
[Skotlex]
|
||||
* Mob skill state MSS_ANY won't include MSS_DEAD now. [Skotlex]
|
||||
* Added mob skill state MSS_ANYTARGET ("anytarget") which means any state
|
||||
(except dead) on which the mob has a target set. [Skotlex]
|
||||
2006/04/23
|
||||
* Added new column to mob_db Sprite_Name to hold the mob's sprite name.
|
||||
Columns Name and JName now hold the mob's english and kro names
|
||||
|
@ -8,10 +8,11 @@
|
||||
//delay is the time in milliseconds that has to be pass before recasting the same skill.
|
||||
//
|
||||
//STATE:
|
||||
// any / idle (in standby) / walk (in movement) / dead (on killed) / loot /
|
||||
// attack / angry (like attack, except player has not attacked mob yet) /
|
||||
// any (except dead) / idle (in standby) / walk (in movement) / dead (on killed) /
|
||||
// loot /attack / angry (like attack, except player has not attacked mob yet) /
|
||||
// chase (following target, after being attacked) / follow (following
|
||||
// target, without being attacked)
|
||||
// anytarget (attack+angry+chase+follow)
|
||||
//
|
||||
//target: The target of the skill can be: target (when a PC is targetted) / self / friend / master
|
||||
// (the following are for ground-skills, a random target tile is selected from
|
||||
|
@ -1382,23 +1382,6 @@ static int mob_ai_hard(int tid,unsigned int tick,int id,int data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* The structure object for item drop with delay
|
||||
* Since it is only two being able to pass [ int ] a timer function
|
||||
* Data is put in and passed to this structure object.
|
||||
*------------------------------------------
|
||||
*/
|
||||
struct item_drop {
|
||||
struct item item_data;
|
||||
struct item_drop *next;
|
||||
};
|
||||
|
||||
struct item_drop_list {
|
||||
int m,x,y;
|
||||
struct map_session_data *first_sd,*second_sd,*third_sd;
|
||||
struct item_drop *item;
|
||||
};
|
||||
|
||||
/*==========================================
|
||||
* Initializes the delay drop structure for mob-dropped items.
|
||||
*------------------------------------------
|
||||
@ -2617,10 +2600,12 @@ int mobskill_use(struct mob_data *md, unsigned int tick, int event)
|
||||
if (DIFF_TICK(tick, md->skilldelay[i]) < ms[i].delay)
|
||||
continue;
|
||||
|
||||
// <20>ó‘Ô”»’è
|
||||
if (ms[i].state != MSS_ANY && ms[i].state != md->state.skillstate)
|
||||
continue;
|
||||
|
||||
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]
|
||||
else
|
||||
continue;
|
||||
}
|
||||
if (rand() % 10000 > ms[i].permillage) //Lupus (max value = 10000)
|
||||
continue;
|
||||
|
||||
@ -3478,7 +3463,7 @@ static int mob_readskilldb(void)
|
||||
{ "hiding", SC_HIDING },
|
||||
{ "sight", SC_SIGHT },
|
||||
}, state[] = {
|
||||
{ "any", MSS_ANY },
|
||||
{ "any", MSS_ANY }, //All states except Dead
|
||||
{ "idle", MSS_IDLE },
|
||||
{ "walk", MSS_WALK },
|
||||
{ "loot", MSS_LOOT },
|
||||
@ -3487,6 +3472,7 @@ static int mob_readskilldb(void)
|
||||
{ "angry", MSS_ANGRY }, //Preemptive attack (aggressive mobs)
|
||||
{ "chase", MSS_RUSH }, //Chase escaping target
|
||||
{ "follow", MSS_FOLLOW }, //Preemptive chase (aggressive mobs)
|
||||
{ "anytarget",MSS_ANYTARGET }, //Berserk+Angry+Rush+Follow
|
||||
}, target[] = {
|
||||
{ "target", MST_TARGET },
|
||||
{ "self", MST_SELF },
|
||||
|
@ -106,6 +106,25 @@ enum {
|
||||
MSS_ANGRY, //Mob retaliating from being attacked.
|
||||
MSS_RUSH, //Mob following a player after being attacked.
|
||||
MSS_FOLLOW, //Mob following a player without being attacked.
|
||||
MSS_ANYTARGET,
|
||||
};
|
||||
|
||||
|
||||
/*==========================================
|
||||
* The structure object for item drop with delay
|
||||
* Since it is only two being able to pass [ int ] a timer function
|
||||
* Data is put in and passed to this structure object.
|
||||
*------------------------------------------
|
||||
*/
|
||||
struct item_drop {
|
||||
struct item item_data;
|
||||
struct item_drop *next;
|
||||
};
|
||||
|
||||
struct item_drop_list {
|
||||
int m,x,y;
|
||||
struct map_session_data *first_sd,*second_sd,*third_sd;
|
||||
struct item_drop *item;
|
||||
};
|
||||
|
||||
struct mob_db* mob_db(int class_);
|
||||
|
119
src/map/pet.c
119
src/map/pet.c
@ -10,6 +10,7 @@
|
||||
#include "../common/nullpo.h"
|
||||
#include "../common/malloc.h"
|
||||
#include "../common/showmsg.h"
|
||||
#include "../common/ers.h"
|
||||
|
||||
#include "pc.h"
|
||||
#include "status.h"
|
||||
@ -29,6 +30,9 @@
|
||||
|
||||
struct pet_db pet_db[MAX_PET_DB];
|
||||
|
||||
static struct eri *item_drop_ers; //For loot drops delay structures.
|
||||
static struct eri *item_drop_list_ers;
|
||||
|
||||
static int dirx[8]={0,-1,-1,-1,0,1,1,1};
|
||||
static int diry[8]={1,1,0,-1,-1,-1,0,1};
|
||||
|
||||
@ -321,18 +325,6 @@ int pet_hungry_timer_delete(struct map_session_data *sd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct delay_item_drop {
|
||||
int m,x,y;
|
||||
int nameid,amount;
|
||||
struct map_session_data *first_sd,*second_sd,*third_sd;
|
||||
};
|
||||
|
||||
struct delay_item_drop2 {
|
||||
int m,x,y;
|
||||
struct item item_data;
|
||||
struct map_session_data *first_sd,*second_sd,*third_sd;
|
||||
};
|
||||
|
||||
int pet_performance(struct map_session_data *sd)
|
||||
{
|
||||
struct pet_data *pd;
|
||||
@ -1082,54 +1074,72 @@ int pet_ai_sub_hard_lootsearch(struct block_list *bl,va_list ap)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pet_delay_item_drop(int tid,unsigned int tick,int id,int data)
|
||||
{
|
||||
struct item_drop_list *list;
|
||||
struct item_drop *ditem, *ditem_prev;
|
||||
list=(struct item_drop_list *)id;
|
||||
ditem = list->item;
|
||||
while (ditem) {
|
||||
map_addflooritem(&ditem->item_data,ditem->item_data.amount,
|
||||
list->m,list->x,list->y,
|
||||
list->first_sd,list->second_sd,list->third_sd,0);
|
||||
ditem_prev = ditem;
|
||||
ditem = ditem->next;
|
||||
ers_free(item_drop_ers, ditem_prev);
|
||||
}
|
||||
ers_free(item_drop_list_ers, list);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pet_lootitem_drop(struct pet_data *pd,struct map_session_data *sd)
|
||||
{
|
||||
int i,flag=0;
|
||||
struct delay_item_drop2 *ditem_floor, ditem;
|
||||
if(pd && pd->loot && pd->loot->count) {
|
||||
memset(&ditem, 0, sizeof(struct delay_item_drop2));
|
||||
ditem.m = pd->bl.m;
|
||||
ditem.x = pd->bl.x;
|
||||
ditem.y = pd->bl.y;
|
||||
ditem.first_sd = 0;
|
||||
ditem.second_sd = 0;
|
||||
ditem.third_sd = 0;
|
||||
for(i=0;i<pd->loot->count;i++) {
|
||||
memcpy(&ditem.item_data,&pd->loot->item[i],sizeof(pd->loot->item[0]));
|
||||
// 落とさないで直接PCのItem欄へ
|
||||
if(sd){
|
||||
if((flag = pc_additem(sd,&ditem.item_data,ditem.item_data.amount))){
|
||||
clif_additem(sd,0,0,flag);
|
||||
map_addflooritem(&ditem.item_data,ditem.item_data.amount,ditem.m,ditem.x,ditem.y,ditem.first_sd,ditem.second_sd,ditem.third_sd,0);
|
||||
}
|
||||
}
|
||||
else {
|
||||
ditem_floor=(struct delay_item_drop2 *)aCalloc(1,sizeof(struct delay_item_drop2));
|
||||
memcpy(ditem_floor, &ditem, sizeof(struct delay_item_drop2));
|
||||
add_timer(gettick()+540+i,pet_delay_item_drop2,(int)ditem_floor,0);
|
||||
struct item_drop_list *dlist;
|
||||
struct item_drop *ditem;
|
||||
struct item *it;
|
||||
if(!pd || !pd->loot || !pd->loot->count)
|
||||
return 0;
|
||||
dlist = ers_alloc(item_drop_list_ers, struct item_drop_list);
|
||||
dlist->m = pd->bl.m;
|
||||
dlist->x = pd->bl.x;
|
||||
dlist->y = pd->bl.y;
|
||||
dlist->first_sd = NULL;
|
||||
dlist->second_sd = NULL;
|
||||
dlist->third_sd = NULL;
|
||||
dlist->item = NULL;
|
||||
|
||||
for(i=0;i<pd->loot->count;i++) {
|
||||
it = &pd->loot->item[i];
|
||||
if(sd){
|
||||
if((flag = pc_additem(sd,it,it->amount))){
|
||||
clif_additem(sd,0,0,flag);
|
||||
ditem = ers_alloc(item_drop_ers, struct item_drop);
|
||||
memcpy(&ditem->item_data, it, sizeof(struct item));
|
||||
ditem->next = dlist->item;
|
||||
dlist->item = ditem->next;
|
||||
}
|
||||
}
|
||||
//The smart thing to do is use pd->loot->max (thanks for pointing it out, Shinomori)
|
||||
memset(pd->loot->item,0,pd->loot->max * sizeof(struct item));
|
||||
pd->loot->count = 0;
|
||||
pd->loot->weight = 0;
|
||||
pd->ud.canact_tick = gettick()+10000; // 10*1000msの間拾わない
|
||||
else {
|
||||
ditem = ers_alloc(item_drop_ers, struct item_drop);
|
||||
memcpy(&ditem->item_data, it, sizeof(struct item));
|
||||
ditem->next = dlist->item;
|
||||
dlist->item = ditem->next;
|
||||
}
|
||||
}
|
||||
//The smart thing to do is use pd->loot->max (thanks for pointing it out, Shinomori)
|
||||
memset(pd->loot->item,0,pd->loot->max * sizeof(struct item));
|
||||
pd->loot->count = 0;
|
||||
pd->loot->weight = 0;
|
||||
pd->ud.canact_tick = gettick()+10000; // 10*1000ms‚ÌŠÔ<C5A0>E‚í‚È‚¢
|
||||
|
||||
if (dlist->item)
|
||||
add_timer(gettick()+540,pet_delay_item_drop,(int)dlist,0);
|
||||
else
|
||||
ers_free(item_drop_list_ers, dlist);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int pet_delay_item_drop2(int tid,unsigned int tick,int id,int data)
|
||||
{
|
||||
struct delay_item_drop2 *ditem;
|
||||
|
||||
ditem=(struct delay_item_drop2 *)id;
|
||||
|
||||
map_addflooritem(&ditem->item_data,ditem->item_data.amount,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0);
|
||||
|
||||
aFree(ditem);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* pet bonus giving skills [Valaris] / Rewritten by [Skotlex]
|
||||
*------------------------------------------
|
||||
@ -1384,10 +1394,13 @@ int do_init_pet(void)
|
||||
memset(pet_db,0,sizeof(pet_db));
|
||||
read_petdb();
|
||||
|
||||
item_drop_ers = ers_new((uint32)sizeof(struct item_drop));
|
||||
item_drop_list_ers = ers_new((uint32)sizeof(struct item_drop_list));
|
||||
|
||||
add_timer_func_list(pet_hungry,"pet_hungry");
|
||||
add_timer_func_list(pet_ai_hard,"pet_ai_hard");
|
||||
add_timer_func_list(pet_skill_bonus_timer,"pet_skill_bonus_timer"); // [Valaris]
|
||||
add_timer_func_list(pet_delay_item_drop2,"pet_delay_item_drop2");
|
||||
add_timer_func_list(pet_delay_item_drop,"pet_delay_item_drop");
|
||||
add_timer_func_list(pet_skill_support_timer, "pet_skill_support_timer"); // [Skotlex]
|
||||
add_timer_func_list(pet_recovery_timer,"pet_recovery_timer"); // [Valaris]
|
||||
add_timer_func_list(pet_heal_timer,"pet_heal_timer"); // [Valaris]
|
||||
@ -1404,5 +1417,7 @@ int do_final_pet(void) {
|
||||
pet_db[i].script = NULL;
|
||||
}
|
||||
}
|
||||
ers_destroy(item_drop_ers);
|
||||
ers_destroy(item_drop_list_ers);
|
||||
return 0;
|
||||
}
|
||||
|
@ -52,7 +52,6 @@ int pet_equipitem(struct map_session_data *sd,int index);
|
||||
int pet_unequipitem(struct map_session_data *sd);
|
||||
int pet_food(struct map_session_data *sd);
|
||||
int pet_lootitem_drop(struct pet_data *pd,struct map_session_data *sd);
|
||||
int pet_delay_item_drop2(int tid,unsigned int tick,int id,int data);
|
||||
int pet_ai_sub_hard_lootsearch(struct block_list *bl,va_list ap);
|
||||
int pet_attackskill(struct pet_data *pd, int target_id);
|
||||
int pet_skill_support_timer(int tid, unsigned int tick, int id, int data); // [Skotlex]
|
||||
|
@ -8330,6 +8330,8 @@ int skill_delayfix(struct block_list *bl, int skill_id, int skill_lv)
|
||||
int scale = battle_config.castrate_dex_scale - status_get_dex(bl);
|
||||
if (scale > 0)
|
||||
time = time * scale / battle_config.castrate_dex_scale;
|
||||
else //To be capped later to minimum.
|
||||
time = 0;
|
||||
}
|
||||
|
||||
if (bl->type == BL_PC && ((TBL_PC*)bl)->delayrate != 100)
|
||||
|
Loading…
x
Reference in New Issue
Block a user