コード例 #1
0
ファイル: mclient.c プロジェクト: BlueKarl/gmsv
//GM踢人
void mproto_WaeiKick_Recv(int fd,char* uid,int userfdid)
{
	int fd_charaindex;
	int clifd=getfdFromFdid(userfdid);
	if (clifd == -1) return;
	if (uid == NULL ) return;
	fd_charaindex = CONNECT_getCharaindex(clifd);
	if (!CHAR_CHECKINDEX(fd_charaindex))
		return;
	CHAR_talkToCli( fd_charaindex, -1, "由於捣乱,被GM踢除", CHAR_COLORYELLOW);
	CHAR_CHAT_DEBUG_gmkick( -1, CHAR_getChar( fd_charaindex, CHAR_CDKEY));
}
コード例 #2
0
ファイル: mclient.c プロジェクト: BlueKarl/gmsv
void mproto_WARP_Recv(int fd,char* uid,int userfdid,int floor, int x, int y)
{
	int fd_charaindex;
	int clifd=getfdFromFdid(userfdid);
	print("clifd =%d\n",clifd);
	if (clifd == -1) return ;
	if (uid == NULL ) return ;
	fd_charaindex=CONNECT_getCharaindex(clifd);
	if (!CHAR_CHECKINDEX(fd_charaindex)) return;
	CHAR_warpToSpecificPoint(fd_charaindex, floor, x, y);

}
コード例 #3
0
ファイル: mclient.c プロジェクト: BlueKarl/gmsv
//GM禁言
void mproto_NoTalk_Recv(int fd,char* uid,int userfdid,int nTime)
{
	int fd_charaindex;
	int clifd=getfdFromFdid(userfdid);
	print("clifd =%d\n",clifd);
	if (clifd == -1) return ;
	if (uid == NULL ) return ;
	fd_charaindex=CONNECT_getCharaindex(clifd);
	if (!CHAR_CHECKINDEX(fd_charaindex)) return;
	CHAR_setInt( fd_charaindex,CHAR_SILENT, nTime );
	CHAR_setWorkInt( fd_charaindex, CHAR_WORKLOGINTIME, (int)NowTime.tv_sec );
	CHAR_talkToCli( fd_charaindex, -1, "由於捣乱,被GM禁言10到30分钟", CHAR_COLORYELLOW);
	CHAR_setWorkInt(fd_charaindex, CHAR_WORKTALKCOUNT, 0 );
}
コード例 #4
0
ファイル: mclient.c プロジェクト: BlueKarl/gmsv
//GM回覆问题
void mproto_Que_Recv(int fd,char* uid,int userfdid,char* ans)
{
	int fd_charaindex;
	char sGM[256];
	int clifd=getfdFromFdid(userfdid);
	if  (clifd == -1) return ;
	if (ans == NULL || uid==NULL) return;
    	sprintf(sGM,"GM[%s]为你解答如下:",uid);
    	fd_charaindex = CONNECT_getCharaindex( clifd );
	if (!CHAR_CHECKINDEX(fd_charaindex)) return;
	CHAR_talkToCli(fd_charaindex, -1, sGM, CHAR_COLORYELLOW);
	CHAR_talkToCli(fd_charaindex, -1, ans, CHAR_COLORWHITE);

	return;
}
コード例 #5
0
ファイル: mclient.c プロジェクト: BlueKarl/gmsv
//GM讯息
void mproto_Message_Recv(int fd,char* uid,int userfdid,char* ans)
{
	int fd_charaindex;
	char sGM[256];
	int clifd=getfdFromFdid(userfdid);
	if  (clifd == -1)	return ;
	if (ans == NULL || uid==NULL)	return;
	if( !strcmp( uid, "无") )	{
		sprintf( sGM, "%s", ans);
	}else{
		sprintf( sGM, "GM[%s]讯息:%s", uid, ans);
	}

    fd_charaindex = CONNECT_getCharaindex( clifd );
	if (!CHAR_CHECKINDEX(fd_charaindex)) return;
	CHAR_talkToCli(fd_charaindex, -1, sGM, CHAR_COLORRED);
	return;
}
コード例 #6
0
ファイル: chatroom.c プロジェクト: ChowZenki/Long-Sa-Source
void ChatRoom_recvall ( int fd , char *data )
{ 
	char Head[4];
	char message[1024];
	char buf[16];
	int myindex ;

	myindex = CONNECT_getCharaindex(fd);
	if ( !CHAR_CHECKINDEX ( myindex ) )return ;
	getStringFromIndexWithDelim( data , "|", 1, Head, sizeof(Head));
	getStringFromIndexWithDelim( data , "|", 2, message, sizeof(message));

	if ( strcmp ( Head , "C" ) == 0 ) { // 成立频道
		if ( !ChatRoom_Create ( myindex , message ) )
			print("\nSyu log Create Channel Error" );
	}else if ( strcmp ( Head , "D" ) == 0 ) { // 删除频道
		if ( !ChatRoom_Destroy ( myindex ) )
			print("\nSyu log Destroy Channel Error" ) ; 
	}else if ( strcmp ( Head , "A" ) == 0 ) {// 同意加入频道
		getStringFromIndexWithDelim( data , "|", 2, message, sizeof(message));
		getStringFromIndexWithDelim( data , "|", 3, buf, sizeof(buf));
		ChatRoom_Agree ( myindex , atoi( message ) , atoi( buf ) ) ; 
	}else if ( strcmp ( Head , "J" ) == 0 ) {// 申请频道
		getStringFromIndexWithDelim( data , "|", 2, message, sizeof(message));
		ChatRoom_Join ( myindex , atoi( message ) ) ; 
	}else if ( strcmp ( Head , "L" ) == 0 ) {// 离开频道
		ChatRoom_Leave ( myindex ) ; 
	}else if ( strcmp ( Head , "K" ) == 0 ) {//踢出频道
		getStringFromIndexWithDelim( data , "|", 2, message, sizeof(message));
		ChatRoom_Kick ( myindex , atoi( message ) ); 
	}else if ( strcmp ( Head , "M" ) == 0 ) { // 更换室长
		getStringFromIndexWithDelim( data , "|", 2, message, sizeof(message));
		ChatRoom_Make ( myindex , atoi( message ) ); 
	}else if ( strcmp ( Head , "T" ) == 0 ) {// 频道讯息
		getStringFromIndexWithDelim( data , "|", 2, message, sizeof(message));
		ChatRoom_Message ( myindex , message ) ; 
	}else if ( strcmp ( Head , "B" ) == 0 ) {// 聊天室清单
		ChatRoom_List ( fd );
	}else 
		print("\nSyu log None");
}
コード例 #7
0
void NPC_WarpManWindowTalked( int meindex, int talkerindex, 
								int seqno, int select, char *data)
{
	char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE - 1024 * 20];
	char buf[NPC_UTIL_GETARGSTR_BUFSIZE - 1024 * 20];
#ifdef _NEW_WARPMAN
	BOOL checkp=TRUE;
	char buf1[1024];
	int talkNo = 1;
	BOOL tenflg=FALSE;
#else
	int fl,x,y;
#endif
	char buff2[256];
	int fd = getfdFromCharaIndex( talkerindex );
	if( NPC_Util_CharDistance( talkerindex, meindex ) > 2)
		return;
	if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){
		print("GetArgStrErr");
		return ;
	}
	if( CHAR_getWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT) < 1 )	{
		CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, -1);
		return;
	}

#ifdef _NEW_WARPMAN
	if( seqno == NEW_WARPMAN )    {
		int eqnum=0;
		eqnum = CHAR_getWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT);
		sprintf(buf1,"%s", "NOFREE");
		if( eqnum >= 0 )	{
			sprintf(buf1,"TALKEVENT%d", eqnum);
		}
		CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0);
		while( getStringFromIndexWithDelim( npcarg,"OVER",talkNo,buf,sizeof( buf)) != FALSE){
			if( strstr(buf, buf1) != NULL)	{
				strcpy( npcarg , buf);
				tenflg = TRUE;
				break;
			}
			talkNo++;
		}
		if( tenflg == FALSE )	{
			CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, -1);
			return;
		}
	}else {
#endif    
		if( select != WINDOW_BUTTONTYPE_YES )	{
			CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, -1);
			return;
		}
		    if(NPC_PARTY_CHAECK( meindex, talkerindex) == FALSE){
			    NPC_ERR_DiSP( meindex, talkerindex, 1);
			    return;
			}
#ifdef _NEW_WARPMAN	
	}
#else
	NPC_Util_GetStrFromStrWithDelim( npcarg, "WARP", buf, sizeof( buf));
	GetRand_WarpPoint( buf, &fl, &x, &y );
#endif

#ifdef _NEW_WARPMAN	
  switch( seqno)	{
  case WARP_MAN:
	if( select != WINDOW_BUTTONTYPE_YES )
		return;
	    if( NPC_PARTY_CHAECK( meindex, talkerindex) == FALSE ){
		    NPC_ERR_DiSP( meindex, talkerindex, 1);
		    return;
		}		
#else
	if( select != WINDOW_BUTTONTYPE_YES) return;
	    if( NPC_PARTY_CHAECK( meindex, talkerindex) == FALSE)
		    return;
#endif

#ifdef _NEW_WARPMAN
  break;
  case NEW_WARPMAN:
		if( select != WINDOW_BUTTONTYPE_YES ){
			CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, -1);
			if( NPC_Util_GetStrFromStrWithDelim( npcarg, "CancelMsg", buff2, sizeof( buff2) ) != NULL)	{
				CHAR_talkToCli( talkerindex, meindex, buff2, CHAR_COLORYELLOW);
			}
			return;
		}
	  checkp=TRUE;
	  if( NPC_Util_GetStrFromStrWithDelim( npcarg, "CHECKPARTY", buff2, sizeof( buff2) ) != NULL)	{
		  if( strstr( buff2, "FALSE") != NULL )	{
			checkp = FALSE;
		}
	  }
	  if( checkp==TRUE && NPC_PARTY_CHAECK( meindex, talkerindex) == FALSE )	{
		      NPC_ERR_DiSP( meindex, talkerindex, 1);
		      CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, -1);
		      return;
	  }		
  break;
  case NEW_WARPMAN_END:
	  return;
  break;
  }
#endif

	if( Action_RunDoEventAction( meindex, talkerindex, npcarg) == FALSE ){
		CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, -1);
		return;
	}

		CHAR_complianceParameter( talkerindex );
		CHAR_send_P_StatusString( talkerindex ,
						CHAR_P_STRING_ATK|CHAR_P_STRING_DEF|
						CHAR_P_STRING_CHARM|CHAR_P_STRING_QUICK|
						CHAR_P_STRING_WATER|CHAR_P_STRING_FIRE|
						CHAR_P_STRING_WIND|CHAR_P_STRING_EARTH
						);
		if( CHAR_getWorkInt( CONNECT_getCharaindex(fd), CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE){
	            return ;
		}
		if(CHAR_getWorkInt( talkerindex , CHAR_WORKSHOPRELEVANTTRD) <= 0){
				CHAR_setWorkInt( talkerindex, CHAR_WORKWARPCHECK, FALSE );
#ifdef _NEW_WARPMAN	
				NPC_WarpMsg( meindex, talkerindex, npcarg);
#else
				if( fl == 0 && x == 0 && y == 0 )		{
				}else	{
					CHAR_warpToSpecificPoint(talkerindex, fl, x,y);
				}
#endif
		}else	{
			if(CHAR_getInt(talkerindex,CHAR_GOLD) <
	                  CHAR_getWorkInt(talkerindex,CHAR_WORKSHOPRELEVANTTRD)){
				NPC_ERR_DiSP( meindex, talkerindex, 2);
				return ;
			}
			CHAR_DelGold( talkerindex, CHAR_getWorkInt(talkerindex,CHAR_WORKSHOPRELEVANTTRD ));

				CHAR_setWorkInt( talkerindex, CHAR_WORKWARPCHECK, FALSE );
#ifdef _NEW_WARPMAN	
				NPC_WarpMsg( meindex, talkerindex, npcarg);
#else
				if( fl == 0 && x == 0 && y == 0 )		{
				}else	{
                        CHAR_warpToSpecificPoint(talkerindex, fl, x,y);
				}
#endif

		}
#ifdef _NEW_WARPMAN
		NPC_NpcWarpMsg( meindex, talkerindex, npcarg);
#else
	}
コード例 #8
0
void NPC_PetSkillShopWindowTalked( int meindex, int talkerindex, 
								int seqno, int select, char *data)
{
	int skill;
	int pet;
	int slot;
	int cost;
	int skillID=0;
	int petskillindex;
	char buf[64];
	char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
	char msg[512];
	int petindex;
	char msgbuf[128];
	int fd = getfdFromCharaIndex( talkerindex );
	double rate= 1.0;

	if( NPC_Util_CharDistance( talkerindex, meindex ) > 2) {
		return;
	}

	if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr))==NULL){
		print("GetArgStrErr");
		return;
	}
	makeStringFromEscaped( data);
	getStringFromIndexWithDelim(data,"|",1,buf,sizeof(buf));
	skill=atoi(buf);
	getStringFromIndexWithDelim(data,"|",2,buf,sizeof(buf));
	pet=atoi(buf);
	getStringFromIndexWithDelim(data,"|",3,buf,sizeof(buf));
	slot=atoi(buf);
	getStringFromIndexWithDelim(data,"|",4,buf,sizeof(buf));
	cost=atoi(buf);

	if( NPC_Util_GetStrFromStrWithDelim( argstr, "pet_skill", msg, sizeof( msg)) != NULL){
		getStringFromIndexWithDelim(msg,",",skill,buf,sizeof(buf));
		skillID=atoi(buf);
	}

	slot--;
	if( !CHAR_CHECKPETSKILLINDEX( slot)){
	 	CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD);
		return ; 
	}
	petindex = CHAR_getCharPet( talkerindex, pet-1);
    if( !CHAR_CHECKINDEX(petindex) ){
    	CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD);
    	return ;
	}
	if(skillID < 0) return ;

	if(petindex == -1){
		print("petskillshop.c:170 PetindexError");
		return;
	}

	if( CHAR_getWorkInt( CONNECT_getCharaindex(fd),
                         CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return ;
	if( NPC_Util_GetStrFromStrWithDelim( argstr, "skill_rate", msg, sizeof( msg)) != NULL){
		rate = atof( msg);
	}

	petskillindex =  PETSKILL_getPetskillArray( skillID );
	if(petskillindex == -1){
		CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD);
		return ;
	}

	cost = PETSKILL_getInt( petskillindex, PETSKILL_COST );
	cost = cost * rate;

	if(CHAR_getInt(talkerindex,CHAR_GOLD) < cost){
		CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD);
		return;
	}
	CHAR_setPetSkill( petindex, slot, skillID);

	CHAR_DelGold( talkerindex, cost );

	snprintf( msgbuf, sizeof( msgbuf ), "W%d",pet-1);
	CHAR_sendStatusString( talkerindex, msgbuf );
	CHAR_sendStatusString( talkerindex, "P");
	NPC_PetSkillShop_selectWindow( meindex, talkerindex,0,-1);
}
コード例 #9
0
void NPC_Duelranking_PrintRanking( char *data, int count_start, int fdid, int msgid2)
{
	char message[1024];
	char buf[2048];
	int		i;
	int	 cnt = 0;
	int	button = 0;	
	int fd = getfdFromFdid( fdid);
	if( fd == -1 ) return;
	message[0] = '\0';
	snprintf( message, sizeof( message), 
			"                        世界的强者们\n\n"
			"      Rank       DuelPoint      Lv     Name\n\n" );
	for( i = 1; ; i ++ ) {
		char	rankdata[256];
		char	cdandname[64];
		char	charaname[32];
		char	rank[16];
		char	score[64];
		char	msgbuf[512];
		char	cdkey[32];
		char	lv[16];
		char	hosi[6];
		
		if( !getStringFromIndexWithDelim( data, "|", i, rankdata, sizeof( rankdata))) {
			break;
		}
		if( !getStringFromIndexWithDelim( rankdata, ",", 2, rank, sizeof( rank)) ){
			continue;
		}
		if( !getStringFromIndexWithDelim( rankdata, ",", 3, cdandname, sizeof( cdandname)) ){			continue;
		}
		makeStringFromEscaped( cdandname);
		if( !getStringFromIndexWithDelim( cdandname, "_", 1, cdkey, sizeof( cdkey)) ){
			continue;
		}
		if( !getStringFromIndexWithDelim( cdandname, "_", 2, charaname, sizeof( charaname)) ){
			continue;
		}
		if( !getStringFromIndexWithDelim( rankdata, ",", 4, score, sizeof( score)) ){
			continue;
		}
		if( !getStringFromIndexWithDelim( rankdata, ",", 5, lv, sizeof( lv)) ){
			lv[0] = '\0';
		}
		{
			char *mycdkey = CHAR_getChar( CONNECT_getCharaindex(fd), CHAR_CDKEY);
			char *myname  = CHAR_getChar( CONNECT_getCharaindex(fd), CHAR_NAME);
			char engnum[4][3] = { "st","nd","rd","th"};
			int  dsprank = atoi(rank);
			if( dsprank > 3) dsprank = 3;
			if( mycdkey != NULL && myname != NULL && strcmp( cdkey, mycdkey) == 0 && 
				strcmp( charaname, myname) == 0 ) {
				strcpy( hosi, "★");
			}else {
				strcpy( hosi, " ");
			}
			snprintf( msgbuf, sizeof( msgbuf), "%s %5d%s      %10s     %3s     %s\n",
											hosi,
											atoi(rank)+1, engnum[dsprank],
											score, lv,
											charaname );
		}
		strcatsafe( message, sizeof( message), msgbuf);
		cnt ++;
	}
	if( cnt == 0 ) {
		strcpy( message, "\n      没有其他的资料了。");
		button = WINDOW_BUTTONTYPE_PREV|WINDOW_BUTTONTYPE_OK;
	}else if( cnt < NPC_DUELRANKING_WINDOWLINENUM ) {
		if( count_start >= NPC_DUELRANKING_WINDOWLINENUM) {
			button = WINDOW_BUTTONTYPE_OK | WINDOW_BUTTONTYPE_PREV;
		}else {
			button = WINDOW_BUTTONTYPE_OK;
		}
	}else if( count_start == 0 ) {
		button = WINDOW_BUTTONTYPE_NEXT|WINDOW_BUTTONTYPE_OK;
	}else {
		button = WINDOW_BUTTONTYPE_NEXT|WINDOW_BUTTONTYPE_PREV|WINDOW_BUTTONTYPE_OK;
	}
	lssproto_WN_send( fd, WINDOW_MESSAGETYPE_WIDEMESSAGEANDLINEINPUT, 
					button,
					CHAR_WINDOWTYPE_DUELRANKING_TOPRANKING,
					msgid2,
					makeEscapeString( message, buf, sizeof(buf)));

	if( cnt == 0 ) {
		CHAR_setWorkInt( CONNECT_getCharaindex(fd), CHAR_WORKSHOPRELEVANT, -1);
	}else {
		CHAR_setWorkInt( CONNECT_getCharaindex(fd), CHAR_WORKSHOPRELEVANT, count_start);
	}
}
コード例 #10
0
ファイル: npc_welfare2.c プロジェクト: BlueKarl/gmsv
void NPC_WelfareWindowTalked2( int meindex, int talkerindex, 
		int seqno, int select, char *data)
{
	int skill, i, j;
	int skillID = -1, skillid = -1;
	int ENDEV = -1, NOWEV = -1;
	char buf[64];
	char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
	char msg[512];
	int fd = getfdFromCharaIndex( talkerindex );
	double rate= 1.0;
	int skillarray;
	CHAR_HaveSkill* hskill;
	char err_msg[128] = {0};

	if( NPC_Util_CharDistance( talkerindex, meindex ) > 2) {
		return;
	}

	if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr))==NULL){
		print("GetArgStrErr");
		return;
	}

	if( NPC_Util_GetStrFromStrWithDelim( argstr, "ENDEV:", msg, sizeof( msg)) != NULL){
		ENDEV=atof(msg);
	}

	if( NPC_Util_GetStrFromStrWithDelim( argstr, "NOWEV:", msg, sizeof( msg)) != NULL){
		NOWEV=atof(msg);
	}

	if( NPC_Util_GetStrFromStrWithDelim( argstr, "err_msg:", err_msg, sizeof( msg)) == NULL){
		print("GetArgStrErr");
		return;		
	}

	if( ENDEV > 0 ){
		if( NPC_EventCheckFlg( talkerindex, ENDEV ) != TRUE ){
			CHAR_talkToCli( talkerindex, -1, err_msg, CHAR_COLORYELLOW);
			return;
		}
	}else if( NOWEV > 0 ){
		if( NPC_EventCheckFlg( talkerindex, NOWEV ) != TRUE ){
			CHAR_talkToCli( talkerindex, -1, err_msg, CHAR_COLORYELLOW);	
			return;
		}
	}

	makeStringFromEscaped( data);
	getStringFromIndexWithDelim(data,"|",1,buf,sizeof(buf));
	skill=atoi(buf);
	
	// 技能id
	skillid = CHAR_getCharSkill( talkerindex, skill - 1 );	
	skillID = skillid;

	if(skillID <= 0) return ;

	if( CHAR_getWorkInt( CONNECT_getCharaindex(fd), CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return ;

	if( NPC_Util_GetStrFromStrWithDelim( argstr, "skill_rate", msg, sizeof( msg)) != NULL){
		rate = atof( msg);
	}

	// 不扣钱
	CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD);

	skillarray = PROFESSION_SKILL_getskillArray( skillID );

	// 检查是否有不能删除的技能
	for( i=0; i<CHAR_SKILLMAXHAVE; i++ ){
		int limit = -1, skillid = -1, skillarray_temp = -1;

		// 技能ID
		skillid = CHAR_getCharSkill( talkerindex, i);
		if( skillid <= 0 ) continue;
	
		skillarray_temp = PROFESSION_SKILL_getskillArray( skillid );

		for( j=0; j<4; j++){
			limit = PROFESSION_SKILL_getInt( skillarray_temp, PROFESSION_SKILL_LIMIT1+j*2 );

			if( limit > 0 && limit == skillID ){
				char token[256] = {0};

				sprintf( token, "需先遗忘%s,才可删除此技能", PROFESSION_SKILL_getChar( skillarray_temp, PROFESSION_SKILL_NAME ) );
				CHAR_talkToCli( talkerindex, -1, token, CHAR_COLORYELLOW);
				return;
			}
		}
	}

	// 遗忘技能
	{

		int skill_level = -1;
		int count = 0;
		int skill_id[CHAR_SKILLMAXHAVE] = {0};
		int skill_temp[CHAR_SKILLMAXHAVE] = {0};
		
		// 取熟练度
		for( i=0; i<CHAR_SKILLMAXHAVE; i++ ){
			int skillid = -1;

			// 技能ID
			skillid = CHAR_getCharSkill( talkerindex, i);

			// 不储存需遗忘的技能
			if( skillid <= 0 || skillid == skillID ) continue;


			// 技能等级
			hskill = CHAR_getCharHaveSkill( talkerindex, i );
			skill_level = SKILL_getInt( &hskill->skill, SKILL_LEVEL);
			
			skill_id[count] = skillid;
			skill_temp[count] = skill_level;
			count++;
		}

		// 删除所有技能
		CHAR_CHAT_DEBUG_delsk( talkerindex, "all" );

		// 还原技能
		for( i=0; i<count; i++ ){
			PROFESSION_SKILL_ADDSK( talkerindex, skill_id[i], skill_temp[i] );
		}

		CHAR_sendStatusString( talkerindex , "S");
		NPC_Welfare_selectWindow2( meindex, talkerindex,0,-1);
		
	}

	// 传送讯息
	{
		char token[256];
		int next_profession_skill_point = 0;
		
		next_profession_skill_point = CHAR_getInt( talkerindex, PROFESSION_SKILL_POINT ) + 1;			
		CHAR_setInt( talkerindex, PROFESSION_SKILL_POINT, next_profession_skill_point );
		
		memset(token, -1, sizeof(token) );
		sprintf( token, "您遗忘了 %s,剩馀学习点数增加一点"
				,PROFESSION_SKILL_getChar( skillarray, PROFESSION_SKILL_NAME ) );

		CHAR_talkToCli( talkerindex, -1, token, CHAR_COLORYELLOW);
    
		CHAR_sendCToArroundCharacter( CHAR_getWorkInt( talkerindex , CHAR_WORKOBJINDEX ));
	}

}             
コード例 #11
0
ファイル: npc_petshop.c プロジェクト: BlueKarl/gmsv
void NPC_PetDel(int meindex, int talker,int select,char* token)
{
	int petindex;
	int petsel;
	char szPet[128];
	int cost;
	int defpet;
	int fd = getfdFromCharaIndex( talker );

	NPC_MaxGoldOver( meindex, talker, NPC_PETSHOP_MSG_THANKS, token);
	petsel=(CHAR_getWorkInt(talker,CHAR_WORKSHOPRELEVANT)-1);
	petindex = CHAR_getCharPet( talker, petsel);
	
    if( !CHAR_CHECKINDEX(petindex) ) return;

        // CoolFish: Family 2001/6/14
	if (CHAR_getInt(petindex, CHAR_PETFAMILY) == 1){	
/*		char buf[1024];
		lssproto_WN_send(fd, WINDOW_MESSAGETYPE_MESSAGE,
			WINDOW_BUTTONTYPE_OK,
			-1, -1,
		makeEscapeString("\n\nºÜ±§Ç¸¡«ÊØ»¤ÊÞÎÞ·¨··Âôร¡\nÇë×Ô¼ººÃºÃÕչˣ¡", buf, sizeof(buf)));
*/
		sprintf(token,"\n\nºÜ±§Ç¸¡«ÊØ»¤ÊÞÎÞ·¨··Âôร¡\nÇë×Ô¼ººÃºÃÕչˣ¡");
		return;
	}

        // Robin 0725
        if (CHAR_getInt( talker, CHAR_RIDEPET ) == petsel ){	
/*        	char buf[1024];
        	lssproto_WN_send(fd, WINDOW_MESSAGETYPE_MESSAGE,
        		WINDOW_BUTTONTYPE_OK,
        		-1, -1,
        		makeEscapeString("\n\nÆï³ËÖеijèÎïÎÞ·¨··Âôร¡", buf, sizeof(buf)));
*/
					sprintf(token,"\n\nÆï³ËÖеijèÎïÎÞ·¨··Âôร¡");
        	return;
        }

	if( CHAR_getWorkInt( CONNECT_getCharaindex(fd),
                         CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return ;
	defpet=CHAR_getInt(talker,CHAR_DEFAULTPET);
	if(defpet==petsel){
		CHAR_setInt(talker,CHAR_DEFAULTPET,-1);
		lssproto_KS_send( fd, -1, TRUE);
	}
   	CHAR_setCharPet( talker, petsel, -1);
	LogPet(
		CHAR_getChar( talker, CHAR_NAME ), /* ƽÅÒ·Â   */
		CHAR_getChar( talker, CHAR_CDKEY ),
		CHAR_getChar( petindex, CHAR_NAME),
		CHAR_getInt( petindex, CHAR_LV),
		"sell(Âô³è)",
		CHAR_getInt( talker,CHAR_FLOOR),
		CHAR_getInt( talker,CHAR_X ),
		CHAR_getInt( talker,CHAR_Y ),
		CHAR_getChar( petindex, CHAR_UNIQUECODE)   // shan 2001/12/14
	);
	CHAR_endCharOneArray( petindex );
		
	snprintf( szPet, sizeof( szPet ), "K%d", petsel);
	CHAR_sendStatusString( talker, szPet );
	cost=NPC_GetCost(meindex,talker,petindex);
	CHAR_AddGold( talker, cost);

}
コード例 #12
0
void ITEM_contractSign( int fd, int itemindex, int signindex)
{
	int charaindex;
	int i;
	int conIndex;
	int complete =0;
	int item_id;
	char contractSignData[512];
	contractSignTag contractSign[4];

	print("\n contractSign:%d:%d ", itemindex, signindex);
	
	charaindex = CONNECT_getCharaindex( fd );
	if( !CHAR_CHECKINDEX(charaindex))	return;

	if( signindex <0 || signindex >=4)	return;
    for( i=0 ; i<CHAR_MAXITEMHAVE ; i++ ){
        if( CHAR_getItemIndex( charaindex,i ) == itemindex )
			break;
	}
	if( i >= CHAR_MAXITEMHAVE )	return;
	if( strcmp( ITEM_getChar( itemindex, ITEM_USEFUNC), "ITEM_contract") )	return;
	
	conIndex = atoi( ITEM_getChar( itemindex, ITEM_ARGUMENT));
	if( signindex >= ITEM_contractTbl[conIndex].argnum )	return;

	strcpy( contractSignData, ITEM_getChar( itemindex, ITEM_CONTRACTARG) );

	for( i=0; i<4; i++) contractSign[i].used = FALSE;

	for( i=0; i<4; i++) {
		int index;
		char buf[512];
		char token[32];
		if( getStringFromIndexWithDelim( contractSignData, ",", i+1, buf, sizeof( buf )-1) == FALSE )
			break;
		if( strlen( buf) == 0)	break;
		getStringFromIndexWithDelim( buf, ":", 1, token, sizeof( token )-1 );
		index = atoi( token);
		if( index <0 || index >=4)	break;
		getStringFromIndexWithDelim( buf, ":", 2, contractSign[index].name, sizeof( contractSign[index].name )-1 );
		getStringFromIndexWithDelim( buf, ":", 3, contractSign[index].fmname, sizeof( contractSign[index].fmname )-1 );
		contractSign[index].used = TRUE;
	}

	if( contractSign[signindex].used == TRUE)	return;
	
	strcpy( contractSign[signindex].name, CHAR_getChar( charaindex, CHAR_NAME) );
	strcpy( contractSign[signindex].fmname, CHAR_getChar( charaindex, CHAR_FMNAME) );
	contractSign[signindex].used = TRUE;

	// 檢查是否完成契約
	for( i =0; i<4; i++) {
		if( contractSign[i].used == TRUE)
			complete++;
	}
	if( complete >= ITEM_contractTbl[conIndex].argnum ) {
		char buf[512];
		if( CHAR_findEmptyItemBoxNo( charaindex ) < ITEM_contractTbl[conIndex].argnum -1 ) {
			sprintf( buf, "要完成這個契約,請先準備%d個空道具欄位。", ITEM_contractTbl[conIndex].argnum -1);
			CHAR_talkToCli( charaindex, -1, buf, CHAR_COLORYELLOW);
			return;
		}
	}


	strcpy( contractSignData, "");
	for( i=0; i<4; i++) {
		char buf[512];
		if( contractSign[i].used == FALSE)	continue;
		sprintf( buf, "%d:%s:%s,", i, contractSign[i].name, contractSign[i].fmname);
		strcat( contractSignData, buf);
	}
	ITEM_setChar( itemindex, ITEM_CONTRACTARG, contractSignData);

	CHAR_talkToCli( charaindex, -1, "完成契約簽名。", CHAR_COLORYELLOW);


	// 完成契約
	if( complete >= ITEM_contractTbl[conIndex].argnum ) {
		struct tm *nowtime;
		char timebuf[512];

		// 紀錄日期
		nowtime = localtime( (time_t *)&NowTime.tv_sec );
		sprintf( timebuf, "%04d年%02d月%02d日",
			nowtime->tm_year +1900, nowtime->tm_mon+1, nowtime->tm_mday);
		ITEM_setChar( itemindex, ITEM_CONTRACTTIME, timebuf);

		CHAR_talkToCli( charaindex, -1, "完成所有簽名,契約成立!", CHAR_COLORYELLOW);
		// 複製契約
		item_id = ITEM_getInt( itemindex, ITEM_ID);
		for( i =0 ; i < ITEM_contractTbl[conIndex].argnum -1 ; i++)
		{
			int	emptyindex;
			int newitemindex;
			
			emptyindex = CHAR_findEmptyItemBox( charaindex );
			
			if( emptyindex < 0 ){
				CHAR_talkToCli( charaindex, -1, "空間欄位不足。", CHAR_COLORYELLOW);
				break;
			}
			
			newitemindex = ITEM_makeItemAndRegist( item_id );
			
			if( newitemindex != -1 ){
				CHAR_setItemIndex( charaindex, emptyindex, newitemindex );
				ITEM_setWorkInt( newitemindex, ITEM_WORKOBJINDEX, -1);
				ITEM_setWorkInt( newitemindex, ITEM_WORKCHARAINDEX, charaindex);
				CHAR_sendItemDataOne( charaindex, emptyindex);
				ITEM_setChar( newitemindex, ITEM_CONTRACTARG, contractSignData);
				ITEM_setChar( newitemindex, ITEM_CONTRACTTIME, timebuf);
			}
			
			CHAR_talkToCli( charaindex, -1, "複製契約書。", CHAR_COLORYELLOW);
		}
	}
}