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

📄 npc_warpman.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "version.h"
#include <string.h>
#include "char.h"
#include "object.h"
#include "char_base.h"
#include "npcutil.h"
#include "lssproto_serv.h"
#include "saacproto_cli.h"
#include "npc_warpman.h"
#include "map_deal.h"
#include "readmap.h"
#include "battle.h"
#include "npc_exchangeman.h"
#include "log.h"
#include "enemy.h"
#include "handletime.h"
#include "npc_eventaction.h"

static void NPC_WarpMan_selectWindow( int meindex, int toindex, int num,int select);
//ANDY_END
BOOL NPC_GetDuelPointCheck(int meindex,int talker);
BOOL NPC_PARTY_CHAECK( int meindex, int talkerindex);
void NPC_ERR_DiSP(int meindex,int talker,int errNO);

BOOL NPC_BigSmallLastCheck(int point1,int mypoint,int flg);

//BOOL NPC_ItemCheck(int meindex,int talker,int itemNo,int flg);
int NPC_FloorUse(int talker,int floor);
BOOL NPC_WarpMsg(int meindex,int talker,char *buf);
BOOL NPC_NpcWarpMsg(int meindex,int talker,char *arg);
int NPC_FloorUseOtherFloor(int charaindex, char *buf);


#ifdef  _NPC_ADDLEVELUP
void NPC_LevelAndTransUp( int meindex, int charindex, int level, int skillpoint, int exp, int ridepet);
#endif

#define WARPMAN_STANDBY 3000
#define WARPMAN_WAIT 150
//ANDY_ADD
int CheckWarpMsg( int meindex, int talkerindex,char *npcarg ,char *TalkStr);

#ifdef _TREASURE_BOX
BOOL NPC_TreasureEventRunMsg( int meindex);
#endif

BOOL NPC_TreasureRandItemGet(int meidex,int talker,int rand_j,char *buf);

enum {
	NPC_WORK_CURRENTTIME = CHAR_NPCWORKINT1,
	NPC_TIME_BORN = CHAR_NPCWORKINT2,
	NPC_TIME_DEAD = CHAR_NPCWORKINT3,
	NPC_TIME_MODE = CHAR_NPCWORKINT4,

	NPC_TIME_EVENTMODE = CHAR_NPCWORKINT6,// 1
	NPC_TIME_EVENTTIME = CHAR_NPCWORKINT7,
	NPC_TIME_EVENONBBI = CHAR_NPCWORKINT8,
	NPC_TIME_EVENOFFDBBI = CHAR_NPCWORKINT9,
	NPC_TIME_EVENTNUM = CHAR_NPCWORKINT10,
};

enum{
	NPC_EVENTMODE_NONE,
	NPC_EVENTMODE_OPEN,
	NPC_EVENTMODE_EVENT,
};

#ifdef _NEW_WARPMAN
static void NPC_NewWarpMan_selectWindow( int meindex, int toindex, int num,int select,char *TalkStr);

enum	{
	WARP_MAN=0,
	NEW_WARPMAN,
	NEW_WARPMAN_END
	};
#endif
#define TIMECHECKLOOP 20
// Robin 0518
//BOOL checkend = FALSE;


BOOL NPC_WarpManInit( int meindex )
{
	char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
	char buff2[256];
	char buf[1024];
	int fl,x,y;
		
	if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){
		print("WarpMan:GetArgStrErr");
		return FALSE;
	}
   	CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_TYPEWARPMAN );
#ifdef _NEW_WARPMAN
	if( strstr( npcarg,"NEWWARPMAN") )      {
			//timeman 功能
			CHAR_setWorkInt( meindex, NPC_TIME_MODE, 1);
			if(NPC_Util_GetStrFromStrWithDelim( npcarg, "NEWTIME", buff2, sizeof( buff2)) != NULL ){
				CHAR_setInt( meindex, CHAR_LOOPINTERVAL, 60*1000);
			}
#ifdef _TREASURE_BOX
			CHAR_setWorkInt( meindex, NPC_TIME_EVENTMODE, NPC_EVENTMODE_NONE);
			if(NPC_Util_GetStrFromStrWithDelim( npcarg, "TREASURE_BOX", buff2, sizeof( buff2)) != NULL ){
				if( strstr( buff2, "ON") != NULL ){
					CHAR_setWorkInt( meindex, NPC_TIME_EVENTMODE, NPC_EVENTMODE_EVENT);
					CHAR_setWorkInt( meindex, NPC_TIME_EVENTTIME, NowTime.tv_sec);
					if(NPC_Util_GetStrFromStrWithDelim( npcarg, "TREASURE_ONBBI", buff2, sizeof( buff2)) != NULL )
						CHAR_setWorkInt( meindex, NPC_TIME_EVENONBBI, atoi( buff2));
					if(NPC_Util_GetStrFromStrWithDelim( npcarg, "TREASURE_OFFDBBI", buff2, sizeof( buff2)) != NULL )
						CHAR_setWorkInt( meindex, NPC_TIME_EVENOFFDBBI, atoi( buff2));
					CHAR_setWorkInt( meindex, NPC_TIME_EVENTNUM, 0 );
				}
			}

#endif
			return TRUE;
	}else{
#endif
		if(NPC_Util_GetStrFromStrWithDelim( npcarg, "WARP", buf, sizeof( buf))==NULL){
			char filename[256];
			 if( NPC_Util_CheckAssignArgFile( meindex, filename) != NULL )
				 print("\n Warpman Err -> file:%s", filename);
			return FALSE;
		}
		getStringFromIndexWithDelim(buf,",",1,buff2,sizeof(buff2));
		fl=atoi(buff2);
		getStringFromIndexWithDelim(buf,",",2,buff2,sizeof(buff2));
		x=atoi(buff2);
		getStringFromIndexWithDelim(buf,",",3,buff2,sizeof(buff2));
		y=atoi(buff2);
		if( MAP_IsValidCoordinate( fl,x,y )== FALSE ){
			char filename[256];
			NPC_Util_CheckAssignArgFile( meindex, filename);
			print( "\nWarp NPC: filename:%s\n 3.Invalid warpman ERR %d %d %d" , filename, fl , x , y );
			return FALSE;
		}
#ifdef _NEW_WARPMAN
	}
#endif
	return TRUE;
}

void NPC_WarpManTalked( int meindex , int talkerindex , char *szMes ,int color )
{
	char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
	char token[256];
	int RunType=-1;
	
	CHAR_setWorkInt( talkerindex, CHAR_WORKWARPCHECK, FALSE );
	if( CHAR_getInt( talkerindex , CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) {
		return;
	}
	if(NPC_Util_isFaceToFace( meindex ,talkerindex ,2)==FALSE){
		if(NPC_Util_isFaceToChara(talkerindex,meindex,1 )==FALSE) return;
	}
	if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){
		print("GetArgStrErr");
		return ;
	}

#ifdef _NEW_WARPMAN
	if( strstr( npcarg,"NEWWARPMAN") )      {
#ifdef _TREASURE_BOX
		if( CHAR_getWorkInt( meindex, NPC_TIME_EVENTMODE) == NPC_EVENTMODE_OPEN )
			return;
#endif
		NPC_NewWarpMan_selectWindow( meindex ,talkerindex, 0, -1, szMes);
		return;
	}else	{
		if(NPC_PARTY_CHAECK( meindex, talkerindex) == FALSE)	{//有组队
			NPC_ERR_DiSP( meindex, talkerindex, 1);
			return;
		}
		
		
		RunType = CheckWarpMsg( meindex, talkerindex, npcarg , szMes);
		if( RunType !=0 )	{
			if( RunType == 1 )	{
				if( NPC_Util_GetStrFromStrWithDelim( npcarg, "nomal_msg", token, sizeof(token)) != NULL)	{
					CHAR_talkToCli( talkerindex, meindex,token,CHAR_COLORWHITE);
				}
			}
			return;
		}
	}
#else
	
	
	if(NPC_PARTY_CHAECK( meindex, talkerindex) == FALSE)	{//有组队
		NPC_ERR_DiSP( meindex, talkerindex, 1);
		return;
	}
	RunType = CheckWarpMsg( meindex, talkerindex, npcarg , szMes);
	if( RunType !=0 )	{
		if( RunType == 1 )	{
			if( NPC_Util_GetStrFromStrWithDelim( npcarg, "nomal_msg", token, sizeof(token)) != NULL)	{
				CHAR_talkToCli( talkerindex, meindex,token,CHAR_COLORWHITE);
			}
		}
		return;
	}
#endif
	
	CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0);
	CHAR_setWorkInt( talkerindex , CHAR_WORKSHOPRELEVANTTRD , 0 );
	if(strstr(npcarg,"DR")!=NULL)	{
		CHAR_setWorkInt( talkerindex , CHAR_WORKSHOPRELEVANTSEC , -1 );
		if(NPC_GetDuelPointCheck(meindex,talkerindex)==FALSE)	return;
	}else{
		NPC_WarpMan_selectWindow( meindex, talkerindex,0,-1);
	}
}

static void NPC_WarpMan_selectWindow( int meindex, int toindex, int num,int select)
{
	
	char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
	char token[1024];
	char buf[256];
	char buf2[1024];
	char buf3[256];
	int fl=0	;
	int money=100	;
	int fd = getfdFromCharaIndex( toindex);
	char tmp[64];

	if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){
		print("GetArgStrErr");
		CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 0);
		return ;
	}

        if(NPC_PARTY_CHAECK( meindex, toindex) == FALSE)	{
		    NPC_ERR_DiSP( meindex, toindex, 1);
		    return;
		}


	if( CHAR_getWorkInt( toindex, CHAR_WORKSHOPRELEVANT) != 0 )	{
		return;
	}else	{
		CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 1);
	}

	if(strstr(npcarg,"%4d")!=NULL){
		int flwork = 0;
		int work;
		NPC_Util_GetStrFromStrWithDelim( npcarg, "WARP", buf, sizeof( buf));
		getStringFromIndexWithDelim(buf,",",1,buf3,sizeof(buf3));
		work = atoi( buf3);
		fl = NPC_FloorUse( toindex, atoi(buf3));		

		if(NPC_Util_GetStrFromStrWithDelim( npcarg, "Floor", buf3, sizeof( buf3)) != NULL){
			flwork = NPC_FloorUseOtherFloor(work, buf3);
		}
		fl = fl +flwork;
	}

	NPC_Util_GetStrFromStrWithDelim( npcarg, "FREE", buf, sizeof( buf));

	if( (NPC_ActionPassCheck(meindex,toindex,buf)==TRUE) || (strstr(buf,"ALLFREE")!=NULL) ){
		if(NPC_Util_GetStrFromStrWithDelim( npcarg, "FreeMsg", buf2, sizeof( buf2))==NULL) return;
		      CONNECT_set_pass(fd,TRUE);
		      CONNECT_set_first_warp(fd,TRUE);
		if(strstr(buf2,"%4d") != NULL){
			sprintf(token,buf2,fl);
		}else{
			strcpy(token,buf2);
		}
		CHAR_setWorkInt( toindex , CHAR_WORKSHOPRELEVANTTRD , -1 );
		CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 2);
	}else	{
		if(NPC_Util_GetStrFromStrWithDelim( npcarg, "PayMsg", buf2, sizeof( buf2)) != NULL){
		       CONNECT_set_pass(fd,FALSE);
		       CONNECT_set_first_warp(fd,FALSE);
			if(strstr(buf2,"%8d") != NULL){
				NPC_Util_GetStrFromStrWithDelim( npcarg, "MONEY", tmp, sizeof( tmp));
				if(strstr(tmp,"LV")!=NULL){
					int level;
					char buff2[32];
						
					level = CHAR_getInt(toindex,CHAR_LV);
					getStringFromIndexWithDelim(tmp,"*",2,buff2,sizeof(buff2));
					money = level*atoi(buff2);
				}else{
					money=atoi(tmp);
				}
				if(strstr(buf2,"%4d") != NULL){
					sprintf(token,buf2,fl,money);
				}else{
					sprintf(token,buf2,money);
				}
			}else if(strstr(buf2,"%4d") != NULL){
				sprintf(token,buf2,fl);
				NPC_Util_GetStrFromStrWithDelim( npcarg, "MONEY", tmp, sizeof( tmp));
				if( strstr( tmp,"-" ) != NULL){
					money=10000001;
					lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,
								WINDOW_BUTTONTYPE_OK,
								CHAR_WINDOWTYPE_WINDOWWARPMAN_MAIN, 
								CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
								token);
					return ;
				}
			}else{
				strcpy(token,buf2);
				NPC_Util_GetStrFromStrWithDelim( npcarg, "MONEY", tmp, sizeof( tmp));
				if( strstr( tmp,"-" ) != NULL){
					money=10000001;
					lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,
								WINDOW_BUTTONTYPE_OK,
								CHAR_WINDOWTYPE_WINDOWWARPMAN_MAIN, 
								CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
								token);
					return ;
				}else{
					money = atoi(tmp);
				}
			}
			if(CHAR_getInt(toindex,CHAR_FLOOR)==117){
			   money=CHAR_getInt(toindex,CHAR_GOLD);
			   if (money>=10) money*=0.9; 
			   else if( money == 0 ) {
				   CHAR_warpToSpecificPoint(toindex,117,225,13);
				   return;
			   }
			}
			CHAR_setWorkInt( toindex , CHAR_WORKSHOPRELEVANTTRD , money );
			CONNECT_set_pass(fd,TRUE);
			CONNECT_set_first_warp(fd,TRUE);
		
		}else if(NPC_Util_GetStrFromStrWithDelim( npcarg, "NomalMsg", token,sizeof(token)) !=NULL){
			CHAR_setWorkInt( toindex , CHAR_WORKSHOPRELEVANTTRD , -2 );
			CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, -1);
			lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,
								WINDOW_BUTTONTYPE_OK,
								CHAR_WINDOWTYPE_WINDOWWARPMAN_MAIN, 
								CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
								token);
		}
	}
	lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,
						WINDOW_BUTTONTYPE_YESNO,
						CHAR_WINDOWTYPE_WINDOWWARPMAN_MAIN, 
						CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
						token);
}

void NPC_WarpManWindowTalked( int meindex, int talkerindex, 
								int seqno, int select, char *data)
{
	char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
	char buf[NPC_UTIL_GETARGSTR_BUFSIZE];
#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");

⌨️ 快捷键说明

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