Преглед изворни кода

* [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

Lance пре 19 година
родитељ
комит
397f255a23
8 измењених фајлова са 67 додато и 54 уклоњено
  1. 5 1
      Changelog-Trunk.txt
  2. 8 6
      db/const.txt
  3. 1 1
      src/char/char.c
  4. 1 0
      src/map/map.h
  5. 29 39
      src/map/mob.c
  6. 12 0
      src/map/mob.h
  7. 2 7
      src/map/pc.c
  8. 9 0
      src/map/unit.c

+ 5 - 1
Changelog-Trunk.txt

@@ -3,10 +3,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/06/16
+	* [Improved]:
+	  - Cleaned up Custom Mob Script Callback codes. Looks much better now :B. [Lance]
+
 2006/06/15
 	* [Fixed]:
 	  - 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. 
    	  (note, someone already put the index on loginlog on trunk.) [Euph]
 	* Merged Adam's patch to let the char-server handle validation of

+ 8 - 6
db/const.txt

@@ -705,12 +705,14 @@ AI_ACTION_TAR_TYPE_PC	1
 AI_ACTION_TAR_TYPE_MOB	2
 AI_ACTION_TAR_TYPE_PET	4
 AI_ACTION_TAR_TYPE_HOMUN	8
-AI_ACTION_TYPE_ATTACK	1
-AI_ACTION_TYPE_DETECT	2
-AI_ACTION_TYPE_DEAD	3
-AI_ACTION_TYPE_ASSIST	4
-AI_ACTION_TYPE_KILL	5
-AI_ACTION_TYPE_UNLOCK	6
+AI_ACTION_TYPE_ATTACK	128
+AI_ACTION_TYPE_DETECT	64
+AI_ACTION_TYPE_DEAD	32
+AI_ACTION_TYPE_ASSIST	16
+AI_ACTION_TYPE_KILL	8
+AI_ACTION_TYPE_UNLOCK	4
+AI_ACTION_TYPE_WALKACK	2
+AI_ACTION_TYPE_WARPACK	1
 
 ALL_CLIENT	0
 ALL_SAMEMAP	1

+ 1 - 1
src/char/char.c

@@ -2562,7 +2562,7 @@ int parse_frommap(int fd) {
 				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]
 			}
-                        WFIFOHEAD(fd, 3 + NAME_LENGTH);
+			WFIFOHEAD(fd, 3 + NAME_LENGTH);
 			WFIFOW(fd,0) = 0x2afb;
 			WFIFOB(fd,2) = 0;
 			memcpy(WFIFOP(fd,3), wisp_server_name, NAME_LENGTH); // name for wisp to player

+ 1 - 0
src/map/map.h

@@ -875,6 +875,7 @@ struct mob_data {
 	int master_id,master_dist;
 
 	struct npc_data *nd;
+	unsigned char callback_flag;
 	
 	short skillidx;
 	unsigned int skilldelay[MAX_MOBSKILL];

+ 29 - 39
src/map/mob.c

@@ -772,11 +772,7 @@ static int mob_ai_sub_hard_activesearch(struct block_list *bl,va_list ap)
 		return 0;
 
 	if(md->nd){
-		setd_sub(NULL, NULL, ".ai_action", 0, (void *)(int)2, &md->nd->u.scr.script->script_vars);
-		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);
+		mob_script_callback(md, bl, CALLBACK_DETECT);
 		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(md->nd){
-					setd_sub(NULL, NULL, ".ai_action", 0, (void *)(int)4, &md->nd->u.scr.script->script_vars);
-					setd_sub(NULL, NULL, ".ai_action", 1, (void *)(int)tbl->type, &md->nd->u.scr.script->script_vars);
-					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);
+					mob_script_callback(md, bl, CALLBACK_ASSIST);
+					return 0;
 				}
 				md->target_id=tbl->id;
 				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);
 
-	if(md->nd){
-		struct block_list *tbl = map_id2bl(md->target_id);
-		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);
-	}
+	if(md->nd)
+		mob_script_callback(md, map_id2bl(md->target_id), CALLBACK_UNLOCK);
 
 	md->target_id=0;
 	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++;
 		
 	if(md->nd)
-	{
-		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);
-	}
+		mob_script_callback(md, src, CALLBACK_ATTACK);
 
 	switch (src->type) {
 		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){
 		struct mob_data *smd = (struct mob_data *)src;
-		if(smd->nd){
-			setd_sub(NULL, NULL, ".ai_action", 0, (void *)(int)5, &smd->nd->u.scr.script->script_vars);
-			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(smd->nd)
+			mob_script_callback(smd, &md->bl, CALLBACK_KILL);
 	}
 
-	if(md->nd){
-		setd_sub(NULL, NULL, ".ai_action", 0, (void *)(int)3, &md->nd->u.scr.script->script_vars);
-		setd_sub(NULL, NULL, ".ai_action", 1, (void *)(int)(src?src->type:0), &md->nd->u.scr.script->script_vars);
-		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(md->nd)
+		mob_script_callback(md, src, CALLBACK_DEAD);
+	else if(md->npc_event[0]){
 		if(src && src->type == BL_PET)
 			sd = ((struct pet_data *)src)->msd;
 		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);
 	}
+
+	if(md2->nd)
+		mob_convertslave(md2);
+
 	return 0;
 }
 
@@ -3012,6 +2988,20 @@ int mob_clone_delete(int class_)
 	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);
+	}
+}
+
 //
 // �‰Šú‰»
 //

+ 12 - 0
src/map/mob.h

@@ -25,6 +25,18 @@
 #define MOB_CLONE_START 9001
 #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 {
 	short state;
 	short skill_id,skill_lv;

+ 2 - 7
src/map/pc.c

@@ -4663,13 +4663,8 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
 			status_calc_mob(md, 0);
 			status_percent_heal(src,10,0);
 		}
-		if(md->nd){
-			setd_sub(NULL, NULL, ".ai_action", 0, (void *)(int)5, &md->nd->u.scr.script->script_vars);
-			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);
-		}
+		if(md->nd)
+			mob_script_callback(md, &sd->bl, CALLBACK_KILL);
 	}
 	break;
 	case BL_PC:

+ 9 - 0
src/map/unit.c

@@ -27,6 +27,7 @@
 #include "party.h"
 #include "intif.h"
 #include "chrif.h"
+#include "script.h"
 
 static int dirx[8]={0,-1,-1,-1,0,1,1,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]
 		ud->to_x = bl->x;
 		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;
 }
@@ -530,6 +533,12 @@ int unit_warp(struct block_list *bl,int m,short x,short y,int type)
 	map_addblock(bl);
 	clif_spawn(bl);
 	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;
 }