?? 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"
#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 4
enum {
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);
#ifdef _DEATH_FAMILY_GM_COMMAND // WON ADD 家族戰GM指令
int i;
int playernum = CHAR_getPlayerMaxNum();
#endif
// 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));
#ifdef _DEATH_FAMILY_GM_COMMAND // WON ADD 家族戰GM指令
{
static int next_time[5] = {10,20,30,40,50}, flag[5] = {0};
int now_time = time(NULL);
int j, ID = 0;
ID = CHAR_getWorkInt(meindex, NPC_WORK_ID) - MANORNUM ;
if( flag[ ID - 1 ] == 0 ){
next_time[ ID - 1 ] += now_time;
flag[ ID -1 ] = 1;
}
if( now_time > next_time[ID - 1] ){
next_time[ID -1] = now_time + (60 * 5);
for( i=0; i<MAX_SCHEDULE; i++ ){
if( fmpks[ fmpks_pos + i ].flag == FMPKS_FLAG_SCHEDULED &&
CHAR_getWorkInt(meindex, NPC_WORK_MODEFLAG) == NPC_STATEFREE ){
char msg[128] = {0};
int pk_min = fmpks[fmpks_pos + i ].prepare_time;
sprintf(msg, "[%s] VS [%s] 於(%d:%d) 在場地 %d 開打",
fmpks[ fmpks_pos + i ].host_name,
fmpks[ fmpks_pos + i ].guest_name,
tm1.tm_hour + i, pk_min,
CHAR_getWorkInt(meindex, NPC_WORK_ID) - 9 );
for( j=0; j< playernum; j++ ){
if( CHAR_CHECKINDEX( j ) != FALSE )
CHAR_talkToCli( j, -1, msg, CHAR_COLORYELLOW);
}
}
}
}
}
#endif
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 !!");
#ifdef _DEATH_FAMILY_GM_COMMAND // WON ADD 家族戰GM指令
{
int num1 = 0, num2 = 0;
int winflag = 0;
int floor = CHAR_getWorkInt(meindex, NPC_WORK_WARPFLOOR);
NPC_GetPKFMNum(floor, fmpks[fmpks_pos].host_index,
fmpks[fmpks_pos].guest_index, &num1, &num2);
if( num2 < 20 ){
NPC_WarpFamily(floor, -1,
fmpks[fmpks_pos].guest_index,
CHAR_getInt(meindex, CHAR_FLOOR),
CHAR_getInt(meindex, CHAR_X),
CHAR_getInt(meindex, CHAR_Y));
NPC_talkToFloor( floor, -1, fmpks[fmpks_pos].guest_index, "因未滿二十人而離場" );
#ifdef _DEATH_FAMILY_STRUCT // WON ADD 家族戰存放勝負資料
{
char out[256];
sprintf( out, "[%s](%d) 因未滿二十人棄權", fmpks[fmpks_pos].guest_name, num2 );
saacproto_FM_PK_STRUCT_send( acfd, out );
}
#endif
}
if( num1 < 20 ){
NPC_WarpFamily(floor, fmpks[fmpks_pos].host_index,
-1,
CHAR_getInt(meindex, CHAR_FLOOR),
CHAR_getInt(meindex, CHAR_X),
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -