?? npc_fmdengon.c
字號:
#include "version.h"
#include <time.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 // 整個公布欄的資料筆數(shù)
#define FMSDENGONFILELINENUM 140 // 家族間的留言板資料筆數(shù)
#define DENGONFILEENTRYSIZE 128 // 本文大小
#ifdef _NEW_MANOR_LAW
#define MESSAGEINONEWINDOW 10 // 每頁所顯示的筆數(shù)
#else
#define MESSAGEINONEWINDOW 7 // 每頁所顯示的筆數(shù)
#endif
#define FMMAXNUM 1000 // 家族數(shù)量的最大值
#define FM_MEMBERLIST 2 // 家族成員列表 (主功能表的按鍵)
#define FM_MEMBERMEMO 3 // 家族留言 (主功能表的按鍵)
#ifdef _UN_FMMEMO
#define FM_FMPOINT 4 // 申請家族據(jù)點 (主功能表的按鍵)
#define FM_FMDPTOP 5 // 家族間強者表 (主功能表的按鍵)
#else
#define FM_FMMEMO 4 // 家族之間留言板 (主功能表的按鍵)
#ifdef _UN_FMPOINT
#define FM_FMDPTOP 5 // 家族間強者表 (主功能表的按鍵)
#else
#define FM_FMPOINT 5 // 申請家族據(jù)點 (主功能表的按鍵)
#define FM_FMDPTOP 6 // 家族間強者表 (主功能表的按鍵)
#endif//_UN_FMPOINT
#endif//_UN_FMMEMO
#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; // 家族據(jù)點
extern struct FMS_DPTOP fmdptop; // 家族強者表
extern int leaderdengonindex; // 777 家族公布欄 index
char NPC_sendbuf[DENGONFILEENTRYSIZE*MESSAGEINONEWINDOW]; // 一整頁的大小
char enlistbuf[4096]; // 家族成員召募 BUF(顯示用的)
unsigned long READTIME1 = 0,
READTIME2 = 0,
READTIME3 = 0,
READTIME4 = 0;
// 公布欄的初始化(when gmsv start)
BOOL NPC_FmDengonInit( int meindex)
{
int i;
CHAR_setInt( meindex, CHAR_WHICHTYPE, CHAR_TYPEDENGON);
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),以及家族的留言板
for( i=0; i<FMMAXNUM; i++){
saacproto_ACShowMemberList_send( acfd, i);
saacproto_ACFMReadMemo_send( acfd, i);
}
// 家族之間的留言板所傳的值預(yù)設(shè)為 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);
#ifdef _NEW_MANOR_LAW
saacproto_ACShowTopFMList_send(acfd, FM_TOP_MOMENTUM);
#endif
}
return TRUE;
}
// Select Event
void 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 的 圍內(nèi)時,即取消動作
#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)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -