?? npc_manorsman.c
字號:
fmpks[fmpks_pos+1].dueltime = CHAR_getWorkInt(meindex, NPC_WORK_PEACEWAIT) + NowTime.tv_sec;
fmpks[fmpks_pos+1].flag = FMPKS_FLAG_NONE;
NPC_CleanPkList( fmpks_pos);
#ifndef _NEW_MANOR_LAW
NPC_ManorSavePKSchedule(meindex, -1, FMPKS_FLAG_NONE);
#else
NPC_ManorSavePKSchedule(meindex, -1, FMPKS_FLAG_NONE,fmpks[fmpks_pos+1].dueltime,tm1);
#endif
break;
}
CHAR_setWorkInt(meindex, NPC_WORK_PREVLOOPTIME, NowTime.tv_sec);
}
void NPC_ManorLoadPKSchedule(int meindex)
{
#ifdef _ACFMPK_LIST
int fmpks_pos = CHAR_getWorkInt(meindex, NPC_WORK_ID);
saacproto_ACLoadFmPk_send(acfd, fmpks_pos);
#else
char filename[256], tmp[4096], token[256];
FILE *f;
int fmpks_pos = CHAR_getWorkInt(meindex, NPC_WORK_ID)*MAX_SCHEDULE;
snprintf(filename,sizeof(filename), "%s%d_%d_%d",
SCHEDULEFILEDIR, CHAR_getInt(meindex, CHAR_FLOOR),
CHAR_getInt(meindex, CHAR_X),
CHAR_getInt(meindex, CHAR_Y) );
if( ! (f=fopen( filename, "r" )) ){ // create new schedule file
f = fopen( filename, "w" );
if( !f ){
print( "ERROR:Can't create Schedule file %s!\n",filename );
return;
}
strcpy(tmp,"0|-1|-1|-1|-1|-1|-1|-1|-1\n");
fwrite(tmp, strlen(tmp), 1, f);
}
fseek(f, 0, SEEK_SET); // 檔案開頭
fgets(tmp, sizeof(tmp), f);
fmpks[fmpks_pos].flag=-1;
// 時間
if (getStringFromIndexWithDelim(tmp,"|",1,token,sizeof(token))) {
fmpks[fmpks_pos+1].dueltime=atoi(token);
}
// 主隊 familyindex
if (getStringFromIndexWithDelim(tmp,"|",2,token,sizeof(token))) {
fmpks[fmpks_pos+1].host_index=atoi(token);
}
// 主隊 家族名
if (getStringFromIndexWithDelim(tmp,"|",3,token,sizeof(token))) {
strcpy(fmpks[fmpks_pos+1].host_name,makeStringFromEscaped(token));
}
// 客隊 familyindex
if (getStringFromIndexWithDelim(tmp,"|",4,token,sizeof(token))) {
fmpks[fmpks_pos+1].guest_index=atoi(token);
}
// 客隊 家族名
if (getStringFromIndexWithDelim(tmp,"|",5,token,sizeof(token))) {
strcpy(fmpks[fmpks_pos+1].guest_name,makeStringFromEscaped(token));
}
// 準備時間
if (getStringFromIndexWithDelim(tmp,"|",6,token,sizeof(token))) {
fmpks[fmpks_pos+1].prepare_time=atoi(token);
}
// 最大人數
if (getStringFromIndexWithDelim(tmp,"|",7,token,sizeof(token))) {
fmpks[fmpks_pos+1].max_player=atoi(token);
}
// 旗標
if (getStringFromIndexWithDelim(tmp,"|",8,token,sizeof(token))) {
fmpks[fmpks_pos+1].flag=atoi(token);
}
// 對戰星球
if (getStringFromIndexWithDelim(tmp,"|",9,token,sizeof(token))) {
strcpy(fmpks[fmpks_pos+2].host_name,makeStringFromEscaped(token));
}
// no schedule
fmpks[fmpks_pos].flag=-1;
// prepare time expired?
if ((fmpks[fmpks_pos+1].flag==FMPKS_FLAG_MANOR_PREPARE) &&
(fmpks[fmpks_pos+1].dueltime<NowTime.tv_sec)) {
fmpks[fmpks_pos].flag=-1;
// Terry fix 要清為-1不能清為0
// fmpks[fmpks_pos].host_index=0;
fmpks[fmpks_pos].host_index=-1;
strcpy(fmpks[fmpks_pos].host_name,"");
// Terry fix 要清為-1不能清為0
// fmpks[fmpks_pos].guest_index=0;
fmpks[fmpks_pos].guest_index=-1;
strcpy(fmpks[fmpks_pos].guest_name,"");
fmpks[fmpks_pos+1].flag=-1;
fmpks[fmpks_pos+1].dueltime=0;
// fmpks[fmpks_pos+1].dueltime=NowTime.tv_sec+30*60; // add more 30 minutes
}
fclose(f);
#endif // end AC_SEND_FM_PK
}
#ifdef _ACFMPK_LIST
#ifndef _NEW_MANOR_LAW
void NPC_ManorSavePKSchedule(int meindex, int toindex, int flg)
#else
void NPC_ManorSavePKSchedule(int meindex, int toindex, int flg,int setTime,struct tm tm2)
#endif
{
int fmpks_pos, manorid, dueltime;
char msg[1024], n1[256], n2[256], n3[256];
char token[256], hadfmname[256];
int hadfmindex=0, hadfmpopular=0, tkfmindex=0;
int PkFlg=0;
if( toindex == -1 ){
#ifndef _NEW_MANOR_LAW
dueltime = CHAR_getWorkInt(meindex, NPC_WORK_PEACEWAIT) + NowTime.tv_sec;
sprintf(msg, "%d|%d|%s|%d|%s|%d|%d|%d|%s",
dueltime, 0, "", 0, "", 0, 0, flg, "");
#else
sprintf(msg, "%d|%d|%s|%d|%s|%d|%d|%d|%s",
setTime, 0, "", 0, "", 0, 0, flg, "");
#endif
PkFlg = 0;
}else{
struct tm tm1;
int index;
#ifndef _NEW_MANOR_LAW
tkfmindex = CHAR_getWorkInt(toindex, CHAR_WORKFMINDEXI);
#else
// toindex 變成 家族的index
tkfmindex = toindex;
#endif
fmpks_pos = CHAR_getWorkInt(meindex, NPC_WORK_ID) * MAX_SCHEDULE;
manorid = CHAR_getWorkInt(meindex, NPC_WORK_MANORID);
memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1));
#ifndef _NEW_MANOR_LAW
dueltime = CHAR_getWorkInt(meindex, NPC_WORK_CHALLENGEWAIT) + NowTime.tv_sec - tm1.tm_min*60 + 1800;
#else
// 以挑戰時的時間為開打的時間,中間所經過的時間為準備時間
dueltime = NowTime.tv_sec - tm1.tm_min * 60 + ((24 - tm1.tm_hour) * 3600) + 3600 * tm2.tm_hour;
// |-------------取整點-------------| |--------加到0000時-------| |挑戰時的時間(算整點)|
#endif
getStringFromIndexWithDelim( fmpointlist.pointlistarray[manorid-1], "|", 5, token, sizeof(token));
hadfmindex = atoi( token);
getStringFromIndexWithDelim( fmpointlist.pointlistarray[manorid-1], "|", 7, token, sizeof(token));
hadfmpopular = atoi( token);
getStringFromIndexWithDelim( fmpointlist.pointlistarray[manorid-1], "|", 6, token, sizeof(token));
strcpy( hadfmname, token);
makeEscapeString( hadfmname, n1, sizeof(n1));
#ifndef _NEW_MANOR_LAW
makeEscapeString( CHAR_getChar(toindex, CHAR_FMNAME), n2, sizeof(n2));
#else
// 找出挑戰家族中氣勢最高家族索引
index = ManorSchedule[manorid-1].iSort[0];
makeEscapeString(ManorSchedule[manorid-1].szFmName[index],n2,sizeof(n2));
#endif
makeEscapeString( getGameserverID(), n3, sizeof(n3));
sprintf(msg, "%d|%d|%s|%d|%s|%d|%d|%d|%s",
dueltime, hadfmindex-1, n1, tkfmindex, n2, 15, 50, FMPKS_FLAG_MANOR_OTHERPLANET, n3);
PkFlg = 1;
{
char buf1[256];
sprintf( buf1,"%d", CHAR_getWorkInt( meindex, NPC_WORK_ID) );
Logfmpk(
n1, hadfmindex-1, 0,
n2, tkfmindex, 0,
"", buf1, n3, 1);
}
}
#ifndef _NEW_MANOR_LAW
saacproto_ACSendFmPk_send( acfd, toindex, PkFlg, CHAR_getWorkInt( meindex, NPC_WORK_ID), msg);
#else
// toindex 用不到設為 -1
saacproto_ACSendFmPk_send( acfd, -1, PkFlg, CHAR_getWorkInt( meindex, NPC_WORK_ID), msg);
#endif
}
#endif
#ifdef _NEW_MANOR_LAW
// 加入挑戰排程
void NPC_ManorAddToSchedule(int meindex,int charaindex)
{
int i,j,iEmpty = -1,iFmIndex,manorindex = CHAR_getWorkInt(meindex,NPC_WORK_MANORID) - 1;
struct tm tm1;
iFmIndex = CHAR_getWorkInt(charaindex,CHAR_WORKFMINDEXI);
// 檢查是否已排入排程,檢查所有的莊園約戰
for(j=0;j<MANORNUM;j++){
for(i=0;i<10;i++){
if(ManorSchedule[j].iFmIndex[i] != -1){
if(ManorSchedule[j].iFmIndex[i] == iFmIndex){
lssproto_WN_send(getfdFromCharaIndex(charaindex),WINDOW_MESSAGETYPE_MESSAGE,WINDOW_BUTTONTYPE_OK,CHAR_WINDOWTYPE_CHECKMAN_END,
CHAR_getWorkInt(meindex, CHAR_WORKOBJINDEX),"你已經報名過挑戰莊園了喔~");
return;
}
}
else{
if(j == manorindex) iEmpty = i; // 記錄空的位置
}
}
}
// 如果程式執行到這里,表示沒有加入排程,檢查有沒有空的位置
if(iEmpty != -1){ // 有空位置,把報名者加入
// 記錄家族索引
ManorSchedule[manorindex].iFmIndex[iEmpty] = iFmIndex;
// 記錄家族名稱
sprintf(ManorSchedule[manorindex].szFmName[iEmpty],"%s",CHAR_getChar(charaindex,CHAR_FMNAME));
// 記錄挑戰時間
memcpy(&tm1,localtime((time_t *)&NowTime.tv_sec),sizeof(tm1));
memset(ManorSchedule[manorindex].szMemo[iEmpty],0,sizeof(ManorSchedule[manorindex].szMemo[iEmpty]));
memcpy(&ManorSchedule[manorindex].tm1[iEmpty],&tm1,sizeof(tm1));
lssproto_WN_send(getfdFromCharaIndex(charaindex),WINDOW_MESSAGETYPE_MESSAGE,WINDOW_BUTTONTYPE_OK,CHAR_WINDOWTYPE_CHECKMAN_END,
CHAR_getWorkInt(meindex, CHAR_WORKOBJINDEX),"加入挑戰排程");
}
// 滿了,和挑戰排程的最後一名作比較,如果後來的氣勢比最後一名高,替換掉最後一名,否則通知目前氣勢無法擠進排程
else{
// 取得最後一名在ManorSchedule的位置
int index = ManorSchedule[manorindex].iSort[9];
for(i=0;i<FAMILY_MAXNUM;i++){
// 找出挑戰家族的索引
if(fmdptop.fmtopid[i] == iFmIndex) break;
}
// 找不到此家族
if(i >= FAMILY_MAXNUM){
lssproto_WN_send(getfdFromCharaIndex(charaindex),WINDOW_MESSAGETYPE_MESSAGE,WINDOW_BUTTONTYPE_OK,CHAR_WINDOWTYPE_CHECKMAN_END,
CHAR_getWorkInt(meindex, CHAR_WORKOBJINDEX),"抱歉,找不到你的家族氣勢資料");
return;
}
// 比較氣勢
if(ManorSchedule[manorindex].iFmMomentum[index] < fmdptop.fmMomentum[i]){
int fmpks_pos,iPlayerNum = CHAR_getPlayerMaxNum();
char szMsg[256];
// 通知所有人
fmpks_pos = CHAR_getWorkInt(meindex,NPC_WORK_ID) * MAX_SCHEDULE;
sprintf(szMsg,"%s 家族被 %s 家族擠下挑戰排程",ManorSchedule[manorindex].szFmName[index],CHAR_getChar(charaindex,CHAR_FMNAME));
for(i=0;i<iPlayerNum;i++){
if(CHAR_getCharUse(i) != FALSE){
CHAR_talkToCli(i,-1,szMsg,CHAR_COLORBLUE2);
}
}
// 最後一名被擠掉
ManorSchedule[manorindex].iFmIndex[index] = iFmIndex;
// 記錄家族名稱
sprintf(ManorSchedule[manorindex].szFmName[index],"%s",CHAR_getChar(charaindex,CHAR_FMNAME));
// 記錄挑戰時間
memcpy(&tm1,localtime((time_t *)&NowTime.tv_sec),sizeof(tm1));
memcpy(&ManorSchedule[manorindex].tm1[index],&tm1,sizeof(tm1));
lssproto_WN_send(getfdFromCharaIndex(charaindex),WINDOW_MESSAGETYPE_MESSAGE,WINDOW_BUTTONTYPE_OK,CHAR_WINDOWTYPE_CHECKMAN_END,
CHAR_getWorkInt(meindex, CHAR_WORKOBJINDEX),"加入挑戰排程");
}
else{
lssproto_WN_send(getfdFromCharaIndex(charaindex),WINDOW_MESSAGETYPE_MESSAGE,WINDOW_BUTTONTYPE_OK,CHAR_WINDOWTYPE_CHECKMAN_END,
CHAR_getWorkInt(meindex, CHAR_WORKOBJINDEX),"抱歉,你的家族氣勢不足以排進挑戰排程");
return;
}
}
// 排序
SortManorSchedule();
}
// 排序挑戰排程
void SortManorSchedule()
{
int i,j,k;
// 先取得最新家族氣勢
for(k=0;k<MANORNUM;k++){
for(i=0;i<10;i++){
ManorSchedule[k].iSort[i] = i;
if(ManorSchedule[k].iFmIndex[i] != -1){
for(j=0;j<FAMILY_MAXNUM;j++){
// 找出挑戰家族的索引
if(fmdptop.fmtopid[j] == ManorSchedule[k].iFmIndex[i]){
// 取得氣勢值
ManorSchedule[k].iFmMomentum[i] = fmdptop.fmMomentum[j];
// 作成memo
sprintf(ManorSchedule[k].szMemo[i],"%-16s %2d:%2d %12d",
ManorSchedule[k].szFmName[i],ManorSchedule[k].tm1[i].tm_hour,ManorSchedule[k].tm1[i].tm_min,
ManorSchedule[k].iFmMomentum[i]/100);
break;
}
}
}
}
}
// 排序
for(i=0;i<MANORNUM;i++){
g_iSortManor = i;
qsort(&ManorSchedule[g_iSortManor].iSort,10,sizeof(int),&SortManorScheduleMomentum);
}
}
int SortManorScheduleMomentum(const void *indexa, const void *indexb)
{
int momentumA,momentumB;
momentumA = ManorSchedule[g_iSortManor].iFmMomentum[*(int*)indexa];
momentumB = ManorSchedule[g_iSortManor].iFmMomentum[*(int*)indexb];
return (momentumA > momentumB) ? -1:1;
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -