www.pudn.com > mycode-08[1].8.24.rar > char_party.c


#include "version.h" 
#include  
 
#include "readmap.h" 
#include "object.h" 
#include "char.h" 
#include "char_base.h" 
#include "battle.h" 
#include "lssproto_serv.h" 
#include "npcutil.h" 
#include "npc_bus.h" 
#include "npc_airplane.h"       // Arminius 7.10 Airplane 
#include "family.h"             // shan 
 
#ifdef _ITEM_QUITPARTY 
#include "init.h" 
#endif 
// shan add  
extern struct FM_PKFLOOR fmpkflnum[FAMILY_FMPKFLOOR]; 
 
/*------------------------------------------------------------ 
 * 由□  奴楮  及末□旦 
 ------------------------------------------------------------*/ 
 
/*------------------------------------------------------------ 
 * 坞中化中月由□  奴  毛茧允 
 * 卅仃木壬-1毛忒允[ 
 ------------------------------------------------------------*/ 
int CHAR_getEmptyPartyArray( int charaindex) 
{ 
	int     i = -1; 
	int     rc = FALSE; 
	int		toindex; 
	if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_NONE ) { 
		toindex = charaindex; 
	} 
	else { 
		toindex = CHAR_getPartyIndex( charaindex, 0); 
	} 
	if( CHAR_CHECKINDEX( toindex)){ 
		for( i = 1; i < CHAR_PARTYMAX; i ++ ) { 
			if( CHAR_getWorkInt( toindex, i + CHAR_WORKPARTYINDEX1) == -1 ) { 
				rc = TRUE; 
				break; 
			} 
		} 
	} 
	return( rc ? i: -1); 
} 
/*------------------------------------------------------------ 
 *   端卞由□  奴卞  月质   
 * 
 *  charaindex		int		愤坌 
 *  targetindex		int		  月锹澎及谛 
 ------------------------------------------------------------*/ 
void CHAR_JoinParty_Main( int charaindex, int targetindex) 
{ 
	int		firstflg = FALSE; 
	int		i; 
	char	c[3]; 
	char buf[64]; 
	int		toindex; 
	int		parray; 
 
	/* 褪互中凶日娄匀舰曰请允 */ 
	if( CHAR_getWorkInt( targetindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_NONE ) { 
		toindex = targetindex; 
	} 
	else { 
		toindex = CHAR_getPartyIndex( targetindex, 0); 
		if( !CHAR_CHECKINDEX( toindex) ) { 
			print( " %s:%d err\n", __FILE__, __LINE__); 
			return; 
		} 
	} 
 
 
	/* 锹澎由□  奴及谛醒反    井" */ 
	parray = CHAR_getEmptyPartyArray( toindex) ; 
	if( parray == -1 ) { 
		print( "%s : %d err\n", __FILE__,__LINE__); 
		return; 
	} 
	/* 窒手  仄  褪及凛反褪卞卅匀凶CA毛霜耨允月 */ 
	if( CHAR_getWorkInt( toindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_NONE ) { 
		CHAR_sendLeader( CHAR_getWorkInt( toindex, CHAR_WORKOBJINDEX), 1); 
		/* 锹澎及橇谪及踏五晶尹 */ 
		/* 褪卞卅月 */ 
		CHAR_setWorkInt( toindex, CHAR_WORKPARTYMODE, 1); 
		CHAR_setWorkInt( toindex, CHAR_WORKPARTYINDEX1, toindex); 
		firstflg = TRUE; 
	} 
	CHAR_setWorkInt( toindex, parray + CHAR_WORKPARTYINDEX1, charaindex); 
 
	CHAR_setWorkChar( charaindex, CHAR_WORKWALKARRAY, ""); 
 
	CHAR_setWorkInt( charaindex, CHAR_WORKPARTYMODE, CHAR_PARTY_CLIENT); 
 
	CHAR_setWorkInt( charaindex, CHAR_WORKPARTYINDEX1, toindex); 
 
	if( firstflg ) { 
		CHAR_sendStatusString( toindex, "N0"); 
	} 
 
 
	for( i = 0; i < CHAR_PARTYMAX; i ++ ) { 
		int index = CHAR_getWorkInt( toindex, i + CHAR_WORKPARTYINDEX1); 
		if( CHAR_CHECKINDEX(index)) { 
				snprintf( c, sizeof(c), "N%d", i); 
				CHAR_sendStatusString( charaindex, c); 
		} 
	} 
 
	snprintf( buf,sizeof( buf), "%s 加入团队!", 
			  CHAR_getChar( charaindex, CHAR_NAME)); 
 
	for( i = 0; i < CHAR_PARTYMAX; i ++ ) { 
		int index = CHAR_getWorkInt( toindex, i + CHAR_WORKPARTYINDEX1); 
		if( CHAR_CHECKINDEX(index)) { 
			if( index != charaindex ) { 
				snprintf( c, sizeof(c), "N%d", parray); 
				CHAR_sendStatusString( index, c); 
				CHAR_talkToCli( index, -1, buf, CHAR_COLORYELLOW); 
			} 
			else { 
				CHAR_talkToCli( index, -1, "加入团队!", CHAR_COLORYELLOW); 
			} 
		} 
	} 
} 
/*------------------------------------------------------------ 
 * 由□  奴卞  欠丹午允月[ 
 ------------------------------------------------------------*/ 
BOOL CHAR_JoinParty( int charaindex ) 
{ 
 
	int     result = -1; 
	int     x,y; 
	OBJECT  object; 
	int     found = FALSE; 
	int     fd; 
	int		cnt; 
	int	i; 
	fd = getfdFromCharaIndex( charaindex ); 
	if( fd == -1 ) { 
		print( "%s : %d err\n", __FILE__, __LINE__); 
		return FALSE; 
	} 
        /* 愤坌互由□  奴赚氏匹凶日蛲   */ 
	if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE ) { 
		lssproto_PR_send( fd, 1, FALSE); 
		return FALSE; 
	} 
	/*   及蟆及甄  毛  月 */ 
	CHAR_getCoordinationDir( CHAR_getInt( charaindex, CHAR_DIR ) , 
							 CHAR_getInt( charaindex , CHAR_X ), 
							 CHAR_getInt( charaindex , CHAR_Y ) , 
							 1 , &x , &y ); 
 
	/* 赓渝祭允月 */ 
	for( i = 0; i < CONNECT_WINDOWBUFSIZE; i ++ ) { 
        CONNECT_setJoinpartycharaindex(fd,i,-1); 
    } 
	cnt = 0; 
 
	/*愤坌及  及蟆及平乓仿毛潸  允月 */ 
	for( object = MAP_getTopObj( CHAR_getInt( charaindex, CHAR_FLOOR),x,y) ; 
		 object ; 
		 object = NEXT_OBJECT(object ) ) 
	{ 
		int toindex; 
		int parray; 
		int objindex = GET_OBJINDEX(object); 
		int targetindex = -1; 
		/* 平乓仿弁正□元扎卅中 */ 
		if( OBJECT_getType( objindex) != OBJTYPE_CHARA) continue; 
		toindex = OBJECT_getIndex( objindex); 
	 
                // shan begin 
                if( CHAR_getInt(charaindex, CHAR_FMINDEX) > 0 && CHAR_getInt(toindex, CHAR_FMINDEX) >0){ 
                    for( i = 0; i < FAMILY_FMPKFLOOR; i++){ 
                        if( fmpkflnum[i].fl == CHAR_getInt( charaindex, CHAR_FLOOR) ) 
                            if( CHAR_getInt(charaindex, CHAR_FMINDEX) != CHAR_getInt(toindex, CHAR_FMINDEX) ){ 
                                lssproto_PR_send( fd, 1, FALSE); 
                                return FALSE; 
                            } 
                    } 
                } 
                // shan end 
	 
		/* 皿伊奶乩□及凛 */ 
		if( CHAR_getInt( toindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ){ 
			found = TRUE; 
			/* 锹澎互阂分匀凶日褪毛娄匀舰曰请允 */ 
			if( CHAR_getWorkInt( toindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_CLIENT ) { 
				targetindex = CHAR_getWorkInt( toindex, CHAR_WORKPARTYINDEX1); 
				if( !CHAR_CHECKINDEX( targetindex) ) { 
					print( " %s:%d err\n", __FILE__, __LINE__); 
					continue; 
				} 
				if( CHAR_getInt( targetindex, CHAR_WHICHTYPE) == CHAR_TYPEBUS) { 
					continue; 
				} 
			} 
			else { 
				targetindex = toindex; 
			} 
			/*   褪午  ㄠ汹动  卞中月井 */ 
			if( NPC_Util_CharDistance( charaindex, targetindex ) > 1) { 
				continue; 
			} 
 
			/* 爵    反匹卅中仪[*/ 
			if( CHAR_getWorkInt( targetindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE ){ 
				continue; 
			} 
			/* 醮棉袱第乒□玉井 */ 
			if( !CHAR_getFlg( targetindex, CHAR_ISPARTY) ) continue; 
 
#ifdef _ANGEL_SUMMON 
			if( CHAR_getWorkInt( targetindex, CHAR_WORKANGELMODE) == TRUE) { 
				CHAR_talkToCli( charaindex, -1, "使者不可以当领队。", CHAR_COLORYELLOW); 
				continue; 
			} 
#endif 
#ifdef _ESCAPE_RESET // 使用恶宝逃跑後x分钟内不可与人组队 
			if( getStayEncount( getfdFromCharaIndex(targetindex) ) ) { 
				//print(" 恶宝中组队 "); 
				if( time(NULL) - CHAR_getWorkInt( targetindex, CHAR_WORKLASTESCAPE) < 5*60 ) { 
					//print(" 恶宝逃跑後组队 "); 
					CHAR_talkToCli( charaindex, -1, "此人暂时不可以当领队。", CHAR_COLORYELLOW); 
					continue; 
				} 
			} 
#endif 
		} 
		/* 穴件乒旦田旦互中月凛反]谛棉方曰穸燮允月[ */ 
		else if( CHAR_getInt( toindex, CHAR_WHICHTYPE) == CHAR_TYPEBUS ) { 
			targetindex = toindex; 
			cnt = 0; 
			if( !NPC_BusCheckJoinParty( toindex, charaindex, TRUE)) { 
				/* 椭瘀毛  凶今卅井匀凶[醮棉  月及反蔽歹月[谛棉及质  手仄卅中[ 
				 * 支支仇仄中及匹[ 
				 */ 
				break; 
			} 
			{	// Arminius 7.10 Airplane 
			  int busimg=CHAR_getInt(toindex, CHAR_BASEIMAGENUMBER); 
		          if ((busimg!=100355) && (busimg!=100461)) { 
		            CHAR_setInt(charaindex,CHAR_BASEIMAGENUMBER,busimg); 
			    CHAR_sendCToArroundCharacter( CHAR_getWorkInt( charaindex , 
				CHAR_WORKOBJINDEX )); 
				// Robin debug 01/11/21 
				if( CHAR_getInt( charaindex, CHAR_RIDEPET) != -1 ) { 
					CHAR_setInt( charaindex, CHAR_RIDEPET, -1); 
					CHAR_send_P_StatusString( charaindex, CHAR_P_STRING_RIDEPET); 
				} 
			/* 
			    CHAR_sendPMEToArroundCharacterFLXY(charaindex, 
			        CHAR_getInt( charaindex, CHAR_FLOOR), 
			        CHAR_getInt( charaindex, CHAR_X), 
			        CHAR_getInt( charaindex, CHAR_Y), 
			        0,1,CHAR_getInt( charaindex, CHAR_PETMAILEFFECT) 
			        ); 
			*/ 
		          } 
		        } 
		} 
		/* 皿伊奶乩□坭反穴件乒旦田旦动陆反  骰允月 */ 
		else { 
			continue; 
		} 
		/* 锹澎由□  奴及谛醒反    井" */ 
		parray = CHAR_getEmptyPartyArray( targetindex) ; 
		if( parray == -1 ) continue; 
 
		/* 仇仇引匹仁木壬     */ 
        CONNECT_setJoinpartycharaindex( fd,cnt,toindex); 
		cnt++; 
		if( cnt == CONNECT_WINDOWBUFSIZE ) break; 
		 
		/* 穴件乒旦田旦  苇仄分中]伙□皿毛  仃月[ */ 
		if( CHAR_getInt( targetindex, CHAR_WHICHTYPE) == CHAR_TYPEBUS ) break; 
 
	} 
	if( cnt == 0 ) { 
		if( found == TRUE) { 
			CHAR_talkToCli( charaindex, -1, "无法加入团队。", CHAR_COLORYELLOW); 
		} 
		result = FALSE; 
	}else if( cnt == 1 ) { 
#ifdef _DEATH_CONTEND 
		int toindex = CONNECT_getJoinpartycharaindex( fd, 0); 
		if(CHAR_getInt(toindex,CHAR_PKLISTTEAMNUM) == -1 && CHAR_getInt(charaindex,CHAR_PKLISTTEAMNUM) == -1){ 
		}else if( CHAR_getInt( charaindex, CHAR_PKLISTLEADER ) > 0 || 
			CHAR_getInt( toindex, CHAR_PKLISTTEAMNUM) < 0 || 
			CHAR_getInt( charaindex, CHAR_PKLISTTEAMNUM) < 0 || 
			CHAR_getInt( toindex, CHAR_PKLISTTEAMNUM) != CHAR_getInt( charaindex, CHAR_PKLISTTEAMNUM) || 
			CHAR_getInt(toindex,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER){ 
 
			CHAR_talkToCli( charaindex, -1, "队伍不同,无法加入团队。", CHAR_COLORYELLOW); 
			result = FALSE; 
		}else{ 
#endif 
			CHAR_JoinParty_Main( charaindex, CONNECT_getJoinpartycharaindex(fd,0)); 
			result = TRUE; 
#ifdef _DEATH_CONTEND 
		} 
#endif 
	}else { 
		int		strlength; 
		char	msgbuf[1024]; 
		char	escapebuf[2048]; 
#ifdef _DEATH_CONTEND 
		int toindex = CONNECT_getJoinpartycharaindex( fd, 0); 
		if(CHAR_getInt(toindex,CHAR_PKLISTTEAMNUM) == -1 && CHAR_getInt(charaindex,CHAR_PKLISTTEAMNUM) == -1){ 
		}else if( CHAR_getInt( charaindex, CHAR_PKLISTLEADER ) > 0 || 
			CHAR_getInt( toindex, CHAR_PKLISTTEAMNUM) < 0 || 
			CHAR_getInt( charaindex, CHAR_PKLISTTEAMNUM) < 0 || 
			CHAR_getInt( toindex, CHAR_PKLISTTEAMNUM) != CHAR_getInt( charaindex, CHAR_PKLISTTEAMNUM) || 
			CHAR_getInt(toindex,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER){ 
 
			CHAR_talkToCli( charaindex, -1, "队伍不同,无法加入团队。", CHAR_COLORYELLOW); 
			result = FALSE; 
		} 
#endif 
		strcpy( msgbuf, "1\n和谁组成团队呢?\n"); 
		strlength = strlen( msgbuf); 
		for( i = 0; 
             CONNECT_getJoinpartycharaindex( fd,i ) != -1 
			&& i< CONNECT_WINDOWBUFSIZE; 
			i ++ ){ 
			char	*a = CHAR_getChar( 
                CONNECT_getJoinpartycharaindex(fd,i) , CHAR_NAME); 
			char	buf[256]; 
			snprintf( buf, sizeof( buf),"%s\n", a); 
			if( strlength + strlen( buf) > arraysizeof( msgbuf)){ 
				print( "%s:%d视窗讯息buffer不足。\n", 
						__FILE__,__LINE__); 
				break; 
			} 
			strcpy( &msgbuf[strlength], buf); 
			strlength += strlen(buf); 
		} 
		lssproto_WN_send( fd, WINDOW_MESSAGETYPE_SELECT, 
						WINDOW_BUTTONTYPE_CANCEL, 
						CHAR_WINDOWTYPE_SELECTPARTY, 
						-1, 
					makeEscapeString( msgbuf, escapebuf, sizeof(escapebuf))); 
 
 
	} 
 
	if( result != -1 ) { 
		lssproto_PR_send( fd, 1, result); 
	} 
	return result; 
} 
 
static BOOL CHAR_DischargePartySub( int charaindex, int msgflg) 
{ 
	char buf[64], c[3]; 
	int toindex,flg,i; 
#ifdef _ITEM_QUITPARTY 
    int j = 0,k; 
#endif 
	 
 
	if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_LEADER ) { 
		int pindex, airplaneflag=0; 
		// Arminius 7.10 Airplane 
		if( CHAR_getInt(charaindex, CHAR_WHICHTYPE) == CHAR_TYPEBUS ) { 
		  if ((CHAR_getInt(charaindex, CHAR_BASEIMAGENUMBER) !=100355) && 
		      (CHAR_getInt(charaindex, CHAR_BASEIMAGENUMBER) !=100461)){ 
		    airplaneflag=1; 
		  } 
		} 
		for( i = 0; i < CHAR_PARTYMAX; i ++ ) { 
			pindex = CHAR_getWorkInt( charaindex, i + CHAR_WORKPARTYINDEX1); 
			if( CHAR_CHECKINDEX( pindex) ) { 
				int     fd = getfdFromCharaIndex( pindex ); 
				CHAR_setWorkInt( pindex, CHAR_WORKPARTYINDEX1, -1); 
				CHAR_setWorkInt( pindex, CHAR_WORKPARTYMODE, CHAR_PARTY_NONE); 
				if( msgflg ){ 
					CHAR_talkToCli( pindex, -1, "团队已解散!", CHAR_COLORYELLOW); 
#ifdef _ITEM_QUITPARTY 
					// won fix 
	                for( j=0;j=0){ 
		        int fl,x,y; 
		        CHAR_getElderPosition( CHAR_getInt( charaindex, CHAR_LASTTALKELDER), 
		          &fl, &x, &y ); 
		        CHAR_warpToSpecificPoint(charaindex, fl, x, y); 
		      } 
		    } 
		  } 
		} 
		CHAR_setWorkInt( charaindex, CHAR_WORKPARTYINDEX1, -1); 
		for( i = 0; i < CHAR_PARTYMAX; i ++ ) { 
			int index = CHAR_getWorkInt( toindex, i + CHAR_WORKPARTYINDEX1); 
			if( CHAR_CHECKINDEX(index) ){ 
				if( index == charaindex) { 
					myarray = i; 
					break; 
				} 
			} 
		} 
		if( myarray == CHAR_PARTYMAX) { 
			print( "DischargeParty(): 真奇怪!"); 
			return FALSE; 
		} 
		CHAR_setWorkInt( toindex, CHAR_WORKPARTYINDEX1 + myarray, -1); 
		snprintf( buf,sizeof( buf), "%s 脱离团队!", 
				  CHAR_getChar( charaindex, CHAR_NAME)); 
		if( msgflg ){ 
			CHAR_talkToCli( charaindex, -1, "脱离团队!", CHAR_COLORYELLOW); 
#ifdef _ITEM_QUITPARTY 
			// won fix 
	        for( i=0;i 1) { 
						int		parent_dir; 
						start.x = CHAR_getInt( index, CHAR_X); 
						start.y = CHAR_getInt( index, CHAR_Y); 
						parent_dir = NPC_Util_getDirFromTwoPoint( &start,&end ); 
						end = start; 
						if( parent_dir != -1 ) { 
							CHAR_walk( index, parent_dir, 0); 
						} 
					} 
					previndex = index; 
				} 
			} 
		} 
		 
	} 
 
	return TRUE; 
} 
BOOL CHAR_DischargeParty( int charaindex, int flg) 
{ 
	return CHAR_DischargePartySub( charaindex, 1); 
} 
 
BOOL CHAR_DischargePartyNoMsg( int charaindex) 
{ 
	return CHAR_DischargePartySub( charaindex, 0); 
} 
 
 
/*------------------------------------------------------------ 
 * 愤坌互伉□母□井升丹井毛霜耨允月[ 
 ------------------------------------------------------------*/ 
void CHAR_sendLeader( int objindex, int leader) 
{ 
	int		opt[1]; 
	opt[0] = leader; 
	CHAR_sendWatchEvent( objindex,CHAR_ACTLEADER,opt,1,TRUE); 
} 
/*------------------------------------------------------------ 
 * 醮棉毛赐    CHAR_WORKPARTYINDEX)隙烂匹平乓仿index毛娄匀舰月[ 
 * 愤坌互褪匹手阂匹手    [ 
 ------------------------------------------------------------*/ 
int CHAR_getPartyIndex( int index, int num) 
{ 
	int	nindex = -1; 
 
	/* 醮棉及奶件犯永弁旦毛潸   */ 
	/* 褪及桦宁 */ 
	if( CHAR_getWorkInt( index, CHAR_WORKPARTYMODE) == CHAR_PARTY_LEADER ) { 
		nindex = CHAR_getWorkInt( index, CHAR_WORKPARTYINDEX1 + num ); 
	} 
	/* 阂及桦宁 */ 
	else { 
		int oyaindex = CHAR_getWorkInt( index, CHAR_WORKPARTYINDEX1); 
		if( CHAR_CHECKINDEX( oyaindex)) { 
			nindex = CHAR_getWorkInt( oyaindex, CHAR_WORKPARTYINDEX1+num); 
		} 
	} 
	return nindex; 
} 
/*------------------------------------------------------------ 
 * 丢永本□斥毛霜耨允月[ 
 * 醮棉互中木壬公及醮棉卞手丢永本□斥毛霜耨允月[ 
 ------------------------------------------------------------*/ 
void CHAR_talkToCliAndParty( int talkedcharaindex,int talkcharaindex, 
					 char* message, CHAR_COLOR color ) 
{ 
	int		i; 
	/* 引内愤坌 */ 
	CHAR_talkToCli( talkedcharaindex, talkcharaindex, message, color); 
 
	for( i = 0; i < CHAR_PARTYMAX; i ++ ) { 
		int index = CHAR_getPartyIndex( talkedcharaindex, i); 
		if( CHAR_CHECKINDEX( index) && 
			index != talkedcharaindex) 
		{ 
			CHAR_talkToCli( index, talkcharaindex, message, color); 
		} 
	} 
}