* [Improved]:
- Cleaned up Custom Mob Script Callback codes. Looks much better now :B. git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@7202 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
db2a9e7c96
commit
397f255a23
@ -3,10 +3,14 @@ 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/06/16
|
||||||
|
* [Improved]:
|
||||||
|
- Cleaned up Custom Mob Script Callback codes. Looks much better now :B. [Lance]
|
||||||
|
|
||||||
2006/06/15
|
2006/06/15
|
||||||
* [Fixed]:
|
* [Fixed]:
|
||||||
- intif_parse_RenamePetOk for not compatible with ANSI-C initialzation specification.
|
- intif_parse_RenamePetOk for not compatible with ANSI-C initialzation specification.
|
||||||
[Lance]
|
[Lance]
|
||||||
* Added indexes for loginlog and ipbanlist as they did not have any.
|
* Added indexes for loginlog and ipbanlist as they did not have any.
|
||||||
(note, someone already put the index on loginlog on trunk.) [Euph]
|
(note, someone already put the index on loginlog on trunk.) [Euph]
|
||||||
* Merged Adam's patch to let the char-server handle validation of
|
* Merged Adam's patch to let the char-server handle validation of
|
||||||
|
14
db/const.txt
14
db/const.txt
@ -705,12 +705,14 @@ AI_ACTION_TAR_TYPE_PC 1
|
|||||||
AI_ACTION_TAR_TYPE_MOB 2
|
AI_ACTION_TAR_TYPE_MOB 2
|
||||||
AI_ACTION_TAR_TYPE_PET 4
|
AI_ACTION_TAR_TYPE_PET 4
|
||||||
AI_ACTION_TAR_TYPE_HOMUN 8
|
AI_ACTION_TAR_TYPE_HOMUN 8
|
||||||
AI_ACTION_TYPE_ATTACK 1
|
AI_ACTION_TYPE_ATTACK 128
|
||||||
AI_ACTION_TYPE_DETECT 2
|
AI_ACTION_TYPE_DETECT 64
|
||||||
AI_ACTION_TYPE_DEAD 3
|
AI_ACTION_TYPE_DEAD 32
|
||||||
AI_ACTION_TYPE_ASSIST 4
|
AI_ACTION_TYPE_ASSIST 16
|
||||||
AI_ACTION_TYPE_KILL 5
|
AI_ACTION_TYPE_KILL 8
|
||||||
AI_ACTION_TYPE_UNLOCK 6
|
AI_ACTION_TYPE_UNLOCK 4
|
||||||
|
AI_ACTION_TYPE_WALKACK 2
|
||||||
|
AI_ACTION_TYPE_WARPACK 1
|
||||||
|
|
||||||
ALL_CLIENT 0
|
ALL_CLIENT 0
|
||||||
ALL_SAMEMAP 1
|
ALL_SAMEMAP 1
|
||||||
|
@ -2562,7 +2562,7 @@ int parse_frommap(int fd) {
|
|||||||
if (max_account_id != DEFAULT_MAX_ACCOUNT_ID || max_char_id != DEFAULT_MAX_CHAR_ID)
|
if (max_account_id != DEFAULT_MAX_ACCOUNT_ID || max_char_id != DEFAULT_MAX_CHAR_ID)
|
||||||
mapif_send_maxid(max_account_id, max_char_id); //Send the current max ids to the server to keep in sync [Skotlex]
|
mapif_send_maxid(max_account_id, max_char_id); //Send the current max ids to the server to keep in sync [Skotlex]
|
||||||
}
|
}
|
||||||
WFIFOHEAD(fd, 3 + NAME_LENGTH);
|
WFIFOHEAD(fd, 3 + NAME_LENGTH);
|
||||||
WFIFOW(fd,0) = 0x2afb;
|
WFIFOW(fd,0) = 0x2afb;
|
||||||
WFIFOB(fd,2) = 0;
|
WFIFOB(fd,2) = 0;
|
||||||
memcpy(WFIFOP(fd,3), wisp_server_name, NAME_LENGTH); // name for wisp to player
|
memcpy(WFIFOP(fd,3), wisp_server_name, NAME_LENGTH); // name for wisp to player
|
||||||
|
@ -875,6 +875,7 @@ struct mob_data {
|
|||||||
int master_id,master_dist;
|
int master_id,master_dist;
|
||||||
|
|
||||||
struct npc_data *nd;
|
struct npc_data *nd;
|
||||||
|
unsigned char callback_flag;
|
||||||
|
|
||||||
short skillidx;
|
short skillidx;
|
||||||
unsigned int skilldelay[MAX_MOBSKILL];
|
unsigned int skilldelay[MAX_MOBSKILL];
|
||||||
|
@ -772,11 +772,7 @@ static int mob_ai_sub_hard_activesearch(struct block_list *bl,va_list ap)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(md->nd){
|
if(md->nd){
|
||||||
setd_sub(NULL, NULL, ".ai_action", 0, (void *)(int)2, &md->nd->u.scr.script->script_vars);
|
mob_script_callback(md, bl, CALLBACK_DETECT);
|
||||||
setd_sub(NULL, NULL, ".ai_action", 1, (void *)(int)bl->type, &md->nd->u.scr.script->script_vars);
|
|
||||||
setd_sub(NULL, NULL, ".ai_action", 2, (void *)bl->id, &md->nd->u.scr.script->script_vars);
|
|
||||||
setd_sub(NULL, NULL, ".ai_action", 3, (void *)md->bl.id, &md->nd->u.scr.script->script_vars);
|
|
||||||
run_script(md->nd->u.scr.script, 0, 0, md->nd->bl.id);
|
|
||||||
return 1; // We have script handling the work.
|
return 1; // We have script handling the work.
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -951,11 +947,8 @@ static int mob_ai_sub_hard_slavemob(struct mob_data *md,unsigned int tick)
|
|||||||
}
|
}
|
||||||
if (tbl && status_check_skilluse(&md->bl, tbl, 0, 0)) {
|
if (tbl && status_check_skilluse(&md->bl, tbl, 0, 0)) {
|
||||||
if(md->nd){
|
if(md->nd){
|
||||||
setd_sub(NULL, NULL, ".ai_action", 0, (void *)(int)4, &md->nd->u.scr.script->script_vars);
|
mob_script_callback(md, bl, CALLBACK_ASSIST);
|
||||||
setd_sub(NULL, NULL, ".ai_action", 1, (void *)(int)tbl->type, &md->nd->u.scr.script->script_vars);
|
return 0;
|
||||||
setd_sub(NULL, NULL, ".ai_action", 2, (void *)tbl->id, &md->nd->u.scr.script->script_vars);
|
|
||||||
setd_sub(NULL, NULL, ".ai_action", 3, (void *)md->bl.id, &md->nd->u.scr.script->script_vars);
|
|
||||||
run_script(md->nd->u.scr.script, 0, 0, md->nd->bl.id);
|
|
||||||
}
|
}
|
||||||
md->target_id=tbl->id;
|
md->target_id=tbl->id;
|
||||||
md->min_chase=md->db->range3+distance_bl(&md->bl, tbl);
|
md->min_chase=md->db->range3+distance_bl(&md->bl, tbl);
|
||||||
@ -975,14 +968,8 @@ int mob_unlocktarget(struct mob_data *md,int tick)
|
|||||||
{
|
{
|
||||||
nullpo_retr(0, md);
|
nullpo_retr(0, md);
|
||||||
|
|
||||||
if(md->nd){
|
if(md->nd)
|
||||||
struct block_list *tbl = map_id2bl(md->target_id);
|
mob_script_callback(md, map_id2bl(md->target_id), CALLBACK_UNLOCK);
|
||||||
setd_sub(NULL, NULL, ".ai_action", 0, (void *)(int)6, &md->nd->u.scr.script->script_vars);
|
|
||||||
setd_sub(NULL, NULL, ".ai_action", 1, (void *)(int)(tbl?tbl->type:0), &md->nd->u.scr.script->script_vars);
|
|
||||||
setd_sub(NULL, NULL, ".ai_action", 2, (void *)(tbl?tbl->id:0), &md->nd->u.scr.script->script_vars);
|
|
||||||
setd_sub(NULL, NULL, ".ai_action", 3, (void *)md->bl.id, &md->nd->u.scr.script->script_vars);
|
|
||||||
run_script(md->nd->u.scr.script, 0, 0, md->nd->bl.id);
|
|
||||||
}
|
|
||||||
|
|
||||||
md->target_id=0;
|
md->target_id=0;
|
||||||
md->state.skillstate=MSS_IDLE;
|
md->state.skillstate=MSS_IDLE;
|
||||||
@ -1604,13 +1591,7 @@ void mob_damage(struct mob_data *md, struct block_list *src, int damage)
|
|||||||
md->attacked_players++;
|
md->attacked_players++;
|
||||||
|
|
||||||
if(md->nd)
|
if(md->nd)
|
||||||
{
|
mob_script_callback(md, src, CALLBACK_ATTACK);
|
||||||
setd_sub(NULL, NULL, ".ai_action", 0, (void *)(int)1, &md->nd->u.scr.script->script_vars);
|
|
||||||
setd_sub(NULL, NULL, ".ai_action", 1, (void *)(int)src->type, &md->nd->u.scr.script->script_vars);
|
|
||||||
setd_sub(NULL, NULL, ".ai_action", 2, (void *)src->id, &md->nd->u.scr.script->script_vars);
|
|
||||||
setd_sub(NULL, NULL, ".ai_action", 3, (void *)md->bl.id, &md->nd->u.scr.script->script_vars);
|
|
||||||
run_script(md->nd->u.scr.script, 0, 0, md->nd->bl.id);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (src->type) {
|
switch (src->type) {
|
||||||
case BL_PC:
|
case BL_PC:
|
||||||
@ -2112,22 +2093,13 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
|
|||||||
|
|
||||||
if(src && src->type == BL_MOB){
|
if(src && src->type == BL_MOB){
|
||||||
struct mob_data *smd = (struct mob_data *)src;
|
struct mob_data *smd = (struct mob_data *)src;
|
||||||
if(smd->nd){
|
if(smd->nd)
|
||||||
setd_sub(NULL, NULL, ".ai_action", 0, (void *)(int)5, &smd->nd->u.scr.script->script_vars);
|
mob_script_callback(smd, &md->bl, CALLBACK_KILL);
|
||||||
setd_sub(NULL, NULL, ".ai_action", 1, (void *)(int)md->bl.type, &smd->nd->u.scr.script->script_vars);
|
|
||||||
setd_sub(NULL, NULL, ".ai_action", 2, (void *)md->bl.id, &smd->nd->u.scr.script->script_vars);
|
|
||||||
setd_sub(NULL, NULL, ".ai_action", 3, (void *)smd->bl.id, &smd->nd->u.scr.script->script_vars);
|
|
||||||
run_script(smd->nd->u.scr.script, 0, 0, smd->nd->bl.id);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(md->nd){
|
if(md->nd)
|
||||||
setd_sub(NULL, NULL, ".ai_action", 0, (void *)(int)3, &md->nd->u.scr.script->script_vars);
|
mob_script_callback(md, src, CALLBACK_DEAD);
|
||||||
setd_sub(NULL, NULL, ".ai_action", 1, (void *)(int)(src?src->type:0), &md->nd->u.scr.script->script_vars);
|
else if(md->npc_event[0]){
|
||||||
setd_sub(NULL, NULL, ".ai_action", 2, (void *)(src?src->id:0), &md->nd->u.scr.script->script_vars);
|
|
||||||
setd_sub(NULL, NULL, ".ai_action", 3, (void *)md->bl.id, &md->nd->u.scr.script->script_vars);
|
|
||||||
run_script(md->nd->u.scr.script, 0, 0, md->nd->bl.id);
|
|
||||||
} else if(md->npc_event[0]){
|
|
||||||
if(src && src->type == BL_PET)
|
if(src && src->type == BL_PET)
|
||||||
sd = ((struct pet_data *)src)->msd;
|
sd = ((struct pet_data *)src)->msd;
|
||||||
if(sd && battle_config.mob_npc_event_type)
|
if(sd && battle_config.mob_npc_event_type)
|
||||||
@ -2449,6 +2421,10 @@ int mob_summonslave(struct mob_data *md2,int *value,int amount,int skill_id)
|
|||||||
|
|
||||||
clif_skill_nodamage(&md->bl,&md->bl,skill_id,amount,1);
|
clif_skill_nodamage(&md->bl,&md->bl,skill_id,amount,1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(md2->nd)
|
||||||
|
mob_convertslave(md2);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3012,6 +2988,20 @@ int mob_clone_delete(int class_)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mob_script_callback(struct mob_data *md, struct block_list *target, unsigned char action_type)
|
||||||
|
{
|
||||||
|
// I will not add any protection here since I assume everything is checked before coming here.
|
||||||
|
if(md->callback_flag&action_type){
|
||||||
|
setd_sub(NULL, NULL, ".ai_action", 0, (void *)(int)action_type, &md->nd->u.scr.script->script_vars);
|
||||||
|
if(target){
|
||||||
|
setd_sub(NULL, NULL, ".ai_action", 1, (void *)(int)target->type, &md->nd->u.scr.script->script_vars);
|
||||||
|
setd_sub(NULL, NULL, ".ai_action", 2, (void *)target->id, &md->nd->u.scr.script->script_vars);
|
||||||
|
}
|
||||||
|
setd_sub(NULL, NULL, ".ai_action", 3, (void *)md->bl.id, &md->nd->u.scr.script->script_vars);
|
||||||
|
run_script(md->nd->u.scr.script, 0, 0, md->nd->bl.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// <20>‰Šú‰»
|
// <20>‰Šú‰»
|
||||||
//
|
//
|
||||||
|
@ -25,6 +25,18 @@
|
|||||||
#define MOB_CLONE_START 9001
|
#define MOB_CLONE_START 9001
|
||||||
#define MOB_CLONE_END 10000
|
#define MOB_CLONE_END 10000
|
||||||
|
|
||||||
|
// Scripted Mob AI Constants
|
||||||
|
#define CALLBACK_ATTACK 0x80
|
||||||
|
#define CALLBACK_DETECT 0x40
|
||||||
|
#define CALLBACK_DEAD 0x20
|
||||||
|
#define CALLBACK_ASSIST 0x10
|
||||||
|
#define CALLBACK_KILL 0x08
|
||||||
|
#define CALLBACK_UNLOCK 0x04
|
||||||
|
#define CALLBACK_WALKACK 0x02
|
||||||
|
#define CALLBACK_WARPACK 0x01
|
||||||
|
|
||||||
|
void mob_script_callback(struct mob_data *md, struct block_list *target, unsigned char action_type);
|
||||||
|
|
||||||
struct mob_skill {
|
struct mob_skill {
|
||||||
short state;
|
short state;
|
||||||
short skill_id,skill_lv;
|
short skill_id,skill_lv;
|
||||||
|
@ -4663,13 +4663,8 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
|
|||||||
status_calc_mob(md, 0);
|
status_calc_mob(md, 0);
|
||||||
status_percent_heal(src,10,0);
|
status_percent_heal(src,10,0);
|
||||||
}
|
}
|
||||||
if(md->nd){
|
if(md->nd)
|
||||||
setd_sub(NULL, NULL, ".ai_action", 0, (void *)(int)5, &md->nd->u.scr.script->script_vars);
|
mob_script_callback(md, &sd->bl, CALLBACK_KILL);
|
||||||
setd_sub(NULL, NULL, ".ai_action", 1, (void *)(int)sd->bl.type, &md->nd->u.scr.script->script_vars);
|
|
||||||
setd_sub(NULL, NULL, ".ai_action", 2, (void *)sd->bl.id, &md->nd->u.scr.script->script_vars);
|
|
||||||
setd_sub(NULL, NULL, ".ai_action", 3, (void *)md->bl.id, &md->nd->u.scr.script->script_vars);
|
|
||||||
run_script(md->nd->u.scr.script, 0, 0, md->nd->bl.id);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case BL_PC:
|
case BL_PC:
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include "party.h"
|
#include "party.h"
|
||||||
#include "intif.h"
|
#include "intif.h"
|
||||||
#include "chrif.h"
|
#include "chrif.h"
|
||||||
|
#include "script.h"
|
||||||
|
|
||||||
static int dirx[8]={0,-1,-1,-1,0,1,1,1};
|
static int dirx[8]={0,-1,-1,-1,0,1,1,1};
|
||||||
static int diry[8]={1,1,0,-1,-1,-1,0,1};
|
static int diry[8]={1,1,0,-1,-1,-1,0,1};
|
||||||
@ -244,6 +245,8 @@ static int unit_walktoxy_timer(int tid,unsigned int tick,int id,int data)
|
|||||||
} else { //Stopped walking. Update to_x and to_y to current location [Skotlex]
|
} else { //Stopped walking. Update to_x and to_y to current location [Skotlex]
|
||||||
ud->to_x = bl->x;
|
ud->to_x = bl->x;
|
||||||
ud->to_y = bl->y;
|
ud->to_y = bl->y;
|
||||||
|
if(md && md->nd) // Tell the script engine we've finished walking (for AI pathfinding)
|
||||||
|
mob_script_callback(md, NULL, CALLBACK_WALKACK);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -530,6 +533,12 @@ int unit_warp(struct block_list *bl,int m,short x,short y,int type)
|
|||||||
map_addblock(bl);
|
map_addblock(bl);
|
||||||
clif_spawn(bl);
|
clif_spawn(bl);
|
||||||
skill_unit_move(bl,gettick(),1);
|
skill_unit_move(bl,gettick(),1);
|
||||||
|
|
||||||
|
if(bl->type == BL_MOB){
|
||||||
|
TBL_MOB *md = (TBL_MOB *)bl;
|
||||||
|
if(md->nd) // Tell the script engine we've warped
|
||||||
|
mob_script_callback(md, NULL, CALLBACK_WARPACK);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user