📄 npc_sysinfo.c
字号:
#include "version.h"#include <string.h>#include "char.h"#include "char_event.h"#include "object.h"#include "handletime.h"#include "magic.h"#include "npcutil.h"#include "char_data.h"#include "chatmagic.h"#include "net.h"#include "configfile.h"#include "npcgen.h"/*---------------------------------------------------------------------sysinfo By Kawata---------------------------------------------------------------------*/#define NPC_SYSINFO_MSGMAX 21#define NPC_SYSINFO_PASSWD_DEFAULT "longzoro"#define NPC_SYSINFO_TIMELIMIT_DEFAULT 120#define NPC_SYSINFO_SHUTDOWNLIMIT_DEFAULT 5#define NPC_SYSINFO_SHUTDOWN_MSG "再过 %d 分钟後,即开始进行server系统维护。"#define NPC_SYSINFO_SHUTDOWN_MSG_COMP "server已关闭。"enum { CHAR_WORK_MODE = CHAR_NPCWORKINT1, CHAR_WORK_TIME = CHAR_NPCWORKINT2, CHAR_WORK_TIMELIMIT = CHAR_NPCWORKINT3, CHAR_WORK_SHUTDOWNTIME = CHAR_NPCWORKINT4, CHAR_WORK_SHUTDOWNLIMIT = CHAR_NPCWORKINT5, CHAR_WORK_SHUTDOWNDSPTIME = CHAR_NPCWORKINT6, CHAR_WORK_MSGCOLOR = CHAR_NPCWORKINT7, CHAR_WORK_PLAYER = CHAR_NPCWORKINT8,};enum { CHAR_WORKCHAR_PASSWD = CHAR_NPCWORKCHAR1,};typedef struct { char msg[16];}CMD_MSG;CMD_MSG cmd_msg[] = { { "startinfo"}, {"endinfo"}, {"help"}, {"player"}, {"list"}, {"sendno"}, {"sendmsg"}, {"shutdown"}, {"msgcol"}, {"sysinfo"}, {"info"}, { "allowaccept" } , { "denyaccept" } , { "closeallsockets" }, { "allnosee" }, { "allnobody" }, { "movenum" }, { "bornnum" }, { "enemystate" }, { "setwalktime"},{ "setcatime" },{"setcdtime"}, { "setoneloop"}, { "titlerestart"}, { "setsaacwrite"}, { "setsaacread"},};enum{ NPC_SYSINFO_MSG_STARTINFO, NPC_SYSINFO_MSG_ENDINFO, NPC_SYSINFO_MSG_HELP, NPC_SYSINFO_MSG_PLAYER, NPC_SYSINFO_MSG_LIST, NPC_SYSINFO_MSG_SENDNO, NPC_SYSINFO_MSG_SENDMSG, NPC_SYSINFO_MSG_SHUTDOWN, NPC_SYSINFO_MSG_MSGCOL, NPC_SYSINFO_MSG_SYSINFO, NPC_SYSINFO_MSG_INFO, NPC_SYSINFO_MSG_ALLOWACCEPT, NPC_SYSINFO_MSG_DENYACCEPT, NPC_SYSINFO_MSG_CLOSEALLSOCKETS, /* 错痊馨笛 */ NPC_SYSINFO_ALL_NOSEE, NPC_SYSINFO_ALL_NOBODY, NPC_SYSINFO_MOVE_NUM, NPC_SYSINFO_BORN_NUM, NPC_SYSINFO_ENEMY_STATE, NPC_SYSINFO_SETWALKTIME, NPC_SYSINFO_SETCATIME, NPC_SYSINFO_SETCDTIME, NPC_SYSINFO_SETONELOOP, NPC_SYSINFO_TITLERESTART, NPC_SYSINFO_SETSAACWRITE, NPC_SYSINFO_SETSAACREAD, NPC_SYSINFO_MSG_NUM,};typedef struct { char arg[32]; char defMsg[128];}NPC_Sysinfo_Msg;static NPC_Sysinfo_Msg msgtable[] = { { "def_msg", "我拥有和全世界的人说话的能力。" }, { "shutdown_msg", "现在开始要进行server系统维护请尽速logout!!"},};enum{ NPC_SYSINFO_ARG_DEF_MSG, NPC_SYSINFO_ARG_SHUTDOWN_MSG,};static void NPC_Sysinfo_SendMsg( int meindex, int pindex, int tblnum);static char *NPC_Sysinfo_GetMsg( int meindex, char *msgindexstr, char *out,int outlen, int num );static void NPC_Sysinfo_SendMsgToAll( int meindex, char *msg);static void NPC_Sysinfo_Msg_EndInfo( int meindex, int tindex, char *msg);static void NPC_Sysinfo_Msg_Help( int meindex, int tindex, char *msg);static void NPC_Sysinfo_Msg_Player( int meindex, int tindex, char *msg);static void NPC_Sysinfo_Msg_List( int meindex, int tindex, char *msg);static void NPC_Sysinfo_Msg_SendNo( int meindex, int tindex, char *msg);static void NPC_Sysinfo_Msg_SendMsg( int meindex, int tindex, char *msg);static void NPC_Sysinfo_Msg_Shutdown( int meindex, int tindex, char *msg);static void NPC_Sysinfo_Msg_Msgcol( int meindex, int tindex, char *msg);/* 错痊馨笛 */static void NPC_Sysinfo_All_NoBody( int meindex, int tindex, char *msg);static void NPC_Sysinfo_All_NoSee( int meindex, int tindex, char *msg);static void NPC_Sysinfo_Move_Num( int meindex, int tindex, char *msg);static void NPC_Sysinfo_Born_Num( int meindex, int tindex, char *msg);static void NPC_Sysinfo_Enemy_State( int meindex, int tindex, char *msg);static void NPC_Sysinfo_SetWalkTime( int meindex, int tindex, char *msg);static void NPC_Sysinfo_SetCATime( int meindex, int tindex, char *msg);static void NPC_Sysinfo_SetCDTime( int meindex, int tindex, char *msg);static void NPC_Sysinfo_SetOneloop( int meindex, int tindex, char *msg);static void NPC_Sysinfo_TitleRestart( int meindex, int tindex, char *msg);static void NPC_Sysinfo_SetSaacwrite( int meindex, int tindex, char *msg);static void NPC_Sysinfo_SetSaacread( int meindex, int tindex, char *msg);static void NPC_Sysinfo_Msg_allowAccept(int meindex, int tindex, char*msg){ SERVSTATE_SetAcceptMore( 1 ); CHAR_talkToCli( tindex, meindex, "allowaccept OK.", CHAR_COLORYELLOW);}static void NPC_Sysinfo_Msg_denyAccept(int meindex, int tindex, char*msg){ SERVSTATE_SetAcceptMore( 0 ); CHAR_talkToCli( tindex, meindex, "denyaccept OK.", CHAR_COLORYELLOW);}static void NPC_Sysinfo_Msg_closeallsockets(int meindex, int tindex, char*msg){ CHAR_talkToCli( tindex, meindex, "closeallsockets OK.", CHAR_COLORYELLOW); closeAllConnectionandSaveData();}static void NPC_Sysinfo_Msg_Sysinfo(int meindex, int tindex, char*msg){ CHAR_CHAT_DEBUG_sysinfo( tindex, msg);}static void NPC_Sysinfo_Msg_Info(int meindex, int tindex, char*msg){ CHAR_CHAT_DEBUG_info( tindex, msg);}typedef void (*FUNC)(int,int,char *);static FUNC functbl[] = { NULL, NPC_Sysinfo_Msg_EndInfo, NPC_Sysinfo_Msg_Help, NPC_Sysinfo_Msg_Player, NPC_Sysinfo_Msg_List, NPC_Sysinfo_Msg_SendNo, NPC_Sysinfo_Msg_SendMsg, NPC_Sysinfo_Msg_Shutdown, NPC_Sysinfo_Msg_Msgcol, NPC_Sysinfo_Msg_Sysinfo, NPC_Sysinfo_Msg_Info, NPC_Sysinfo_Msg_allowAccept, NPC_Sysinfo_Msg_denyAccept, NPC_Sysinfo_Msg_closeallsockets, /* 错痊馨笛 */ NPC_Sysinfo_All_NoSee, NPC_Sysinfo_All_NoBody, NPC_Sysinfo_Move_Num, NPC_Sysinfo_Born_Num, NPC_Sysinfo_Enemy_State, NPC_Sysinfo_SetWalkTime, NPC_Sysinfo_SetCATime, NPC_Sysinfo_SetCDTime, NPC_Sysinfo_SetOneloop, NPC_Sysinfo_TitleRestart, NPC_Sysinfo_SetSaacwrite, NPC_Sysinfo_SetSaacread, };/******************************************************************/BOOL NPC_SysinfoInit( int meindex ){ int tmp; char argstr[NPC_UTIL_GETARGSTR_BUFSIZE]; char buff[128]; NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)); CHAR_setWorkInt( meindex, CHAR_WORK_MODE, 0); /* 由旦伐□玉本永玄 */ if( NPC_Util_GetStrFromStrWithDelim( argstr, "passwd", buff, sizeof( buff)) == NULL) { strcpy( buff, NPC_SYSINFO_PASSWD_DEFAULT); } CHAR_setWorkChar( meindex, CHAR_WORKCHAR_PASSWD, buff); tmp = NPC_Util_GetNumFromStrWithDelim( argstr, "time"); if( tmp == -1 ) tmp = NPC_SYSINFO_TIMELIMIT_DEFAULT; CHAR_setWorkInt( meindex, CHAR_WORK_TIMELIMIT, tmp); tmp = NPC_Util_GetNumFromStrWithDelim( argstr, "msg_col"); if( tmp < CHAR_COLORRED || tmp > CHAR_COLORWHITE ) tmp = CHAR_COLORYELLOW; CHAR_setWorkInt( meindex, CHAR_WORK_MSGCOLOR, tmp); CHAR_setWorkInt( meindex, CHAR_WORK_PLAYER, -1); CHAR_setWorkInt( meindex, CHAR_WORK_SHUTDOWNTIME, 0); CHAR_setWorkInt( meindex, CHAR_WORK_SHUTDOWNDSPTIME, 0); CHAR_setInt( meindex, CHAR_WHICHTYPE, CHAR_TYPEOTHERNPC); CHAR_setFlg( meindex, CHAR_ISATTACKED, 0); return TRUE;}/*******************************************************************/void NPC_SysinfoLoop( int meindex ){ int shuttime; if( CHAR_getWorkInt( meindex, CHAR_WORK_MODE) == 1) { int oldtime; /* 凛棉毛褡户月 */ oldtime = CHAR_getWorkInt( meindex, CHAR_WORK_TIME); /* 孺蜃凛棉左□田□匹骚橘乒□玉尺 */ if( NowTime.tv_sec - oldtime > CHAR_getWorkInt( meindex, CHAR_WORK_TIMELIMIT)) { CHAR_setWorkInt( meindex, CHAR_WORK_MODE, 0); CHAR_setWorkInt( meindex, CHAR_WORK_PLAYER, -1); } } shuttime = CHAR_getWorkInt( meindex, CHAR_WORK_SHUTDOWNTIME); /* shutdown凛棉民尼永弁 */ if( shuttime > 0 ) { int diff,limit,hun; diff = NowTime.tv_sec - shuttime; limit = CHAR_getWorkInt( meindex, CHAR_WORK_SHUTDOWNLIMIT); hun = limit - (diff/60); /* ㄠ坌云五卞丢永本□斥 */ if( hun != CHAR_getWorkInt( meindex, CHAR_WORK_SHUTDOWNDSPTIME)){ char buff[256]; if( hun != 0 ) { snprintf( buff, sizeof(buff), NPC_SYSINFO_SHUTDOWN_MSG, hun); } else { strcpy( buff, NPC_SYSINFO_SHUTDOWN_MSG_COMP); } NPC_Sysinfo_SendMsgToAll( meindex, buff); CHAR_setWorkInt( meindex, CHAR_WORK_SHUTDOWNDSPTIME, hun); } if( hun == 0) { CHAR_setWorkInt( meindex, CHAR_WORK_SHUTDOWNDSPTIME,0); CHAR_setWorkInt( meindex, CHAR_WORK_SHUTDOWNLIMIT,0); CHAR_setWorkInt( meindex, CHAR_WORK_SHUTDOWNTIME,0); } }}/*******************************************************************/void NPC_SysinfoTalked( int meindex, int tindex, char *msg, int color){ char *msgwk; char *buff; int len; int msgno; len = strlen( msg)+1; msgwk = calloc( 1, sizeof(char)*len); buff = calloc( 1, sizeof(char)*len); strcpy( msgwk, msg); /* 旦矢□旦毛引午户月 */ deleteSequentChar( msgwk, " "); if( CHAR_getWorkInt( meindex, CHAR_WORK_MODE) == 0 ) { msgno = 0; if( strncmp( msgwk, cmd_msg[NPC_SYSINFO_MSG_STARTINFO].msg, strlen( cmd_msg[NPC_SYSINFO_MSG_STARTINFO].msg)) == 0) { if( getStringFromIndexWithDelim( msgwk, " ", 2, buff, len) == TRUE ) { if( strcmp( buff, CHAR_getWorkChar( meindex, CHAR_WORKCHAR_PASSWD)) == 0 ) { CHAR_setWorkInt( meindex, CHAR_WORK_MODE, 1); CHAR_setWorkInt( meindex, CHAR_WORK_PLAYER, tindex); CHAR_setWorkInt( meindex, CHAR_WORK_TIME, NowTime.tv_sec); CHAR_talkToCli( tindex, meindex, "已移到指令模式。按下help即会出现说明档。", CHAR_getWorkInt( meindex, CHAR_WORK_MSGCOLOR)); CHAR_talkToCli( tindex, meindex, "可以在enemystate 中了解敌人的产生和行动数。", CHAR_getWorkInt( meindex, CHAR_WORK_MSGCOLOR)); } } } if( CHAR_getWorkInt( meindex, CHAR_WORK_MODE ) == 0 ) { NPC_Sysinfo_SendMsg( meindex, tindex, NPC_SYSINFO_ARG_DEF_MSG); } }else { if( tindex == CHAR_getWorkInt( meindex, CHAR_WORK_PLAYER)) { int i; for( i = NPC_SYSINFO_MSG_ENDINFO; i < NPC_SYSINFO_MSG_NUM; i ++ ) { if( strncmp( msgwk, cmd_msg[i].msg, strlen( cmd_msg[i].msg)) == 0) { if( functbl[i] != NULL ) { functbl[i]( meindex, tindex, msgwk); } break; } } CHAR_setWorkInt( meindex, CHAR_WORK_TIME, NowTime.tv_sec); } else { NPC_Sysinfo_SendMsg( meindex, tindex, NPC_SYSINFO_ARG_DEF_MSG); } } free( msgwk); free( buff);}/*------------------------------------------------------------------------ * 骚橘乒□玉尺 *----------------------------------------------------------------------*/static void NPC_Sysinfo_Msg_EndInfo( int meindex, int tindex, char *msg){ CHAR_setWorkInt( meindex, CHAR_WORK_MODE, 0); CHAR_setWorkInt( meindex, CHAR_WORK_PLAYER, -1); CHAR_talkToCli( tindex, meindex, "已移到一般模式", CHAR_getWorkInt( meindex, CHAR_WORK_MSGCOLOR));}/*------------------------------------------------------------------------ * HELP丢永本□斥 *----------------------------------------------------------------------*/static void NPC_Sysinfo_Msg_Help( int meindex, int tindex, char *msg){ int i; typedef struct { char str[512]; }SYSINFO_MSGWK; SYSINFO_MSGWK msgwk[] = { { "指令HELP"}, { "help 此项讯息。"}, { "player 表示现在LOGIN的玩家人数。"}, { "list 讯息一览。"}, { "send number 「number」 是数值。指定讯息的号码後将该讯息内容传送给全部的玩家。"}, { "sendmsg msgs msgs为想传送的讯息。在send 之後空一格,即可将之後的文章送信给全部的玩家。"}, { "shutdown min min 代表分。"}, { "msgcol col 设定传送给玩家讯息的颜色。颜色的指定有red,green,yellow,blue,purple,cyan,white。"}, { "sysinfo 系统状态"}, { "info 玩家状态"}, { "endinfo 回复普通的状态。"}, { "denyaccept 无法接受CLIENT端的接续。"}, { "allowaccept 接受CLIENT端的接续。"}, { "closeallsockets 强迫让CLIENT端LOGOUT。在内部实行denyaccept。"}, { "titlerestart 再次读取称号名的设定。"}, { "enemystate 说明NPC的状况。"}, { ""}, }; for( i = 0; msgwk[i].str[0] != '\0'; i ++ ) { CHAR_talkToCli( tindex, meindex, msgwk[i].str, CHAR_getWorkInt( meindex, CHAR_WORK_MSGCOLOR)); }}/*------------------------------------------------------------------------ * 皿伊奶乩□及醒毛譬屯月 *----------------------------------------------------------------------*/static void NPC_Sysinfo_Msg_Player( int meindex, int tindex, char *msg){ int i, cnt = 0; int playernum=CHAR_getPlayerMaxNum(); char buff[64]; for( i=0 ; i<playernum ; i++ ){ if( CHAR_getCharUse(i) != FALSE ) { if( CHAR_getInt( i, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ) { cnt ++; } } } snprintf( buff, sizeof( buff), "玩家有%d人。", cnt); CHAR_talkToCli( tindex, meindex, buff, CHAR_getWorkInt( meindex, CHAR_WORK_MSGCOLOR));}/*------------------------------------------------------------------------ *----------------------------------------------------------------------*/static void NPC_Sysinfo_Msg_List( int meindex, int tindex, char *msg){ char buff[512]; char buff2[512]; int i; for( i = 1; i < NPC_SYSINFO_MSGMAX; i ++ ) { if( NPC_Sysinfo_GetMsg( meindex, "sendno", buff, sizeof( buff), i)!= NULL ) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -