BOOL NPC_WarpManInit( int meindex ) { char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE - 1024 * 20]; char buff2[256]; char buf[1024]; int fl,x,y; if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){ print("WarpMan:GetArgStrErr"); return FALSE; } CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_TYPEWARPMAN ); #ifdef _NEW_WARPMAN if( strstr( npcarg,"NEWWARPMAN") ) { //timeman 功能 CHAR_setWorkInt( meindex, NPC_TIME_MODE, 1); if(NPC_Util_GetStrFromStrWithDelim( npcarg, "NEWTIME", buff2, sizeof( buff2)) != NULL ){ CHAR_setInt( meindex, CHAR_LOOPINTERVAL, 60*1000); } #ifdef _TREASURE_BOX CHAR_setWorkInt( meindex, NPC_TIME_EVENTMODE, NPC_EVENTMODE_NONE); if(NPC_Util_GetStrFromStrWithDelim( npcarg, "TREASURE_BOX", buff2, sizeof( buff2)) != NULL ){ if( strstr( buff2, "ON") != NULL ){ CHAR_setWorkInt( meindex, NPC_TIME_EVENTMODE, NPC_EVENTMODE_EVENT); CHAR_setWorkInt( meindex, NPC_TIME_EVENTTIME, NowTime.tv_sec); if(NPC_Util_GetStrFromStrWithDelim( npcarg, "TREASURE_ONBBI", buff2, sizeof( buff2)) != NULL ) CHAR_setWorkInt( meindex, NPC_TIME_EVENONBBI, atoi( buff2)); if(NPC_Util_GetStrFromStrWithDelim( npcarg, "TREASURE_OFFDBBI", buff2, sizeof( buff2)) != NULL ) CHAR_setWorkInt( meindex, NPC_TIME_EVENOFFDBBI, atoi( buff2)); CHAR_setWorkInt( meindex, NPC_TIME_EVENTNUM, 0 ); } } #endif return TRUE; }else{ #endif if(NPC_Util_GetStrFromStrWithDelim( npcarg, "WARP", buf, sizeof( buf))==NULL){ char filename[256]; if( NPC_Util_CheckAssignArgFile( meindex, filename) != NULL ) print("\n Warpman Err -> file:%s", filename); return FALSE; } getStringFromIndexWithDelim(buf,",",1,buff2,sizeof(buff2)); fl=atoi(buff2); 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 ){ char filename[256]; NPC_Util_CheckAssignArgFile( meindex, filename); print( "\nWarp NPC: filename:%s\n 3.Invalid warpman ERR %d %d %d" , filename, fl , x , y ); return FALSE; } #ifdef _NEW_WARPMAN } #endif return TRUE; }
BOOL NPC_PetSkillShopInit( int meindex ) { char argstr[NPC_UTIL_GETARGSTR_BUFSIZE]; char msg[256]; CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_TYPESTONESHOP ); if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr))==NULL){ print("GetArgStrErr"); return FALSE; } if( NPC_Util_GetStrFromStrWithDelim( argstr, "pet_skill", msg, sizeof( msg)) != NULL){ char buf[256], filename[256]; int k=1, skillID, skillarray; while( getStringFromIndexWithDelim( msg, ",", k, buf, sizeof( buf) ) ){ k++; skillID=atoi(buf); skillarray = PETSKILL_getPetskillArray( skillID); if( PETSKILL_CHECKINDEX( skillarray) == FALSE ) continue; if( PETSKILL_getInt( skillarray, PETSKILL_ILLEGAL) == 1){ if( NPC_Util_CheckAssignArgFile( meindex, filename) != NULL ){ print("PetSkillShop illegal skill:[%d-%s] ->file:%s", skillID, PETSKILL_getChar( skillarray, PETSKILL_NAME), filename ); } } } }else{ return FALSE; } return TRUE; }
BOOL NPC_FreePetSkillShopInit( int meindex ) { char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE]; char msg[256]; CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_FREESKILLSHOP ); CHAR_setWorkInt( meindex, CHAR_WORK_SKILLSELECT, 0); if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){ print("GetArgStrErr NO arg !!"); return FALSE; } if( NPC_Util_GetStrFromStrWithDelim( npcarg, "pet_skill", msg, sizeof( msg)) != NULL){ char buf[256], filename[256]; int k=1, skillID, skillarray; while( getStringFromIndexWithDelim( msg, ",", k, buf, sizeof( buf) ) ){ k++; skillID=atoi(buf); skillarray = PETSKILL_getPetskillArray( skillID); if( PETSKILL_CHECKINDEX( skillarray) == FALSE ) continue; if( PETSKILL_getInt( skillarray, PETSKILL_ILLEGAL) == 1){ if( NPC_Util_CheckAssignArgFile( meindex, filename) != NULL ){ print("\n宠物技能不规范:[%d-%s] ->文件:%s\n", skillID, PETSKILL_getChar( skillarray, PETSKILL_NAME), filename ); } } } }else{ return FALSE; } return TRUE; }
char *NPC_Util_GetArgStr(int index, char *argstr, int len) { char filename[128]; char *cret = NULL; if (NPC_Util_CheckAssignArgFile(index, filename) != NULL) { if (NPC_Util_MargeStrFromArgFile(filename, argstr, len) != NULL) { cret = argstr; } } else { if (CHAR_getChar(index, CHAR_NPCARGUMENT) != NULL) { strcpy(argstr, CHAR_getChar(index, CHAR_NPCARGUMENT)); cret = argstr; } else { cret = NULL; } } if (cret == NULL) print("File:%s\n", NPC_Util_CheckAssignArgFile(index, filename)); return (cret); }
void Check_EnemyWarpMe( int meindex, char *args ) { char buf1[256]; int objindex,index; int nfl, nx, ny; OBJECT obj; memset( buf1, 0, sizeof( buf1)); if( NPC_Util_GetStrFromStrWithDelim( args, "REPLACEMENT", buf1, sizeof( buf1)) == NULL ) { return; } GetRand_WarpPoint( buf1, &nfl, &nx, &ny ); if( MAP_IsValidCoordinate( nfl, nx, ny ) == FALSE ){ char filename[256]; NPC_Util_CheckAssignArgFile( meindex, filename); print( "NPCENEMY REPLACEMENT: %s .Invalid POINT( %d, %d, %d)\n", filename, nfl, nx, ny ); return; } { int ofl, ox, oy; ofl = CHAR_getInt( meindex, CHAR_FLOOR ); ox = CHAR_getInt( meindex, CHAR_X ); oy = CHAR_getInt( meindex, CHAR_Y ); for ( obj=MAP_getTopObj( nfl, nx, ny); obj; obj=NEXT_OBJECT( obj) ) { objindex = GET_OBJINDEX( obj); if (OBJECT_getType( objindex) != OBJTYPE_CHARA) continue; index = OBJECT_getIndex( objindex); if( CHAR_getInt( index, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER && CHAR_getWorkInt( index, CHAR_WORKEVENTTYPE) != CHAR_TYPEPET ) { CHAR_warpToSpecificPoint( index, ofl, ox, oy); CHAR_sendCToArroundCharacter( objindex); break; } } } objindex = CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX); CHAR_warpToSpecificPoint( meindex, nfl, nx, ny); CHAR_sendCToArroundCharacter( objindex); }
BOOL NPC_NPCEnemyInit( int meindex ) { char argstr1[NPC_UTIL_GETARGSTR_BUFSIZE]; char *argstr; char buf[64]; int tmp, gym; if((argstr = NPC_Util_GetArgStr( meindex, argstr1, sizeof( argstr1))) == NULL ) { print("Can't GetArgStr !!"); return FALSE; } if( NPC_Util_GetStrFromStrWithDelim( argstr, "sktype", buf, sizeof( buf)) != NULL ){ CHAR_setWorkInt( meindex, CHAR_WORK_BATTLETYPE, atoi( buf)); }else{ CHAR_setWorkInt( meindex, CHAR_WORK_BATTLETYPE, 0); } if( NPC_Util_GetStrFromStrWithDelim( argstr, "enemyno", buf, sizeof( buf)) == NULL ){ char filename[256]; NPC_Util_CheckAssignArgFile( meindex, filename); print( "NPCEnemy: nothing parameter [enemyno]:\n%s\n", filename); return FALSE; }else { int i; for( i = 0; i < NPC_ENEMY_ENEMYNUMBER; i ++ ) { int curEnemy; char data[128]; int ret; ret = getStringFromIndexWithDelim( buf,",", i + 1, data, sizeof(data)); if( ret == FALSE) break; curEnemy = ENEMY_getEnemyArrayFromId( atoi( data)); if( !ENEMY_CHECKINDEX( curEnemy) ) { char filename[256]; NPC_Util_CheckAssignArgFile( meindex, filename); print( "NPCEnemy: invalid param [enemyno:%d data:%s curEnemy:%d]\nfile:%s\n",i+1, data, curEnemy, filename ); return FALSE; } } } if( NPC_Util_GetStrFromStrWithDelim( argstr, "steal", buf, sizeof( buf)) != NULL ) { if( NPC_Util_GetStrFromStrWithDelim( argstr, "item", buf, sizeof( buf)) == NULL ) { print( "NPCEnemy:有指定steal而沒有指定item,很奇怪\n"); return FALSE; } } gym = NPC_Util_GetNumFromStrWithDelim( argstr, "gym"); if( gym > 0 ){ CHAR_setInt( meindex, CHAR_BASEBASEIMAGENUMBER, gymbody[RAND( 0, arraysizeof( gymbody ) - 1)] ); CHAR_setInt( meindex, CHAR_BASEIMAGENUMBER, CHAR_getInt( meindex, CHAR_BASEBASEIMAGENUMBER ) ); CHAR_setInt( meindex, CHAR_LV, gym ); } tmp = NPC_Util_GetNumFromStrWithDelim( argstr, "dieact"); if( tmp != 1 ) tmp = 0; CHAR_setWorkInt( meindex, CHAR_WORK_DIEACT, tmp); if( strstr( argstr, "NEWNPCENEMY") != 0 ) { CHAR_setWorkInt( meindex, CHAR_WORK_WARP_FLOOR, 0 ); CHAR_setWorkInt( meindex, CHAR_WORK_WARP_Y, 0 ); CHAR_setWorkInt( meindex, CHAR_WORK_WARP_X, 0 ); }else { if( CHAR_getWorkInt( meindex, CHAR_WORK_DIEACT) == 1 ) { char buff1[256]; if( NPC_Util_GetStrFromStrWithDelim( argstr, "warpfl", buff1, sizeof( buff1) ) == NULL) { print( "NPCENEMY: nothing warp_floor %s\n", buff1); return FALSE; } tmp = atoi( buff1); CHAR_setWorkInt( meindex, CHAR_WORK_WARP_FLOOR, tmp); if( NPC_Util_GetStrFromStrWithDelim( argstr, "warpx", buff1, sizeof( buff1) ) == NULL) { print( "NPCENEMY: nothing warp_x\n"); return FALSE; } tmp = atoi( buff1); CHAR_setWorkInt( meindex, CHAR_WORK_WARP_X, tmp); if( NPC_Util_GetStrFromStrWithDelim( argstr, "warpy", buff1, sizeof( buff1) ) == NULL) { print( "NPCENEMY: nothing warp_y\n"); return FALSE; } tmp = atoi( buff1); CHAR_setWorkInt( meindex, CHAR_WORK_WARP_Y, tmp); if( MAP_IsValidCoordinate( CHAR_getWorkInt( meindex, CHAR_WORK_WARP_FLOOR), CHAR_getWorkInt( meindex, CHAR_WORK_WARP_X), CHAR_getWorkInt( meindex, CHAR_WORK_WARP_Y) ) == FALSE ){ char filename[256]; NPC_Util_CheckAssignArgFile( meindex, filename); print( "NPCENEMY: %s: .\n %s.\nInvalid fl=%d,x=%d,y=%d\n", filename, argstr, CHAR_getWorkInt( meindex, CHAR_WORK_WARP_FLOOR), CHAR_getWorkInt( meindex, CHAR_WORK_WARP_X), CHAR_getWorkInt( meindex, CHAR_WORK_WARP_Y) ); return FALSE; } } } //andy_end tmp = NPC_Util_GetNumFromStrWithDelim( argstr, "entype"); if( tmp != 1 && tmp != 2) tmp = 0; CHAR_setWorkInt( meindex, CHAR_WORK_ENCOUNTTYPE, tmp); tmp = NPC_Util_GetNumFromStrWithDelim( argstr, "onebattle"); if( tmp != 1 ) tmp = 0; CHAR_setWorkInt( meindex, CHAR_WORK_ONEBATTLE, tmp); tmp = NPC_Util_GetNumFromStrWithDelim( argstr, "time"); if( tmp == -1 ) tmp = NPC_ENEMY_REVIVALTIMA_DEFAULT; CHAR_setWorkInt( meindex, CHAR_WORK_REVIVALTIME, tmp); CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_TYPENPCENEMY ); CHAR_setWorkInt( meindex, CHAR_WORKEVENTTYPE, CHAR_EVENT_ENEMY); CHAR_setWorkInt( meindex, CHAR_WORK_BASEIMGBAK, CHAR_getInt( meindex, CHAR_BASEIMAGENUMBER)); return TRUE; }
BOOL NPC_WarpInit( int charaindex ) { char arg1[NPC_UTIL_GETARGSTR_BUFSIZE]; char *arg; int ret; int floor=-1,x=-1,y=-1; char token[128]; #ifdef _RECORD_NPCMAN_ //紀錄 char evtype[256]; char evtime[256]; char argfile[256]; if( NPC_Util_CheckAssignArgFile( charaindex, argfile) == NULL ) sprintf( argfile, "NULL"); #endif CHAR_setInt( charaindex, CHAR_WHICHTYPE , CHAR_TYPEWARP ); if((arg = NPC_Util_GetArgStr( charaindex, arg1, sizeof( arg1))) == NULL ) { print("\n GetArgStr ERR!!"); return FALSE; } #ifdef _NEW_WARPPOINT if( strstr( arg, "FREEMORE") != NULL ) { #ifdef _RECORD_NPCMAN_ //紀錄 sprintf( evtype, "FREE"); sprintf( evtime, "NULL"); #endif CHAR_setWorkInt( charaindex, CHAR_WORKEVENTTYPE, CHAR_EVENT_WARP); }else { #endif #ifdef _MAP_WARPPOINT return FALSE; #endif #ifdef _RECORD_NPCMAN_ //紀錄 sprintf( evtype, "NONE"); #endif ret=getStringFromIndexWithDelim(arg,"|", 1,token,sizeof(token)); if( ret ) floor = atoi( token ); ret=getStringFromIndexWithDelim(arg,"|", 2,token,sizeof(token)); if( ret ) x = atoi( token ); ret=getStringFromIndexWithDelim(arg,"|", 3,token,sizeof(token)); if( ret ) y = atoi( token ); if( MAP_IsValidCoordinate( floor,x,y )== FALSE ){ NPC_WarpsetNeverMake( charaindex ); //print( "Warp NPC:Invalid arg:%s\n", arg ); print( "Warp Npc Err:%d:%d:%d->(%s)\n", CHAR_getInt( charaindex, CHAR_FLOOR ), CHAR_getInt( charaindex, CHAR_X ), CHAR_getInt( charaindex, CHAR_Y ), arg ); return FALSE; } ret=getStringFromIndexWithDelim(arg,"|",4,token,sizeof(token)); if(ret==TRUE){ int day; day=NPC_TimeWarpCheck(charaindex,token,0); if(day==0){ #ifdef _RECORD_NPCMAN_ //紀錄 sprintf( evtime, "N"); #endif CHAR_setWorkInt( charaindex, CHAR_WORKEVENTTYPE, CHAR_EVENT_WARP_NIGHT); }else if(day==1){ #ifdef _RECORD_NPCMAN_ //紀錄 sprintf( evtime, "M"); #endif CHAR_setWorkInt( charaindex, CHAR_WORKEVENTTYPE, CHAR_EVENT_WARP_MORNING); }else if(day==2){ #ifdef _RECORD_NPCMAN_ //紀錄 sprintf( evtime, "A"); #endif CHAR_setWorkInt( charaindex, CHAR_WORKEVENTTYPE, CHAR_EVENT_WARP_NOON); }else{ #ifdef _RECORD_NPCMAN_ //紀錄 sprintf( evtime, "NULL"); #endif CHAR_setWorkInt( charaindex, CHAR_WORKEVENTTYPE, CHAR_EVENT_WARP); } }else{ #ifdef _RECORD_NPCMAN_ //紀錄 sprintf( evtime, "NULL"); #endif CHAR_setWorkInt( charaindex, CHAR_WORKEVENTTYPE, CHAR_EVENT_WARP); } #ifdef _NEW_WARPPOINT } #endif CHAR_setFlg( charaindex,CHAR_ISVISIBLE, 0 ); CHAR_setFlg( charaindex,CHAR_ISOVERED,1 ); CHAR_setFlg( charaindex,CHAR_ISATTACKED,0 ); CHAR_setFlg( charaindex,CHAR_ISATTACK,0 ); #ifdef _RECORD_NPCMAN_ //紀錄 { FILE *fp=NULL; char filename[256]; sprintf( filename,"./data/npc/%s", "mapwarp.txt"); if( (fp = fopen( filename, "a+")) != NULL ) { fprintf( fp, "%s:%s:%d,%d,%d:%d,%d,%d:%s\n", evtype, evtime, CHAR_getInt( charaindex, CHAR_FLOOR), CHAR_getInt( charaindex, CHAR_X), CHAR_getInt( charaindex, CHAR_Y), floor, x, y, argfile ); fclose( fp); }else { } } #endif return TRUE; }
/*#ifdef _JZ_NPCBUF CHAR_NPCBUFPOINT = CHAR_WORKEQUITFIRE, //NPC arg文件緩存指針 CHAR_NPCTIMERH32 = CHAR_WORKEQUITTHUNDER, //NPC 計時器(高32位) CHAR_NPCTIMERL32 = CHAR_WORKEQUITICE, //NPC 計時器(低32位) CHAR_NPCFILECTIMEH32 = CHAR_WORKEQUITWEAKEN, //讀NPC arg文件的時間(高32位) CHAR_NPCFILECTIMEL32 = CHAR_WORKEQUITBARRIER, //讀NPC arg文件的時間(低32位) //CHAR_NPCFILECTIME_HOUR = CHAR_WORKEQUITNOCAST, //讀NPC arg文件時的時鐘 //CHAR_NPCFILECTIME_MIN = CHAR_WORKEQUITFALLRIDE, //讀NPC arg文件時的分鐘 #endif*/ char *NPC_Util_GetArgStr( int index, char *argstr, int len) { char filename[128]; Char *ch; char *cret = NULL; struct stat buff; int fd; char opfile[128]; if( (ch = CHAR_getCharPointer( index)) == NULL ) { print("GetArgStr Not get CharPointer\n"); return NULL; //獲得NPC結構指針 } if( NPC_Util_CheckAssignArgFile( index, filename) != NULL ) { sprintf( opfile, "%s/%s", getNpcdir(),filename); if(stat(opfile,&buff)!=0) { print("NPC緩存機制 stat error:%s\n",strerror( errno )); buff.st_size = NPC_UTIL_GETARGSTR_BUFSIZE; }else{ buff.st_size++; } //if(buff.st_size > len)buff.st_size = len; cret = (char *)ch->workint[CHAR_NPCBUFPOINT]; //獲得NPC緩存指針 if( cret == NULL ) { //首先判斷NPC緩存是否已經加載數據 //未加載緩存,申請內存,並將文件內容讀到緩存中 loadarg: cret = allocateMemory((unsigned int)buff.st_size); //申請內存 memset( cret, 0,buff.st_size); if( cret == NULL ) { //判斷申請內存是否成功,如果不成功則採用舊的模式 //舊的文件即時讀取模式 //print("NPC BUF OLD LOAD FILE %d\n",buff.st_size); if( NPC_Util_MargeStrFromArgFile( opfile, argstr, len) != NULL ) { cret = argstr; } }else{ //新的NPC緩存模式 //print("NPC BUF NEW LOAD FILE %d\n",buff.st_size); if( NPC_Util_MargeStrFromArgFile( opfile, cret, buff.st_size) != NULL ) { //memcpy(cret,argstr,buff.st_size); ch->workint[CHAR_NPCBUFPOINT] = (int)cret; ch->workint[CHAR_NPCFILECTIMEH32] = (unsigned long)buff.st_mtime; }else{ freeMemory(cret); cret = NULL; } } }else { //print("NPC BUF NEW %d\n",buff.st_size); //已加載緩存,判斷是否數據被更改,如果沒被更改直接返回緩存指針,如果更改的話則GOTO到未加載緩存的代碼 //2個計時器暫時不用 //if(buff.st_size > NPC_UTIL_GETARGSTR_BUFSIZE)buff.st_size = NPC_UTIL_GETARGSTR_BUFSIZE; if((unsigned long)ch->workint[CHAR_NPCFILECTIMEH32] != (unsigned long)buff.st_mtime) { print("npc updata:%s\n",opfile); freeMemory(cret); cret = NULL; goto loadarg; } //memcpy(argstr,cret,buff.st_size); //cret = argstr; } }else { if( CHAR_getChar( index, CHAR_NPCARGUMENT) != NULL ){ strcpy( argstr, CHAR_getChar( index, CHAR_NPCARGUMENT)); cret = argstr; }else{ cret = NULL; } } if( cret == NULL ) print("File:%s\n", NPC_Util_CheckAssignArgFile( index, opfile)); return( cret); /* if( NPC_Util_CheckAssignArgFile( index, filename) != NULL ) { if( NPC_Util_MargeStrFromArgFile( filename, argstr, len) != NULL ) { cret = argstr; } }else { if( CHAR_getChar( index, CHAR_NPCARGUMENT) != NULL ){ strcpy( argstr, CHAR_getChar( index, CHAR_NPCARGUMENT)); cret = argstr; }else{ cret = NULL; } } if( cret == NULL ) print("File:%s\n", NPC_Util_CheckAssignArgFile( index, filename)); return( cret);*/ }