#include "version.h" #include #include #include "common.h" #include "object.h" #include "char_base.h" #include "char.h" #include "configfile.h" #include "handletime.h" #include "pet_event.h" #include "npcutil.h" #include "log.h" #include "lssproto_serv.h" // Arminius 8.14 pet talk #include #include "npc_exchangeman.h" #include "npc_eventaction.h" #ifdef _MARKET_TRADE #include "item_trade.h" #endif #ifdef _PET_TALK //BOOL PetTalk_CheckFree( int meindex, int toindex, char *buf); BOOL PetTalk_CheckFree( int meindex, int talker, char *buf); BOOL PetTalk_BSCheck(int meindex,int talker,char* buf); BOOL PetTalk_FreeIfCheck(int meindex,int talker,char* buf,int kosuu,int flg, int temp); BOOL PetTalk_WarpManReduce(int meindex,int talker,char *buf); BOOL PetTalk_BigSmallLastCheck(int point1,int mypoint,int flg); BOOL PetTalk_CheckTrans(int meindex,int talker,int trans,int flg); BOOL PetTalk_LevelCheck(int meindex,int talker,int level,int flg); BOOL PetTalk_CheckMyPet( int meindex, int talker, int petLv, int flg, int petid); BOOL PetTalk_ItemCheck(int meindex,int talker,int itemNo,int flg); BOOL PetTalk_CheckMyType( int meindex, int toindex, int kosuu, int flg, int Type ); BOOL PetTalk_CheckPetEvent( int meindex, int toindex, char *buf); void PetTalk_RequestMain(int meindex,int talker,char *buf); BOOL PetTalk_AddItem(int meindex, int talker, char *buf); BOOL PetTalk_DelItem(int meindex,int talker,char *buf); BOOL PetTalk_RunEvent( int meindex, int talker, char *buf); BOOL PetTalk_CheckMyFloor( int meindex, int talker, char *buf, int flg); #ifdef _PET_TALKBBI BOOL PET_CheckPlayerBBI( int meindex, int charindex, int BBI, int flg); #endif #ifdef _PET_TALKPRO #else char *Pet_TalkGetFunStr( char *temp , char *buf, int len) { char filename[56]; char pathfile[128]; char talkfun[ 10240]; char buf1[256],buf2[256],buf3[256]; FILE *petarg; char *cStr=NULL; int talkNo=1,mark=1; char line[4096]; BOOL find=FALSE; talkfun[0] ='\0'; while( getStringFromIndexWithDelim( pettalktext,"&",talkNo, buf1, sizeof( buf1) ) != FALSE){ talkNo++; if( NPC_Util_GetStrFromStrWithDelim( buf1, "PETTEMPNO", buf2, sizeof( buf2)) == NULL ) continue; mark=2; strcpy( filename,"\0"); while( getStringFromIndexWithDelim( buf2,",", mark,buf3,sizeof( buf3)) != FALSE ) { mark ++; if( !strcmp( buf3, temp)) { print("\n buf2=%s",buf2); if( getStringFromIndexWithDelim( buf2,",", 1,filename,sizeof( filename)) == FALSE ) return NULL; find = TRUE; break; } } if( find == TRUE ) break; } if( !strcmp( filename, "\0") ) return NULL; sprintf( pathfile, "%s/pettalk/%s", getNpcdir(), filename); petarg = fopen( pathfile , "r" ); if( petarg != NULL ) { while( fgets( line, sizeof( line), petarg ) ) { if( strlen( talkfun) != 0 ) { if( talkfun[strlen( talkfun) -1] != '|' ) { strcatsafe( talkfun, sizeof( talkfun), "|"); } } chompex( line); strcatsafe( talkfun, sizeof( talkfun ), line); } fclose( petarg); }else { return NULL; } talkNo = 1; while( getStringFromIndexWithDelim( talkfun,"}",talkNo, buf, len) != FALSE) { talkNo++; if( NPC_Util_GetStrFromStrWithDelim( buf, "PETTEMPNO", buf2, sizeof( buf2)) == NULL ) continue; if( !strcmp( temp, buf2) ) { cStr = buf; break; } } return( cStr); } #endif void PET_Talkfunc( int meindex, int talkerindex, char *msg, int color) { char buf2[1024], buf3[256]; char TalkType[][16]={"TALKRUN","EVENTRUN","BOTH"}; char AllTalk[PETTALK_MAXID][1024]; int Type=0,j,i; int talkNo=0; BOOL FREEs=FALSE; int buttontype = 0; int windowtype = 0; #ifdef _PET_TALKPRO int tPage=-1; #else int petid=-1; char tempNo[32], buf1[10240]; #endif int fd = getfdFromCharaIndex( talkerindex); #define RAND(x,y) ((x-1)+1+ (int)( (double)(y-(x-1))*rand()/(RAND_MAX+1.0)) ) windowtype = WINDOW_MESSAGETYPE_MESSAGE; buttontype = WINDOW_BUTTONTYPE_OK; if( NPC_Util_isFaceToFace( meindex ,talkerindex , 2) == FALSE) { if( NPC_Util_isFaceToChara( talkerindex, meindex, 1) == FALSE) return; } for( i = 0 ; i < 5 ; i++ ) { strcpy( AllTalk[i], "\0" ); } #ifdef _PET_TALKPRO for( i=0;i=0 && pettalktext[i].ID == CHAR_getInt(meindex, CHAR_PETID) ) { if( strcmp( pettalktext[i].DATA, "\0") && strlen( pettalktext[i].DATA) > 0 ) { //snprintf( buf1, sizeof(buf1), pettalktext[i].DATA); tPage=i; break; } } } if( i == PETTALK_MAXID ) return; #else sprintf(tempNo,"%d", CHAR_getInt(meindex, CHAR_PETID)); petid = CHAR_getInt(meindex, CHAR_PETID); if( Pet_TalkGetFunStr( tempNo , buf1 , sizeof( buf1) ) == NULL ) { return; } #endif if( CHAR_getInt( meindex, CHAR_LV ) >= CHAR_getInt( meindex, CHAR_LIMITLEVEL) ) { Type = 1; } //设定为非主人不得与PET互动 if( strcmp( CHAR_getChar( meindex, CHAR_OWNERCDKEY), CHAR_getChar( talkerindex, CHAR_CDKEY) ) || strcmp( CHAR_getChar( meindex, CHAR_OWNERCHARANAME), CHAR_getChar( talkerindex, CHAR_NAME) )){ #ifdef _PET_TALKPRO if( NPC_Util_GetStrFromStrWithDelim( pettalktext[tPage].DATA, "NoPlayerMsg", buf3, sizeof( buf3)) != NULL ) { #else if( NPC_Util_GetStrFromStrWithDelim( buf1, "NoPlayerMsg", buf3, sizeof( buf3)) != NULL ) { #endif }else { sprintf(buf3,"陌生人?我不认识你呀!你是坏人!"); } CHAR_talkToCli( talkerindex, meindex, buf3, color); return; } j=0; #ifdef _PET_TALKPRO while( getStringFromIndexWithDelim( pettalktext[tPage].DATA,"OVER",talkNo, buf2, sizeof( buf2) ) != FALSE){ #else while( getStringFromIndexWithDelim( buf1,"OVER",talkNo, buf2, sizeof( buf2) ) != FALSE){ #endif talkNo++; if( ( strstr( buf2, TalkType[Type]) == NULL ) && ( strstr( buf2, TalkType[2]) == NULL ) )continue; if( NPC_Util_GetStrFromStrWithDelim( buf2, "FLOOR", buf3, sizeof( buf3)) != NULL ) {//判断房间号 if( PetTalk_CheckMyFloor( meindex, talkerindex, buf3, 0) == FALSE )continue; } if( NPC_Util_GetStrFromStrWithDelim( buf2, "PET", buf3, sizeof( buf3)) != NULL ) {//判断宠物FREE条件 if( PetTalk_CheckFree( meindex, meindex, buf3) != TRUE ) continue; } if( NPC_Util_GetStrFromStrWithDelim( buf2, "FREE", buf3, sizeof( buf3) ) == NULL)continue; if( NPC_ActionPassCheck( meindex, talkerindex, buf3) == FALSE ) continue;//判断玩家FREE条件 // if( ActionNpc_CheckFree( meindex, talkerindex, buf2, 0) == FALSE ) continue; if( PetTalk_CheckPetEvent( meindex, talkerindex, buf2) == FALSE )continue; FREEs = TRUE; //条件成立 strcpy( AllTalk[j++], buf2 ); if( j > PETTALK_MAXID-1 ) break; } talkNo = 0; if( FREEs == FALSE) { //如果全部条件都不成立 j=0; #ifdef _PET_TALKPRO while( getStringFromIndexWithDelim( pettalktext[tPage].DATA,"OVER",talkNo, buf2, sizeof( buf2) ) != FALSE ){ #else while( getStringFromIndexWithDelim( buf1,"OVER",talkNo, buf2, sizeof( buf2) ) != FALSE ){ #endif talkNo ++; if( strstr( buf2, "OTHER") == NULL ) continue; if( NPC_Util_GetStrFromStrWithDelim( buf2, "TalkMsg", buf3, sizeof( buf3)) == NULL) continue; while( getStringFromIndexWithDelim( buf3,",",j+1, AllTalk[j], sizeof( AllTalk[j]) ) != FALSE ){ j++; } break; } } if( j > 0 ) { strcpy( buf2, AllTalk[ RAND( 0, (j-1) ) ] ); if( PetTalk_RunEvent( meindex, talkerindex, buf2) == FALSE ) { sprintf( buf3,"....!"); CHAR_talkToCli( talkerindex, meindex, buf3, color); return; } if( NPC_Util_GetStrFromStrWithDelim( buf2, "TalkMsg", buf3, sizeof( buf3)) == NULL) { //sprintf( buf3,"主人,我们去逛逛吧!"); strcpy( buf3, buf2); } lssproto_WN_send( fd, windowtype, buttontype, 0, CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), buf3 ); } } BOOL PetTalk_CheckMyFloor( int meindex, int talker, char *buf, int flg) { char buf1[16]; int Myfloor=-1; Myfloor = CHAR_getInt( talker, CHAR_FLOOR); if( strstr( buf, "!") != NULL ) { getStringFromIndexWithDelim( buf,"!", 2, buf1, sizeof( buf1) ); if( Myfloor == atoi( buf1) ) { return FALSE; } }else { if( Myfloor != atoi( buf) ) { return FALSE; } } return TRUE; } BOOL PetTalk_RunEvent( int meindex, int talker, char *buf) { char buf1[256]; int LimitLevel = -1; if( Action_RunDoEventAction( meindex, talker, buf) == FALSE ) return FALSE; if( NPC_Util_GetStrFromStrWithDelim( buf, "RandItem", buf1, sizeof( buf1)) != NULL ){ if( RAND( 0, 10) > 9 ) { PetTalk_AddItem( meindex, talker, buf1); }else { return FALSE; } } if( NPC_Util_GetStrFromStrWithDelim( buf, "LimitLevel", buf1, sizeof( buf1)) != NULL ){ LimitLevel = atoi( buf1); CHAR_setInt( meindex, CHAR_LIMITLEVEL, LimitLevel); } return TRUE; } BOOL PetTalk_DelItem(int meindex,int talker,char *buf) { int i = 1, j = 1,k = 1; char buff3[128]; char buf2[32]; int itemindex; while( getStringFromIndexWithDelim(buf , "," , k, buff3, sizeof(buff3)) !=FALSE ) { k++; if(strstr(buff3,"*")!=NULL){ int itemno; int kosuu; int id; int cnt=0; getStringFromIndexWithDelim(buff3,"*",1,buf2,sizeof(buf2)); itemno = atoi(buf2); getStringFromIndexWithDelim(buff3,"*",2,buf2,sizeof(buf2)); kosuu = atoi(buf2); for( i =0 ; i < CHAR_MAXITEMHAVE ; i++ ){ itemindex=CHAR_getItemIndex( talker , i ); if( ITEM_CHECKINDEX(itemindex) ){ id=ITEM_getInt(itemindex ,ITEM_ID ); if(itemno==id){ cnt++; LogItem( CHAR_getChar( talker, CHAR_NAME ), /* 平乓仿 */ CHAR_getChar( talker, CHAR_CDKEY ), #ifdef _add_item_log_name // WON ADD 在item的log中增加item名称 itemindex, #else ITEM_getInt( itemindex, ITEM_ID), /* 失奶 丞 寞 */ #endif "WarpManDelItem(NPC收道具後传至某点)", CHAR_getInt( talker, CHAR_FLOOR), CHAR_getInt( talker, CHAR_X ), CHAR_getInt( talker, CHAR_Y ), ITEM_getChar( itemindex, ITEM_UNIQUECODE), ITEM_getChar( itemindex, ITEM_NAME), ITEM_getInt( itemindex, ITEM_ID) ); CHAR_DelItem( talker, i); if(cnt == kosuu){ break; } } } } }else{ /*--蓟氏分 寞及失奶 丞毛蓟请---*/ for( j = 0 ; j < CHAR_MAXITEMHAVE ; j++){ itemindex = CHAR_getItemIndex( talker ,j); if( ITEM_CHECKINDEX(itemindex) ){ if( atoi( buff3) == ITEM_getInt(itemindex,ITEM_ID)){ LogItem( CHAR_getChar( talker, CHAR_NAME ), /* 平乓仿 */ CHAR_getChar( talker, CHAR_CDKEY ), #ifdef _add_item_log_name // WON ADD 在item的log中增加item名称 itemindex, #else ITEM_getInt( itemindex, ITEM_ID), /* 失奶 丞 寞 */ #endif "WarpManDelItem(NPC收道具後传至某点)", CHAR_getInt( talker,CHAR_FLOOR), CHAR_getInt( talker,CHAR_X ), CHAR_getInt( talker,CHAR_Y ), ITEM_getChar( itemindex, ITEM_UNIQUECODE), ITEM_getChar( itemindex, ITEM_NAME), ITEM_getInt( itemindex, ITEM_ID) ); CHAR_DelItem( talker, j); } } } } } return TRUE; } BOOL PetTalk_AddItem(int meindex, int talker, char *buf) { int itemID,k=1,itemindex=-1; int spaceNum=5,i; char buff3[256], msgbuf[64], token[256]; int ret; while( getStringFromIndexWithDelim(buf , "," , k, buff3, sizeof(buff3)) !=FALSE ){ k++; for( i = spaceNum ; i < CHAR_MAXITEMHAVE ; i++ ){ itemindex=CHAR_getItemIndex( talker , i ); if( itemindex == -1 ) { spaceNum = i+1; break; } } if( i == CHAR_MAXITEMHAVE ) { snprintf( msgbuf,sizeof( msgbuf), "主人,你的物品栏已经满了!!"); CHAR_talkToCli( talker, meindex, msgbuf, CHAR_COLORWHITE); return FALSE; } } k=1; while( getStringFromIndexWithDelim(buf , "," , k, buff3, sizeof(buff3)) !=FALSE ){ k++; itemID = atoi( buff3); if( itemID ) itemindex = ITEM_makeItemAndRegist( itemID); if(itemindex == -1) continue; ret = CHAR_addItemSpecificItemIndex( talker, itemindex); if( ret < 0 || ret >= CHAR_MAXITEMHAVE ) { ITEM_endExistItemsOne( itemindex); print ("\n ret error!!"); return FALSE; } sprintf( token,"拿到%s",ITEM_getChar( itemindex, ITEM_NAME)); CHAR_talkToCli( talker, -1,token,CHAR_COLORWHITE); CHAR_sendItemDataOne( talker, ret); } return TRUE; } BOOL PetTalk_CheckPetEvent( int meindex, int toindex, char *buf) { char buf1[256],buf2[256]; int k = 0; if( NPC_Util_GetStrFromStrWithDelim( buf, "EndSetFlg", buf1,sizeof( buf1) ) != NULL ) { k=1; while( getStringFromIndexWithDelim(buf1 , "," ,k, buf2, sizeof(buf2) ) != FALSE ){ k++; NPC_EventSetFlg( toindex, atoi( buf2)); } } if( NPC_Util_GetStrFromStrWithDelim( buf, "NowSetFlg", buf1, sizeof( buf1)) != NULL) { k=1 ; while(getStringFromIndexWithDelim(buf1 , "," , k, buf2, sizeof(buf2))!= FALSE ){ k++; NPC_NowEventSetFlg( toindex, atoi( buf2)); } } return TRUE; } void PetTalk_RequestMain(int meindex,int talker,char *buf) { int shiftbit; char buf2[128]; if( NPC_Util_GetStrFromStrWithDelim( buf,"EventNo", buf2,sizeof( buf2) ) == NULL ) { print("\n pet_event.c err:NOT FIND [EventNo] !!"); return; } shiftbit = atoi( buf2); if( NPC_NowEventCheckFlg( talker, shiftbit) != TRUE ) { NPC_NowEventSetFlg( talker, shiftbit); } } BOOL PetTalk_CheckFree( int meindex, int talker, char *buf) { char buff2[256]; char buff3[128]; int i=1,j=1; int loop=0; while( getStringFromIndexWithDelim(buf,",",i,buff2,sizeof(buff2)) !=FALSE ) { i++; if(strstr(buff2,"&")!=NULL){ j=1; loop=0; while( getStringFromIndexWithDelim(buff2,"&",j,buff3,sizeof(buff3)) !=FALSE ) { j++; if(PetTalk_BSCheck(meindex,talker,buff3)==FALSE) { loop=1; break; } } if(loop==0) { CHAR_setWorkInt( talker, CHAR_WORKWARPCHECK, TRUE ); return TRUE; } }else{ if( PetTalk_BSCheck( meindex, talker, buff2) == TRUE ){ CHAR_setWorkInt( talker, CHAR_WORKWARPCHECK, TRUE ); return TRUE; } } } CHAR_setWorkInt( talker, CHAR_WORKWARPCHECK, FALSE ); return FALSE; } BOOL PetTalk_BSCheck(int meindex,int talker,char* buf) { char buff2[128]; int kosuu,temp=-1,flg=0; char buff1[128],buff3[128]; if(strstr( buf, "-") != NULL) { //buff3为抓宠物ID getStringFromIndexWithDelim( buf, "-", 2, buff3, sizeof(buff3)); temp = atoi( buff3); getStringFromIndexWithDelim( buf, "-", 1, buff1, sizeof(buff1)); strcpy( buf, buff1); } if(strstr( buf, "<") != NULL){ getStringFromIndexWithDelim( buf, "<", 2, buff2, sizeof(buff2)); kosuu = atoi( buff2); getStringFromIndexWithDelim( buf, "<", 1, buff2, sizeof(buff2)); if(PetTalk_FreeIfCheck( meindex, talker, buff2, kosuu, 1, temp)==TRUE){ return TRUE; } }else if(strstr( buf, ">") != NULL){ getStringFromIndexWithDelim( buf, ">", 2, buff2, sizeof(buff2)); kosuu = atoi(buff2); getStringFromIndexWithDelim( buf, ">" ,1, buff2, sizeof(buff2)); if(PetTalk_FreeIfCheck( meindex, talker, buff2, kosuu, 2, temp)==TRUE){ return TRUE; } }else if(strstr( buf, "!" ) != NULL){ getStringFromIndexWithDelim( buf, "!=", 2, buff2, sizeof(buff2)); kosuu = atoi( buff2); getStringFromIndexWithDelim( buf, "!=", 1, buff2, sizeof(buff2)); if(PetTalk_FreeIfCheck( meindex, talker, buff2, kosuu, 0, temp) == TRUE){ return FALSE; }else{ return TRUE; } }else if(strstr( buf, "=") != NULL){ getStringFromIndexWithDelim( buf, "=", 2, buff2, sizeof(buff2)); kosuu = atoi( buff2); getStringFromIndexWithDelim( buf, "=", 1, buff2, sizeof(buff2)); if( strstr( buf, "PET")) { flg = 3; } if(strstr( buf, "*") != NULL){ if( PetTalk_WarpManReduce( meindex, talker, buf)==TRUE){ return TRUE; } }else if(PetTalk_FreeIfCheck( meindex, talker, buff2, kosuu, flg, temp)==TRUE){ return TRUE; } } return FALSE; } BOOL PetTalk_FreeIfCheck(int meindex,int talker,char* buf,int kosuu,int flg, int temp) { int Type = -1; if(strcmp(buf,"LV")==0){ if(PetTalk_LevelCheck(meindex,talker,kosuu,flg)==TRUE){ return TRUE; } } if( strcmp( buf, "TRANS") == 0 ) { if( PetTalk_CheckTrans( meindex, talker, kosuu, flg) == TRUE ) return TRUE; } if( strcmp( buf, "PET") == 0 ) { if( temp > 0 ) { if( PetTalk_CheckMyPet( meindex, talker, kosuu, flg, temp) == TRUE ) return TRUE; }else return FALSE; } if(strcmp( buf, "ITEM")==0){ if(PetTalk_ItemCheck(meindex,talker,kosuu,flg)==TRUE){ return TRUE; } } if(strcmp( buf, "ENDEV")==0){ if(NPC_EventCheckFlg( talker, kosuu)==TRUE){ return TRUE; } } if(strcmp( buf, "NOWEV")==0){ if(NPC_NowEventCheckFlg( talker, kosuu)==TRUE){ return TRUE; } } if(strcmp( buf, "HP" ) == 0 ) { Type = 0; if( PetTalk_CheckMyType( meindex, talker, kosuu, flg, Type ) == TRUE ) { return TRUE; } } #ifdef _PET_TALKBBI if(strcmp( buf, "BBI" ) == 0 ) { if( PET_CheckPlayerBBI( meindex, talker, kosuu, flg)== TRUE) { return TRUE; } } #endif return FALSE; } BOOL PetTalk_CheckMyType( int meindex, int toindex, int kosuu, int flg, int Type ) { int MyType=0,MyMaxType=0; switch( Type ) { case 0: //HP MyType = CHAR_getInt( toindex, CHAR_HP); MyMaxType = CHAR_getWorkInt( toindex, CHAR_WORKMAXHP); MyMaxType = (MyMaxType * kosuu )/ 100; if( PetTalk_BigSmallLastCheck( MyMaxType, MyType , flg ) == TRUE ) { return TRUE; } break; } return FALSE; } BOOL PetTalk_WarpManReduce(int meindex,int talker,char *buf) { char buf2[512]; char buf3[256]; int id=0; int i; int itemindex; int itemno; int kosuu; int cnt=0; getStringFromIndexWithDelim(buf,"=",2,buf2,sizeof(buf2)); getStringFromIndexWithDelim(buf2,"*",1,buf3,sizeof(buf3)); itemno = atoi(buf3); getStringFromIndexWithDelim(buf2,"*",2,buf3,sizeof(buf3)); kosuu = atoi(buf3); for( i=0 ; i < CHAR_MAXITEMHAVE;i++ ){ itemindex=CHAR_getItemIndex( talker , i ); if( ITEM_CHECKINDEX(itemindex) ){ id=ITEM_getInt(itemindex ,ITEM_ID ); if(itemno==id){ cnt++; if(cnt==kosuu){ return TRUE; } } } } return FALSE; } BOOL PetTalk_LevelCheck(int meindex,int talker,int level,int flg) { int mylevel; mylevel=CHAR_getInt(talker,CHAR_LV); if(PetTalk_BigSmallLastCheck(level,mylevel,flg)==TRUE) { return TRUE; } return FALSE; } BOOL PetTalk_CheckTrans(int meindex,int talker,int trans,int flg) { int myTrans; myTrans=CHAR_getInt(talker, CHAR_TRANSMIGRATION); if( PetTalk_BigSmallLastCheck( trans, myTrans, flg ) == TRUE ) { return TRUE; } return FALSE; } BOOL PetTalk_CheckMyPet( int meindex, int talker, int petLv, int flg, int petid) { int petsel,petindex=-1; for(petsel=0 ; petsel < CHAR_MAXPETHAVE ; petsel++) { petindex = CHAR_getCharPet( talker, petsel); if( petindex == -1 ) continue; if(CHAR_getInt( petindex, CHAR_PETID) != petid ) continue; break; } if( petsel == CHAR_MAXPETHAVE ) { return FALSE; }else { //找到条件宠 if( PetTalk_BigSmallLastCheck( petLv, CHAR_getInt( petindex, CHAR_LV), flg ) == TRUE ) return TRUE; } return FALSE; } BOOL PetTalk_ItemCheck(int meindex,int talker,int itemNo,int flg) { int i; int itemindex=-1; int id; for( i=0;i point1) { return TRUE; } } return FALSE; } #else void PET_Talkfunc( int meindex, int talkerindex, char *msg, int color) { print("\n PET_Talkfunc(...) return; "); return; } #endif void PET_CleanFreePetAll() { int objindex; int objmaxnum = OBJECT_getNum(); for( objindex=0; objindex= (petputtime + 60*60) ) { int ownerindex = CHAR_getWorkInt( petindex, CHAR_WORKPLAYERINDEX); if( CHAR_CHECKINDEX( ownerindex) ){ if( CHAR_pickupFollowPet( ownerindex, petindex ) ) { return; } CHAR_talkToCli( ownerindex, -1, "溜宠太久,宠物走失了!!", CHAR_COLORYELLOW ); } #ifdef _PET_LOSTPET CHAR_CharSaveLostPet( petindex, 1); LogPet( "系统", "Watchfunc", CHAR_getChar( petindex, CHAR_NAME), CHAR_getInt( petindex, CHAR_LV), "timeout_lost(系统扣留-溜宠自由宠)", CHAR_getInt( petindex, CHAR_FLOOR), CHAR_getInt( petindex,CHAR_X ), CHAR_getInt( petindex,CHAR_Y ), CHAR_getChar( petindex, CHAR_UNIQUECODE) // shan 2001/12/14 ); print("系统扣留-溜宠自由宠:%s\n", CHAR_getUseName( petindex)); CHAR_CharaDelete( petindex); #else CHAR_setInt( petindex, CHAR_PUTPETTIME, NowTime.tv_sec); CHAR_setWorkInt( petindex, CHAR_WORKPETFOLLOWMODE, CHAR_PETFOLLOW_NONE); LogPet( CHAR_getChar( pindex, CHAR_NAME ), CHAR_getChar( pindex, CHAR_CDKEY ), CHAR_getChar( petindex, CHAR_NAME), CHAR_getInt( petindex, CHAR_LV), "timeout_lost(溜宠太久,宠物走失))", CHAR_getInt( pindex,CHAR_FLOOR), CHAR_getInt( pindex,CHAR_X ), CHAR_getInt( pindex,CHAR_Y ), CHAR_getChar( petindex, CHAR_UNIQUECODE) // shan 2001/12/14 ); #endif return; } }else{ PET_CHECKFreePetIsIt( petindex); } #ifdef _MARKET_TRADE } #endif if( CHAR_getInt( petindex, CHAR_MAILMODE) == CHAR_PETMAIL_IDLE3 || CHAR_getInt( petindex, CHAR_MAILMODE) == CHAR_PETMAIL_IDLE2){ if( act == CHAR_ACTATTACK) { if( NPC_Util_isFaceToChara( pindex,petindex,1 ) == TRUE ) { int action[2] = { CHAR_ACTDAMAGE, CHAR_ACTGUARD}; CHAR_sendWatchEvent( objmeindex, action[RAND(0,1)], NULL,0,FALSE); CHAR_setWorkInt( petindex, CHAR_WORKACTION, act); } } }else if( CHAR_getInt( petindex, CHAR_MAILMODE) != CHAR_PETMAIL_NONE) { ; }else if( CHAR_getWorkInt( petindex, CHAR_WORKFIXAI) >= 100 ) { int workpindex = CHAR_getWorkInt( petindex, CHAR_WORKPLAYERINDEX); if( act == CHAR_ACTWALK && CHAR_CHECKINDEX( workpindex) && workpindex == pindex ){ dir = NPC_Util_GetDirCharToChar( petindex, pindex, 0); if( dir != -1 ) { if( CHAR_getInt( petindex, CHAR_DIR) != dir ) { CHAR_setInt( petindex, CHAR_DIR, dir); CHAR_sendWatchEvent( CHAR_getWorkInt( petindex, CHAR_WORKOBJINDEX), CHAR_ACTTURN,NULL,0,TRUE); } } }else if( NPC_Util_isFaceToFace( petindex, pindex, 2 ) == TRUE ) { switch( act) { case CHAR_ACTATTACK: case CHAR_ACTDAMAGE: case CHAR_ACTDOWN: case CHAR_ACTSTAND: case CHAR_ACTACTIONWALK: case CHAR_ACTGUARD: case CHAR_ACTACTIONSTAND: CHAR_sendWatchEvent( objmeindex, act, NULL,0,FALSE); CHAR_setWorkInt( petindex, CHAR_WORKACTION, act); break; default: break; } } }else { /* #ifdef _MARKET_TRADE if( CHAR_getWorkInt( petindex, CHAR_WORKTRADETYP) != TRADETYPE_SELL) { #endif if( CHAR_getWorkInt( petindex, CHAR_WORKPETFOLLOWMODE) != CHAR_PETFOLLOW_NOW ){ if( RAND(0,30) == 1 ) { CHAR_walk( petindex,RAND( 0,7),0); } } #ifdef _MARKET_TRADE } #endif */ } return; } #ifdef _PET_TALKBBI BOOL PET_CheckPlayerBBI( int meindex, int charindex, int BBI, int flg) { int MyBBI; if( !CHAR_CHECKINDEX( charindex)) return FALSE; if( BBI < 0 ) return FALSE; MyBBI = CHAR_getInt( charindex, CHAR_BASEIMAGENUMBER); if(flg==0){ if(BBI==MyBBI) return TRUE; }else if(flg==1){ if(BBI < MyBBI) return TRUE; }else if(flg==2){ if(BBI > MyBBI) return TRUE; } return FALSE; } #endif