Bladeren bron

- Moved subtype from struct block_list to struct npc_data.
- Fixed some compilation warnings.


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@11772 54d463be-8e91-2dee-dedb-b68131a5f0ec

skotlex 17 jaren geleden
bovenliggende
commit
6840bb28ab
11 gewijzigde bestanden met toevoegingen van 37 en 41 verwijderingen
  1. 1 1
      db/skill_db.txt
  2. 1 2
      src/map/clif.c
  3. 1 1
      src/map/map.c
  4. 3 4
      src/map/map.h
  5. 0 2
      src/map/mercenary.c
  6. 3 3
      src/map/mob.c
  7. 19 19
      src/map/npc.c
  8. 0 1
      src/map/pet.c
  9. 6 6
      src/map/script.c
  10. 2 2
      src/map/status.c
  11. 1 0
      src/map/unit.c

+ 1 - 1
db/skill_db.txt

@@ -658,7 +658,7 @@
 
 10000,0,0,0,0,0,0,1,0,no,0,0x10,0,none,0        ,GD_APPROVAL,Official Guild Approval
 10001,0,0,0,0,0,0,1,0,no,0,0x10,0,none,0        ,GD_KAFRACONTRACT,Kafra Contract
-10002,0,0,0,0,0,0,1,0,no,0,0x10,0,none,0        ,GD_GUARDRESEARCH,Guardian Research
+10002,0,0,0,0,0,0,1,0,no,0,0x10,0,none,0        ,GD_GUARDIANRESEARCH,Guardian Research
 10003,0,0,0,0,0,0,1,0,no,0,0x10,0,none,0        ,GD_GUARDUP,Strengthen Guardians
 10004,0,0,0,0,0,0,10,0,no,0,0x10,0,none,0       ,GD_EXTENSION,Guild Extension
 10005,0,0,0,0,0,0,1,0,no,0,0x10,0,none,0        ,GD_GLORYGUILD,Guild's Glory

+ 1 - 2
src/map/clif.c

@@ -1074,7 +1074,6 @@ static int clif_set_unit_walking(struct block_list* bl, struct unit_data* ud, un
  *------------------------------------------*/
 static int clif_set_unit_spawned(struct block_list* bl, unsigned char* buf)
 {
-	struct status_change* sc = status_get_sc(bl);
 	struct view_data* vd = status_get_viewdata(bl);
 
 	if( pcdb_checkid(vd->class_) )
@@ -3583,7 +3582,7 @@ void clif_getareachar_unit(struct map_session_data* sd,struct block_list *bl)
 	uint8 buf[128];
 	struct unit_data *ud;
 	struct view_data *vd;
-	int len, fd = sd->fd;
+	int len;
 	
 	vd = status_get_viewdata(bl);
 	if (!vd || vd->class_ == INVISIBLE_CLASS)

+ 1 - 1
src/map/map.c

@@ -1955,7 +1955,7 @@ void map_removenpc(void)
 				clif_clearunit_area(&map[m].npc[i]->bl,2);
 				map_delblock(&map[m].npc[i]->bl);
 				idb_remove(id_db,map[m].npc[i]->bl.id);
-				if(map[m].npc[i]->bl.subtype==SCRIPT) {
+				if(map[m].npc[i]->subtype==SCRIPT) {
 					aFree(map[m].npc[i]->u.scr.script);
 					aFree(map[m].npc[i]->u.scr.label_list);
 				}

+ 3 - 4
src/map/map.h

@@ -189,7 +189,7 @@ enum bl_type {
 #define BL_CHAR (BL_PC|BL_MOB|BL_HOM)
 #define BL_ALL 0xfff
 
-enum bl_subtype { WARP, SHOP, SCRIPT, MONS };
+enum npc_subtype { WARP, SHOP, SCRIPT };
 
 enum {
 	RC_FORMLESS=0,
@@ -233,7 +233,6 @@ struct block_list {
 	int id;
 	short m,x,y;
 	enum bl_type type;
-	enum bl_subtype subtype;
 };
 
 struct walkpath_data {
@@ -824,6 +823,7 @@ struct npc_data {
 	struct unit_data  ud; //Because they need to be able to move....
 	struct view_data *vd;
 	struct status_change sc; //They can't have status changes, but.. they want the visual opt values.
+	struct npc_data *master_nd;
 	short n;
 	short class_;
 	short speed;
@@ -833,8 +833,7 @@ struct npc_data {
 	unsigned int next_walktime;
 
 	void* chatdb; // pointer to a npc_parse struct (see npc_chat.c)
-	struct npc_data *master_nd;
-
+	enum npc_subtype subtype;
 	union {
 		struct {
 			struct script_code *script;

+ 0 - 2
src/map/mercenary.c

@@ -608,7 +608,6 @@ int merc_hom_alloc(struct map_session_data *sd, struct s_homunculus *hom)
 		return 1;
 	}
 	sd->hd = hd = aCalloc(1,sizeof(struct homun_data));
-	hd->bl.subtype = MONS;
 	hd->bl.type = BL_HOM;
 	hd->bl.id = npc_get_new_npc_id();
 
@@ -643,7 +642,6 @@ void merc_hom_init_timers(struct homun_data * hd)
 {
 	if (hd->hungry_timer == -1)
 		hd->hungry_timer = add_timer(gettick()+hd->homunculusDB->hungryDelay,merc_hom_hungry,hd->master->bl.id,0);
-	hd->ud.canact_tick = 0; //Reset can-act delay
 	hd->regen.state.block = 0; //Restore HP/SP block.
 }
 

+ 3 - 3
src/map/mob.c

@@ -207,7 +207,6 @@ struct mob_data* mob_spawn_dataset(struct spawn_data *data)
 	struct mob_data *md = aCalloc(1, sizeof(struct mob_data));
 	md->bl.id= npc_get_new_npc_id();
 	md->bl.type = BL_MOB;
-	md->bl.subtype = MONS;
 	md->bl.m = data->m;
 	md->bl.x = data->x;
 	md->bl.y = data->y;
@@ -889,10 +888,11 @@ static int mob_warpchase_sub(struct block_list *bl,va_list ap)
 	target_nd= va_arg(ap, struct npc_data**);
 	min_distance= va_arg(ap, int*);
 
-	if(bl->subtype != WARP)
-		return 0; //Not a warp
 	nd = (TBL_NPC*) bl;
 
+	if(nd->subtype != WARP)
+		return 0; //Not a warp
+
 	if(nd->u.warp.mapindex != map[target->m].index)
 		return 0; //Does not lead to the same map.
 

+ 19 - 19
src/map/npc.c

@@ -725,7 +725,7 @@ int npc_touch_areanpc(struct map_session_data* sd, int m, int x, int y)
 			continue;
 		}
 
-		switch(map[m].npc[i]->bl.subtype) {
+		switch(map[m].npc[i]->subtype) {
 		case WARP:
 			xs=map[m].npc[i]->u.warp.xs;
 			ys=map[m].npc[i]->u.warp.ys;
@@ -746,7 +746,7 @@ int npc_touch_areanpc(struct map_session_data* sd, int m, int x, int y)
 			ShowError("npc_touch_areanpc : some bug \n");
 		return 1;
 	}
-	switch(map[m].npc[i]->bl.subtype) {
+	switch(map[m].npc[i]->subtype) {
 		case WARP:
 			// hidden chars cannot use warps -- is it the same for scripts too?
 			if (sd->sc.option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK) ||
@@ -785,7 +785,7 @@ int npc_touch_areanpc2(struct block_list* bl)
 		if (map[m].npc[i]->sc.option&OPTION_INVISIBLE)
 			continue;
 
-		if (map[m].npc[i]->bl.subtype!=WARP)
+		if (map[m].npc[i]->subtype!=WARP)
 			continue;
 	
 		xs=map[m].npc[i]->u.warp.xs;
@@ -840,7 +840,7 @@ int npc_check_areanpc(int flag, int m, int x, int y, int range)
 		if (map[m].npc[i]->sc.option&OPTION_INVISIBLE)
 			continue;
 
-		switch(map[m].npc[i]->bl.subtype)
+		switch(map[m].npc[i]->subtype)
 		{
 		case WARP:
 			if (!(flag&1))
@@ -949,7 +949,7 @@ int npc_click(struct map_session_data* sd, struct npc_data* nd)
 	if (nd->class_ < 0 || nd->sc.option&(OPTION_INVISIBLE|OPTION_HIDE))
 		return 1;
 
-	switch(nd->bl.subtype) {
+	switch(nd->subtype) {
 	case SHOP:
 		clif_npcbuysell(sd,nd->bl.id);
 		break;
@@ -1000,7 +1000,7 @@ int npc_buysellsel(struct map_session_data* sd, int id, int type)
 	if ((nd = npc_checknear(sd,map_id2bl(id))) == NULL)
 		return 1;
 	
-	if (nd->bl.subtype!=SHOP) {
+	if (nd->subtype!=SHOP) {
 		ShowError("no such shop npc : %d\n",id);
 		if (sd->npc_id == id)
 			sd->npc_id=0;
@@ -1052,7 +1052,7 @@ int npc_buylist(struct map_session_data* sd, int n, unsigned short* item_list)
 	if (nd->master_nd) //Script-based shops.
 		return npc_buylist_sub(sd,n,item_list,nd->master_nd);
 
-	if (nd->bl.subtype!=SHOP)
+	if (nd->subtype!=SHOP)
 		return 3;
 
 	for(i=0,w=0,z=0;i<n;i++) {
@@ -1228,7 +1228,7 @@ int npc_remove_map(struct npc_data* nd)
 		return 1; //Not assigned to a map.
   	m = nd->bl.m;
 	clif_clearunit_area(&nd->bl,2);
-	if (nd->bl.subtype == WARP)
+	if (nd->subtype == WARP)
 	{// Remove corresponding NPC CELLs
 		int j, xs, ys, x, y;
 		x = nd->bl.x;
@@ -1269,7 +1269,7 @@ static int npc_unload_dup_sub(DBKey key, void* data, va_list ap)
 	struct npc_data *nd = (struct npc_data *)data;
 	int src_id;
 
-	if(nd->bl.type!=BL_NPC || nd->bl.subtype != SCRIPT)
+	if(nd->bl.type!=BL_NPC || nd->subtype != SCRIPT)
 		return 0;
 
 	src_id=va_arg(ap,int);
@@ -1299,10 +1299,10 @@ int npc_unload(struct npc_data* nd)
 	npc_chat_finalize(nd); // deallocate npc PCRE data structures
 #endif
 
-	if( nd->bl.subtype == SHOP )
+	if( nd->subtype == SHOP )
 		aFree(nd->u.shop.shop_item);
 	else
-	if( nd->bl.subtype == SCRIPT )
+	if( nd->subtype == SCRIPT )
 	{
 		ev_db->foreach(ev_db,npc_unload_ev,nd->exname); //Clean up all events related.
 		if (nd->u.scr.timerid != -1) {
@@ -1508,7 +1508,7 @@ struct npc_data* npc_add_warp(short from_mapid, short from_x, short from_y, shor
 	nd->u.warp.xs = xs;
 	nd->u.warp.ys = xs;
 	nd->bl.type = BL_NPC;
-	nd->bl.subtype = WARP;
+	nd->subtype = WARP;
 	npc_setcells(nd);
 	map_addblock(&nd->bl);
 	status_set_viewdata(&nd->bl, nd->class_);
@@ -1568,7 +1568,7 @@ static const char* npc_parse_warp(char* w1, char* w2, char* w3, char* w4, const
 	nd->u.warp.ys = ys;
 	npc_warp++;
 	nd->bl.type = BL_NPC;
-	nd->bl.subtype = WARP;
+	nd->subtype = WARP;
 	npc_setcells(nd);
 	map_addblock(&nd->bl);
 	status_set_viewdata(&nd->bl, nd->class_);
@@ -1653,7 +1653,7 @@ static const char* npc_parse_shop(char* w1, char* w2, char* w3, char* w4, const
 
 	++npc_shop;
 	nd->bl.type = BL_NPC;
-	nd->bl.subtype = SHOP;
+	nd->subtype = SHOP;
 	if( m >= 0 )
 	{// normal shop npc
 		nd->n = map_addnpc(m,nd);
@@ -1888,7 +1888,7 @@ static const char* npc_parse_script(char* w1, char* w2, char* w3, char* w4, cons
 
 	++npc_script;
 	nd->bl.type = BL_NPC;
-	nd->bl.subtype = SCRIPT;
+	nd->subtype = SCRIPT;
 
 	if( m >= 0 )
 	{
@@ -1969,7 +1969,7 @@ void npc_setcells(struct npc_data* nd)
 	int m = nd->bl.m, x = nd->bl.x, y = nd->bl.y, xs, ys;
 	int i,j;
 
-	if (nd->bl.subtype == WARP) {
+	if (nd->subtype == WARP) {
 		xs = nd->u.warp.xs;
 		ys = nd->u.warp.ys;
 	} else {
@@ -2003,7 +2003,7 @@ void npc_unsetcells(struct npc_data* nd)
 	int m = nd->bl.m, x = nd->bl.x, y = nd->bl.y, xs, ys;
 	int i,j, x0, x1, y0, y1;
 
-	if (nd->bl.subtype == WARP) {
+	if (nd->subtype == WARP) {
 		xs = nd->u.warp.xs;
 		ys = nd->u.warp.ys;
 	} else {
@@ -2862,7 +2862,7 @@ int do_final_npc(void)
 static void npc_debug_warps_sub(struct npc_data* nd)
 {
 	int m;
-	if (nd->bl.type != BL_NPC || nd->bl.subtype != WARP || nd->bl.m < 0)
+	if (nd->bl.type != BL_NPC || nd->subtype != WARP || nd->bl.m < 0)
 		return;
 
 	m = map_mapindex2mapid(nd->u.warp.mapindex);
@@ -2952,7 +2952,7 @@ int do_init_npc(void)
 
 	npc_script++;
 	fake_nd->bl.type = BL_NPC;
-	fake_nd->bl.subtype = SCRIPT;
+	fake_nd->subtype = SCRIPT;
 
 	strdb_put(npcname_db, fake_nd->exname, fake_nd);
 	fake_nd->u.scr.timerid = -1;

+ 0 - 1
src/map/pet.c

@@ -395,7 +395,6 @@ int pet_data_init(struct map_session_data *sd, struct s_pet *pet)
 	pd->bl.y = pd->ud.to_y;
 	pd->bl.id = npc_get_new_npc_id();
 	pd->db = mob_db(pet->class_);
-	pd->bl.subtype = MONS;
 	pd->bl.type = BL_PET;
 	pd->msd = sd;
 	status_set_viewdata(&pd->bl, pet->class_);

+ 6 - 6
src/map/script.c

@@ -11691,7 +11691,7 @@ BUILDIN_FUNC(callshop)
 	if( script_hasdata(st,3) )
 		flag = script_getnum(st,3);
 	nd = npc_name2id(shopname);
-	if (!nd || nd->bl.type!=BL_NPC || nd->bl.subtype!=SHOP) {
+	if (!nd || nd->bl.type!=BL_NPC || nd->subtype!=SHOP) {
 		ShowError("buildin_callshop: Shop [%s] not found (or NPC is not shop type)\n", shopname);
 		script_pushint(st,0);
 		return 1;
@@ -11720,7 +11720,7 @@ BUILDIN_FUNC(npcshopitem)
 	int n, i;
 	int amount;
 
-	if( !nd || nd->bl.subtype != SHOP )
+	if( !nd || nd->subtype != SHOP )
 	{	//Not found.
 		script_pushint(st,0);
 		return 0;
@@ -11749,7 +11749,7 @@ BUILDIN_FUNC(npcshopadditem)
 	int n, i;
 	int amount;
 
-	if( !nd || nd->bl.subtype != SHOP )
+	if( !nd || nd->subtype != SHOP )
 	{	//Not found.
 		script_pushint(st,0);
 		return 0;
@@ -11778,7 +11778,7 @@ BUILDIN_FUNC(npcshopdelitem)
 	int amount;
 	int size;
 
-	if( !nd || nd->bl.subtype != SHOP )
+	if( !nd || nd->subtype != SHOP )
 	{	//Not found.
 		script_pushint(st,0);
 		return 0;
@@ -11815,7 +11815,7 @@ BUILDIN_FUNC(npcshopattach)
 	if( script_hasdata(st,3) )
 		flag = script_getnum(st,3);
 
-	if( !nd || nd->bl.subtype != SHOP )
+	if( !nd || nd->subtype != SHOP )
 	{	//Not found.
 		script_pushint(st,0);
 		return 0;
@@ -12708,7 +12708,7 @@ BUILDIN_FUNC(getvariableofnpc)
 	}
 
 	nd = npc_name2id(script_getstr(st,3));
-	if( nd == NULL || nd->bl.subtype != SCRIPT || nd->u.scr.script == NULL )
+	if( nd == NULL || nd->subtype != SCRIPT || nd->u.scr.script == NULL )
 	{// NPC not found or has no script
 		ShowError("script:getvariableofnpc: can't find npc %s\n", script_getstr(st,3));
 		script_pushnil(st);

+ 2 - 2
src/map/status.c

@@ -4180,7 +4180,7 @@ int status_get_guild_id(struct block_list *bl)
 			return ((TBL_HOM*)bl)->master->status.guild_id;
 		break;
 	case BL_NPC:
-	  	if (bl->subtype == SCRIPT)
+	  	if (((TBL_NPC*)bl)->subtype == SCRIPT)
 			return ((TBL_NPC*)bl)->u.scr.guild_id;
 		break;
 	case BL_SKILL:
@@ -4214,7 +4214,7 @@ int status_get_emblem_id(struct block_list *bl)
 			return ((TBL_HOM*)bl)->master->guild_emblem_id;
 		break;
 	case BL_NPC:
-		if (bl->subtype == SCRIPT && ((TBL_NPC*)bl)->u.scr.guild_id > 0) {
+		if (((TBL_NPC*)bl)->subtype == SCRIPT && ((TBL_NPC*)bl)->u.scr.guild_id > 0) {
 			struct guild *g = guild_search(((TBL_NPC*)bl)->u.scr.guild_id);
 			if (g)
 				return g->emblem_id;

+ 1 - 0
src/map/unit.c

@@ -1724,6 +1724,7 @@ int unit_remove_map(struct block_list *bl, int clrtype)
 		}
 	} else if (bl->type == BL_HOM) {
 		struct homun_data *hd = (struct homun_data *) bl;
+		ud->canact_tick = ud->canmove_tick; //It appears HOM do reset the can-act tick.
 		if(!hd->homunculus.intimacy &&
 			!(hd->master && hd->master->state.waitingdisconnect)
 		) {	//If logging out, this is deleted on unit_free