?? petmail.c
字號:
#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 + -