#include "version.h" #include #include "object.h" #include "char_base.h" #include "char.h" #include "util.h" #include "npcutil.h" #include "npc_oldman.h" #include "title.h" #include "char_data.h" #include "readmap.h" #include "lssproto_serv.h" #include "log.h" #define RANGE 2 void NPC_SetFlg(int talker,int shiftbit); BOOL NPC_CheckFlg(int point,int shiftbit); BOOL NPC_SavePointItemCheck(int meindex,int talker,int itemno,int kosuu); void NPC_MessageDisp(int meindex,int talker,int MseNo); BOOL NPC_UsedCheck(int meindex,int talker,int flg); BOOL NPC_SavePointItemDelete(int meindex,int talker,int itemNo,int kosuu); extern time_t initTime; int playeronlinenum=0; BOOL NPC_SavePointInit( int meindex ) { int oldmanid=0, bornfl=0, bornx=0 ,borny=0; char argstr[NPC_UTIL_GETARGSTR_BUFSIZE]; char token[32]; char buf2[512]; if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr))==NULL){ print("NPC_Savepoint.c Init: GetArgStrErr"); return FALSE; } if(NPC_Util_GetStrFromStrWithDelim(argstr,"ID",buf2,sizeof( buf2) )==NULL){ print("SavePoint:ID尚未设定 "); return FALSE; } oldmanid=atoi(buf2); NPC_Util_GetStrFromStrWithDelim(argstr,"Born",buf2,sizeof( buf2) ); getStringFromIndexWithDelim( buf2,",",1,token,sizeof(token)); bornfl = atoi( token ); getStringFromIndexWithDelim( buf2,",",2,token,sizeof(token)); bornx = atoi( token ); getStringFromIndexWithDelim( buf2,",",3,token,sizeof(token)); borny = atoi( token ); CHAR_setWorkInt( meindex , CHAR_WORKOLDMANID ,oldmanid ); CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_TYPESAVEPOINT ); CHAR_setFlg( meindex , CHAR_ISATTACKED , 1 ); if( MAP_IsValidCoordinate( bornfl,bornx,borny )== TRUE && CHAR_ElderSetPosition( oldmanid ,bornfl,bornx, borny ) == TRUE ){ return TRUE; }else{ printf( "Invalid elder npcarg=%s\n", argstr ); return FALSE; } } void NPC_SavePointTalked( int meindex , int talkerindex , char *msg , int color ) { int fd; char argstr[NPC_UTIL_GETARGSTR_BUFSIZE]; char token[512]; char buf2[1024]; char timeMsg[1024]; int oldmanid; if( ! NPC_Util_charIsInFrontOfChar(talkerindex,meindex,RANGE) || CHAR_getFlg( talkerindex,CHAR_ISDIE )){ if( (CHAR_getInt(talkerindex,CHAR_X) == CHAR_getInt(meindex,CHAR_X)) && (CHAR_getInt(talkerindex,CHAR_Y) == CHAR_getInt(meindex,CHAR_Y)) && (CHAR_getInt(talkerindex,CHAR_FLOOR) ==CHAR_getInt(meindex,CHAR_FLOOR)) ){ }else{ return; } } if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr))==NULL){ print("NPC_Savepoint.c TypeCheck: GetArgStrErr\n"); return ; } if(NPC_Util_GetStrFromStrWithDelim(argstr,"ID",buf2,sizeof( buf2) )==NULL) return ; oldmanid=atoi(buf2); if(strstr(argstr,"NOITEM")!=NULL) { NPC_SetFlg(talkerindex,oldmanid); } #ifndef _FREE_SAVE if(NPC_CheckFlg(CHAR_getInt(talkerindex,CHAR_SAVEPOINT),oldmanid)==FALSE){ if(NPC_UsedCheck(meindex,talkerindex,0)==TRUE){ NPC_MessageDisp(meindex,talkerindex,2); }else{ NPC_MessageDisp(meindex,talkerindex,0); } }else #endif { CHAR_setInt( talkerindex, CHAR_LASTTALKELDER ,CHAR_getWorkInt( meindex, CHAR_WORKOLDMANID ) ); fd = getfdFromCharaIndex( talkerindex); if( fd != -1 ) { #ifndef _NPC_NOSAVEPOINT Char *chwk; chwk = CHAR_getCharPointer( talkerindex); // CoolFish: +1 2001/11/05 if (!chwk) return; CHAR_charSaveFromConnectAndChar( fd, chwk ,FALSE ); // Nuke 0907: For acsv test { CHAR_charSaveFromConnectAndChar( fd, chwk ,FALSE ); } #endif } NPC_Util_GetStrFromStrWithDelim(argstr,"NomalMsg",token,sizeof( token) ); sprintf(buf2,token,CHAR_getChar(talkerindex,CHAR_NAME)); // Robin 0619 display time { time_t new_t; int dd,hh,mm,ss; time(&new_t); new_t-=initTime; dd=(int) new_t / 86400; new_t=new_t % 86400; hh=(int) new_t / 3600; new_t=new_t % 3600; mm=(int) new_t / 60; new_t=new_t % 60; ss=(int) new_t; #ifdef _SAVE_GAME_ID if (dd>0) { snprintf( timeMsg, sizeof( timeMsg ) , "本星球%s已经启动了 %d 日 %d 小时 %d 分 %d 秒。",getGameserverID(),dd,hh,mm,ss); } else if (hh>0) { snprintf( timeMsg, sizeof( timeMsg ) , "本星球%s已经启动了 %d 小时 %d 分 %d 秒。",getGameserverID(),hh,mm,ss); } else { snprintf( timeMsg, sizeof( timeMsg ) , "本星球%s已经启动了 %d 分 %d 秒。",getGameserverID(),mm,ss); } strcat(buf2,timeMsg); #else if (dd>0) { snprintf( timeMsg, sizeof( timeMsg ) , "本星球已经启动了 %d 日 %d 小时 %d 分 %d 秒。",dd,hh,mm,ss); } else if (hh>0) { snprintf( timeMsg, sizeof( timeMsg ) , "本星球已经启动了 %d 小时 %d 分 %d 秒。",hh,mm,ss); } else { snprintf( timeMsg, sizeof( timeMsg ) , "本星球已经启动了 %d 分 %d 秒。",mm,ss); } strcat(buf2,timeMsg); #endif } { char temp[1024]; //char *answer;// CoolFish: Rem 2001/4/18 extern unsigned int StateTable[]; // Robin 03/20 万能的天神,请赐给我灌水的力量!!!! #ifdef _PLAYER_NUM if(getPlayerNum()>0){ int playernum = abs(StateTable[LOGIN])+getPlayerNum()+playeronlinenum; if(atof(getPlayerBase())>1.0) playernum = playernum * atof(getPlayerBase()) + 0.5; sprintf(temp,"目前线上人数为 %d 人。",playernum); }else{ int playernum = abs(StateTable[LOGIN])+playeronlinenum; if(atof(getPlayerBase())>1.0) playernum = playernum * atof(getPlayerBase()) + 0.5; sprintf(temp,"目前线上人数为 %d 人。",playernum); } #else sprintf(temp,"目前线上人数为 %d 人。",abs(StateTable[LOGIN])); #endif strcat(buf2,temp); } { char savetemp[1024]; sprintf(savetemp,"系统自动为你存档!"); strcat(buf2,savetemp); } //fd = getfdFromCharaIndex( talkerindex); CHAR_charSaveFromConnect(talkerindex, FALSE); CHAR_talkToCli( talkerindex , meindex , buf2 , CHAR_COLORWHITE ); } } /*----------------------------------------- * -------------------------------------------*/ void NPC_SavePointWindowTalked( int meindex, int talkerindex, int seqno, int select, char *data) { if( NPC_Util_CharDistance( talkerindex, meindex ) > 2) { return; } if(seqno==CHAR_WINDOWTYPE_WINDOWSAVEPOINT_START){ if(select==WINDOW_BUTTONTYPE_YES){ if(NPC_UsedCheck(meindex,talkerindex,1)==TRUE){ NPC_MessageDisp(meindex,talkerindex,1); } } } } /* */ BOOL NPC_AndReduce(int meindex,int talker,char *buf,int flg) { char buf2[512]; char buf3[256]; int itemNo=0; int kosuu; int j=1; if(flg==0){ while(getStringFromIndexWithDelim(buf,"&",j,buf2,sizeof(buf2))!=FALSE) { j++; if(strstr( buf2, "*") != NULL){ getStringFromIndexWithDelim(buf2,"*",1,buf3,sizeof(buf3)); itemNo = atoi(buf3); getStringFromIndexWithDelim(buf2,"*",2,buf3,sizeof(buf3)); kosuu = atoi(buf3); /*--民尼永弁乒□玉--*/ if(NPC_SavePointItemCheck(meindex,talker,itemNo,kosuu)==FALSE){ return FALSE; } }else{ itemNo = atoi(buf2); /*--民尼永弁乒□玉--*/ if(NPC_SavePointItemCheck(meindex,talker,itemNo,1)==FALSE){ return FALSE; } } } }else{ if(strstr( buf, "*") != NULL){ getStringFromIndexWithDelim(buf,"*",1,buf3,sizeof(buf3)); itemNo = atoi(buf3); getStringFromIndexWithDelim(buf,"*",2,buf3,sizeof(buf3)); kosuu = atoi(buf3); /*--民尼永弁乒□玉--*/ if(NPC_SavePointItemCheck(meindex,talker,itemNo,kosuu)==FALSE){ return FALSE; } }else{ itemNo = atoi(buf); /*--民尼永弁乒□玉--*/ if(NPC_SavePointItemCheck(meindex,talker,itemNo,1)==FALSE){ return FALSE; } } } return TRUE; } BOOL NPC_AndReduceDelete(int meindex,int talker,char *buf,int flg) { char buf2[512]; char buf3[256]; int itemNo=0; int kosuu; int j=1; if(flg==0){ while(getStringFromIndexWithDelim(buf,"&",j,buf2,sizeof(buf2))!=FALSE) { j++; if(strstr( buf2, "*") != NULL){ getStringFromIndexWithDelim(buf2,"*",1,buf3,sizeof(buf3)); itemNo = atoi(buf3); getStringFromIndexWithDelim(buf2,"*",2,buf3,sizeof(buf3)); kosuu = atoi(buf3); /*--绰轮乒□玉--*/ if(NPC_SavePointItemDelete(meindex,talker,itemNo,kosuu)==FALSE){ return FALSE; } }else{ itemNo = atoi(buf2); /*--绰轮乒□玉--*/ if(NPC_SavePointItemDelete(meindex,talker,itemNo,1)==FALSE){ return FALSE; } } } }else{ if(strstr( buf, "*") != NULL){ getStringFromIndexWithDelim(buf,"*",1,buf3,sizeof(buf3)); itemNo = atoi(buf3); getStringFromIndexWithDelim(buf,"*",2,buf3,sizeof(buf3)); kosuu = atoi(buf3); /*--绰轮乒□玉--*/ if(NPC_SavePointItemDelete(meindex,talker,itemNo,kosuu)==FALSE){ return FALSE; } }else{ itemNo = atoi(buf); /*--绰轮乒□玉--*/ if(NPC_SavePointItemDelete(meindex,talker,itemNo,1)==FALSE){ return FALSE; } } } return TRUE; } /* * 椭瘀毛苇凶仄凶井及民尼永弁 */ BOOL NPC_UsedCheck(int meindex,int talker,int flg) { char argstr[NPC_UTIL_GETARGSTR_BUFSIZE]; char buf[128]; char buf2[512]; int i=1; int checkflg=0; if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr))==NULL){ print("NPC_savePoint.c UseCheck: GetArgStrErr"); return FALSE; } if(NPC_Util_GetStrFromStrWithDelim(argstr,"GetItem",buf,sizeof( buf) )!=NULL) { i=1; while( getStringFromIndexWithDelim(buf,",",i,buf2,sizeof(buf2)) !=FALSE ) { i++; if(strstr( buf2, "&") != NULL){ if(NPC_AndReduce( meindex, talker, buf2,0)==TRUE) { checkflg=1; break; } }else{ if(NPC_AndReduce( meindex, talker, buf2,1)==TRUE) { checkflg=2; break; } } } if(checkflg==0) return FALSE; } else return TRUE; // Arminius 2.5 如果没有设 GetItem 则一律储存 if(flg==1){ if(checkflg==1){ if(NPC_AndReduceDelete(meindex,talker,buf2,0)==FALSE){ return FALSE; } }else{ if(NPC_AndReduceDelete(meindex,talker,buf2,1)==FALSE){ return FALSE; } } } return TRUE; } void NPC_MessageDisp(int meindex,int talker,int MesNo) { int fd = getfdFromCharaIndex( talker); int buttontype=WINDOW_BUTTONTYPE_OK; int windowtype=WINDOW_MESSAGETYPE_MESSAGE; int windowno=CHAR_WINDOWTYPE_WINDOWSAVEPOINT_START; char token[1024]; char argstr[NPC_UTIL_GETARGSTR_BUFSIZE]; char buf[32]; if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr))==NULL){ print("NPC_savePoint.c UseCheck: GetArgStrErr"); return ; } switch(MesNo){ case 0:/*-- 邰卅失奶 丞毛手匀化中月井及民尼永弁-*/ NPC_Util_GetStrFromStrWithDelim(argstr,"RequestMsg",token,sizeof( token) ); break; case 1:/*-- 邰卅失奶 丞毛手匀化中月井及民尼永弁-*/ NPC_Util_GetStrFromStrWithDelim(argstr,"OkMsg",token,sizeof( token) ); NPC_Util_GetStrFromStrWithDelim(argstr,"ID",buf,sizeof( buf) ); NPC_SetFlg(talker,atoi(buf)); /*--本□皮今六化丐仆月--*/ /* 反卅仄井仃凶蛊卞}愤坌及ID毛筏盛今六月 */ CHAR_setInt( talker, CHAR_LASTTALKELDER ,CHAR_getWorkInt( meindex, CHAR_WORKOLDMANID ) ); /* 本□皮允月 */ /* 夫永弁仄化中月反内互卅中及匹失件夫永弁仄卅中 */ fd = getfdFromCharaIndex( talker); if( fd != -1 ) { #ifndef _NPC_NOSAVEPOINT Char *chwk; chwk = CHAR_getCharPointer( talker); // CoolFish: +1 2001/11/05 if (!chwk) return; CHAR_charSaveFromConnectAndChar( fd, chwk ,FALSE ); #endif } break; case 2:/*-- 邰卅失奶 丞毛手匀化中月井及民尼永弁-*/ NPC_Util_GetStrFromStrWithDelim(argstr,"RealyMsg",token,sizeof( token) ); buttontype=WINDOW_BUTTONTYPE_YESNO; break; } lssproto_WN_send( fd, windowtype, buttontype, windowno, CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), token); } BOOL NPC_SavePointItemDelete(int meindex,int talker,int itemNo,int kosuu) { int i; int itemindex; int id; int cnt=0; for( i=CHAR_STARTITEMARRAY;i