📄 npc_warpman.c
字号:
#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_ENDBOOL 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);#define WARPMAN_STANDBY 3000#define WARPMAN_WAIT 150//ANDY_ADDint CheckWarpMsg( int meindex, int talkerindex,char *npcarg ,char *TalkStr);#ifdef _TREASURE_BOXBOOL NPC_TreasureEventRunMsg( int meindex);#endifBOOL 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_WARPMANstatic 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 - 1024 * 20]; 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 - 1024 * 20]; 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 - 1024 * 20]; 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 - 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 }#endif}BOOL NPC_BigSmallLastCheck(int point1,int mypoint,int flg){ if(flg==0){ if(point1==mypoint) { return TRUE; } }else if(flg==1){ if(mypoint < point1) { return TRUE; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -