📄 npc_autopk.c
字号:
#include "version.h"#include <string.h>#include "char.h"#include "object.h"#include "char_base.h"#include "npcutil.h"#include "npc_autopk.h"#include "lssproto_serv.h"#include "saacproto_cli.h"#include "readmap.h"#include "battle.h"#include "log.h"#include "enemy.h"#include "handletime.h"#include "npc_eventaction.h"#include "npc_healer.h"#include "configfile.h"#ifdef _GMRELOAD extern struct GMINFO gminfo[GMMAXNUM];#endif#ifdef _AUTO_PK#define AWARDNO (1 << 0)#define AWARDPET (1 << 1)#define AWARDITEM (1 << 2)#define AWARDALL (AWARDPET|AWARDITEM)enum { WINDOW_START=1, WINDOW_SELECT, WINDOW_JOINPK, WINDOW_PKLIST, WINDOW_PKINFO, WINDOW_HISTORY, WINDOW_HISTORY_NEXT, WINDOW_HISTORY_PREV, WINDOW_END,};typedef struct tagautopk{ int winnum; char cdkey[CDKEYLEN]; char name[CHARNAMELEN];}Autopk;typedef struct tagaward{ int awardpetid; int awarditemid; char awardpet[32]; char awarditem[32]; int draw;}Award;static int baward = FALSE;Award award[5];Autopk ship[5];int autopklist;static int autopktime=-1;static int awardpetid=-1;static int awarditemid=-1;static char awardpet[32];static char awarditem[32];enum { NPC_WORK_CURRENTTIME = CHAR_NPCWORKINT1, NPC_WORK_TIMEFLAG = CHAR_NPCWORKINT9,/* NPC_WORK_ROUTETOY = CHAR_NPCWORKINT2, NPC_WORK_ROUTEPOINT = CHAR_NPCWORKINT3, NPC_WORK_ROUNDTRIP = CHAR_NPCWORKINT4, NPC_WORK_MODE = CHAR_NPCWORKINT5, NPC_WORK_CURRENTROUTE = CHAR_NPCWORKINT6, NPC_WORK_ROUTEMAX = CHAR_NPCWORKINT7, NPC_WORK_WAITTIME = CHAR_NPCWORKINT8, NPC_WORK_CURRENTTIME = CHAR_NPCWORKINT9, NPC_WORK_SEFLG = CHAR_NPCWORKINT10,*/};enum { NPC_AUTOPK_START, NPC_AUTOPK_SELECT, NPC_AUTOPK_JOINPK, NPC_AUTOPK_PKLIST, NPC_AUTOPK_PKAWARD, NPC_AUTOPK_HISTORY, NPC_AUTOPK_OK, NPC_AUTOPK_END,};#define STANDBYTIME 50static void NPC_AutoPk_selectWindow( int meindex, int toindex, int num,int select);BOOL AutoPk_GetHistoryStr( char *token, int page );void AutoPk_PKNum( char *token );BOOL AutoPk_AddItem( int charindex, int index );BOOL AutoPk_AddPet( int charindex, int index );BOOL NPC_AutoPkInit( int meindex ){ char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE]; if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){ print("TRANSER_MAN: GetArgStrErr!!"); return FALSE; } CHAR_setInt( meindex, CHAR_WHICHTYPE, CHAR_TRANSERMANS); //CHAR_setInt( meindex, CHAR_LOOPINTERVAL, NEWNPCMAN_STANDBY); CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec); return TRUE;}//CHAR_setWorkInt(talkerindex,CHAR_WORKSHOPRELEVANT,1);void NPC_AutoPkTalked( int meindex, int talkerindex, char *msg, int color ){ 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; } CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0); NPC_AutoPk_selectWindow( meindex, talkerindex, WINDOW_START, 0);}void NPC_AutoPkWindowTalked( int meindex, int talkerindex, int seqno, int select, char *data){ if( select == WINDOW_BUTTONTYPE_CANCEL || select == WINDOW_BUTTONTYPE_NO) return; switch( seqno) { case NPC_AUTOPK_START: break; case NPC_AUTOPK_SELECT: NPC_AutoPk_selectWindow( meindex, talkerindex, WINDOW_SELECT, atoi( data)); break; case NPC_AUTOPK_JOINPK: if(autopktime>2){ char buf1[128]; char buf2[255]; int i; CHAR_DischargePartyNoMsg( talkerindex);//解散团队 CHAR_warpToSpecificPoint( talkerindex, 20000, 27, 15 );#ifdef _GMRELOAD for (i = 0; i < GMMAXNUM; i++){ if (strcmp( CHAR_getChar( talkerindex, CHAR_CDKEY), gminfo[i].cdkey) == 0){ CHAR_setInt(talkerindex,CHAR_AUTOPK,-1); break; } } if(i == GMMAXNUM)#endif { CHAR_setInt(talkerindex,CHAR_AUTOPK,0); sprintf(buf1,"玩家%s参加比赛!",CHAR_getChar( talkerindex, CHAR_NAME)); sprintf(buf2,"玩家%s参加比赛,你还没参加吗?本次奖品丰富,你还等什么?快来吧!",CHAR_getChar( talkerindex, CHAR_NAME)); AutoPk_PKSystemTalk(buf1,buf2); } } break; case NPC_AUTOPK_PKLIST: NPC_AutoPk_selectWindow( meindex, talkerindex, WINDOW_PKLIST, atoi( data)); break; case NPC_AUTOPK_PKAWARD: if(!strcmp(ship[0].cdkey, CHAR_getChar( talkerindex, CHAR_CDKEY)) && !strcmp(ship[0].name, CHAR_getChar( talkerindex, CHAR_NAME))){ if((award[0].draw&AWARDPET)!=AWARDPET) if(AutoPk_AddPet( talkerindex, 0 )) award[0].draw=award[0].draw|AWARDPET; if((award[0].draw&AWARDITEM)!=AWARDITEM) if(AutoPk_AddItem( talkerindex, 0 )) award[0].draw=award[0].draw|AWARDITEM; }else if(!strcmp(ship[1].cdkey, CHAR_getChar( talkerindex, CHAR_CDKEY)) && !strcmp(ship[1].name, CHAR_getChar( talkerindex, CHAR_NAME))){ if((award[1].draw&AWARDPET)!=AWARDPET) if(AutoPk_AddPet( talkerindex, 1 )) award[1].draw=award[1].draw|AWARDPET; if((award[1].draw&AWARDITEM)!=AWARDITEM) if(AutoPk_AddItem( talkerindex, 1 )) award[1].draw=award[1].draw|AWARDITEM; }else if(!strcmp(ship[2].cdkey, CHAR_getChar( talkerindex, CHAR_CDKEY)) && !strcmp(ship[2].name, CHAR_getChar( talkerindex, CHAR_NAME))){ if((award[2].draw&AWARDPET)!=AWARDPET) if(AutoPk_AddPet( talkerindex, 2 )) award[2].draw=award[2].draw|AWARDPET; if((award[2].draw&AWARDITEM)!=AWARDITEM) if(AutoPk_AddItem( talkerindex, 2 )) award[2].draw=award[2].draw|AWARDITEM; } if(!strcmp(ship[3].cdkey, CHAR_getChar( talkerindex, CHAR_CDKEY)) && !strcmp(ship[3].name, CHAR_getChar( talkerindex, CHAR_NAME))){ if((award[3].draw&AWARDPET)!=AWARDPET) if(AutoPk_AddPet( talkerindex, 3 )) award[3].draw=award[3].draw|AWARDPET; if((award[3].draw&AWARDITEM)!=AWARDITEM) if(AutoPk_AddItem( talkerindex, 3 )) award[3].draw=award[3].draw|AWARDITEM; }else if(!strcmp(ship[4].cdkey, CHAR_getChar( talkerindex, CHAR_CDKEY)) && !strcmp(ship[4].name, CHAR_getChar( talkerindex, CHAR_NAME))){ if((award[4].draw&AWARDPET)!=AWARDPET) if(AutoPk_AddPet( talkerindex, 4 )) award[4].draw=award[4].draw|AWARDPET; if((award[4].draw&AWARDITEM)!=AWARDITEM) if(AutoPk_AddItem( talkerindex, 4 )) award[4].draw=award[4].draw|AWARDITEM; } break; case NPC_AUTOPK_HISTORY: if( select == WINDOW_BUTTONTYPE_CANCEL ) return; if( select == WINDOW_BUTTONTYPE_NEXT ) { NPC_AutoPk_selectWindow( meindex, talkerindex, WINDOW_HISTORY_NEXT, atoi( data)); return; } if( select == WINDOW_BUTTONTYPE_PREV ) { NPC_AutoPk_selectWindow( meindex, talkerindex, WINDOW_HISTORY_PREV, atoi( data)); return; } break; case NPC_AUTOPK_OK: break; case NPC_AUTOPK_END: NPC_AutoPk_selectWindow( meindex, talkerindex, WINDOW_END, atoi( data)); break; }}static void NPC_AutoPk_selectWindow( int meindex, int toindex, int num,int select){ char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE]; char token[256]; int buttontype = 0, windowtype = 0, windowno = 0; int fd = getfdFromCharaIndex( toindex); if(NPC_Util_isFaceToFace( meindex ,toindex , 2) == FALSE) { if(NPC_Util_isFaceToChara( toindex, meindex, 1) == FALSE) return; } memset( npcarg, 0, sizeof( npcarg)); if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){ print("TRANSER_MAN: GetArgStrErr!!"); return; } memset( token, 0, sizeof( token)); switch( num) { case WINDOW_START: sprintf(token, "3\n ★乱舞格斗PK赛管理员★\n\n" "有什么需要我为你服务呢?\n" " 《我要参加比赛》\n" " 《查看参赛名单》\n" " 《领取获奖奖品》\n" " 《查看比赛历史》\n"); CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, WINDOW_START); windowtype = WINDOW_MESSAGETYPE_SELECT; buttontype = WINDOW_BUTTONTYPE_CANCEL; windowno = NPC_AUTOPK_SELECT; break; case WINDOW_SELECT: windowtype = WINDOW_MESSAGETYPE_MESSAGE; if(select==1){ if(autopktime>2){ sprintf(token, " ★乱舞格斗PK赛管理员★\n\n" "当前离比赛开始时间还剩%d分钟,你是否要参加当前比赛吗???",autopktime); buttontype = WINDOW_BUTTONTYPE_YESNO; windowno = NPC_AUTOPK_JOINPK; }else if(autopktime>0){ sprintf(token, " ★乱舞格斗PK赛管理员★\n\n" "PK比赛将在%d分钟后开始!\n现在已无法进入比赛场地!",autopktime); buttontype = WINDOW_BUTTONTYPE_CANCEL; }else{ sprintf(token, " ★乱舞格斗PK赛管理员★\n\n" "目前还未举行PK比赛!\n请关注PK比赛最新消息!"); buttontype = WINDOW_BUTTONTYPE_CANCEL; } }else if(select==2){ sprintf(token, " ★乱舞格斗PK赛参赛名单★\n"); strcat(token, "转生 等级 玩 家\n"); AutoPk_PKNum(token); buttontype = WINDOW_BUTTONTYPE_CANCEL; windowno = NPC_AUTOPK_PKLIST; }else if(select==3){ char buff[64]; sprintf(token, " ★乱舞格斗PK赛奖品领取★\n"); strcat(token, "“获胜”“奖 品”\n"); if(strlen(award[0].awardpet)>0) sprintf(buff, " 冠军 宠物:%s\n", award[0].awardpet); else sprintf(buff, " 冠军 宠物:无\n"); strcat(token, buff); if(strlen(award[0].awarditem)>0) sprintf(buff, " 冠军 物品:%s\n", award[0].awarditem); else sprintf(buff, " 冠军 物品:无\n"); strcat(token, buff); if(strlen(award[1].awardpet)>0) sprintf(buff, " 亚军 宠物:%s\n", award[1].awardpet); else sprintf(buff, " 亚军 宠物:无\n"); strcat(token, buff); if(strlen(award[1].awarditem)>0) sprintf(buff, " 亚军 物品:%s\n", award[1].awarditem); else sprintf(buff, " 亚军 物品:无\n"); strcat(token, buff); if(strlen(award[2].awardpet)>0) sprintf(buff, " 季军 宠物:%s\n", award[2].awardpet); else sprintf(buff, " 季军 宠物:无\n"); strcat(token, buff); if(strlen(award[2].awarditem)>0) sprintf(buff, " 季军 物品:%s\n", award[2].awarditem); else sprintf(buff, " 季军 物品:无\n"); strcat(token, buff); if(strlen(award[3].awardpet)>0) sprintf(buff, " 优胜 宠物:%s\n", award[3].awardpet); else sprintf(buff, " 优胜 宠物:无\n"); strcat(token, buff); if(strlen(award[3].awarditem)>0) sprintf(buff, " 优胜 物品:%s\n", award[3].awarditem); else sprintf(buff, " 优胜 物品:无\n"); strcat(token, buff); if(strlen(award[4].awardpet)>0) sprintf(buff, " 优胜 宠物:%s\n", award[4].awardpet); else sprintf(buff, " 优胜 宠物:无\n"); strcat(token, buff); if(strlen(award[4].awarditem)>0) sprintf(buff, " 优胜 物品:%s\n", award[4].awarditem); else sprintf(buff, " 优胜 物品:无\n"); strcat(token, buff); if(baward && (!strcmp(ship[0].cdkey, CHAR_getChar( toindex, CHAR_CDKEY)) && !strcmp(ship[0].name, CHAR_getChar( toindex, CHAR_NAME)) && award[0].draw != AWARDALL) || (!strcmp(ship[1].cdkey, CHAR_getChar( toindex, CHAR_CDKEY)) && !strcmp(ship[1].name, CHAR_getChar( toindex, CHAR_NAME)) && award[1].draw != AWARDALL) || (!strcmp(ship[2].cdkey, CHAR_getChar( toindex, CHAR_CDKEY)) && !strcmp(ship[2].name, CHAR_getChar( toindex, CHAR_NAME)) && award[2].draw != AWARDALL) || (!strcmp(ship[3].cdkey, CHAR_getChar( toindex, CHAR_CDKEY)) && !strcmp(ship[3].name, CHAR_getChar( toindex, CHAR_NAME)) && award[3].draw != AWARDALL) || (!strcmp(ship[4].cdkey, CHAR_getChar( toindex, CHAR_CDKEY)) && !strcmp(ship[4].name, CHAR_getChar( toindex, CHAR_NAME)) && award[4].draw != AWARDALL)) buttontype = WINDOW_BUTTONTYPE_YESNO; else buttontype = WINDOW_BUTTONTYPE_CANCEL; windowno = NPC_AUTOPK_PKAWARD; }else if(select==4){ CHAR_setInt( toindex, CHAR_LISTPAGE, 1); if(AutoPk_GetHistoryStr(token,CHAR_getInt( toindex, CHAR_LISTPAGE))) buttontype = WINDOW_BUTTONTYPE_CANCEL; else buttontype = WINDOW_BUTTONTYPE_CANCEL|WINDOW_BUTTONTYPE_NEXT; windowno = NPC_AUTOPK_HISTORY; } break; case WINDOW_HISTORY_NEXT: windowtype = WINDOW_MESSAGETYPE_MESSAGE; CHAR_setInt( toindex, CHAR_LISTPAGE,CHAR_getInt( toindex, CHAR_LISTPAGE)+1); if(AutoPk_GetHistoryStr(token,CHAR_getInt( toindex, CHAR_LISTPAGE))) buttontype = WINDOW_BUTTONTYPE_CANCEL|WINDOW_BUTTONTYPE_PREV; else buttontype = WINDOW_BUTTONTYPE_CANCEL|WINDOW_BUTTONTYPE_PREV|WINDOW_BUTTONTYPE_NEXT; windowno = NPC_AUTOPK_HISTORY; break; case WINDOW_HISTORY_PREV: windowtype = WINDOW_MESSAGETYPE_MESSAGE; CHAR_setInt( toindex, CHAR_LISTPAGE,CHAR_getInt( toindex, CHAR_LISTPAGE)-1); if(CHAR_getInt( toindex, CHAR_LISTPAGE)<1)CHAR_setInt( toindex, CHAR_LISTPAGE,1); if(AutoPk_GetHistoryStr(token,CHAR_getInt( toindex, CHAR_LISTPAGE)) || CHAR_getInt( toindex, CHAR_LISTPAGE)==1) buttontype = WINDOW_BUTTONTYPE_CANCEL|WINDOW_BUTTONTYPE_NEXT; else buttontype = WINDOW_BUTTONTYPE_CANCEL|WINDOW_BUTTONTYPE_PREV|WINDOW_BUTTONTYPE_NEXT; windowno = NPC_AUTOPK_HISTORY; break; case WINDOW_END: return; break; } lssproto_WN_send( fd, windowtype, buttontype, windowno, CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), token);}void NPC_AutoPkLoop( void ){}BOOL AutoPk_GetHistoryStr( char *token, int page ){ FILE* fp; fp = fopen("./data/autopk/autopkhistory.txt", "r"); if (fp == NULL) { print("查看比赛历史文件打开错误\n"); return FALSE; } typedef struct taghistory { char winnum[5]; char name[CHARNAMELEN]; }History; History history[5]; char hstime[5],line[255],buf[255]; int i; for(i=0;i<page;i++){ if(fgets(line, sizeof(line), fp) == NULL)break; chop(line); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -