From 53796ffafd6eb381595b77cda1b039d795940e68 Mon Sep 17 00:00:00 2001 From: skotlex Date: Sat, 1 Apr 2006 02:23:56 +0000 Subject: - Added structure view_data to handle sprite information for all characters (equipment, weapons, hair, dyes, etc). Unified a bunch of clif functions now that you only need to handle the view_data (so instead of clif_spawn[pc/mob/npc/pet] you just have clif_spawn) - Fixed the clif_change_class packet (it should check for non players classes, not a class above MAX_PC_CLASS), it fixes morphing enemies. - Rewrote the way cloth dye packets are resent to optimize bandwidth usage. - Fixed the npc_item_flag thing (enable_items/disable_items script command) - Rewrote the disguise implementation to be bandwidth friendly. - Modified the hide options to change your class to INVISIBLE_CLASS, since such classes don't even get their view packets sent around. - Rewrote several clif functions to adapt to the new view_data class; - Added class 139 to npcdb_checkid which was required by some npcs in the swordman quest? o.O git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@5833 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/unit.c | 127 +++++++++++---------------------------------------------- 1 file changed, 24 insertions(+), 103 deletions(-) (limited to 'src/map/unit.c') diff --git a/src/map/unit.c b/src/map/unit.c index e441bc693..dd2ee0505 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -57,21 +57,9 @@ int unit_walktoxy_sub(struct block_list *bl) memcpy(&ud->walkpath,&wpd,sizeof(wpd)); - switch (bl->type) { - case BL_PC: + if (bl->type == BL_PC) clif_walkok((TBL_PC*)bl); - clif_movechar((TBL_PC*)bl); - break; - case BL_MOB: - clif_movemob((TBL_MOB*)bl); - break; - case BL_PET: - clif_movepet((TBL_PET*)bl); - break; - case BL_NPC: - clif_movenpc((TBL_NPC*)bl); - break; - } + clif_move(bl); ud->state.change_walk_target=0; @@ -151,22 +139,9 @@ static int unit_walktoxy_timer(int tid,unsigned int tick,int id,int data) // バシリカ判定 - ud->walktimer = 1; - switch (bl->type) { - case BL_PC: - map_foreachinmovearea(clif_pcoutsight,bl->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_ALL,sd); - break; - case BL_MOB: - map_foreachinmovearea(clif_moboutsight,bl->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,md); - break; - case BL_PET: - map_foreachinmovearea(clif_petoutsight,bl->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,(TBL_PET*)bl); - break; - case BL_NPC: - map_foreachinmovearea(clif_npcoutsight,bl->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,(TBL_NPC*)bl); - break; - } - ud->walktimer = -1; + map_foreachinmovearea(clif_outsight,bl->m, + x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE, + dx,dy,sd?BL_ALL:BL_PC,bl); if(md && md->min_chase > md->db->range2) md->min_chase--; @@ -176,20 +151,9 @@ static int unit_walktoxy_timer(int tid,unsigned int tick,int id,int data) map_moveblock(bl, x, y, tick); ud->walktimer = 1; - switch (bl->type) { - case BL_PC: - map_foreachinmovearea(clif_pcinsight,bl->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,BL_ALL,sd); - break; - case BL_MOB: - map_foreachinmovearea(clif_mobinsight,bl->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,BL_PC,md); - break; - case BL_PET: - map_foreachinmovearea(clif_petinsight,bl->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,BL_PC,(TBL_PET*)bl); - break; - case BL_NPC: - map_foreachinmovearea(clif_npcinsight,bl->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,BL_PC,(TBL_NPC*)bl); - break; - } + map_foreachinmovearea(clif_insight,bl->m, + x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE, + -dx,-dy,sd?BL_ALL:BL_PC,bl); ud->walktimer = -1; if(sd) { @@ -219,7 +183,6 @@ static int unit_walktoxy_timer(int tid,unsigned int tick,int id,int data) clif_displaymessage(sd->fd,"[Miracle of the Sun, Moon and Stars]"); sc_start(&sd->bl,SC_MIRACLE,100,1,battle_config.sg_miracle_skill_duration); } - } } @@ -285,14 +248,11 @@ int unit_movepos(struct block_list *bl,int dst_x,int dst_y, int easy, int checkp int dx,dy,dir; struct unit_data *ud = NULL; struct map_session_data *sd = NULL; - struct mob_data *md = NULL; struct walkpath_data wpd; nullpo_retr(0, bl); if( BL_CAST( BL_PC, bl, sd ) ) { ud = &sd->ud; - } else if( BL_CAST( BL_MOB, bl, md ) ) { - ud = &md->ud; } else ud = unit_bl2ud(bl); @@ -311,37 +271,16 @@ int unit_movepos(struct block_list *bl,int dst_x,int dst_y, int easy, int checkp dx = dst_x - bl->x; dy = dst_y - bl->y; - switch (bl->type) { - case BL_PC: - map_foreachinmovearea(clif_pcoutsight,bl->m,bl->x-AREA_SIZE,bl->y-AREA_SIZE,bl->x+AREA_SIZE,bl->y+AREA_SIZE,dx,dy,BL_ALL,sd); - break; - case BL_MOB: - map_foreachinmovearea(clif_moboutsight,bl->m,bl->x-AREA_SIZE,bl->y-AREA_SIZE,bl->x+AREA_SIZE,bl->y+AREA_SIZE,dx,dy,BL_PC,md); - break; - case BL_PET: - map_foreachinmovearea(clif_petoutsight,bl->m,bl->x-AREA_SIZE,bl->y-AREA_SIZE,bl->x+AREA_SIZE,bl->y+AREA_SIZE,dx,dy,BL_PC,(TBL_PET*)bl); - break; - case BL_NPC: - map_foreachinmovearea(clif_petoutsight,bl->m,bl->x-AREA_SIZE,bl->y-AREA_SIZE,bl->x+AREA_SIZE,bl->y+AREA_SIZE,dx,dy,BL_PC,(TBL_NPC*)bl); - break; - } + map_foreachinmovearea(clif_outsight,bl->m, + bl->x-AREA_SIZE,bl->y-AREA_SIZE,bl->x+AREA_SIZE,bl->y+AREA_SIZE, + dx,dy,sd?BL_ALL:BL_PC,bl); map_moveblock(bl, dst_x, dst_y, gettick()); + ud->walktimer = 1; - switch (bl->type) { - case BL_PC: - map_foreachinmovearea(clif_pcinsight,bl->m,bl->x-AREA_SIZE,bl->y-AREA_SIZE,bl->x+AREA_SIZE,bl->y+AREA_SIZE,-dx,-dy,BL_ALL,sd); - break; - case BL_MOB: - map_foreachinmovearea(clif_mobinsight,bl->m,bl->x-AREA_SIZE,bl->y-AREA_SIZE,bl->x+AREA_SIZE,bl->y+AREA_SIZE,-dx,-dy,BL_PC,md); - break; - case BL_PET: - map_foreachinmovearea(clif_petinsight,bl->m,bl->x-AREA_SIZE,bl->y-AREA_SIZE,bl->x+AREA_SIZE,bl->y+AREA_SIZE,-dx,-dy,BL_PC,(TBL_PET*)bl); - break; - case BL_NPC: - map_foreachinmovearea(clif_npcinsight,bl->m,bl->x-AREA_SIZE,bl->y-AREA_SIZE,bl->x+AREA_SIZE,bl->y+AREA_SIZE,-dx,-dy,BL_PC,(TBL_NPC*)bl); - break; - } + map_foreachinmovearea(clif_insight,bl->m, + bl->x-AREA_SIZE,bl->y-AREA_SIZE,bl->x+AREA_SIZE,bl->y+AREA_SIZE, + -dx,-dy,sd?BL_ALL:BL_PC,bl); ud->walktimer = -1; if(sd) { @@ -454,21 +393,11 @@ int unit_warp(struct block_list *bl,int m,int x,int y,int type) bl->m=m; map_addblock(bl); - switch (bl->type) { - case BL_PC: - clif_spawnpc((TBL_PC*)bl); - break; - case BL_MOB: - clif_spawnmob((TBL_MOB*)bl); - mob_warpslave(bl,AREA_SIZE); - break; - case BL_PET: - clif_spawnpet((TBL_PET*)bl); - break; - case BL_NPC: - clif_spawnnpc((TBL_NPC*)bl); - break; - } + clif_spawn(bl); +//This is broken because the mob already was changed from map. +//Fortunately, the slave ai will make them chase their master automatically +// if (bl->type == BL_MOB) +// mob_warpslave(bl,AREA_SIZE); skill_unit_move(bl,gettick(),1); return 0; } @@ -836,11 +765,8 @@ int unit_skilluse_id2(struct block_list *src, int target_id, int skill_num, int } if( casttime>0 || temp){ /* 詠唱が必要 */ - if(sd && sd->disguise) { // [Valaris] - clif_skillcasting(src, src->id, target_id, 0,0, skill_num,0); - clif_skillcasting(src,-src->id, target_id, 0,0, skill_num,casttime); - } else - clif_skillcasting(src, src->id, target_id, 0,0, skill_num,casttime); + + clif_skillcasting(src, src->id, target_id, 0,0, skill_num,casttime); /* 詠唱反応モンスター */ if (sd && target->type == BL_MOB) @@ -973,12 +899,7 @@ int unit_skilluse_pos2( struct block_list *src, int skill_x, int skill_y, int sk if( casttime>0 ) { /* 詠唱が必要 */ unit_stop_walking( src, 1); // 歩行停止 - if(sd && sd->disguise) { // [Valaris] - clif_skillcasting(src, src->id, 0, skill_x,skill_y, skill_num,0); - clif_skillcasting(src,-src->id, 0, skill_x,skill_y, skill_num,casttime); - } - else - clif_skillcasting(src, src->id, 0, skill_x,skill_y, skill_num,casttime); + clif_skillcasting(src, src->id, 0, skill_x,skill_y, skill_num,casttime); } if( casttime<=0 ) /* 詠唱の無いものはキャンセルされない */ @@ -1502,7 +1423,7 @@ int unit_remove_map(struct block_list *bl, int clrtype) { delete_timer(md->deletetimer,mob_timer_delete); md->deletetimer=-1; md->hp=0; - if(pcdb_checkid(mob_get_viewclass(md->class_))) //Player mobs are not removed automatically by the client. + if(pcdb_checkid(md->vd->class_)) //Player mobs are not removed automatically by the client. clif_clearchar_delay(gettick()+3000,bl,0); mob_deleteslave(md); -- cgit v1.2.3-60-g2f50