📄 addressbook.c
字号:
#define __ADDRESSBOOK_C_#include "version.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <strings.h>#include "addressbook.h"#include "char.h"#include "handletime.h"#include "buf.h"#include "net.h"#include "lssproto_serv.h"#include "saacproto_cli.h"#include "object.h"#include "battle.h"#include "configfile.h"#include "npcutil.h"#include "pet.h"#include "petmail.h"#include "log.h"/*裔烂丢永本□斥及 赢赢今[票匹烂聒允月 侬 及赢今反 仇木动票卞允月仇午*/#define ADDRESSBOOK_FIXEDMESSAGE_MAXLEN 128/* 愤坌及蟆卞簿手中卅井匀凶及匹}失玉伊旦皮永弁卞馨笛匹五卅井匀凶 午五及裔烂丢永本□斥 */#define ADDRESSBOOK_CANTADD "那里没有任何人。"#define ADDRESSBOOK_CANTADD2 "无法交换名片。"/* 簿井毛笛尹月仇午互匹五凶午五}笛尹方丹午仄凶谛卞霜耨允月丢永本□斥*/#define ADDRESSBOOK_ADDED "和%s交换名片 。"/* 簿井卞涌毛创尹日木凶日 */#define ADDRESSBOOK_BEINGADDED "和%s交换名片 。"/* 巨件玄伉互中匀天中分匀凶午五及丢永本□斥 */#define ADDRESSBOOK_MYTABLEFULL "名片匣已满。"/* 锹澎及巨件玄伉互中匀天中分匀凶午五及丢永本□斥 */#define ADDRESSBOOK_HISTABLEFULL "对方的名片匣已满。"/* 丢永本□斥毛霜耨允月及卞岳 仄凶午五 */#define ADDRESSBOOK_SENT "送信给%s 。"/* 丢永本□斥毛霜耨允月及卞撩 仄凶午五 */#define ADDRESSBOOK_UNSENT "无法送信给%s 。"/* 簿井毛创尹方丹午仄凶互}湃卞创尹化中凶 */#define ADDRESSBOOK_ALREADYADDED "已经和%s交换过名片了。 "/* 铜毛域 读卞 丹橇谪 */#define ADDRESSBOOK_GIVEADDRESS "从%s得到名片。"/* 铜毛域 读卞丐仆月橇谪 */#define ADDRESSBOOK_TAKEADDRESS1 "给%s自己的名片。"/* 铜毛域 读卞丐仆月橇谪 */#define ADDRESSBOOK_TAKEADDRESS2 "因为%s想要名片,所以将名片给他了。"#define ADDRESSBOOK_RETURNED1 \"从%s寄来信件,但由於没有%s的名片又将信件退回。"#define ADDRESSBOOK_RETURNED2 \"寄信件给%s,但由於%s 没有名片,所以信件又被退回来了。"#define PETMAIL_RETURNED1 \"%s不在这个世界里,所以无法寄送信件给他。"/* static匹银丹迕[ 五中袄手*/char ADDRESSBOOK_returnstring[25*128];static int ADDRESSBOOK_findBlankEntry( int cindex );static BOOL ADDRESSBOOK_makeEntryFromCharaindex( int charaindex, ADDRESSBOOK_entry* ae);/*------------------------------------------------------------ * 失玉伊旦皮永弁及丢永本□斥毛霜耨允月 * MSG皿夫玄戊伙井日勾井歹木月[ * * 支月仇午反}connection井日cdkey匹腹绸仄化}平乓仿 手 * 甲永玄仄凶日} MSG_send允月[公及午五卞}愤坌及树 互 * 锹澎及伉旦玄卞卅井匀凶日窒手仄卅中午中丹仇午分[ * 娄醒 * cindex int 平乓仿及index * aindex int 失玉伊旦皮永弁及index * text char* 霜耨允月 侬 * color int 缙 * 忒曰袄 * 左件仿奶件及平乓仿卞丢永本□斥毛霜耨仄凶日TRUE , * 左白仿奶件卞瓒 仄凶日FALSE毛井尹允 ------------------------------------------------------------*/BOOL ADDRESSBOOK_sendMessage( int cindex, int aindex, char* text , int color ){ int i ; char tmpmsg[256]; char textbuffer[2048]; char *mycd; char *mycharaname = CHAR_getChar(cindex,CHAR_NAME ); struct tm tm1; ADDRESSBOOK_entry *ae; int playernum = CHAR_getPlayerMaxNum(); if( !CHAR_CHECKINDEX(cindex) )return FALSE; ae = CHAR_getAddressbookEntry( cindex , aindex ); if( ae == NULL )return FALSE; //getcdkeyFromCharaIndex(cindex, mycd,sizeof(mycd) ); mycd = CHAR_getChar( cindex, CHAR_CDKEY); memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1)); snprintf( textbuffer, sizeof( textbuffer), "%2d/%02d %2d:%02d|%s|-1", tm1.tm_mon +1, tm1.tm_mday, tm1.tm_hour, tm1.tm_min, text); /* 扔□田□ 卞中月凛 */ 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 ) { /* * CDKEY 手 平乓仿 手域谯仄凶[公及平乓仿弁正及 * 失玉伊旦皮永弁卞愤坌及树 互丐月井譬屯化} * 绣箕仄凶日}MSG允月[ */ int index_to_my_info = ADDRESSBOOK_getIndexInAddressbook( i , mycd, mycharaname); int fd; if( index_to_my_info < 0 ){ /* * 锹澎互愤坌毛坫壅仄化仄引匀化月[ * 域杀 谛卞]丢□伙互 凶午分仃骚襞允月[ */ //snprintf( tmpmsg, sizeof( tmpmsg), // ADDRESSBOOK_RETURNED1, // ae->charname // ); //CHAR_talkToCli( CONNECT_getCharaindex(i), -1, // tmpmsg , CHAR_COLORYELLOW ); snprintf( tmpmsg, sizeof( tmpmsg), ADDRESSBOOK_RETURNED2, CHAR_getChar( i, CHAR_NAME), CHAR_getChar( i, CHAR_NAME)); /* 霜曰潜卞手丢永本□斥 */ CHAR_talkToCli( cindex, -1, tmpmsg , CHAR_COLORYELLOW ); return FALSE; } fd = getfdFromCharaIndex( i); if( fd != -1 ) { lssproto_MSG_send( fd , index_to_my_info , textbuffer , color ); /* 夫弘午曰 */ printl( LOG_TALK, "CD=%s\tNM=%s\tT=%s" , mycd, mycharaname, textbuffer ); } snprintf( tmpmsg , sizeof( tmpmsg),ADDRESSBOOK_SENT, ae->charname ); CHAR_talkToCli(cindex,-1, tmpmsg , color ); // WON ADD 修正snprintf会导致当机的bug { char tmp[1000]; sprintf( tmp , "ADDRESSBOOK_sendMessage:" "Send MSG to: %s %s\n", ae->cdkey , ae->charname ); // print( tmp ); } CHAR_setInt( cindex, CHAR_SENDMAILCOUNT, CHAR_getInt( cindex, CHAR_SENDMAILCOUNT)+1); return TRUE; } } /* 苇勾井日卅井匀凶凛反]失市它件玄扔□田□卞霜月 */ saacproto_Message_send( acfd, mycd, mycharaname, ae->cdkey, ae->charname, textbuffer, color); CHAR_setInt( cindex, CHAR_SENDMAILCOUNT, CHAR_getInt( cindex, CHAR_SENDMAILCOUNT)+1); snprintf( tmpmsg , sizeof( tmpmsg),ADDRESSBOOK_SENT,ae->charname ); CHAR_talkToCli( cindex,-1, tmpmsg , CHAR_COLORWHITE ); return FALSE;}/*------------------------------------------------------------ * 失玉伊旦皮永弁及丢永本□斥毛霜耨允月 * saac 井日msg 毛熬仃午匀化弁仿奶失件玄卞禾旦玄允月[ * * 忒曰袄 ------------------------------------------------------------*/BOOL ADDRESSBOOK_sendMessage_FromOther( char *fromcdkey, char *fromcharaname, char *tocdkey, char *tocharaname, char* text , int color ){#define ADDRESSBOOK_SYSTEM "system" int i ; char tmpmsg[256]; int playernum = CHAR_getPlayerMaxNum(); /* 扔□田□ 毛腹绸允月 */ for( i = 0 ; i < playernum ; i ++){ if( CHAR_CHECKINDEX( i) && strcmp( CHAR_getChar( i, CHAR_CDKEY), tocdkey) == 0 && strcmp( CHAR_getChar( i, CHAR_NAME), tocharaname) == 0) { int index_to_my_info; /* * CDKEY 手 平乓仿 手域谯仄凶[公及平乓仿弁正及 * 失玉伊旦皮永弁卞愤坌及树 互丐月井譬屯化} * 绣箕仄凶日}MSG允月[ */ /* 扑旦 丞丢永本□斥互窖匀化五凶 */ if( strcmp( fromcdkey, ADDRESSBOOK_SYSTEM) == 0 && strcmp( fromcharaname, ADDRESSBOOK_SYSTEM ) == 0 ) { /* 扑旦 丞丢永本□斥毛龚仁 */ CHAR_talkToCli( i, -1, text , color ); break; } index_to_my_info = ADDRESSBOOK_getIndexInAddressbook( i , fromcdkey, fromcharaname); if( index_to_my_info < 0 ){ /* * 锹澎互愤坌毛坫壅仄化仄引匀化月[ */ snprintf( tmpmsg, sizeof( tmpmsg), ADDRESSBOOK_RETURNED2, tocharaname, tocharaname); /* 霜曰潜卞手丢永本□斥 */ saacproto_Message_send( acfd, ADDRESSBOOK_SYSTEM , ADDRESSBOOK_SYSTEM, fromcdkey, fromcharaname, tmpmsg, CHAR_COLORYELLOW); } else { int fd = getfdFromCharaIndex( i); if( fd != -1 ) { lssproto_MSG_send( fd , index_to_my_info , text , color ); /* 夫弘午曰 */ printl( LOG_TALK, "CD=%s\tNM=%s\tT=%s" , fromcdkey, fromcharaname, text ); } } break; } } if( i == playernum ) return FALSE; return TRUE;}int ADDRESSBOOK_getIndexInAddressbook(int cindex , char *cdkey, char *charname){ int i ; if( !CHAR_CHECKINDEX( cindex ) ) return -1; for( i = 0 ; i < ADDRESSBOOK_MAX ; i++){ ADDRESSBOOK_entry *ae = CHAR_getAddressbookEntry( cindex , i ); if( ae && ae->use && strcmp( ae->cdkey, cdkey )==0 && strcmp( ae->charname , charname ) == 0 ){ return i; } } return -1;}BOOL ADDRESSBOOK_deleteEntry( int meindex ,int index ){ ADDRESSBOOK_entry ent; BOOL ret; if( !CHAR_CHECKINDEX( meindex ) ) return FALSE; memset( &ent ,0, sizeof( ADDRESSBOOK_entry )); ret = CHAR_setAddressbookEntry( meindex , index , &ent ); if( ret == TRUE ){ ADDRESSBOOK_sendAddressbookTable( meindex ); return TRUE; } return FALSE;}BOOL ADDRESSBOOK_addEntry( int meindex ){ int objbuf[20]; int found_count; int front_x , front_y; int i; int cnt = 0; int fd; char *mycd , *tocd; BOOL found = FALSE; if( !CHAR_CHECKINDEX( meindex ) )return FALSE; fd = getfdFromCharaIndex( meindex); if( fd == -1 ) return FALSE; if( ADDRESSBOOK_findBlankEntry( meindex ) < 0) { CHAR_talkToCli( meindex , -1,ADDRESSBOOK_MYTABLEFULL,CHAR_COLORWHITE ); return FALSE; } for( i = 0; i < CONNECT_WINDOWBUFSIZE; i ++ ) { CONNECT_setTradecardcharaindex( fd,i,-1); } CHAR_getCoordinationDir( CHAR_getInt( meindex, CHAR_DIR ) , CHAR_getInt( meindex , CHAR_X ), CHAR_getInt( meindex , CHAR_Y ) , 1 , &front_x , &front_y ); found_count = CHAR_getSameCoordinateObjects( objbuf, arraysizeof( objbuf), CHAR_getInt(meindex,CHAR_FLOOR), front_x,front_y ); if( found_count == 0 ){ CHAR_talkToCli( meindex, -1, ADDRESSBOOK_CANTADD, CHAR_COLORWHITE); return FALSE; } for( i = 0 ; i < found_count; i++ ){ int objindex = objbuf[i]; int index = OBJECT_getIndex( objindex); if( OBJECT_getType(objindex) != OBJTYPE_CHARA ) { continue; } if( CHAR_getInt( index,CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ){ continue; } if( index == meindex ) { continue; } found = TRUE; if( CHAR_getWorkInt( index, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) { continue; } if(!CHAR_getFlg( index, CHAR_ISTRADECARD)) { continue; } if( ADDRESSBOOK_findBlankEntry( index ) < 0 ) { continue; } tocd = CHAR_getChar( index, CHAR_CDKEY); mycd = CHAR_getChar( meindex, CHAR_CDKEY); if( ADDRESSBOOK_getIndexInAddressbook( meindex, tocd, CHAR_getChar( index, CHAR_NAME)) >= 0 && ADDRESSBOOK_getIndexInAddressbook( index, mycd, CHAR_getChar(meindex, CHAR_NAME) ) >= 0 ) { continue; } CONNECT_setTradecardcharaindex( fd,cnt,index); cnt ++; if( cnt == CONNECT_WINDOWBUFSIZE ) break; } if( cnt == 0 ) { if( found ) { CHAR_talkToCli( meindex, -1, ADDRESSBOOK_CANTADD2, CHAR_COLORWHITE); }else { CHAR_talkToCli( meindex, -1, ADDRESSBOOK_CANTADD, CHAR_COLORWHITE); } return FALSE; } if( cnt == 1 ) { ADDRESSBOOK_addAddressBook( meindex, CONNECT_getTradecardcharaindex(fd,0) ); return TRUE; }else if( cnt > 1 ) { int strlength; char msgbuf[1024]; char escapebuf[2048]; strcpy( msgbuf, "1\n和谁交换名片呢?\n"); strlength = strlen( msgbuf); for( i = 0; CONNECT_getTradecardcharaindex(fd,i) != -1 && i< CONNECT_WINDOWBUFSIZE; i ++ ){ char *a = CHAR_getChar( CONNECT_getTradecardcharaindex(fd,i), CHAR_NAME); char buf[256]; snprintf( buf, sizeof( buf),"%s\n", a); if( strlength + strlen( buf) > arraysizeof( msgbuf)){ print( "%s:%d视窗讯息buffer不足。\n", __FILE__,__LINE__); break; } strcpy( &msgbuf[strlength], buf); strlength += strlen(buf); } lssproto_WN_send( fd, WINDOW_MESSAGETYPE_SELECT, WINDOW_BUTTONTYPE_CANCEL, CHAR_WINDOWTYPE_SELECTTRADECARD, -1, makeEscapeString( msgbuf, escapebuf, sizeof(escapebuf))); return TRUE; } return FALSE;}static int ADDRESSBOOK_findBlankEntry( int cindex ){ int i; if( CHAR_CHECKINDEX( cindex ) == FALSE )return -1; for( i=0 ; i<ADDRESSBOOK_MAX-1 ; i++){ ADDRESSBOOK_entry *ae; ae = CHAR_getAddressbookEntry( cindex , i ); if( ae && ae->use == FALSE ) { return i; } } return -1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -