📄 npc_fmwarpman.c
字号:
#include "version.h"#include <time.h>#include "char.h"#include "object.h"#include "char_base.h"#include "npcutil.h"#include "lssproto_serv.h"#include "saacproto_cli.h"#include "npc_fmwarpman.h"#include "npc_scheduleman.h"#include "readmap.h"#include "log.h"#include "battle.h"#include "handletime.h"#include "family.h"#include "errno.h"#include "configfile.h"#ifdef _FM_POINT_PKextern struct FM_POINTLIST fmpointlist; // 家族据点#endif#define FMWARPMAN_INIT_LOOPTIME 600 // 0.1秒#define FMWARPMAN_FREE_LOOPTIME 9000 // 1.5秒#define FMWARPMAN_BUSY_LOOPTIME 3000 // 0.5秒#define FMWARPMAN_WAIT_LOOPTIME 18000 // 3秒#define FMWARPMAN_CLEANPLACE 59//#define FMWARPMAN_CLEANPLACE 9#define TRUE 1#define FALSE 0// CoolFish Rem 2002/2/25// #define MANOR 4enum { NPC_WORK_MODEFLAG = CHAR_NPCWORKINT1, NPC_WORK_CURRENTTIME = CHAR_NPCWORKINT2, NPC_WORK_WARPFLOOR = CHAR_NPCWORKINT3, NPC_WORK_FMNUMI = CHAR_NPCWORKINT4, NPC_WORK_FMNUMII = CHAR_NPCWORKINT5, NPC_WORK_ID = CHAR_NPCWORKINT6, NPC_WORK_TIMEFLAG = CHAR_NPCWORKINT9, NPC_WORK_TALKFLAG = CHAR_NPCWORKINT10, NPC_WORK_CleanTime = CHAR_NPCWORKINT11,};enum { NPC_STATEINIT, NPC_STATEFREE, NPC_STATEBUSY, NPC_STATEWAIT,};enum { NPC_WORK_WINFMNAME = CHAR_NPCWORKCHAR1,};void NPC_ERR_FMDiSP(int meindex, int talker, int errNO);static void NPC_FMWarpMan_selectWindow(int meindex, int toindex, int num, int select);void NPC_FMBATTLESET(int floor, int index1, int index2, int flag);void NPC_WarpFamily(int floor, int index1, int index2, int fl, int x, int y);void NPC_BattleOut(int fmindex, int fmindex1);void NPC_CleanPK(int floor, int meindex);int NPC_FMFloorUse(int floor);void NPC_talkToFloor(int floor, int index1, int index2, char *data);void CheckLeavePK(int npcindex, int floor, int index1, int index2);void CHECK_FMPknumInFloor( int meindex){ int fmnum1 = 0, fmnum2 = 0; int fmpks_pos; fmpks_pos = CHAR_getWorkInt(meindex, NPC_WORK_ID) * MAX_SCHEDULE; // Nuke 20040920: Bug fix 庄园人数满时要检查总人数 //print("<<%d %d>>",fmpks_pos,MAX_SCHEDULEMAN); //if( fmpks_pos < 0 || fmpks_pos >= MAX_SCHEDULEMAN ) return; if( fmpks_pos < 0 || fmpks_pos >= MAX_SCHEDULEMAN * MAX_SCHEDULE ) return; NPC_GetPKFMNum(CHAR_getWorkInt(meindex, NPC_WORK_WARPFLOOR), fmpks[fmpks_pos].host_index, fmpks[fmpks_pos].guest_index, &fmnum1, &fmnum2 ); CHAR_setWorkInt( meindex, NPC_WORK_FMNUMI , fmnum1); CHAR_setWorkInt( meindex, NPC_WORK_FMNUMII, fmnum2);}extern int familyMemberIndex[FAMILY_MAXNUM][FAMILY_MAXMEMBER];BOOL NPC_FMWarpManInit( int meindex ){ char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE]; char buff2[256]; char buf[1024]; int fl, x, y, meid; // shan int fl1, x1, y1; if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){ print("FMWarpMan:GetArgStrErr"); return FALSE; } if(NPC_Util_GetStrFromStrWithDelim( npcarg, "WARP1", buf, sizeof( buf))==NULL){ print("FMWarpman Err is %s",npcarg); print("FMWarpman Err"); return FALSE; } getStringFromIndexWithDelim(buf,",",1,buff2,sizeof(buff2)); fl=atoi(buff2); CHAR_setWorkInt(meindex, NPC_WORK_WARPFLOOR, fl); getStringFromIndexWithDelim(buf,",",2,buff2,sizeof(buff2)); x=atoi(buff2); getStringFromIndexWithDelim(buf,",",3,buff2,sizeof(buff2)); y=atoi(buff2); if( MAP_IsValidCoordinate( fl,x,y )== FALSE ){ print( "FMWarp NPC:Invalid warpman ERR" ); return FALSE; } // shan begin if(NPC_Util_GetStrFromStrWithDelim( npcarg, "WARP2", buf, sizeof( buf))==NULL){ print("FMWarpman Err is %s",npcarg); print("FMWarpman Err"); return FALSE; } getStringFromIndexWithDelim(buf,",",1,buff2,sizeof(buff2)); fl1=atoi(buff2); CHAR_setWorkInt(meindex, NPC_WORK_WARPFLOOR, fl); getStringFromIndexWithDelim(buf,",",2,buff2,sizeof(buff2)); x1=atoi(buff2); getStringFromIndexWithDelim(buf,",",3,buff2,sizeof(buff2)); y1=atoi(buff2); if( MAP_IsValidCoordinate( fl1,x1,y1 )== FALSE ){ print( "FMWarp NPC:Invalid warpman ERR" ); return FALSE; } // shan end meid = NPC_Util_GetNumFromStrWithDelim(npcarg, "ID"); if ((meid < 0) || (meid >= MAX_SCHEDULEMAN)) { print("FMWARP NPC: Init error invalid ID:%d\n", meid); return FALSE; } /*--正奶皿涩烂--*/ CHAR_setInt(meindex, CHAR_LOOPINTERVAL, FMWARPMAN_INIT_LOOPTIME); CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_TYPEWARPMAN ); CHAR_setWorkInt(meindex, NPC_WORK_MODEFLAG, NPC_STATEINIT); CHAR_setWorkInt(meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec); CHAR_setWorkInt(meindex, NPC_WORK_TIMEFLAG, 0); CHAR_setWorkInt(meindex, NPC_WORK_TALKFLAG, -1); CHAR_setWorkInt(meindex, NPC_WORK_ID, meid); CHAR_setWorkInt(meindex, NPC_WORK_FMNUMI, 0); CHAR_setWorkInt(meindex, NPC_WORK_FMNUMII, 0); CHAR_setWorkInt( meindex, NPC_WORK_CleanTime, 6*10); return TRUE;}void NPC_FMWarpManTalked(int meindex, int talkerindex, char *szMes, int color){ char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE]; CHAR_setWorkInt( talkerindex, CHAR_WORKWARPCHECK, FALSE ); if( CHAR_getInt( talkerindex , CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) { return; } if(NPC_Util_isFaceToFace( meindex ,talkerindex ,2)==FALSE){ if(NPC_Util_isFaceToChara(talkerindex,meindex,1 )==FALSE) return; } if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){ print("GetArgStrErr"); return ; } if(CHAR_getWorkInt(talkerindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE){ NPC_ERR_FMDiSP( meindex, talkerindex, 1); } CHAR_setWorkInt( talkerindex , CHAR_WORKSHOPRELEVANTTRD , 0 ); NPC_FMWarpMan_selectWindow( meindex, talkerindex, 0, -1);}void NPC_FMWarpManLoop(int meindex){ struct tm tm1; struct tm *tm2; int fmpks_pos = CHAR_getWorkInt(meindex, NPC_WORK_ID) * MAX_SCHEDULE; int floor = CHAR_getWorkInt(meindex, NPC_WORK_WARPFLOOR); // WON ADD 修正snprintf会导致当机的bug if( (tm2=localtime((time_t *)&NowTime.tv_sec) ) == NULL ){ print("\n won ==> time err !! "); return; } memcpy(&tm1, localtime((time_t *)&NowTime.tv_sec), sizeof(tm1)); if (tm1.tm_min == 0) CHAR_setWorkInt(meindex, NPC_WORK_TIMEFLAG, tm1.tm_min); if (CHAR_getWorkInt(meindex, NPC_WORK_MODEFLAG) == NPC_STATEINIT) { if (tm1.tm_sec == 0) { CHAR_setWorkInt(meindex, NPC_WORK_MODEFLAG, NPC_STATEFREE); CHAR_setInt(meindex, CHAR_LOOPINTERVAL, FMWARPMAN_FREE_LOOPTIME); } } if (CHAR_getWorkInt(meindex, NPC_WORK_MODEFLAG) == NPC_STATEFREE) { // 取得目前系统时间,若目前时间 >= 准备时间则设定BUSY状态 if (tm1.tm_min > CHAR_getWorkInt(meindex, NPC_WORK_TALKFLAG) && tm1.tm_min == 0) { // 通知成员进场 if (fmpks[fmpks_pos].flag == FMPKS_FLAG_SCHEDULED) NPC_talkToFloor(CHAR_getInt(meindex, CHAR_FLOOR), fmpks[fmpks_pos].host_index, fmpks[fmpks_pos].guest_index, "可以准备进场了!"); CHAR_setWorkInt(meindex, NPC_WORK_TALKFLAG, tm1.tm_min); } if ((fmpks[fmpks_pos].prepare_time > 0) && (fmpks[fmpks_pos].flag == FMPKS_FLAG_SCHEDULED)) { int clock = 0; NPC_FMBATTLESET(floor, fmpks[fmpks_pos].host_index, fmpks[fmpks_pos].guest_index, -1); if (tm1.tm_hour - (fmpks[fmpks_pos].dueltime / 100) < 0) clock = (fmpks[fmpks_pos].dueltime % 100) + fmpks[fmpks_pos].prepare_time - 60; else clock = fmpks[fmpks_pos].dueltime - (tm1.tm_hour * 100) + fmpks[fmpks_pos].prepare_time; if ((tm1.tm_min >= clock) && (fmpks[fmpks_pos].prepare_time > 0)) { NPC_talkToFloor(floor, fmpks[fmpks_pos].host_index, fmpks[fmpks_pos].guest_index, "开战罗~!!"); CHAR_setWorkInt(meindex, NPC_WORK_MODEFLAG, NPC_STATEBUSY); CHAR_setInt(meindex, CHAR_LOOPINTERVAL, FMWARPMAN_BUSY_LOOPTIME); NPC_FMBATTLESET(floor, fmpks[fmpks_pos].host_index, fmpks[fmpks_pos].guest_index, 1); // print("\n won ==> set fmwaperman state busy !!"); } else if (tm1.tm_min > CHAR_getWorkInt(meindex, NPC_WORK_TIMEFLAG)) { char buf[256]; int clock = 0; CHAR_setWorkInt(meindex, NPC_WORK_TIMEFLAG, tm1.tm_min); clock = ((fmpks[fmpks_pos].dueltime % 100) + fmpks[fmpks_pos].prepare_time) - tm1.tm_min; if (clock >= 60) clock = clock - 60; sprintf(buf, "距离对战时间还剩下:%4d分钟", clock); NPC_talkToFloor(floor, fmpks[fmpks_pos].host_index, fmpks[fmpks_pos].guest_index, buf); } } }else if (CHAR_getWorkInt(meindex, NPC_WORK_MODEFLAG) == NPC_STATEBUSY){ // 检查场内人数、判断胜负 int num1 = 0, num2 = 0; int winflag = 0; int floor = CHAR_getWorkInt(meindex, NPC_WORK_WARPFLOOR); int meid = CHAR_getWorkInt(meindex, NPC_WORK_ID); // print("\n won ==> check_winner : npc_meid(%d)", meid ); NPC_GetPKFMNum(floor, fmpks[fmpks_pos].host_index, fmpks[fmpks_pos].guest_index, &num1, &num2); NPC_FMBATTLESET(floor, fmpks[fmpks_pos].host_index, fmpks[fmpks_pos].guest_index, 1); CheckLeavePK(meindex, floor, fmpks[fmpks_pos].host_index, fmpks[fmpks_pos].guest_index); if (meid > MANORNUM){ if (tm1.tm_min == FMWARPMAN_CLEANPLACE){ // 判断胜负、WARP离场、设定NPC状态 NPC_BattleOut(fmpks[fmpks_pos].host_index, fmpks[fmpks_pos].guest_index); NPC_FMBATTLESET(floor, fmpks[fmpks_pos].host_index, fmpks[fmpks_pos].guest_index, -1); if (fmpks[fmpks_pos].win == 0){// 生存战 if (num1 > num2) winflag = 1; else if(num1 < num2) winflag = 2; else winflag = 3; }else if (fmpks[fmpks_pos].win == 1){ // 打飞战 if ((CHAR_getWorkInt(meindex, NPC_WORK_FMNUMI) - num1) < (CHAR_getWorkInt(meindex, NPC_WORK_FMNUMII) - num2)) winflag = 1; else if ((CHAR_getWorkInt(meindex, NPC_WORK_FMNUMI) - num1) > (CHAR_getWorkInt(meindex, NPC_WORK_FMNUMII) - num2)) winflag = 2; else winflag = 3; } } } if ((num1 == 0) && (num2 != 0)){ winflag = 2; }else if ((num2 == 0) && (num1 != 0)){ winflag = 1; }else if ((num1 == 0) && (num2 == 0)){ winflag = 3; } if (winflag > 0 && winflag < 3){#ifdef _MANOR_PKRULE if(meid > MANORNUM){#endif // 流浪家族pk 过声望 if (winflag == 1){ saacproto_ACFixFMPK_send(acfd, fmpks[fmpks_pos].host_name, fmpks[fmpks_pos].host_index + 1, fmpks[fmpks_pos].host_index, fmpks[fmpks_pos].guest_name, fmpks[fmpks_pos].guest_index + 1, fmpks[fmpks_pos].guest_index); } else { saacproto_ACFixFMPK_send(acfd, fmpks[fmpks_pos].guest_name, fmpks[fmpks_pos].guest_index + 1, fmpks[fmpks_pos].guest_index, fmpks[fmpks_pos].host_name, fmpks[fmpks_pos].host_index + 1, fmpks[fmpks_pos].host_index); } #ifdef _MANOR_PKRULE }#endif { if (meid > 0 && meid <= MANORNUM){// CoolFish 2002/2/25 Change MANOR -> MANORNUM fmpks[fmpks_pos + 1].flag = FMPKS_FLAG_MANOR_BATTLEEND; if (winflag == 1){ char token[256]; sprintf( token, " (%d:%d) %d/%d/%d", tm1.tm_hour, tm1.tm_min, tm1.tm_year+1900, tm1.tm_mon+1, tm1.tm_mday); saacproto_ACFixFMPoint_send(acfd, fmpks[fmpks_pos].host_name, fmpks[fmpks_pos].host_index + 1, fmpks[fmpks_pos].host_index, fmpks[fmpks_pos].guest_name, fmpks[fmpks_pos].guest_index + 1, fmpks[fmpks_pos].guest_index, meid); //Syu 增加庄园战胜负Log Logfmpk( fmpks[fmpks_pos].host_name, fmpks[fmpks_pos].host_index, num1, fmpks[fmpks_pos].guest_name, fmpks[fmpks_pos].guest_index, num2, token, "", "", 2); } else if (winflag == 2){ char token[256]; sprintf( token, " (%d:%d) %d/%d/%d", tm1.tm_hour, tm1.tm_min, tm1.tm_year+1900, tm1.tm_mon+1, tm1.tm_mday);#ifdef _FM_POINT_PK int fmid;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -