#include "version.h" #include #include "configfile.h" #include "buf.h" #include "char_base.h" #include "char.h" #include "battle.h" #include "handletime.h" #include "map_deal.h" #include "addressbook.h" #include "lssproto_serv.h" #include "pet.h" #include "petmail.h" #include "npcutil.h" #include "log.h" #define PETMAIL_BATTLETIMEOUT 660 #define PETMAIL_IDLETIMEOUT 30 #define PETMAIL_IDLETIME 10 #define PETMAIL_IDLE_RETURNOWNER (60*30) //andy_edit //#define PETMAIL_IDLEDISCARD (60*60) //Syu 修正宠邮等待时间为一小时 #define PETMAIL_IDLEDISCARD (60*3) /* petmail 跨星系的等待时间 shan add */ #define PETMAIL_JS_TIMEOUT (2*60) static int PETMAIL_getIdleTime( int index); static void PETMAIL_sendPetmail( int index, int tocharaindex); static void PETMAIL_IdleProc1( int index); static void PETMAIL_IdleProc2( int index); static void PETMAIL_IdleProc3( int index); static void PETMAIL_IdleProc4( int index); static void PETMAIL_IdleProc5( int index); static void PETMAIL_ReturnWait( int index); static void PETMAIL_returnMail( int index, int tocharaindex); static int PETMAIL_offmsg_max; #define PETMAILOFFMSGFILE "petmail.txt" #define PETMAIL_DEFTOTALNUM 1000 static int PetMailTotalnums = 0; BOOL PETMAIL_sendPetMail( int cindex, int aindex, int havepetindex, int haveitemindex, char* text , int color ) { char textbuffer[2048]; struct tm tm1; Char *ch; ADDRESSBOOK_entry *ae; int petindex; int itemindex =-1; int tocharaindex,playernum,i; //判断 人物 宠物 道具 对象名片 if( !CHAR_CHECKINDEX( cindex) )return FALSE; if( haveitemindex != -1 ) { itemindex = CHAR_getItemIndex( cindex, haveitemindex); if( ITEM_CHECKINDEX( itemindex)) { if( ITEM_getInt( itemindex, ITEM_CANPETMAIL) == 0 ) { print( "err? crack?\n"); return FALSE; } if(ITEM_getInt( itemindex, ITEM_TIME)>0){ CHAR_talkToCli( cindex, -1, "限时道具不可邮寄。", CHAR_COLORYELLOW ); return FALSE; } } } petindex = CHAR_getCharPet( cindex, havepetindex); if( petindex == -1 ) return FALSE; ch = CHAR_getCharPointer( petindex); if( ch == NULL ) return FALSE; ae = CHAR_getAddressbookEntry( cindex , aindex ); if( ae == NULL )return FALSE; if (CHAR_getWorkInt( cindex, CHAR_WORKSAFEMODE)==0) { CHAR_SafePassword(cindex); return FALSE; } #ifdef _AVID_TRADETRYBUG //宠物邮件 if( CHAR_getWorkInt( cindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE ){ CHAR_talkToCli( cindex, -1, "交易状态中无法传递宠物邮件。", CHAR_COLORYELLOW ); return FALSE; } #endif //骑乘 if (CHAR_getInt( cindex, CHAR_RIDEPET) == havepetindex ){ CHAR_talkToCli(cindex, -1, "骑乘中的宠物无法传递宠物邮件!", CHAR_COLORYELLOW); return FALSE; } if( CHAR_getWorkInt( cindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE){ CHAR_talkToCli( cindex, -1, "战斗状态中无法传递宠物邮件。", CHAR_COLORYELLOW ); return FALSE; } if (CHAR_getInt(petindex, CHAR_PETFAMILY) == 1){ CHAR_talkToCli(cindex, -1, "家族守护兽无法传递邮件喔!", CHAR_COLORYELLOW); return FALSE; } #ifdef _PETMAIL_LV if(getPetMailCf()==1 && CHAR_getInt(petindex, CHAR_LV)>=getPetMailLv()){ char bufmsg[256]; sprintf(bufmsg,"本线邮寄仅限%d级以下宠物,请勿用珍贵宠物进行邮寄。",getPetMailLv()); CHAR_talkToCli(cindex, -1, bufmsg, CHAR_COLORYELLOW); return FALSE; } #endif // Terry add fix can send mail to offline character 2004/2/5 if(ae->online == 0){ CHAR_talkToCli(cindex, -1, "该玩家不在线上!", CHAR_COLORYELLOW); return FALSE; } playernum = CHAR_getPlayerMaxNum(); for(i = 0;icdkey) == 0 && strcmp(CHAR_getChar(i,CHAR_NAME),ae->charname) == 0 ) break; } if(i == playernum){ CHAR_talkToCli(cindex, -1, "该玩家不在此星球上!", CHAR_COLORYELLOW); return FALSE; } // end #ifdef _MAP_TIME if((CHAR_getInt(cindex,CHAR_FLOOR) >= 30017 && CHAR_getInt(cindex,CHAR_FLOOR) <= 30021)){ char msgbuf[512]; snprintf(msgbuf,sizeof(msgbuf),"此地区不得寄送道具!"); CHAR_talkToCli(cindex,-1,msgbuf,CHAR_COLORWHITE); return FALSE; } if((CHAR_getInt(i,CHAR_FLOOR) >= 30017 && CHAR_getInt(i,CHAR_FLOOR) <= 30021)){ char msgbuf[512]; snprintf(msgbuf,sizeof(msgbuf),"对方所在地区不得收寄送道具!"); CHAR_talkToCli(cindex,-1,msgbuf,CHAR_COLORWHITE); return FALSE; } #endif // Syu Add 2003/05/30 if( ( CHAR_getInt(cindex,CHAR_FLOOR) >= 8200 && CHAR_getInt(cindex,CHAR_FLOOR) <= 8213 ) ) { char msgbuf[512]; snprintf( msgbuf, sizeof( msgbuf), "英雄战场不得寄送道具!"); CHAR_talkToCli( cindex, -1, msgbuf, CHAR_COLORWHITE); return FALSE; } #ifdef _PET_LIMITLEVEL if( CHAR_getInt( petindex, CHAR_LIMITLEVEL) > 0 ) { CHAR_talkToCli(cindex, -1, "特殊宠物不能传递邮件喔!", CHAR_COLORYELLOW); return FALSE; } #endif //如果是被限定的不可以邮寄的道具那么不可以寄 #ifdef _PETITEM__AMOI_E if(ITEM_NOT_MAIL & ITEM_getInt(itemindex, ITEM_TYPEOFITEM)){ char buf[256]; sprintf( buf, "%s是不可以邮寄的哦!~", ITEM_getChar( itemindex, ITEM_NAME) ); CHAR_talkToCli( cindex, -1, buf, CHAR_COLORRED); return FALSE; } #endif #ifdef _PETMAIL_DEFNUMS if( CHAR_getWorkInt( cindex, CHAR_PETMAILNUMS) > 6 ){ CHAR_talkToCli(cindex, -1, "邮件中宠物过多,暂时无法传递宠物邮件!", CHAR_COLORYELLOW); return FALSE; }else if( PETMAIL_CheckIsMyOffmsg( cindex, ae->cdkey, ae->charname) > 10 ){ CHAR_talkToCli(cindex, -1, "收件者目前邮件宠物超过10封,暂时无法传递宠物邮件!", CHAR_COLORYELLOW); return FALSE; }else if( CHAR_getWorkInt( cindex, CHAR_PETMAILSENDTIME) > (int)time( NULL)){ char Mess1[256]; sprintf( Mess1,"需等待%d秒才能再次寄送宠物邮件!", (int)time( NULL) - CHAR_getWorkInt( cindex, CHAR_PETMAILSENDTIME)); CHAR_talkToCli( cindex, -1, Mess1, CHAR_COLORYELLOW); return FALSE; }else if( PetMailTotalnums >= PETMAIL_DEFTOTALNUM ){ CHAR_talkToCli(cindex, -1, "目前系统邮件过多,请稍後再寄。", CHAR_COLORYELLOW); return FALSE; }else{ int nums = CHAR_getWorkInt( cindex, CHAR_PETMAILNUMS); nums ++; CHAR_setWorkInt( cindex, CHAR_PETMAILNUMS, nums); CHAR_setWorkInt( cindex, CHAR_PETMAILSENDTIME, (int)time( NULL)+6); PetMailTotalnums ++; } #endif #ifdef _AVOIDATTACK_IN_PETMAIL_sendPetMail_textToLong if( strlen(text) > 256 ) return FALSE; #endif memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); snprintf( textbuffer, sizeof( textbuffer), "%2d/%02d %2d:%02d|%s", tm1.tm_mon +1, tm1.tm_mday, tm1.tm_hour, tm1.tm_min, text); { int offmsgindex; offmsgindex = PETMAIL_addOffmsg( cindex, ae->cdkey, ae->charname, text, color); if( offmsgindex == -1 ) { print( "offmsg buffer over\n"); return FALSE; } #ifdef _FIX_PETMAIL2 // WON ADD 修正宠邮2 if( !PET_dropPetFLXY( cindex, havepetindex, PETMAIL_SPOOLFLOOR, PETMAIL_SPOOLX,PETMAIL_SPOOLY) ){ CHAR_talkToCli( cindex, -1, "宠物邮件失败", CHAR_COLORYELLOW); return FALSE; } #endif CHAR_setInt( petindex, CHAR_FLOOR, CHAR_getInt( cindex, CHAR_FLOOR)); CHAR_setInt( petindex, CHAR_X, CHAR_getInt( cindex, CHAR_X)); CHAR_setInt( petindex, CHAR_Y, CHAR_getInt( cindex, CHAR_Y)); CHAR_sendPMEToArroundCharacter( cindex, petindex, 0, CHAR_getInt( petindex, CHAR_PETMAILEFFECT)); CHAR_setInt( petindex, CHAR_MAILMODE,CHAR_PETMAIL_IDLE2); CHAR_setInt( petindex, CHAR_LOOPINTERVAL, PETMAIL_LOOPINTERVAL2); strcpysafe( ch->charfunctable[CHAR_LOOPFUNC].string, sizeof( ch->charfunctable[CHAR_LOOPFUNC]), "PETMAIL_Loop"); CHAR_constructFunctable( petindex); CHAR_setInt( petindex, CHAR_PETMAILBUFINDEX, offmsgindex); CHAR_setInt( petindex, CHAR_PETMAILIDLETIME, NowTime.tv_sec); CHAR_setInt( petindex, CHAR_PETMAILFROMFLOOR, CHAR_getInt( cindex, CHAR_FLOOR)); CHAR_setInt( petindex, CHAR_PETMAILFROMX, CHAR_getInt( cindex, CHAR_X)); CHAR_setInt( petindex, CHAR_PETMAILFROMY,CHAR_getInt( cindex, CHAR_Y)); //#ifdef _WON_PET_MAIL_LOG // WON ADD 增加寄宠邮的 LOG // LogPet( // CHAR_getChar( cindex, CHAR_NAME ), // CHAR_getChar( cindex, CHAR_CDKEY ), // CHAR_getChar( petindex, CHAR_NAME), // CHAR_getInt( petindex, CHAR_LV), // "Pet_Send_Mail(寄宠邮)", // CHAR_getInt( cindex,CHAR_FLOOR), // CHAR_getInt( cindex,CHAR_X ), // CHAR_getInt( cindex,CHAR_Y ), // CHAR_getChar( petindex, CHAR_UNIQUECODE) // ); //#endif if( haveitemindex != -1 ) { CHAR_setItemIndex( cindex, haveitemindex, -1); CHAR_setItemIndex( petindex, CHAR_STARTITEMARRAY, itemindex); CHAR_sendItemDataOne( cindex, haveitemindex); LogItem( CHAR_getChar( cindex, CHAR_NAME ), CHAR_getChar( cindex, CHAR_CDKEY ), itemindex, "pm_have(宠邮->寄送的道具)", CHAR_getInt( cindex,CHAR_FLOOR), CHAR_getInt( cindex,CHAR_X ), CHAR_getInt( cindex,CHAR_Y ), ITEM_getChar( itemindex, ITEM_UNIQUECODE), ITEM_getChar( itemindex, ITEM_NAME), ITEM_getInt( itemindex, ITEM_ID) ); } { char token[256]; tocharaindex = PETMAIL_CheckPlayerExist( petindex, 0); sprintf( token, "寄送宠物邮件(%s)给%s。", CHAR_getUseName( petindex), CHAR_getUseName( tocharaindex) ); CHAR_talkToCli( cindex, -1, token, CHAR_COLORYELLOW); } return TRUE; } return FALSE; } static PETMAIL_offmsg * PETMAIL_offmsgbuf; BOOL PETMAIL_initOffmsgBuffer( int count ) { int size = sizeof( PETMAIL_offmsg )*count ; FILE *fp; char filename[256]; char line[2048]; int linenum = 0; PETMAIL_offmsgbuf = (PETMAIL_offmsg*)allocateMemory( size ); if( PETMAIL_offmsgbuf == NULL ) return FALSE; PetMailTotalnums = 0; memset( PETMAIL_offmsgbuf, 0,size ); PETMAIL_offmsg_max = count; snprintf( filename ,sizeof( filename ) ,"%s/%s", getStoredir(), PETMAILOFFMSGFILE); fp = fopen( filename , "rt" ); if( fp == NULL ) return TRUE; while( fgets( line, sizeof( line ), fp ) != NULL ){ char buf[1024]; int index; if( !getStringFromIndexWithDelim( line, "|", 1, buf, sizeof( buf))) { print( "read error line[%d]\n", linenum); continue; } index = atoi( buf); if( index >= PETMAIL_offmsg_max ) { print( "index over offmsg_max [%d]\n", index); continue; } if( PETMAIL_offmsgbuf[index].use == TRUE) { print( "offmsg already use index[%d]\n", index); continue; } if( !getStringFromIndexWithDelim( line, "|", 2, buf, sizeof( buf))) { print( "read error line[%d]\n", linenum); continue; } PETMAIL_offmsgbuf[index].send_tm = atoi( buf); if( !getStringFromIndexWithDelim( line, "|", 3, buf, sizeof( buf))) { print( "read error line[%d]\n", linenum); continue; } PETMAIL_offmsgbuf[index].color = atoi( buf); if( !getStringFromIndexWithDelim( line, "|", 4, buf, sizeof( buf))) { print( "read error line[%d]\n", linenum); continue; } strcpysafe( PETMAIL_offmsgbuf[index].text, sizeof( PETMAIL_offmsgbuf[index].text), buf); if( !getStringFromIndexWithDelim( line, "|", 5, buf, sizeof( buf))) { print( "read error line[%d]\n", linenum); continue; } strcpysafe( PETMAIL_offmsgbuf[index].destcd, sizeof( PETMAIL_offmsgbuf[index].destcd), buf); if( !getStringFromIndexWithDelim( line, "|", 6, buf, sizeof( buf))) { print( "read error line[%d]\n", linenum); continue; } makeStringFromEscaped(buf); strcpysafe( PETMAIL_offmsgbuf[index].destcharname, sizeof( PETMAIL_offmsgbuf[index].destcharname), buf); if( !getStringFromIndexWithDelim( line, "|", 7, buf, sizeof( buf))) { print( "read error line[%d]\n", linenum); continue; } strcpysafe( PETMAIL_offmsgbuf[index].srccd, sizeof( PETMAIL_offmsgbuf[index].srccd), buf); if( !getStringFromIndexWithDelim( line, "|", 8, buf, sizeof( buf))) { print( "read error line[%d]\n", linenum); continue; } makeStringFromEscaped(buf); strcpysafe( PETMAIL_offmsgbuf[index].srccharname, sizeof( PETMAIL_offmsgbuf[index].srccharname), buf); linenum ++; } fclose( fp); return TRUE; } BOOL PETMAIL_addOffmsg( int fromindex, char *tocdkey, char *tocharaname, char *text , int color ) { int i; for( i = 0 ; i < PETMAIL_offmsg_max; i++ ) { if( PETMAIL_offmsgbuf[i].use == 0 ) { PETMAIL_offmsg *om = & PETMAIL_offmsgbuf[i]; om->use = 1; time( & om->send_tm ); strcpysafe( om->srccd , sizeof( om->srccd ), CHAR_getChar( fromindex, CHAR_CDKEY)); strcpysafe( om->srccharname , sizeof( om->srccharname ), CHAR_getChar( fromindex, CHAR_NAME)); strcpysafe( om->destcd , sizeof( om->destcd ), tocdkey ); strcpysafe( om->destcharname , sizeof(om->destcharname), tocharaname); strcpysafe( om->text , sizeof(om->text), text ); om->color = color; return i; } } return -1; } PETMAIL_offmsg *PETMAIL_getOffmsg( int offmsgindex) { if( offmsgindex < 0 || offmsgindex >= PETMAIL_offmsg_max ) return NULL; return &PETMAIL_offmsgbuf[offmsgindex]; } BOOL PETMAIL_deleteOffmsg( int offmsgindex) { if( offmsgindex < 0 || offmsgindex >= PETMAIL_offmsg_max ) return FALSE; PETMAIL_offmsgbuf[offmsgindex].use = FALSE; return TRUE; } void PETMAIL_proc( void ) { int i; static time_t PETMAIL_check_time_store = 0; time_t t; time( &t ); if( t < PETMAIL_check_time_store) return; PETMAIL_check_time_store = t + PETMAIL_CHECK_OFFMSG_EXPIRE_INTERVAL; for(i = 0; i < PETMAIL_offmsg_max ; i++){ if( PETMAIL_offmsgbuf[i].use && PETMAIL_offmsgbuf[i].send_tm < ( t - PETMAIL_OFFMSG_TIMEOUT )){ PETMAIL_offmsgbuf[i].use = FALSE; } } } BOOL storePetmail( void) { FILE *fp; char filename[256]; char escapebuf1[ 64],escapebuf2[ 64]; int i; /* 白央奶伙 毛菲户月 */ snprintf( filename ,sizeof( filename ) ,"%s/%s" , getStoredir(), PETMAILOFFMSGFILE); fp = fopen( filename , "wt" ); if( fp == NULL ) return FALSE; for(i = 0; i < PETMAIL_offmsg_max ; i++){ if( PETMAIL_offmsgbuf[i].use ){ fprintf( fp, "%d|%ud|%d|%s|%s|%s|%s|%s|", i, (unsigned int)PETMAIL_offmsgbuf[i].send_tm, PETMAIL_offmsgbuf[i].color, PETMAIL_offmsgbuf[i].text, PETMAIL_offmsgbuf[i].destcd, makeEscapeString( PETMAIL_offmsgbuf[i].destcharname, escapebuf1, sizeof( escapebuf1)), PETMAIL_offmsgbuf[i].srccd, makeEscapeString( PETMAIL_offmsgbuf[i].srccharname, escapebuf2, sizeof( escapebuf2))); } } fclose( fp); return TRUE; } BOOL PETMAIL_CheckPlayerExist( int index, int mode) { int i; char *searchcd = NULL; char *searchname = NULL; PETMAIL_offmsg *adof; int playernum = CHAR_getPlayerMaxNum(); if( mode == 0 ) { adof = PETMAIL_getOffmsg( CHAR_getInt( index, CHAR_PETMAILBUFINDEX)); if( adof == NULL ) return FALSE; searchcd = adof->destcd; searchname = adof->destcharname; } else if( mode == 1 ) { searchcd = CHAR_getChar( index, CHAR_OWNERCDKEY); searchname = CHAR_getChar( index, CHAR_OWNERCHARANAME); if( searchcd == "\0" || searchname == "\0" ) return FALSE; } for( i = 0 ; i < playernum ; i ++) { if( CHAR_CHECKINDEX( i) && strcmp( CHAR_getChar( i, CHAR_CDKEY), searchcd ) == 0 && strcmp( CHAR_getChar( i, CHAR_NAME), searchname) == 0 ) { return i; } } return -1; } void PETMAIL_Loopfunc( int index) { int mode = CHAR_getInt( index, CHAR_MAILMODE); switch( mode ){ case CHAR_PETMAIL_IDLE1: PETMAIL_IdleProc1( index); break; case CHAR_PETMAIL_IDLE2: PETMAIL_IdleProc2( index); break; case CHAR_PETMAIL_RETURNWAIT://回来等待 PETMAIL_ReturnWait( index); break; case CHAR_PETMAIL_IDLE3: PETMAIL_IdleProc3( index); break; case CHAR_PETMAIL_IDLE4://寻找主人 PETMAIL_IdleProc4( index); break; case CHAR_PETMAIL_IDLE5: //超过时间无法找到主人 PETMAIL_IdleProc5( index); break; default: break; } } static int PETMAIL_getIdleTime( int index) { #define PETMAIL_DIVRANGE 25 // 坌喃允月汹 #define PETMAIL_IDLELEVELRANGE 10 // 坌喃允月 区 #define PETMAIL_IDLEUNITTIME 3 // 棉厥 int d; #ifdef _PETMAIL_TIME int dex; if(getPetMailTime()>0) dex = getPetMailTime(); else dex = CHAR_getWorkInt( index, CHAR_WORKQUICK); #else int dex = CHAR_getWorkInt( index, CHAR_WORKQUICK) ; #endif d = dex / PETMAIL_DIVRANGE; if( d < 0 ) d = 0; if( d > PETMAIL_IDLELEVELRANGE ) d = PETMAIL_IDLELEVELRANGE; d = PETMAIL_IDLELEVELRANGE - d ; return d * PETMAIL_IDLEUNITTIME; #undef PETMAIL_DIVRANGE #undef PETMAIL_IDLELEVELRANGE #undef PETMAIL_IDLEUNITTIME } static void PETMAIL_sendPetmail( int index, int tocharaindex) { int index_to_my_info; int itemindex,ret; index_to_my_info = ADDRESSBOOK_getIndexInAddressbook( tocharaindex, CHAR_getChar( index, CHAR_OWNERCDKEY), CHAR_getChar( index, CHAR_OWNERCHARANAME)); if( index_to_my_info < 0 ) { char msgbuf[512]; snprintf( msgbuf, sizeof( msgbuf), "%s的%s 终於来了!" "由於对方没有您的名片,所以信件被退回了。", CHAR_getChar( index, CHAR_OWNERCHARANAME), CHAR_getUseName( index)); CHAR_talkToCli( tocharaindex, -1, msgbuf, CHAR_COLORWHITE); } //Syu Add 06/16 else if( CHAR_getInt(tocharaindex,CHAR_FLOOR) >=8200 && CHAR_getInt(tocharaindex,CHAR_FLOOR) <= 8213 ){ char msgbuf[512]; snprintf( msgbuf, sizeof( msgbuf), "英雄战场不得寄送道具!" ); CHAR_talkToCli( tocharaindex, -1, msgbuf, CHAR_COLORWHITE); } else { struct tm tm1; char textbuffer[2048]; char escapebuf[128]; int fd; PETMAIL_offmsg *offmsg; itemindex = CHAR_getItemIndex( index, CHAR_STARTITEMARRAY); ret = CHAR_addItemSpecificItemIndex( tocharaindex, itemindex); if( ret < 0 || ret >= CHAR_MAXITEMHAVE){ CHAR_DropItem( index, CHAR_STARTITEMARRAY); LogItem( CHAR_getChar( tocharaindex, CHAR_NAME ), CHAR_getChar( tocharaindex, CHAR_CDKEY ), itemindex, "pm_putground(宠邮->道具栏已满,放置地上)", CHAR_getInt( index,CHAR_FLOOR), CHAR_getInt( index,CHAR_X ), CHAR_getInt( index,CHAR_Y ), ITEM_getChar( itemindex, ITEM_UNIQUECODE), ITEM_getChar( itemindex, ITEM_NAME), ITEM_getInt( itemindex, ITEM_ID) ); } else { CHAR_setItemIndex( index, CHAR_STARTITEMARRAY, -1); CHAR_sendItemDataOne( tocharaindex, ret); LogItem( CHAR_getChar( tocharaindex, CHAR_NAME ), CHAR_getChar( tocharaindex, CHAR_CDKEY ), itemindex, "pm_getitem(宠邮->收到的道具)", CHAR_getInt( index,CHAR_FLOOR), CHAR_getInt( index,CHAR_X ), CHAR_getInt( index,CHAR_Y ), ITEM_getChar( itemindex, ITEM_UNIQUECODE), ITEM_getChar( itemindex, ITEM_NAME), ITEM_getInt( itemindex, ITEM_ID) ); } offmsg = PETMAIL_getOffmsg( CHAR_getInt( index, CHAR_PETMAILBUFINDEX)); memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); snprintf( textbuffer, sizeof( textbuffer), "%2d/%02d %2d:%02d|%s|%d|%d|%s|%d", tm1.tm_mon +1, tm1.tm_mday, tm1.tm_hour, tm1.tm_min, offmsg->text, CHAR_getInt( index, CHAR_BASEIMAGENUMBER), CHAR_getInt( index, CHAR_LV), makeEscapeString( CHAR_getUseName( index), escapebuf, sizeof( escapebuf)), ITEM_getInt( itemindex, ITEM_BASEIMAGENUMBER) ); fd = getfdFromCharaIndex( tocharaindex); if( fd != -1 ) lssproto_MSG_send( fd , index_to_my_info , textbuffer , offmsg->color ); PETMAIL_deleteOffmsg( CHAR_getInt( index, CHAR_PETMAILBUFINDEX)); CHAR_setInt( index, CHAR_PETMAILBUFINDEX, -1); CHAR_setInt( index, CHAR_PETSENDMAILCOUNT, CHAR_getInt( index, CHAR_PETSENDMAILCOUNT) +1); { char *cdkey = CHAR_getChar( index, CHAR_CDKEY); if( cdkey) printl( LOG_TALK, "CDKEY=%s\tTEXT=%s" , cdkey, offmsg->text ); else printl( LOG_TALK, "CDKEY=(null)\tTEXT=%s" , offmsg->text ); } } } static void PETMAIL_IdleProc1( int index) { int tocharaindex; int warp = FALSE; tocharaindex = PETMAIL_CheckPlayerExist( index, 0); if( !CHAR_CHECKINDEX( tocharaindex) ) { warp = TRUE; }else { if( CHAR_getInt( tocharaindex, CHAR_FLOOR) == 8215 ){//客服活动 andy warp = TRUE; }else if( CHAR_getWorkInt( tocharaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE ){//交易中不收邮件 warp = TRUE; }else if( CHAR_getWorkInt( tocharaindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE ){ int battleindex = CHAR_getWorkInt( tocharaindex, CHAR_WORKBATTLEINDEX ); if( !BATTLE_CHECKINDEX( battleindex ) || BattleArray[battleindex].flgTime > 60 ){ warp = TRUE; } }else { int ret; int distance; distance = NPC_Util_CharDistance( tocharaindex, index); if( distance > CHAR_DEFAULTSEESIZ /2 ) { warp = TRUE; }else if( distance > 1 ){ int dir = NPC_Util_GetDirCharToChar( index, tocharaindex, 0); if( dir != -1 ) { dir = NPC_Util_SuberiWalk( index, dir); } if( dir != -1 ) { ret = CHAR_walk( index, dir, 0); if( ret != CHAR_WALKSUCCESSED) { dir = -1; } } if( dir == -1 ) { warp = TRUE; } }else { PETMAIL_sendPetmail( index, tocharaindex); CHAR_setInt( index, CHAR_MAILMODE,CHAR_PETMAIL_RETURNWAIT); CHAR_setInt( index, CHAR_PETMAILIDLETIME, NowTime.tv_sec); CHAR_setInt( index, CHAR_LOOPINTERVAL, PETMAIL_LOOPINTERVAL2); } } } if( warp) { if( CHAR_getInt( index, CHAR_FLOOR) != PETMAIL_SPOOLFLOOR) { CHAR_warpToSpecificPoint( index, PETMAIL_SPOOLFLOOR, PETMAIL_SPOOLX,PETMAIL_SPOOLX); CHAR_setInt( index, CHAR_MAILMODE,CHAR_PETMAIL_IDLE2); CHAR_setInt( index, CHAR_PETMAILIDLETIME, NowTime.tv_sec); CHAR_setInt( index, CHAR_LOOPINTERVAL, PETMAIL_LOOPINTERVAL2); } } } static void PETMAIL_IdleProc2( int index) { unsigned int t = CHAR_getInt( index, CHAR_PETMAILIDLETIME); if( NowTime.tv_sec > t + PETMAIL_getIdleTime( index)) { int tocharaindex; int cnt; tocharaindex = PETMAIL_CheckPlayerExist( index, 0); if( tocharaindex != -1 ) { if( CHAR_getInt( tocharaindex, CHAR_FLOOR) == 8215 ){//客服活动 andy }else if( CHAR_getWorkInt( tocharaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE ){//交易中不收邮件 }else if( CHAR_getWorkInt( tocharaindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE){ }else { int fl, x, y, ch_x, ch_y; fl = CHAR_getInt( tocharaindex, CHAR_FLOOR); ch_x = CHAR_getInt( tocharaindex, CHAR_X); ch_y = CHAR_getInt( tocharaindex, CHAR_Y); for( cnt = 0; cnt < 10; cnt ++ ) { x = RAND( ch_x -1, ch_x + 1); y = RAND( ch_y -1, ch_y + 1); if( MAP_walkAble( tocharaindex, fl,x,y)) { break; } } if( cnt == 10 ) { x = ch_x; y = ch_y; } CHAR_setInt( index, CHAR_MAILMODE,CHAR_PETMAIL_RETURNWAIT); CHAR_setInt( index, CHAR_PETMAILIDLETIME, NowTime.tv_sec); CHAR_warpToSpecificPoint( index,fl, x,y); PETMAIL_sendPetmail( index, tocharaindex); return; } }else{ if( NowTime.tv_sec > t + PETMAIL_IDLETIMEOUT ) { PETMAIL_deleteOffmsg( CHAR_getInt( index, CHAR_PETMAILBUFINDEX)); CHAR_setInt( index, CHAR_MAILMODE, CHAR_PETMAIL_IDLE3); CHAR_setInt( index, CHAR_PETMAILIDLETIME, NowTime.tv_sec); CHAR_setInt( index, CHAR_LOOPINTERVAL, PETMAIL_LOOPINTERVAL1); } return; } if( NowTime.tv_sec > t + PETMAIL_BATTLETIMEOUT ) { PETMAIL_deleteOffmsg( CHAR_getInt( index, CHAR_PETMAILBUFINDEX)); CHAR_setInt( index, CHAR_MAILMODE, CHAR_PETMAIL_IDLE3); CHAR_setInt( index, CHAR_PETMAILIDLETIME, NowTime.tv_sec); CHAR_setInt( index, CHAR_LOOPINTERVAL, PETMAIL_LOOPINTERVAL1); } } } static void PETMAIL_ReturnWait( int index) { unsigned int t = CHAR_getInt( index, CHAR_PETMAILIDLETIME); if( NowTime.tv_sec > t + PETMAIL_IDLETIME) { CHAR_setInt( index, CHAR_MAILMODE, CHAR_PETMAIL_IDLE3); CHAR_setInt( index, CHAR_PETMAILIDLETIME, NowTime.tv_sec); CHAR_setInt( index, CHAR_LOOPINTERVAL, PETMAIL_LOOPINTERVAL1); } } static void PETMAIL_IdleProc3( int index) { int tocharaindex; int warp = FALSE; tocharaindex = PETMAIL_CheckPlayerExist( index, 1); if( tocharaindex == -1 ) { warp = TRUE; }else { if( CHAR_getWorkInt( tocharaindex, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE) { int ret ; int distance; distance = NPC_Util_CharDistance( tocharaindex, index); if( distance > CHAR_DEFAULTSEESIZ /2 ) { warp = TRUE; }else if( distance > 1 ){ int dir = NPC_Util_GetDirCharToChar( index, tocharaindex, 0); if( dir != -1 ) { dir = NPC_Util_SuberiWalk( index, dir); } if( dir != -1 ) { ret = CHAR_walk( index, dir, 0); if( ret != CHAR_WALKSUCCESSED) { dir = -1; } } if( dir == -1 ) { warp = TRUE; } }else { //andy_reEdit 2003/05/30 warp = TRUE; /* CHAR_setInt( index, CHAR_MAILMODE,CHAR_PETMAIL_IDLE5); CHAR_setInt( index, CHAR_PETMAILIDLETIME, NowTime.tv_sec); CHAR_setInt( index, CHAR_LOOPINTERVAL, PETMAIL_LOOPINTERVAL2); PETMAIL_returnMail( index, tocharaindex); */ } } } if( warp) { CHAR_warpToSpecificPoint( index, PETMAIL_SPOOLFLOOR, PETMAIL_SPOOLX,PETMAIL_SPOOLX); CHAR_setInt( index, CHAR_MAILMODE,CHAR_PETMAIL_IDLE4); CHAR_setInt( index, CHAR_PETMAILIDLETIME, NowTime.tv_sec); CHAR_setInt( index, CHAR_LOOPINTERVAL, PETMAIL_LOOPINTERVAL2); } } static void PETMAIL_IdleProc4( int index) { unsigned int t = CHAR_getInt( index, CHAR_PETMAILIDLETIME); { int tocharaindex; int cnt; tocharaindex = PETMAIL_CheckPlayerExist( index, 1);//寻找主人 if( tocharaindex != -1 ) { if( CHAR_getWorkInt( tocharaindex, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_NONE && CHAR_getWorkInt( tocharaindex, CHAR_WORKTRADEMODE) == CHAR_TRADE_FREE ){ int fl, x, y, ch_x, ch_y;//回到主人身边 fl = CHAR_getInt( tocharaindex, CHAR_FLOOR); ch_x = CHAR_getInt( tocharaindex, CHAR_X); ch_y = CHAR_getInt( tocharaindex, CHAR_Y); for( cnt = 0; cnt < 10; cnt ++ ) { x = RAND( ch_x -1, ch_x + 1); y = RAND( ch_y -1, ch_y + 1); if( MAP_walkAble( index, fl,x,y)) { break; } } if( cnt == 10 ) { x = ch_x; y = ch_y; } CHAR_setInt( index, CHAR_MAILMODE,CHAR_PETMAIL_IDLE5); CHAR_setInt( index, CHAR_PETMAILIDLETIME, NowTime.tv_sec); CHAR_warpToSpecificPoint( index,fl, x,y); PETMAIL_returnMail( index, tocharaindex); } }else { if( NowTime.tv_sec > t + PETMAIL_IDLE_RETURNOWNER ) {//检查等待主人时间 int itemindex; CHAR_warpToSpecificPoint( index, //回到原先主人所在座标 CHAR_getInt( index, CHAR_PETMAILFROMFLOOR), CHAR_getInt( index, CHAR_PETMAILFROMX), CHAR_getInt( index, CHAR_PETMAILFROMY)); CHAR_setInt( index, CHAR_MAILMODE, CHAR_PETMAIL_IDLE5);//改变宠邮状态 CHAR_setInt( index, CHAR_LOOPINTERVAL, PETMAIL_LOOPINTERVAL2); CHAR_setInt( index, CHAR_PETMAILIDLETIME, NowTime.tv_sec); if( CHAR_getInt( index, CHAR_PETMAILIDLETIME) != -1 ) { PETMAIL_deleteOffmsg( CHAR_getInt( index, CHAR_PETMAILBUFINDEX)); } itemindex = CHAR_getItemIndex( index, CHAR_STARTITEMARRAY);//删除附带道具 if( ITEM_CHECKINDEX( itemindex ) ) { CHAR_DropItem( index, CHAR_STARTITEMARRAY); LogItem( CHAR_getChar( index, CHAR_OWNERCHARANAME ), CHAR_getChar( index, CHAR_OWNERCDKEY ), itemindex, "pm_returntimeout(宠邮->逾时删除道具)", CHAR_getInt( index,CHAR_FLOOR), CHAR_getInt( index,CHAR_X ), CHAR_getInt( index,CHAR_Y ), ITEM_getChar( itemindex, ITEM_UNIQUECODE), ITEM_getChar( itemindex, ITEM_NAME), ITEM_getInt( itemindex, ITEM_ID) ); } } } } } static void PETMAIL_IdleProc5( int index) { unsigned int t = CHAR_getInt( index, CHAR_PETMAILIDLETIME); if( NowTime.tv_sec > t + PETMAIL_IDLEDISCARD) { Char *ch; CHAR_setInt( index, CHAR_MAILMODE, CHAR_PETMAIL_NONE); CHAR_setInt( index, CHAR_PETMAILIDLETIME, 0); #ifdef _FIX_PETMAIL // WON ADD 修正宠邮 CHAR_setInt( index, CHAR_PUTPETTIME, NowTime.tv_sec ); #endif #ifdef _PETMAIL_DEFNUMS PETMAIL_delPetMailTotalnums( 1); //M PET 变自由宠 if( PetMailTotalnums < 0 ) PetMailTotalnums = 0; #endif ch = CHAR_getCharPointer( index); if( ch != NULL ) { strcpysafe( ch->charfunctable[CHAR_LOOPFUNC].string, sizeof( ch->charfunctable[CHAR_LOOPFUNC]), "" ); CHAR_constructFunctable( index); } #ifdef _PET_LOSTPET CHAR_CharSaveLostPet( index, 2); LogPet( "系统", "Watchfunc", CHAR_getChar( index, CHAR_NAME), CHAR_getInt( index, CHAR_LV), "timeout_lost(系统扣留-宠邮自由宠)", CHAR_getInt( index, CHAR_FLOOR), CHAR_getInt( index,CHAR_X ), CHAR_getInt( index,CHAR_Y ), CHAR_getChar( index, CHAR_UNIQUECODE) // shan 2001/12/14 ); print("系统扣留-宠邮自由宠:%s\n", CHAR_getUseName( index)); CHAR_CharaDelete( index); #else LogPet( CHAR_getChar( index, CHAR_OWNERCHARANAME ), CHAR_getChar( index, CHAR_OWNERCDKEY ), CHAR_getChar( index, CHAR_NAME), CHAR_getInt( index, CHAR_LV), "FreePet(宠邮变回自由宠)", CHAR_getInt( index,CHAR_FLOOR), CHAR_getInt( index,CHAR_X ), CHAR_getInt( index,CHAR_Y ), CHAR_getChar( index, CHAR_UNIQUECODE) ); #endif }else { int tocharaindex = PETMAIL_CheckPlayerExist( index, 1); if( tocharaindex != -1 ) { if( NPC_Util_CharDistance( tocharaindex, index ) > CHAR_DEFAULTSEESIZ/2) { int fl, x, y, ch_x, ch_y; int cnt; fl = CHAR_getInt( tocharaindex, CHAR_FLOOR); ch_x = CHAR_getInt( tocharaindex, CHAR_X); ch_y = CHAR_getInt( tocharaindex, CHAR_Y); for( cnt = 0; cnt < 10; cnt ++ ) { x = RAND( ch_x -1, ch_x + 1); y = RAND( ch_y -1, ch_y + 1); if( MAP_walkAble( index, fl,x,y)) { break; } } if( cnt == 10 ) { x = ch_x; y = ch_y; } CHAR_warpToSpecificPoint( index,fl, x,y); } } } } static void PETMAIL_returnMail( int index, int tocharaindex) { char msgbuf[512]; int itemindex = CHAR_getItemIndex( index, CHAR_STARTITEMARRAY); if( ITEM_CHECKINDEX( itemindex ) ) { int ret = CHAR_addItemSpecificItemIndex( tocharaindex, itemindex); if( ret < 0 || ret >= CHAR_MAXITEMHAVE){ CHAR_DropItem( index, CHAR_STARTITEMARRAY); LogItem( CHAR_getChar( tocharaindex, CHAR_NAME ), CHAR_getChar( tocharaindex, CHAR_CDKEY ), itemindex, "pm_returnputground(宠邮->道具已满将道具放置地上)", CHAR_getInt( index,CHAR_FLOOR), CHAR_getInt( index,CHAR_X ), CHAR_getInt( index,CHAR_Y ), ITEM_getChar( itemindex, ITEM_UNIQUECODE), ITEM_getChar( itemindex, ITEM_NAME), ITEM_getInt( itemindex, ITEM_ID) ); }else { CHAR_setItemIndex( index, CHAR_STARTITEMARRAY, -1); CHAR_sendItemDataOne( tocharaindex, ret); } } #ifdef _PETMAIL_DEFNUMS { int petmailnums = CHAR_getWorkInt( tocharaindex, CHAR_PETMAILNUMS); petmailnums--; if( petmailnums < 0 ) petmailnums = 0; CHAR_setWorkInt( tocharaindex, CHAR_PETMAILNUMS, petmailnums); } #endif if( CHAR_getInt( index, CHAR_PETMAILBUFINDEX) != -1 ) { snprintf( msgbuf, sizeof( msgbuf), "%s 回来了!" "似乎无法寄送信件。", CHAR_getUseName( index)); CHAR_talkToCli( tocharaindex, -1, msgbuf, CHAR_COLORWHITE); PETMAIL_deleteOffmsg( CHAR_getInt( index, CHAR_PETMAILBUFINDEX)); }else { snprintf( msgbuf, sizeof( msgbuf), "%s 回来了!", CHAR_getUseName( index)); CHAR_talkToCli( tocharaindex, -1, msgbuf, CHAR_COLORWHITE); } #ifdef _PETMAIL_DEFNUMS CHAR_AutoPickupMailPet( tocharaindex, index); #endif } #ifdef _PETMAIL_DEFNUMS void CHAR_AutoPickupMailPet( int charaindex, int petindex ) { int objindex; int havepetindex; char category[3]; Char *ch; if( !CHAR_CHECKINDEX( charaindex ) ) return; #ifdef _AVID_TRADETRYBUG //丢出宠物 if( CHAR_getWorkInt( charaindex, CHAR_WORKTRADEMODE) != CHAR_TRADE_FREE ){ CHAR_talkToCli( charaindex, -1, "交易状态中无法自动拾回邮件宠物!", CHAR_COLORYELLOW ); return; } #endif if( !CHAR_CHECKINDEX( petindex ) ) return; havepetindex = CHAR_getCharPetElement( charaindex); if( havepetindex == -1 ) { CHAR_talkToCli(charaindex,-1,"宠物栏已满!无法自动拾回邮件宠物!",CHAR_COLORYELLOW); // WON ADD LogPet( CHAR_getChar( charaindex, CHAR_NAME ), CHAR_getChar( charaindex, CHAR_CDKEY ), CHAR_getChar( petindex, CHAR_NAME), CHAR_getInt( petindex, CHAR_LV), "Pet_Full(宠物栏已满,无法拾起宠物)", CHAR_getInt( charaindex,CHAR_FLOOR), CHAR_getInt( charaindex,CHAR_X ), CHAR_getInt( charaindex,CHAR_Y ), CHAR_getChar( petindex, CHAR_UNIQUECODE) ); return; } ch = CHAR_getCharPointer( petindex); if( ch == NULL ) return; objindex = CHAR_getWorkInt( petindex, CHAR_WORKOBJINDEX ); CHAR_ObjectDelete(objindex); CHAR_setWorkInt( petindex, CHAR_WORKPLAYERINDEX, charaindex); CHAR_setCharPet( charaindex, havepetindex, petindex); CHAR_setChar( petindex, CHAR_OWNERCDKEY, CHAR_getChar( charaindex, CHAR_CDKEY)); CHAR_setChar( petindex, CHAR_OWNERCHARANAME, CHAR_getChar( charaindex, CHAR_NAME)); snprintf( category,sizeof( category),"K%d",havepetindex); CHAR_sendStatusString( charaindex, category); snprintf( category,sizeof( category),"W%d",havepetindex); CHAR_sendStatusString( charaindex, category); CHAR_setInt( petindex, CHAR_PUTPETTIME, 0); CHAR_setWorkInt( petindex, CHAR_WORKOBJINDEX, -1); CHAR_setInt( petindex, CHAR_MAILMODE, CHAR_PETMAIL_NONE); PETMAIL_delPetMailTotalnums( 1); // M PET 自动捡起 strcpysafe( ch->charfunctable[CHAR_LOOPFUNC].string, sizeof( ch->charfunctable[CHAR_LOOPFUNC]),""); CHAR_setInt( petindex, CHAR_LOOPINTERVAL, 0); CHAR_constructFunctable( petindex); CHAR_complianceParameter( petindex ); if( PetMailTotalnums < 0 ) PetMailTotalnums = 0; { char mesg[256]; char *p = NULL; p = CHAR_getChar( petindex, CHAR_USERPETNAME); if( strlen( p) == 0 ) { p = CHAR_getChar( petindex, CHAR_NAME); } snprintf( mesg,sizeof(mesg), "拾回邮件宠物 %s", p); CHAR_talkToCli(charaindex,-1,mesg,CHAR_COLORYELLOW); } // LogPet( // CHAR_getChar( charaindex, CHAR_NAME ), // CHAR_getChar( charaindex, CHAR_CDKEY ), // CHAR_getChar( petindex, CHAR_NAME), // CHAR_getInt( petindex, CHAR_LV), // "PickupMailPet(自动收回邮宠)", // CHAR_getInt( charaindex,CHAR_FLOOR), // CHAR_getInt( charaindex,CHAR_X ), // CHAR_getInt( charaindex,CHAR_Y ), // CHAR_getChar( petindex, CHAR_UNIQUECODE) // ); return; } #endif int PETMAIL_getPetMailTotalnums() { #ifdef _PETMAIL_DEFNUMS if( PetMailTotalnums < 0 ) PetMailTotalnums = 0; if( PetMailTotalnums >= PETMAIL_DEFTOTALNUM ) PetMailTotalnums = PETMAIL_DEFTOTALNUM; return PetMailTotalnums; #else return 0; #endif } void PETMAIL_delPetMailTotalnums( int numflg) { #ifdef _PETMAIL_DEFNUMS PetMailTotalnums = PetMailTotalnums - numflg; if( PetMailTotalnums < 0 ) PetMailTotalnums = 0; #endif } void PETMAIL_setPetMailTotalnums( int numflg) { PetMailTotalnums = numflg; if( PetMailTotalnums < 0 ) PetMailTotalnums = 0; if( PetMailTotalnums > PETMAIL_DEFTOTALNUM+10 ) PetMailTotalnums = PETMAIL_DEFTOTALNUM + 5; } int PETMAIL_CheckIsMyOffmsg( int fromindex, char *tocdkey, char *tocharaname) { int i, nums=0; for( i = 0 ; i < PETMAIL_offmsg_max; i++ ) { if( PETMAIL_offmsgbuf[i].use == 0 ) continue; if( !strcmp( tocdkey, PETMAIL_offmsgbuf[i].destcd) && !strcmp( tocharaname, PETMAIL_offmsgbuf[i].destcharname) ){ nums++; } } return nums; }