📄 npc_fmdengon.c
字号:
#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 + -