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

📄 npc_fmdengon.c

📁 石器时代2.0完整版源代码.已经加入新功能. 在REDHAT9下GCC3.4编译成功.
💻 C
📖 第 1 页 / 共 4 页
字号:
#include "version.h"#include <time.h>#include <string.h>#include "char.h"#include "object.h"#include "lssproto_serv.h"#include "saacproto_cli.h"#include "npcutil.h"#include "handletime.h"#include "npc_fmdengon.h"#include "family.h"#define DENGONFILELINENUM      35     // 整个公布栏的资料笔数#define FMSDENGONFILELINENUM   140    // 家族间的留言板资料笔数#define DENGONFILEENTRYSIZE    128    // 本文大小#define MESSAGEINONEWINDOW     7      // 每页所显示的笔数#define FMMAXNUM               1000   // 家族数量的最大值#define FM_MEMBERLIST          2      // 家族成员列表    (主功能表的按键)#define FM_MEMBERMEMO          3      // 家族留言        (主功能表的按键)#define FM_FMMEMO              4      // 家族之间留言板  (主功能表的按键)#define FM_FMPOINT             5      // 申请家族据点    (主功能表的按键)#define FM_FMDPTOP             6      // 家族间强者表    (主功能表的按键)#define FM_WAITTIME            (3*60)#define FMSDENGON_SN           10000  // 家族之间的留言板的识别码extern struct  FMMEMBER_LIST memberlist[FMMAXNUM];         // 接收 AC 成员列表资料的 ARRAY extern struct  FMS_MEMO fmsmemo;                           // 家族之间的留言板extern struct  FM_POINTLIST fmpointlist;                   // 家族据点extern struct  FMS_DPTOP fmdptop;                          // 家族强者表extern int leaderdengonindex;                              // 777 家族公布栏 indexchar NPC_sendbuf[DENGONFILEENTRYSIZE*MESSAGEINONEWINDOW];  // 一整页的大小char enlistbuf[4096];                                        // 家族成员召募 BUF(显示用的)unsigned long READTIME1 = 0,              READTIME2 = 0,              READTIME3 = 0,              READTIME4 = 0;#ifdef _FIX_FM_FMPOINTvoid ApplyFamilyPoint( int meindex, int toindex, int select);#endif// 公布栏的初始化(when gmsv start)BOOL NPC_FmDengonInit( int meindex){    int fmindex=CHAR_getInt(meindex, CHAR_FMINDEX);    CHAR_setInt( meindex, CHAR_WHICHTYPE, CHAR_TYPEDENGON);    if(fmindex>0){	    	    //    if( CHAR_getInt(meindex, CHAR_FLOOR) == 777 ){//        leaderdengonindex = meindex;//    }	    	    if( READTIME1 == 0 || READTIME2 == 0 || READTIME3 == 0 || READTIME4 == 0 ){	        READTIME1 = NowTime.tv_sec+FM_WAITTIME,	        READTIME2 = NowTime.tv_sec+FM_WAITTIME,	        READTIME3 = NowTime.tv_sec+FM_WAITTIME,	        READTIME4 = NowTime.tv_sec+FM_WAITTIME;	       	        // 取得家族的成员列表(memberlist struct),以及家族的留言板	        saacproto_ACShowMemberList_send( acfd, fmindex);	        saacproto_ACFMReadMemo_send( acfd, fmindex);	        // 家族之间的留言板所传的值预设为 FMSDENGON_SN	        saacproto_ACFMReadMemo_send( acfd, FMSDENGON_SN);	        saacproto_ACFMPointList_send(acfd);	        saacproto_ACShowTopFMList_send(acfd, FM_TOP_INTEGRATE);	        saacproto_ACShowTopFMList_send(acfd, FM_TOP_ADV);    	        saacproto_ACShowTopFMList_send(acfd, FM_TOP_FEED);	        saacproto_ACShowTopFMList_send(acfd, FM_TOP_SYNTHESIZE);	        saacproto_ACShowTopFMList_send(acfd, FM_TOP_DEALFOOD);	        saacproto_ACShowTopFMList_send(acfd, FM_TOP_PK);	    }	    	 }	 return TRUE;}// Select Eventvoid NPC_FmDengonWindowTalked( int index, int talker, int seqno, int select, char *data){//    char buf[DENGONFILEENTRYSIZE*MESSAGEINONEWINDOW*2];    char buf[4096];    int  buttonevent;    int  buttontype = 0;    struct timeval recvtime;    if (!CHAR_CHECKINDEX(talker)) return;        CONNECT_getLastrecvtime_D( getfdFromCharaIndex( talker), &recvtime);    if( time_diff( NowTime, recvtime) < 0.5 ){        return;    }        CONNECT_setLastrecvtime_D( getfdFromCharaIndex( talker), &NowTime);#ifndef _FM_MODIFY    // 距离超出 DENGONDISTANCE 的  围内时,即取消动作#define DENGONDISTANCE 3	    if( CHAR_getInt(index, CHAR_FLOOR) != 777 )        if(NPC_Util_CharDistance( index, talker) > DENGONDISTANCE) return;#endif        // 家族留言板    if( seqno == CHAR_WINDOWTYPE_FM_DENGON)    {			int dengonindex;			int fmindex_wk;			char tmp_buffer[4096],tmp[4096];						getStringFromIndexWithDelim(data,"|",1,tmp_buffer,sizeof(tmp_buffer));			dengonindex = atoi(tmp_buffer);						fmindex_wk = CHAR_getWorkInt( talker, CHAR_WORKFMINDEXI);						if( fmindex_wk < 0 || fmindex_wk >= FMMAXNUM) return;						switch( select){			case WINDOW_BUTTONTYPE_NEXT:			case WINDOW_BUTTONTYPE_PREV:				{					int fd,i;					fd = getfdFromCharaIndex( talker);					if( fd == -1) return;										dengonindex += 7 * (( select == WINDOW_BUTTONTYPE_NEXT) ? 1 : -1);					if( dengonindex > memberlist[fmindex_wk].memoindex && memberlist[fmindex_wk].memonum < DENGONFILELINENUM)						dengonindex = memberlist[fmindex_wk].memoindex;					else if( dengonindex < 6 && memberlist[fmindex_wk].memonum < DENGONFILELINENUM) 						dengonindex = 6;					else if( dengonindex < 1 && memberlist[fmindex_wk].memonum >= DENGONFILELINENUM)						dengonindex = memberlist[fmindex_wk].memonum+dengonindex;					else if( dengonindex > memberlist[fmindex_wk].memonum && memberlist[fmindex_wk].memonum >= DENGONFILELINENUM)						dengonindex -= memberlist[fmindex_wk].memonum;										buttontype = WINDOW_BUTTONTYPE_OKCANCEL;					if( dengonindex==memberlist[fmindex_wk].memoindex && memberlist[fmindex_wk].memonum >= DENGONFILELINENUM) 						buttontype |= WINDOW_BUTTONTYPE_PREV;					else if( (dengonindex - 7)<=memberlist[fmindex_wk].memoindex && (dengonindex - 7)>=(memberlist[fmindex_wk].memoindex - 7) &&						memberlist[fmindex_wk].memonum >= DENGONFILELINENUM) 						buttontype |= WINDOW_BUTTONTYPE_NEXT;					else if( dengonindex==memberlist[fmindex_wk].memoindex) 						buttontype |= WINDOW_BUTTONTYPE_PREV;    					else if( dengonindex == 6) buttontype |= WINDOW_BUTTONTYPE_NEXT;					else{						buttontype |= WINDOW_BUTTONTYPE_PREV;						buttontype |= WINDOW_BUTTONTYPE_NEXT;					}					if(dengonindex >= 6){						strcpy( NPC_sendbuf, memberlist[fmindex_wk].memo[dengonindex - 6]);						strcat( NPC_sendbuf, "\n");						for( i=(dengonindex - 5); i<=dengonindex; i++){							strcat( NPC_sendbuf, memberlist[fmindex_wk].memo[i]);							strcat( NPC_sendbuf, "\n");						}						sprintf(tmp, "%d\n", dengonindex);						strcat( NPC_sendbuf, tmp);					}					if(dengonindex < 6){						strcpy( NPC_sendbuf, memberlist[fmindex_wk].memo[memberlist[fmindex_wk].memonum+(dengonindex - 6)]);						strcat( NPC_sendbuf, "\n");						for( i=memberlist[fmindex_wk].memonum+(dengonindex - 5); i<memberlist[fmindex_wk].memonum; i++){							strcat( NPC_sendbuf, memberlist[fmindex_wk].memo[i]);							strcat( NPC_sendbuf, "\n");						}						for( i=0; i<=dengonindex; i++){							strcat( NPC_sendbuf, memberlist[fmindex_wk].memo[i]);							strcat( NPC_sendbuf, "\n");						}						sprintf(tmp, "%d\n", dengonindex);						strcat( NPC_sendbuf, tmp);					}										lssproto_WN_send( fd, WINDOW_FMMESSAGETYPE_DENGON,						buttontype,						CHAR_WINDOWTYPE_FM_DENGON,#ifndef _FM_MODIFY						CHAR_getWorkInt( index, CHAR_WORKOBJINDEX),#else						-1,#endif						makeEscapeString( NPC_sendbuf, buf, sizeof(buf)));				}				break;			case WINDOW_BUTTONTYPE_OK:				{					int    fd,i;					struct tm tm1;					char   m_buf[4096];										fd = getfdFromCharaIndex( talker);					if( fd == -1 ) return;					if( strlen(data) == 0 ) break;										memberlist[fmindex_wk].memonum++;					if( memberlist[fmindex_wk].memonum > DENGONFILELINENUM) 						memberlist[fmindex_wk].memonum = DENGONFILELINENUM;										memberlist[fmindex_wk].memoindex++;					if( memberlist[fmindex_wk].memoindex >= DENGONFILELINENUM) 						memberlist[fmindex_wk].memoindex=0;										dengonindex = memberlist[fmindex_wk].memoindex;										if( dengonindex < 6 && memberlist[fmindex_wk].memonum<DENGONFILELINENUM)						dengonindex = 6;										memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof(struct tm));					getStringFromIndexWithDelim(data,"|",2,tmp_buffer,sizeof(tmp_buffer));					sprintf( m_buf,"%s|%2d/%02d %2d:%02d %s",						tmp_buffer,						tm1.tm_mon +1, tm1.tm_mday, tm1.tm_hour, tm1.tm_min,						CHAR_getChar( talker, CHAR_NAME));					strcpy(memberlist[fmindex_wk].memo[memberlist[fmindex_wk].memoindex], m_buf);										// send acsv 					saacproto_ACFMWriteMemo_send( acfd, CHAR_getChar( talker, CHAR_FMNAME), 						CHAR_getInt(talker, CHAR_FMINDEX),						makeEscapeString( memberlist[fmindex_wk].memo[memberlist[fmindex_wk].memoindex], buf, sizeof(buf)),						fmindex_wk);										if( dengonindex >= 6){						strcpy( NPC_sendbuf, memberlist[fmindex_wk].memo[dengonindex - 6]);						strcat( NPC_sendbuf, "\n");						for( i=(dengonindex-5); i<=dengonindex; i++){							strcat( NPC_sendbuf, memberlist[fmindex_wk].memo[i]);							strcat( NPC_sendbuf, "\n");						}						sprintf(tmp, "%d\n", dengonindex);						strcat( NPC_sendbuf, tmp);					}					if( dengonindex < 6){						strcpy( NPC_sendbuf, memberlist[fmindex_wk].memo[memberlist[fmindex_wk].memonum+(dengonindex - 6)]);						strcat( NPC_sendbuf, "\n");						for( i=memberlist[fmindex_wk].memonum+(dengonindex - 5); i<memberlist[fmindex_wk].memonum; i++){							strcat( NPC_sendbuf, memberlist[fmindex_wk].memo[i]);							strcat( NPC_sendbuf, "\n");						}						for( i=0; i<=dengonindex; i++){							strcat( NPC_sendbuf, memberlist[fmindex_wk].memo[i]);							strcat( NPC_sendbuf, "\n");						}						sprintf(tmp, "%d\n", dengonindex);						strcat( NPC_sendbuf, tmp);					}					lssproto_WN_send( fd, WINDOW_FMMESSAGETYPE_DENGON,						WINDOW_BUTTONTYPE_OKCANCEL|						WINDOW_BUTTONTYPE_PREV,						CHAR_WINDOWTYPE_FM_DENGON,#ifndef _FM_MODIFY						CHAR_getWorkInt( index, CHAR_WORKOBJINDEX),#else						-1,#endif						makeEscapeString( NPC_sendbuf, buf, sizeof(buf)));				}				break;			default:				break;      }  // Switch End    }  // If End            // 家族之间留言板    else if(seqno == CHAR_WINDOWTYPE_FM_FMSDENGON)    {			int dengonindex;			char tmp_buffer[4096],tmp[4096];			getStringFromIndexWithDelim(data,"|",1,tmp_buffer,sizeof(tmp_buffer));			dengonindex = atoi(tmp_buffer);						switch( select ){			case WINDOW_BUTTONTYPE_NEXT:			case WINDOW_BUTTONTYPE_PREV:				{					int fd,i;					fd = getfdFromCharaIndex( talker);					if( fd == -1 ) return;										dengonindex += 7 * (( select == WINDOW_BUTTONTYPE_NEXT) ? 1 : -1);					if( dengonindex > fmsmemo.memoindex && fmsmemo.memonum < FMSDENGONFILELINENUM)						dengonindex = fmsmemo.memoindex;					else if( dengonindex < 6 && fmsmemo.memonum < FMSDENGONFILELINENUM) 						dengonindex = 6;					else if( dengonindex < 1 && fmsmemo.memonum >= FMSDENGONFILELINENUM)						dengonindex = fmsmemo.memonum+dengonindex;					else if( dengonindex > fmsmemo.memonum && fmsmemo.memonum >= FMSDENGONFILELINENUM)						dengonindex -= fmsmemo.memonum;										buttontype = WINDOW_BUTTONTYPE_OKCANCEL;					if( dengonindex==fmsmemo.memoindex && fmsmemo.memonum >= FMSDENGONFILELINENUM) 						buttontype |= WINDOW_BUTTONTYPE_PREV;					else if( (dengonindex-7)<=fmsmemo.memoindex && (dengonindex - 7)>=(fmsmemo.memoindex - 7) &&						fmsmemo.memonum >= FMSDENGONFILELINENUM) 						buttontype |= WINDOW_BUTTONTYPE_NEXT;					else if( dengonindex == fmsmemo.memoindex) 						buttontype |= WINDOW_BUTTONTYPE_PREV;    					else if( dengonindex == 6 ) 						buttontype |= WINDOW_BUTTONTYPE_NEXT;					else{						buttontype |= WINDOW_BUTTONTYPE_PREV;						buttontype |= WINDOW_BUTTONTYPE_NEXT;					}										if( dengonindex >= 6 ){						if( (dengonindex - 6)  >= 140 ) return;						strcpy( NPC_sendbuf, fmsmemo.memo[dengonindex - 6]);						strcat( NPC_sendbuf, "\n");						for( i=(dengonindex - 5); i<=dengonindex; i++){							strcat( NPC_sendbuf, fmsmemo.memo[i]);							strcat( NPC_sendbuf, "\n");						}						sprintf(tmp, "%d\n", dengonindex);						strcat( NPC_sendbuf, tmp);					}					if(dengonindex < 6){						if( (fmsmemo.memonum+(dengonindex - 6))  >= 140 ||							(fmsmemo.memonum+(dengonindex - 6))  < 0 ) return;												strcpy( NPC_sendbuf, fmsmemo.memo[fmsmemo.memonum+(dengonindex - 6)]);												strcat( NPC_sendbuf, "\n");						for( i=fmsmemo.memonum+(dengonindex - 5); i<fmsmemo.memonum; i++){							strcat( NPC_sendbuf, fmsmemo.memo[i]);							strcat( NPC_sendbuf, "\n");						}						for( i=0; i<=dengonindex; i++){							strcat( NPC_sendbuf, fmsmemo.memo[i]);							strcat( NPC_sendbuf, "\n");						}						sprintf(tmp, "%d\n", dengonindex);						strcat( NPC_sendbuf, tmp);					}					lssproto_WN_send( fd, WINDOW_FMMESSAGETYPE_FMSDENGON,						buttontype,						CHAR_WINDOWTYPE_FM_FMSDENGON,#ifndef _FM_MODIFY						CHAR_getWorkInt( index, CHAR_WORKOBJINDEX),#else						-1,#endif						makeEscapeString( NPC_sendbuf, buf, sizeof(buf)));				}				break;			case WINDOW_BUTTONTYPE_OK:				{					int    fd,i;					struct tm tm1;					char   m_buf[4096];										fd = getfdFromCharaIndex( talker );					if( fd == -1 )  return;					#ifdef _FMVER21  					if( CHAR_getInt( talker, CHAR_FMLEADERFLAG) != FMMEMBER_LEADER){              #else					if( CHAR_getInt( talker, CHAR_FMLEADERFLAG) != 1){              #endif              							sprintf( NPC_sendbuf, "              『警       告』\n 抱歉!你不是族长,所以仅能查看。");							lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,								WINDOW_BUTTONTYPE_OK,								-1,								-1,								makeEscapeString( NPC_sendbuf, buf, sizeof(buf)));							return;						}												if( strlen( data) == 0 )  break;												fmsmemo.memonum++;						if( fmsmemo.memonum > FMSDENGONFILELINENUM) 							fmsmemo.memonum = FMSDENGONFILELINENUM;            						fmsmemo.memoindex++;						if( fmsmemo.memoindex >= FMSDENGONFILELINENUM) 							fmsmemo.memoindex = 0;												dengonindex = fmsmemo.memoindex;						if( dengonindex < 6 && fmsmemo.memonum<FMSDENGONFILELINENUM)							dengonindex = 6;												memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1));						getStringFromIndexWithDelim(data,"|",2,tmp_buffer,sizeof(tmp_buffer));						sprintf( m_buf,"%s|%2d/%02d %2d:%02d %s",							tmp_buffer,							tm1.tm_mon +1, tm1.tm_mday, tm1.tm_hour, tm1.tm_min,							CHAR_getChar( talker, CHAR_NAME));						strcpy( fmsmemo.memo[fmsmemo.memoindex], m_buf);												// send acsv 						saacproto_ACFMWriteMemo_send( acfd, "FMS", 							FMSDENGON_SN,							makeEscapeString( fmsmemo.memo[fmsmemo.memoindex], buf, sizeof(buf)),							FMSDENGON_SN);												if( dengonindex >= 6){							strcpy( NPC_sendbuf, fmsmemo.memo[dengonindex - 6]);							strcat( NPC_sendbuf, "\n");							for( i=(dengonindex - 5); i<=dengonindex; i++){								strcat( NPC_sendbuf, fmsmemo.memo[i]);								strcat( NPC_sendbuf, "\n");							}							sprintf(tmp, "%d\n", dengonindex);							strcat( NPC_sendbuf, tmp);						}						if(dengonindex < 6){							strcpy( NPC_sendbuf, fmsmemo.memo[fmsmemo.memonum+(dengonindex - 6)]);							strcat( NPC_sendbuf, "\n");							for( i=fmsmemo.memonum+(dengonindex - 5); i<fmsmemo.memonum; i++){								strcat( NPC_sendbuf, fmsmemo.memo[i]);								strcat( NPC_sendbuf, "\n");							}							for( i=0; i<=dengonindex; i++){								strcat( NPC_sendbuf, fmsmemo.memo[i]);								strcat( NPC_sendbuf, "\n");							}							sprintf(tmp, "%d\n", dengonindex);

⌨️ 快捷键说明

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