⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 npc_duelranking.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "version.h"
#include <string.h>
#include "char.h"
#include "object.h"
#include "char_base.h"
#include "npcutil.h"
#include "net.h"
#include "lssproto_serv.h"
#include "saacproto_cli.h"
#include "npc_duelranking.h"
#include "handletime.h"

#ifdef _DEATH_CONTEND
#include "deathcontend.h"
#endif

#ifdef _DEATH_FAMILY_GM_COMMAND	// WON ADD 家族战GM指令
#include "family.h"
#endif

static void NPC_Duelranking_selectWindow( int meindex, int toindex, int num, int select );
#define		NPC_DUELRANKING_WINDOWLINENUM	10

#ifdef _DEATH_FAMILYCONTEND
BOOL NPC_ReadFamilyPK_List( void);
BOOL NPC_BackupFamilyPK_List( void);
BOOL NPC_getFamilyPK_List( int ti, char *buf, int sizes);
BOOL NPC_CheckJoin_FamilyPK_List( int meindex, int toindex);
#endif

enum{
	WINDOWTYPE_PKLIST_START=10,
	WINDOWTYPE_PKLIST_SELECT,
	WINDOWTYPE_PKLIST_SELECT1,
	WINDOWTYPE_PKLIST_SELECT2,

	WINDOWTYPE_FAMILYCONTENDSTART,
	WINDOWTYPE_FAMILYCONTENDSELECT,
	WINDOWTYPE_FAMILYCONTENDLIST,
	WINDOWTYPE_FAMILYCONTENDJOIN,

	NPC_WORK_CURRENTTIME = CHAR_NPCWORKINT1,
	NPC_WORK_BATTLELOOP = CHAR_NPCWORKINT2,
};

BOOL NPC_DuelrankingInit( int meindex )
{
#ifdef _DEATH_CONTEND
	char buf1[256];
	char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];

	CHAR_setWorkInt( meindex, NPC_WORK_BATTLELOOP, 0);
	CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec);

	if( NPC_Util_GetArgStr( meindex, npcarg, sizeof( npcarg) ) != NULL &&
		NPC_Util_GetStrFromStrWithDelim( npcarg, "PKLoop", buf1, sizeof( buf1)) != NULL ){
		CHAR_setInt( meindex, CHAR_LOOPINTERVAL, atoi(buf1));
		if( NPC_Util_GetStrFromStrWithDelim( npcarg, "PKLType", buf1, sizeof( buf1)) != NULL ){
			CHAR_setWorkInt( meindex, NPC_WORK_BATTLELOOP, atoi( buf1));
		}
		if( NPC_Util_GetStrFromStrWithDelim( npcarg, "PKLDelay", buf1, sizeof( buf1)) != NULL ){
			CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec + (atoi( buf1)*60) );
		}
	}
#endif

#ifdef _DEATH_FAMILYCONTEND
	{
		char buf1[256];
		char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
		CHAR_setWorkInt( meindex, NPC_WORK_BATTLELOOP, 0);
		CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec);
		if( NPC_Util_GetArgStr( meindex, npcarg, sizeof( npcarg) ) != NULL &&
			NPC_Util_GetStrFromStrWithDelim( npcarg, "LoadFMList", buf1, sizeof( buf1)) != NULL ){
			if( strstr( buf1, "ON") != NULL )
				NPC_ReadFamilyPK_List();
		}
	}
#endif

	CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_TYPEDUELRANKING );
	return TRUE;
}

void NPC_DuelrankingLooked( int meindex , int lookedindex)
{

#ifdef _DEATH_FAMILYCONTEND
	char buf1[256];
	char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];

	if( NPC_Util_GetArgStr( meindex, npcarg, sizeof( npcarg) ) != NULL &&
		NPC_Util_GetStrFromStrWithDelim( npcarg, "FmPkJoin", buf1, sizeof( buf1)) != NULL ){

		if( strstr( buf1, "ON") !=NULL ){
			CHAR_setWorkInt( lookedindex, CHAR_WORKSHOPRELEVANT, 0);
			NPC_Duelranking_selectWindow( meindex, lookedindex, 2, -1);
			return;
		}else{
			return;
		}
	}
#endif

#ifdef _DEATH_CONTEND
	char buf1[256];
	char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
	//static int first = 1;
	if( NPC_Util_GetArgStr( meindex, npcarg, sizeof( npcarg) ) != NULL &&
		NPC_Util_GetStrFromStrWithDelim( npcarg, "PKCharts", buf1, sizeof( buf1)) != NULL ){
		if( strstr( buf1, "ON") !=NULL ){
			CHAR_setWorkInt( lookedindex, CHAR_WORKSHOPRELEVANT, 0);
			NPC_Duelranking_selectWindow( meindex, lookedindex, 2, -1);
			//if( first == 1 ) saacproto_PKLISTCHARTS_send( acfd, 2, 1);
			//first = 0;
			return;
		}else{
			return;
		}
	}
#endif

#ifdef _DEATH_FAMILY_GM_COMMAND	// WON ADD 家族战GM指令
	NPC_Duelranking_selectWindow( meindex, lookedindex, 2, -1);
#endif

	NPC_Duelranking_selectWindow( meindex, lookedindex, 1, -1);
}

static void NPC_Duelranking_selectWindow( int meindex, int toindex, int num, int select)
{
	
	int		fd;
	int		button;
	if( CHAR_getInt( toindex , CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) {
		return;
	}
	if( NPC_Util_CharDistance( toindex, meindex ) > 1) return;
	if( (fd = getfdFromCharaIndex( toindex)) == -1 ) return;

	switch( num){
	case 1:
		{
			char	message[1024];
			char	buf[2048];
			strcpy( message, 
				"1\n"
				"             要看哪一个?              \n\n\n"
				"             <强者们>              \n\n"
				"             < 自己 >              \n\n"
				"             <都不看>              \n\n" );
			lssproto_WN_send( fd, WINDOW_MESSAGETYPE_SELECT, 
							WINDOW_BUTTONTYPE_NONE,
							CHAR_WINDOWTYPE_DUELRANKING_START,
							CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
							makeEscapeString( message, buf, sizeof(buf)));
		}
		break;
#ifdef _DEATH_CONTEND
	case 2:
		{
			char	message[1024];
			char	buf[2048];
			strcpy( message, 
				"1\n"
				"             要看哪一个?           \n\n"
//				"           <资格赛排行>              \n"
				"          < 正式赛程表 >   \n"
				"           < 队伍资料 >  \n"
//				"           < 参加赛程 >   \n"
				"           < 赛程纪录 >   \n" );

			lssproto_WN_send( fd, WINDOW_MESSAGETYPE_SELECT,
							WINDOW_BUTTONTYPE_CANCEL,
							WINDOWTYPE_PKLIST_START,
							CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
							makeEscapeString( message, buf, sizeof(buf)));
		}
		break;
/*	case 3:
		{
			char token[4096], buf[256], buf1[256],buf2[256];
			char teamname[256];
			int win, lose, battle, score;
			int page, i, pagecount=10;
			page = CHAR_getWorkInt( toindex, CHAR_WORKSHOPRELEVANT);
			button = WINDOW_BUTTONTYPE_OK | WINDOW_BUTTONTYPE_PREV | WINDOW_BUTTONTYPE_NEXT;

			if( select == WINDOW_BUTTONTYPE_PREV || select == WINDOW_BUTTONTYPE_NEXT) {
				if( select == WINDOW_BUTTONTYPE_NEXT ){
					if( page < 40 ) page++;
				}else if( select == WINDOW_BUTTONTYPE_PREV ){
					if( page > 0 )	page--;
				}
			}else if( select == WINDOW_BUTTONTYPE_OK ){
				CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 0);
				return;
			}
			if( page < 0 || page >= 40 ) page = 0;
			if( page == 0  ) button = WINDOW_BUTTONTYPE_OK | WINDOW_BUTTONTYPE_NEXT;
			if( page == 39 ) button = WINDOW_BUTTONTYPE_OK | WINDOW_BUTTONTYPE_PREV;
			CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, page);
			snprintf( token, sizeof( token), 
				"                 资格赛排行榜\n\n"
				"排名    队伍               胜  负  场 积分\n\n" );

			for( i=0; i<pagecount; i++ ){
				if( PKLIST_GetChartsListData( (page*pagecount)+1+i, buf, sizeof(buf) ) == FALSE )continue;

				if( !getStringFromIndexWithDelim( buf, "|", 1, teamname, sizeof( teamname)) ) continue;
				if( !getStringFromIndexWithDelim( buf, "|", 2, buf1, sizeof( buf1)) ) continue;
				win =atoi( buf1);
				if( !getStringFromIndexWithDelim( buf, "|", 3, buf1, sizeof( buf1)) ) continue;
				lose =atoi( buf1);
				if( !getStringFromIndexWithDelim( buf, "|", 4, buf1, sizeof( buf1)) ) continue;
				battle =atoi( buf1);
				if( !getStringFromIndexWithDelim( buf, "|", 5, buf1, sizeof( buf1)) ) continue;
				score =atoi( buf1);

				strcpy( buf2, "-");
				if( battle>= 30 && score > 0 ) strcpy( buf2, "★");
				sprintf( buf1, "%4dth %-18s %3d %3d %3d %3d %s\n", (page*pagecount)+1+i,
					teamname, win, lose, battle, score, buf2);

				strcat( token, buf1);
			}
			lssproto_WN_send( fd, WINDOW_MESSAGETYPE_WIDEMESSAGEANDLINEINPUT, 
							button, WINDOWTYPE_PKLIST_SELECT, CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
							token );
		}
		break;
*/
	case 5://晋级队伍
	case 3://正式赛程
		{
			char token[4096], buf1[256];
			char teamname1[256], teamname2[256], typestring[256];
			int tindex, dtimes, stimes=0;
			int page, i, pagecount=10;
			int winno = WINDOWTYPE_PKLIST_SELECT;

			page = CHAR_getWorkInt( toindex, CHAR_WORKSHOPRELEVANT);
			button = WINDOW_BUTTONTYPE_OK | WINDOW_BUTTONTYPE_PREV | WINDOW_BUTTONTYPE_NEXT;

			if( select == WINDOW_BUTTONTYPE_PREV || select == WINDOW_BUTTONTYPE_NEXT) {
				if( select == WINDOW_BUTTONTYPE_NEXT ){
					if( page < 11 ) page++;
				}else if( select == WINDOW_BUTTONTYPE_PREV ){
					if( page > 0 )	page--;
				}
			}else if( select == WINDOW_BUTTONTYPE_OK ){
				CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 0);
				return;
			}
			if( page < 0 || page >= 11 ) page = 0;
			if( page == 0  ) button = WINDOW_BUTTONTYPE_OK | WINDOW_BUTTONTYPE_NEXT;
			if( page == 10 ) button = WINDOW_BUTTONTYPE_OK | WINDOW_BUTTONTYPE_PREV;
			CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, page);

			switch( num){
			case 3:
				snprintf( token, sizeof( token), 
					"         赛程表\n\n"
					"场次  队伍                         剩馀时间 状态\n\n" );
				break;
			case 5:
				snprintf( token, sizeof( token),	"  队伍名单&赛程纪录\n\n"
													"纪录  \n\n" );
				winno = WINDOWTYPE_PKLIST_SELECT2;
				break;
			}

			for( i=0; i<pagecount; i++ ){
				memset( teamname1, 0, sizeof(teamname1));
				memset( teamname2, 0, sizeof(teamname2));
				if( PKLIST_GetABattlelistDataString(
					(page*pagecount)+1+i, &tindex, &stimes, teamname1, teamname2, typestring, num) == FALSE )
					continue;

				switch( num){
				case 3:
					dtimes = (stimes-(int)time(NULL));
					if( dtimes<1 ) dtimes = 1;
					sprintf( buf1, "场%2d %-12s VS %-12s %2d分%2d秒 %s \n", tindex,
						teamname1, teamname2, (int)(dtimes/60), dtimes%60, typestring);
					break;
				case 5:
					if( strstr(teamname2, "NULL") != NULL ){
						sprintf( buf1, "%4d %-12s \n", tindex, teamname1);
					}else{
						sprintf( buf1, "%-12s vs %12s\n", teamname1, teamname2);
					}
					break;
				}
				strcat( token, buf1);
			}
			lssproto_WN_send( fd, WINDOW_MESSAGETYPE_WIDEMESSAGEANDLINEINPUT, 
							button, winno, CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
							token );
		}
		break;
	case 4:
		{
			char token[4096];
			int teanum = CHAR_getInt( toindex, CHAR_PKLISTTEAMNUM);

			button = WINDOW_BUTTONTYPE_OK;
			if( PKLIST_GetMyPKListTeamData( teanum, token, sizeof(token) ) == FALSE ) return;

			lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE, button, -1,
				CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), token );
		}
		break;
/*	case 6://加入赛程
		{
			int teamnum;
			{
				char buf1[256];
				char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
				if( NPC_Util_GetArgStr( meindex, npcarg, sizeof( npcarg) ) != NULL &&
					NPC_Util_GetStrFromStrWithDelim( npcarg, "ServerType", buf1, sizeof( buf1)) != NULL ){
					if( strstr( buf1, "OFF") !=NULL ){
						return;
					}
				}else{
					return;
				}
			}
			if( (teamnum = CHAR_getInt( toindex, CHAR_PKLISTTEAMNUM)) < 0 ){
				//andy_log
				print("toindex:%d CHAR_PKLISTTEAMNUM:%d err !!\n", toindex, teamnum);
				return;
			}
			if( CHAR_getInt( toindex, CHAR_PKLISTLEADER) != 1 ) {
				CHAR_talkToCli( toindex, -1, "只有队长可以代表队伍加入赛程。", CHAR_COLORYELLOW);
				return;
			}
			if( PKLIST_JoinPKProcedures( toindex) == FALSE ){
				CHAR_talkToCli( toindex, -1, "加入赛程失败!。", CHAR_COLORYELLOW);
			}

		}
		break;
*/
#endif

#ifdef _DEATH_FAMILYCONTEND
	case 2:
		{
			char	message[1024];
			char	buf[2048];
			strcpy( message, 
				"1\n"
				"             要看哪一个?           \n\n"
				"          <家族资格排行>              \n"
				"       < 跨星系家族战报名 >   \n" );

			lssproto_WN_send( fd, WINDOW_MESSAGETYPE_SELECT,
							WINDOW_BUTTONTYPE_CANCEL,
							WINDOWTYPE_FAMILYCONTENDSTART,
							CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
							makeEscapeString( message, buf, sizeof(buf)));
		}
		break;
	case 3:
		{
			char token[4096], buf[512], buf1[256];
			char familyname[256], mname[256];
			int famindex=-1, joinE = 0;

			int page, i, pagecount=10;

			page = CHAR_getWorkInt( toindex, CHAR_WORKSHOPRELEVANT);
			button = WINDOW_BUTTONTYPE_OK | WINDOW_BUTTONTYPE_PREV | WINDOW_BUTTONTYPE_NEXT;

			if( select == WINDOW_BUTTONTYPE_PREV || select == WINDOW_BUTTONTYPE_NEXT) {
				if( select == WINDOW_BUTTONTYPE_NEXT ){
					if( page < 4 ) page++;
				}else if( select == WINDOW_BUTTONTYPE_PREV ){
					if( page > 0 )	page--;
				}
			}else if( select == WINDOW_BUTTONTYPE_OK ){
				CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 0);
				return;
			}
			if( page < 0 || page >= 4 ) page = 0;
			if( page == 0  ) button = WINDOW_BUTTONTYPE_OK | WINDOW_BUTTONTYPE_NEXT;
			if( page == 3 ) button = WINDOW_BUTTONTYPE_OK | WINDOW_BUTTONTYPE_PREV;

			CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, page);
			snprintf( token, sizeof( token), 
				"          跨星系家族赛资格排行榜\n\n"
				"排名    家族名称          家族族长名称\n\n" );
			for( i=0; i<pagecount; i++ ){
				joinE = 0;

				if( NPC_getFamilyPK_List( (page*pagecount)+i, buf, sizeof(buf)) == FALSE ) continue;
//andy_log
print("FPKList[%d]:%s\n", i, buf);

				if( !getStringFromIndexWithDelim( buf, "|", 1, buf1, sizeof( buf1)) ) continue;
				famindex =atoi( buf1);
				if( !getStringFromIndexWithDelim( buf, "|", 2, familyname, sizeof( familyname)) ) continue;
				if( !getStringFromIndexWithDelim( buf, "|", 4, mname, sizeof( mname)) ) continue;
				if( !getStringFromIndexWithDelim( buf, "|", 5, buf1, sizeof( buf1)) ) continue;
				joinE = atoi( buf1);

				sprintf( buf1, "%2dth %-18s %-24s %s\n", (page*pagecount)+1+i,
					familyname, mname, (joinE == 1)?"★":"");


				strcat( token, buf1);
			}
			lssproto_WN_send( fd, WINDOW_MESSAGETYPE_WIDEMESSAGEANDLINEINPUT, 
							button, WINDOWTYPE_FAMILYCONTENDSELECT, CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
							token );
		}
		break;

	case 4:	//报名
		NPC_CheckJoin_FamilyPK_List( meindex, toindex);
		break;
#endif


#ifdef _DEATH_FAMILY_GM_COMMAND	// WON ADD 家族战GM指令
	case 2:
		{
			char	message[1024] = {0};
			char	buf[2048]= {0};
			strcpy( message, 
				"1\n"
				"             要看哪一个?           \n\n"
				"       < 跨星系家族战排行 >   \n" );

			lssproto_WN_send( fd, WINDOW_MESSAGETYPE_SELECT,
							WINDOW_BUTTONTYPE_CANCEL,
							WINDOWTYPE_PKLIST_START,
							CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
							makeEscapeString( message, buf, sizeof(buf)));
		}
		break;
	case 3:
		{
            char token[4096];
            char buf1[256];
            int page, i, pagecount=10;
            char all_msg[400][128];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -