⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 petmail.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 3 页
字号:
#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;
        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -