📄 petmail.c
字号:
}
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -