StoneAge/gmsv/char/petmail.c
2018-08-07 00:51:35 -07:00

1126 lines
36 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "version.h"
#include <stdio.h>
#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;
}
}
}
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;
#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;
}
// 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;i<playernum;i++){
if(CHAR_CHECKINDEX(i) &&
strcmp(CHAR_getChar(i,CHAR_CDKEY),ae->cdkey) == 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
#ifdef _BAD_PLAYER // WON ADD 送坏玩家去关
if( CHAR_getInt(cindex,CHAR_FLOOR)==887 ){
char msgbuf[512];
snprintf( msgbuf, sizeof( msgbuf), "对不起,您在招待室中,无法寄送信件。");
CHAR_talkToCli( cindex, -1, msgbuf, CHAR_COLORWHITE);
return FALSE;
}
#endif
#ifdef _DEATH_FAMILY_GM_COMMAND // WON ADD 家族战GM指令
{
char msgbuf[512];
snprintf( msgbuf, sizeof( msgbuf), "跨星系家族PK无法寄送信件。");
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 _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) > 5 ){
CHAR_talkToCli(cindex, -1, "收件者目前邮件宠物超过5封暂时无法传递宠物邮件", 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
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 == NULL || searchname == NULL ) 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;
int dex = CHAR_getWorkInt( index, CHAR_WORKQUICK) ;
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));
#ifdef _DEATH_FAMILY_GM_COMMAND // WON ADD 家族战GM指令
{
char msgbuf[512];
snprintf( msgbuf, sizeof( msgbuf), "跨星系家族PK无法寄送信件。");
CHAR_talkToCli( index, -1, msgbuf, CHAR_COLORWHITE);
return ;
}
#endif
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);
}
#ifdef _BAD_PLAYER // WON ADD 送坏玩家去关
else if( CHAR_getInt(tocharaindex,CHAR_FLOOR)==887 ){
char msgbuf[512];
snprintf( msgbuf, sizeof( msgbuf),
"由於您在招待室中,无法接收信件,所以信件被退回了。" );
CHAR_talkToCli( tocharaindex, -1, msgbuf, CHAR_COLORWHITE);
}
#endif
//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;
}